From 6987ddb3135d4378fee40266bfbafac5b4fa3f65 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 8 Jun 2018 15:41:46 +0200 Subject: [PATCH] android: Show connection errors as banner, not as modal dialog --- .../android/ui/VpnStateFragment.java | 106 +++++----- .../main/res/drawable/error_background.xml | 32 +++ .../main/res/layout/imc_state_fragment.xml | 1 - .../main/res/layout/vpn_state_fragment.xml | 183 ++++++++++++------ .../app/src/main/res/values-de/strings.xml | 1 + .../app/src/main/res/values-pl/strings.xml | 1 + .../app/src/main/res/values-ru/strings.xml | 1 + .../app/src/main/res/values-ua/strings.xml | 1 + .../src/main/res/values-zh-rCN/strings.xml | 1 + .../src/main/res/values-zh-rTW/strings.xml | 1 + .../app/src/main/res/values/colors.xml | 2 +- .../app/src/main/res/values/strings.xml | 1 + 12 files changed, 204 insertions(+), 127 deletions(-) create mode 100644 src/frontends/android/app/src/main/res/drawable/error_background.xml diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java index 81211d661a..d682be4252 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnStateFragment.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2016 Tobias Brunner + * Copyright (C) 2012-2018 Tobias Brunner * Copyright (C) 2012 Giuliano Grassi * Copyright (C) 2012 Ralf Sager * HSR Hochschule fuer Technik Rapperswil @@ -20,19 +20,18 @@ package org.strongswan.android.ui; import android.app.Service; import android.content.ComponentName; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; -import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; +import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -60,7 +59,10 @@ public class VpnStateFragment extends Fragment implements VpnStateListener private int mColorStateSuccess; private Button mActionButton; private ProgressBar mProgress; - private AlertDialog mErrorDialog; + private LinearLayout mErrorView; + private TextView mErrorText; + private Button mErrorDetails; + private Button mDismissError; private long mErrorConnectionID; private VpnStateService mService; private final ServiceConnection mServiceConnection = new ServiceConnection() @@ -128,12 +130,25 @@ public class VpnStateFragment extends Fragment implements VpnStateListener }); enableActionButton(null); + mErrorView = view.findViewById(R.id.vpn_error); + mErrorText = view.findViewById(R.id.vpn_error_text); + mErrorDetails = view.findViewById(R.id.error_details); + mDismissError = view.findViewById(R.id.dismiss_error); mProgress = (ProgressBar)view.findViewById(R.id.progress); mStateView = (TextView)view.findViewById(R.id.vpn_state); mColorStateBase = mStateView.getCurrentTextColor(); mProfileView = (TextView)view.findViewById(R.id.vpn_profile_label); mProfileNameView = (TextView)view.findViewById(R.id.vpn_profile_name); + mDismissError.setOnClickListener(new OnClickListener() + { + @Override + public void onClick(View v) + { + clearError(); + } + }); + return view; } @@ -156,7 +171,6 @@ public class VpnStateFragment extends Fragment implements VpnStateListener { mService.unregisterListener(this); } - hideErrorDialog(); } @Override @@ -238,13 +252,10 @@ public class VpnStateFragment extends Fragment implements VpnStateListener { if (error == ErrorState.NO_ERROR) { - hideErrorDialog(); + mErrorView.setVisibility(View.GONE); return false; } - else if (mErrorDialog != null) - { /* we already show the dialog */ - return true; - } + mErrorConnectionID = connectionID; mProfileNameView.setText(name); showProfile(true); @@ -257,24 +268,24 @@ public class VpnStateFragment extends Fragment implements VpnStateListener case AUTH_FAILED: if (imcState == ImcState.BLOCK) { - showErrorDialog(R.string.error_assessment_failed); + showError(R.string.error_assessment_failed); } else { - showErrorDialog(R.string.error_auth_failed); + showError(R.string.error_auth_failed); } break; case PEER_AUTH_FAILED: - showErrorDialog(R.string.error_peer_auth_failed); + showError(R.string.error_peer_auth_failed); break; case LOOKUP_FAILED: - showErrorDialog(R.string.error_lookup_failed); + showError(R.string.error_lookup_failed); break; case UNREACHABLE: - showErrorDialog(R.string.error_unreachable); + showError(R.string.error_unreachable); break; default: - showErrorDialog(R.string.error_generic); + showError(R.string.error_generic); break; } return true; @@ -293,75 +304,46 @@ public class VpnStateFragment extends Fragment implements VpnStateListener mActionButton.setVisibility(text != null ? View.VISIBLE : View.GONE); } - private void hideErrorDialog() - { - if (mErrorDialog != null) - { - mErrorDialog.dismiss(); - mErrorDialog = null; - } - } - private void clearError() { if (mService != null) { - mService.disconnect(); if (mService.getConnectionID() == mErrorConnectionID) { + mService.disconnect(); mService.setError(ErrorState.NO_ERROR); } } updateView(); } - private void showErrorDialog(int textid) + private void showError(int textid) { final List instructions = mService.getRemediationInstructions(); final boolean show_instructions = mService.getImcState() == ImcState.BLOCK && !instructions.isEmpty(); int text = show_instructions ? R.string.show_remediation_instructions : R.string.show_log; - mErrorDialog = new AlertDialog.Builder(getActivity()) - .setMessage(getString(R.string.error_introduction) + " " + getString(textid)) - .setCancelable(false) - .setNeutralButton(text, new DialogInterface.OnClickListener() + mErrorText.setText(getString(R.string.error_introduction) + " " + getString(textid)); + mErrorDetails.setText(text); + mErrorDetails.setOnClickListener(new OnClickListener() + { + @Override + public void onClick(View v) { - @Override - public void onClick(DialogInterface dialog, int which) + Intent intent; + if (show_instructions) { - clearError(); - dialog.dismiss(); - Intent intent; - if (show_instructions) - { - intent = new Intent(getActivity(), RemediationInstructionsActivity.class); - intent.putParcelableArrayListExtra(RemediationInstructionsFragment.EXTRA_REMEDIATION_INSTRUCTIONS, - new ArrayList(instructions)); - } - else - { - intent = new Intent(getActivity(), LogActivity.class); - } - startActivity(intent); + intent = new Intent(getActivity(), RemediationInstructionsActivity.class); + intent.putParcelableArrayListExtra(RemediationInstructionsFragment.EXTRA_REMEDIATION_INSTRUCTIONS, + new ArrayList(instructions)); } - }) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int id) + else { - clearError(); - dialog.dismiss(); + intent = new Intent(getActivity(), LogActivity.class); } - }).create(); - mErrorDialog.setOnDismissListener(new DialogInterface.OnDismissListener() - { - @Override - public void onDismiss(DialogInterface dialog) - { - mErrorDialog = null; + startActivity(intent); } }); - mErrorDialog.show(); + mErrorView.setVisibility(View.VISIBLE); } } diff --git a/src/frontends/android/app/src/main/res/drawable/error_background.xml b/src/frontends/android/app/src/main/res/drawable/error_background.xml new file mode 100644 index 0000000000..9f827573bc --- /dev/null +++ b/src/frontends/android/app/src/main/res/drawable/error_background.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + diff --git a/src/frontends/android/app/src/main/res/layout/imc_state_fragment.xml b/src/frontends/android/app/src/main/res/layout/imc_state_fragment.xml index 43219cf3fc..ef5a63d87a 100644 --- a/src/frontends/android/app/src/main/res/layout/imc_state_fragment.xml +++ b/src/frontends/android/app/src/main/res/layout/imc_state_fragment.xml @@ -16,7 +16,6 @@ diff --git a/src/frontends/android/app/src/main/res/layout/vpn_state_fragment.xml b/src/frontends/android/app/src/main/res/layout/vpn_state_fragment.xml index 92ad536071..6807ae39e1 100644 --- a/src/frontends/android/app/src/main/res/layout/vpn_state_fragment.xml +++ b/src/frontends/android/app/src/main/res/layout/vpn_state_fragment.xml @@ -18,80 +18,137 @@ + android:orientation="vertical" + android:animateLayoutChanges="true" > - + android:layout_height="match_parent" + android:background="@drawable/error_background" + android:orientation="vertical" > + android:layout_marginLeft="20dp" + android:layout_marginTop="24dp" + android:layout_marginBottom="12dp" + android:text="Failed to establish VPN: Server is unreachable" + android:textColor="@color/primary_dark" + android:textSize="16sp" /> - + - + + + + + + + + + - + android:layout_marginBottom="10dp" + android:layout_marginLeft="20dp" + android:layout_marginRight="20dp" + android:layout_marginTop="10dp" + android:columnCount="2" + android:rowCount="2" > - + + + + + + + + + + + - - - - + android:layout_marginBottom="10dp" + android:layout_marginLeft="20dp" + android:layout_marginRight="20dp" + android:indeterminate="true" + android:visibility="gone" + style="@style/Widget.AppCompat.ProgressBar.Horizontal" /> - + + diff --git a/src/frontends/android/app/src/main/res/values-de/strings.xml b/src/frontends/android/app/src/main/res/values-de/strings.xml index 564a6cc2e4..17b456d56c 100644 --- a/src/frontends/android/app/src/main/res/values-de/strings.xml +++ b/src/frontends/android/app/src/main/res/values-de/strings.xml @@ -163,6 +163,7 @@ Trennen… Kein aktives Profil Fehler + Ausblenden Assessment: diff --git a/src/frontends/android/app/src/main/res/values-pl/strings.xml b/src/frontends/android/app/src/main/res/values-pl/strings.xml index 8441c0a7a2..bfa09adaf1 100644 --- a/src/frontends/android/app/src/main/res/values-pl/strings.xml +++ b/src/frontends/android/app/src/main/res/values-pl/strings.xml @@ -163,6 +163,7 @@ Przerywam połączenie… Brak aktywnego VPN Błąd + Dismiss Assessment: diff --git a/src/frontends/android/app/src/main/res/values-ru/strings.xml b/src/frontends/android/app/src/main/res/values-ru/strings.xml index 20259ef887..cae13c4217 100644 --- a/src/frontends/android/app/src/main/res/values-ru/strings.xml +++ b/src/frontends/android/app/src/main/res/values-ru/strings.xml @@ -160,6 +160,7 @@ Отключение… Нет активных VPN Ошибка + Dismiss Assessment: diff --git a/src/frontends/android/app/src/main/res/values-ua/strings.xml b/src/frontends/android/app/src/main/res/values-ua/strings.xml index 1fc1c2926c..58e977f433 100644 --- a/src/frontends/android/app/src/main/res/values-ua/strings.xml +++ b/src/frontends/android/app/src/main/res/values-ua/strings.xml @@ -161,6 +161,7 @@ Роз\'єднання… Немає активних VPN Помилка + Dismiss Assessment: diff --git a/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml b/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml index 8a886c5d81..7b2a644d91 100644 --- a/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml +++ b/src/frontends/android/app/src/main/res/values-zh-rCN/strings.xml @@ -160,6 +160,7 @@ 断开连接中… 无活跃VPN 错误 + Dismiss 评估详情: diff --git a/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml b/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml index f2529a519d..b085a11b8d 100644 --- a/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml +++ b/src/frontends/android/app/src/main/res/values-zh-rTW/strings.xml @@ -160,6 +160,7 @@ 結束連線中… 無運作中的VPN 錯誤 + Dismiss 評估詳情: diff --git a/src/frontends/android/app/src/main/res/values/colors.xml b/src/frontends/android/app/src/main/res/values/colors.xml index eedfe23976..11d4e24a2c 100644 --- a/src/frontends/android/app/src/main/res/values/colors.xml +++ b/src/frontends/android/app/src/main/res/values/colors.xml @@ -22,7 +22,7 @@ name="primary">#A2042C #000000 + name="primary_dark">#323232 #D9192C diff --git a/src/frontends/android/app/src/main/res/values/strings.xml b/src/frontends/android/app/src/main/res/values/strings.xml index 584a2d9a2d..dc90b1134b 100644 --- a/src/frontends/android/app/src/main/res/values/strings.xml +++ b/src/frontends/android/app/src/main/res/values/strings.xml @@ -163,6 +163,7 @@ Disconnecting… No active VPN Error + Dismiss Assessment: -- 2.39.2