diff --git a/src/frontends/android/res/values/strings.xml b/src/frontends/android/res/values/strings.xml index 4a719ef1c..04e09265e 100644 --- a/src/frontends/android/res/values/strings.xml +++ b/src/frontends/android/res/values/strings.xml @@ -58,10 +58,17 @@ Connected Disconnecting… No active VPN + Error Enter password to connect Connect + Failed to establish VPN: + Gateway address lookup failed. + Gateway is unreachable. + Verifying gateway authentication failed. + User authentication failed. + Unspecified failure while connecting. Connecting: %1$s Establishing VPN with \""%1$s\". diff --git a/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java b/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java index 94475a3c9..a164ff1c6 100644 --- a/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java +++ b/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java @@ -20,9 +20,11 @@ package org.strongswan.android.ui; import org.strongswan.android.R; import org.strongswan.android.data.VpnProfile; import org.strongswan.android.logic.VpnStateService; +import org.strongswan.android.logic.VpnStateService.ErrorState; import org.strongswan.android.logic.VpnStateService.State; import org.strongswan.android.logic.VpnStateService.VpnStateListener; +import android.app.AlertDialog; import android.app.Fragment; import android.app.ProgressDialog; import android.app.Service; @@ -50,6 +52,7 @@ public class VpnStateFragment extends Fragment implements VpnStateListener private Button mActionButton; private ProgressDialog mProgressDialog; private State mState; + private AlertDialog mErrorDialog; private VpnStateService mService; private final ServiceConnection mServiceConnection = new ServiceConnection() { @Override @@ -119,6 +122,7 @@ public class VpnStateFragment extends Fragment implements VpnStateListener public void onStop() { super.onStop(); + hideErrorDialog(); hideProgressDialog(); } @@ -142,6 +146,7 @@ public class VpnStateFragment extends Fragment implements VpnStateListener public void updateView() { State state = mService.getState(); + ErrorState error = ErrorState.NO_ERROR; String name = "", gateway = ""; if (state != State.DISABLED) @@ -152,6 +157,12 @@ public class VpnStateFragment extends Fragment implements VpnStateListener name = profile.getName(); gateway = profile.getGateway(); } + error = mService.getErrorState(); + } + + if (reportError(name, state, error)) + { + return; } if (state == mState) @@ -192,6 +203,44 @@ public class VpnStateFragment extends Fragment implements VpnStateListener } } + private boolean reportError(String name, State state, ErrorState error) + { + if (error == ErrorState.NO_ERROR || state != State.CONNECTING && state != State.CONNECTED) + { /* we only report errors while initiating */ + hideErrorDialog(); + return false; + } + else if (mErrorDialog != null) + { /* we already show the dialog */ + return true; + } + hideProgressDialog(); + mProfileNameView.setText(name); + showProfile(true); + enableActionButton(false); + mStateView.setText(R.string.state_error); + mStateView.setTextColor(Color.RED); + switch (error) + { + case AUTH_FAILED: + showErrorDialog(R.string.error_auth_failed); + break; + case PEER_AUTH_FAILED: + showErrorDialog(R.string.error_peer_auth_failed); + break; + case LOOKUP_FAILED: + showErrorDialog(R.string.error_lookup_failed); + break; + case UNREACHABLE: + showErrorDialog(R.string.error_unreachable); + break; + default: + showErrorDialog(R.string.error_generic); + break; + } + return true; + } + private void showProfile(boolean show) { mProfileView.setVisibility(show ? View.VISIBLE : View.GONE); @@ -213,6 +262,15 @@ public class VpnStateFragment extends Fragment implements VpnStateListener } } + private void hideErrorDialog() + { + if (mErrorDialog != null) + { + mErrorDialog.dismiss(); + mErrorDialog = null; + } + } + private void showConnectDialog(String profile, String gateway) { mProgressDialog = new ProgressDialog(getActivity()); @@ -243,4 +301,20 @@ public class VpnStateFragment extends Fragment implements VpnStateListener mProgressDialog.setCancelable(false); mProgressDialog.show(); } + + private void showErrorDialog(int textid) + { + mErrorDialog = new AlertDialog.Builder(getActivity()) + .setMessage(getString(R.string.error_introduction) + " " + getString(textid)) + .setCancelable(false) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) + { + mErrorDialog = null; + dialog.dismiss(); + } + }).create(); + mErrorDialog.show(); + } }