diff --git a/res/values/strings.xml b/res/values/strings.xml index 42c846df8fe..d98ff7305d4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3142,5 +3142,7 @@ found in the list of installed applications. Enter password to decrypt storage Sorry, try again + + Service busy, try again diff --git a/src/com/android/settings/vpn/VpnEditor.java b/src/com/android/settings/vpn/VpnEditor.java index 1b3bdb59b49..161d34b2b09 100644 --- a/src/com/android/settings/vpn/VpnEditor.java +++ b/src/com/android/settings/vpn/VpnEditor.java @@ -28,6 +28,7 @@ import android.net.vpn.L2tpIpsecProfile; import android.net.vpn.L2tpIpsecPskProfile; import android.net.vpn.L2tpProfile; import android.net.vpn.PptpProfile; +import android.net.vpn.VpnManager; import android.net.vpn.VpnProfile; import android.os.Bundle; import android.os.Parcel; @@ -37,6 +38,7 @@ import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.widget.Toast; /** * The activity class for editing a new or existing VPN profile. @@ -48,6 +50,7 @@ public class VpnEditor extends SettingsPreferenceFragment { private static final String KEY_PROFILE = "profile"; private static final String KEY_ORIGINAL_PROFILE_NAME = "orig_profile_name"; + private VpnManager mVpnManager; private VpnProfileEditor mProfileEditor; private boolean mAddingProfile; private byte[] mOriginalProfileData; @@ -63,6 +66,7 @@ public class VpnEditor extends SettingsPreferenceFragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + mVpnManager = new VpnManager(getActivity()); VpnProfile p; if (savedInstanceState != null) { @@ -111,8 +115,15 @@ public class VpnEditor extends SettingsPreferenceFragment { case MENU_SAVE: Intent resultIntent = validateAndGetResult(); if (resultIntent != null) { - ((PreferenceActivity) getActivity()).finishPreferencePanel( - this, Activity.RESULT_OK, resultIntent); + PreferenceActivity activity = + (PreferenceActivity) getActivity(); + if (!mVpnManager.isIdle()) { + Toast.makeText(activity, R.string.service_busy, + Toast.LENGTH_SHORT).show(); + } else { + activity.finishPreferencePanel(this, + Activity.RESULT_OK, resultIntent); + } } return true; diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java index 29986fd40e8..bd1cc9ecea6 100644 --- a/src/com/android/settings/vpn/VpnSettings.java +++ b/src/com/android/settings/vpn/VpnSettings.java @@ -131,7 +131,7 @@ public class VpnSettings extends SettingsPreferenceFragment private int mConnectingErrorCode = NO_ERROR; - private Dialog mShowingDialog; + private Dialog mShowingDialog, mConnectDialog; @Override public void onCreate(Bundle savedInstanceState) { @@ -182,7 +182,6 @@ public class VpnSettings extends SettingsPreferenceFragment // for long-press gesture on a profile preference registerForContextMenu(getListView()); - retrieveVpnListFromStorage(); restoreInstanceState(savedInstanceState); } @@ -208,7 +207,13 @@ public class VpnSettings extends SettingsPreferenceFragment mUnlockAction = null; getActivity().runOnUiThread(action); } - checkVpnConnectionStatus(); + if (mConnectDialog == null || !mConnectDialog.isShowing()) { + checkVpnConnectionStatus(); + } else { + // Dismiss the connect dialog in case there is another instance + // trying to operate a vpn connection. + if (!mVpnManager.isIdle()) removeConnectDialog(); + } } @Override @@ -237,7 +242,8 @@ public class VpnSettings extends SettingsPreferenceFragment public Dialog onCreateDialog (int id) { switch (id) { case DIALOG_CONNECT: - return createConnectDialog(); + mConnectDialog = createConnectDialog(); + return mConnectDialog; case DIALOG_SECRET_NOT_SET: return createSecretNotSetDialog(); @@ -253,11 +259,19 @@ public class VpnSettings extends SettingsPreferenceFragment } } + private void removeConnectDialog() { + if (mConnectDialog != null) { + mConnectDialog.dismiss(); + mConnectDialog = null; + checkVpnConnectionStatus(); + } + } + private class ConnectDialog extends AlertDialog { public ConnectDialog(Context context) { super(context); setTitle(String.format(getString(R.string.vpn_connect_to), - mActiveProfile.getName())); + mConnectingActor.getProfile().getName())); setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.vpn_connect_button), VpnSettings.this); @@ -498,11 +512,11 @@ public class VpnSettings extends SettingsPreferenceFragment String error = mConnectingActor.validateInputs(d); if (error == null) { mConnectingActor.connect(d); - removeDialog(DIALOG_CONNECT); + removeConnectDialog(); return; } else { // dismissDialog(DIALOG_CONNECT); - removeDialog(DIALOG_CONNECT); + removeConnectDialog(); final Activity activity = getActivity(); // show error dialog @@ -522,8 +536,7 @@ public class VpnSettings extends SettingsPreferenceFragment mShowingDialog.show(); } } else { - removeDialog(DIALOG_CONNECT); - changeState(mActiveProfile, VpnState.IDLE); + removeConnectDialog(); } }