Merge "Remove duplicated call to authenticationSucceeded()"
diff --git a/src/com/android/settings/vpn2/ConfigDialogFragment.java b/src/com/android/settings/vpn2/ConfigDialogFragment.java
index 788b9a9..1880a6b 100644
--- a/src/com/android/settings/vpn2/ConfigDialogFragment.java
+++ b/src/com/android/settings/vpn2/ConfigDialogFragment.java
@@ -110,8 +110,10 @@
             KeyStore.getInstance().put(Credentials.VPN + profile.key, profile.encode(),
                     KeyStore.UID_SELF, /* flags */ 0);
 
-            // Flush out old version of profile
-            disconnect(profile);
+            // Flush out previous connection, which may be an old version of the profile
+            if (!disconnect(profile)) {
+                Log.w(TAG, "Unable to remove previous connection. Continuing anyway.");
+            }
 
             updateLockdownVpn(dialog.isVpnAlwaysOn(), profile);
 
@@ -125,7 +127,10 @@
             }
         } else if (button == DialogInterface.BUTTON_NEUTRAL) {
             // Disable profile if connected
-            disconnect(profile);
+            if (!disconnect(profile)) {
+                Log.e(TAG, "Failed to disconnect VPN. Leaving profile in keystore.");
+                return;
+            }
 
             // Delete from KeyStore
             KeyStore keyStore = KeyStore.getInstance();
@@ -172,16 +177,27 @@
         }
     }
 
-    private void disconnect(VpnProfile profile) {
+    /**
+     * Ensure that the VPN profile pointed at by {@param profile} is disconnected.
+     *
+     * @return {@code true} iff this VPN profile is no longer connected. Note that another profile
+     *         may still be active - this function will then do nothing but still return success.
+     */
+    private boolean disconnect(VpnProfile profile) {
         try {
-            LegacyVpnInfo connected = mService.getLegacyVpnInfo(UserHandle.myUserId());
-            if (connected != null && profile.key.equals(connected.key)) {
-                VpnUtils.clearLockdownVpn(getContext());
-                mService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN,
-                        UserHandle.myUserId());
+            if (!isConnected(profile)) {
+                return true;
             }
+            VpnUtils.clearLockdownVpn(getContext());
+            return mService.prepareVpn(null, VpnConfig.LEGACY_VPN, UserHandle.myUserId());
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to disconnect", e);
+            return false;
         }
     }
+
+    private boolean isConnected(VpnProfile profile) throws RemoteException {
+        LegacyVpnInfo connected = mService.getLegacyVpnInfo(UserHandle.myUserId());
+        return connected != null && profile.key.equals(connected.key);
+    }
 }