OSDN Git Service

Fix VPN settings flow.
authorAmith Yamasani <yamasani@google.com>
Fri, 12 Nov 2010 16:51:01 +0000 (08:51 -0800)
committerAmith Yamasani <yamasani@google.com>
Fri, 12 Nov 2010 18:37:20 +0000 (10:37 -0800)
Bug: 3053019

res/values/strings.xml
src/com/android/settings/SettingsPreferenceFragment.java
src/com/android/settings/vpn/VpnEditor.java
src/com/android/settings/vpn/VpnSettings.java
src/com/android/settings/vpn/VpnTypeSelection.java

index 3aaed74..7a5174e 100644 (file)
@@ -2711,6 +2711,8 @@ found in the list of installed applications.</string>
     <string name="vpn_type_title">Add VPN</string>
     <!-- "Add VPN" preference title -->
     <string name="vpn_add_new_vpn">Add VPN</string>
+    <!-- VPN details screen title -->
+    <string name="vpn_details_title">VPN details</string>
     <!-- VPN profile editor title when adding a new profile -->
     <string name="vpn_edit_title_add">Add <xliff:g id="name">%s</xliff:g> VPN</string>
     <!-- VPN profile editor title when editing an existing profile -->
index 41ff87f..3c771f5 100644 (file)
@@ -64,49 +64,11 @@ public class SettingsPreferenceFragment extends PreferenceFragment
     private Button mNextButton;
 
     @Override
-    public void onResume() {
-        super.onResume();
-
-        final Fragment f = getTargetFragment();
-        final int requestCode = getTargetRequestCode();
-
-        // TargetFragment becomes invalid when this object is resumed. Notify it to
-        // FragmentManager. Without this code, FragmentManager wrongly take the TargetFragment
-        // as live, and throws IllegalStateException.
-        setTargetFragment(null, -1);
-
-        if (f != null && (f instanceof SettingsPreferenceFragment)) {
-            final SettingsPreferenceFragment spf = (SettingsPreferenceFragment)f;
-            final int resultCode = spf.getResultCode();
-            final Intent resultData = spf.getResultData();
-            onActivityResult(requestCode, resultCode, resultData);
-        }
-    }
-
-    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         setupButtonBar();
     }
 
-    public final void setResult(int resultCode) {
-        mResultCode = resultCode;
-        mResultData = null;
-    }
-
-    public final void setResult(int resultCode, Intent data) {
-        mResultCode = resultCode;
-        mResultData = data;
-    }
-
-    public final int getResultCode() {
-        return mResultCode;
-    }
-
-    public final Intent getResultData() {
-        return mResultData;
-    }
-
     /*
      * The name is intentionally made different from Activity#finish(), so that
      * users won't misunderstand its meaning.
@@ -196,9 +158,8 @@ public class SettingsPreferenceFragment extends PreferenceFragment
             Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
         if (getActivity() instanceof PreferenceActivity) {
             PreferenceActivity preferenceActivity = (PreferenceActivity)getActivity();
-            Fragment f = Fragment.instantiate(getActivity(), fragmentClass, extras);
-            caller.setTargetFragment(f, requestCode);
-            preferenceActivity.switchToHeader(fragmentClass, extras);
+            preferenceActivity.startPreferencePanel(fragmentClass, extras, 0, null, caller,
+                    requestCode);
             return true;
         } else {
             Log.w(TAG, "Parent isn't PreferenceActivity, thus there's no way to launch the "
index 3ab0b90..1b3bdb5 100644 (file)
@@ -32,8 +32,8 @@ import android.net.vpn.VpnProfile;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.preference.PreferenceActivity;
 import android.text.TextUtils;
-import android.util.Log;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -109,7 +109,11 @@ public class VpnEditor extends SettingsPreferenceFragment {
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case MENU_SAVE:
-                if (validateAndSetResult()) finishFragment();
+                Intent resultIntent = validateAndGetResult();
+                if (resultIntent != null) {
+                    ((PreferenceActivity) getActivity()).finishPreferencePanel(
+                            this, Activity.RESULT_OK, resultIntent);
+                }
                 return true;
 
             case MENU_CANCEL:
@@ -152,22 +156,24 @@ public class VpnEditor extends SettingsPreferenceFragment {
      * Checks the validity of the inputs and set the profile as result if valid.
      * @return true if the result is successfully set
      */
-    private boolean validateAndSetResult() {
+    private Intent validateAndGetResult() {
         String errorMsg = mProfileEditor.validate();
 
         if (errorMsg != null) {
             Util.showErrorMessage(getActivity(), errorMsg);
-            return false;
+            return null;
         }
 
-        if (profileChanged()) setResult(getProfile());
-        return true;
+        if (profileChanged()) {
+            return getResult(getProfile());
+        }
+        return null;
     }
 
-    private void setResult(VpnProfile p) {
+    private Intent getResult(VpnProfile p) {
         Intent intent = new Intent(getActivity(), VpnSettings.class);
         intent.putExtra(VpnSettings.KEY_VPN_PROFILE, (Parcelable) p);
-        setResult(Activity.RESULT_OK, intent);
+        return intent;
     }
 
     private VpnProfileEditor getEditor(VpnProfile p) {
index e9a4c3d..0b77930 100644 (file)
@@ -22,7 +22,6 @@ import com.android.settings.SettingsPreferenceFragment;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.app.Fragment;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -39,19 +38,21 @@ import android.net.vpn.VpnState;
 import android.net.vpn.VpnType;
 import android.os.Bundle;
 import android.os.ConditionVariable;
+import android.os.Handler;
 import android.os.IBinder;
 import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceActivity;
 import android.preference.PreferenceCategory;
 import android.preference.PreferenceScreen;
+import android.preference.Preference.OnPreferenceClickListener;
 import android.security.Credentials;
 import android.security.KeyStore;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ContextMenu.ContextMenuInfo;
 import android.widget.AdapterView.AdapterContextMenuInfo;
 
 import java.io.File;
@@ -72,6 +73,9 @@ import java.util.Map;
  */
 public class VpnSettings extends SettingsPreferenceFragment
         implements DialogInterface.OnClickListener {
+
+    private static final boolean DEBUG = false;
+
     // Key to the field exchanged for profile editing.
     static final String KEY_VPN_PROFILE = "vpn_profile";
 
@@ -87,7 +91,7 @@ public class VpnSettings extends SettingsPreferenceFragment
     private static final String PROFILE_OBJ_FILE = ".pobj";
 
     private static final int REQUEST_ADD_OR_EDIT_PROFILE = 1;
-    private static final int REQUEST_SELECT_VPN_TYPE = 2;
+    static final int REQUEST_SELECT_VPN_TYPE = 2;
 
     private static final int CONTEXT_MENU_CONNECT_ID = ContextMenu.FIRST + 0;
     private static final int CONTEXT_MENU_DISCONNECT_ID = ContextMenu.FIRST + 1;
@@ -134,6 +138,8 @@ public class VpnSettings extends SettingsPreferenceFragment
 
     private StatusChecker mStatusChecker = new StatusChecker();
 
+    private Handler mHandler = new Handler();
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -171,7 +177,8 @@ public class VpnSettings extends SettingsPreferenceFragment
     @Override
     public void onResume() {
         super.onResume();
-
+        if (DEBUG)
+            Log.d(TAG, "onResume");
         if ((mUnlockAction != null) && isKeyStoreUnlocked()) {
             Runnable action = mUnlockAction;
             mUnlockAction = null;
@@ -282,7 +289,7 @@ public class VpnSettings extends SettingsPreferenceFragment
                 .setPositiveButton(R.string.vpn_yes_button,
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
-                                startVpnEditor(mActiveProfile);
+                                startVpnEditor(mActiveProfile, false);
                             }
                         })
                 .create();
@@ -295,7 +302,7 @@ public class VpnSettings extends SettingsPreferenceFragment
                             public void onClick(DialogInterface dialog, int w) {
                                 VpnProfile p = mActiveProfile;
                                 onIdle();
-                                startVpnEditor(p);
+                                startVpnEditor(p, false);
                             }
                         });
     }
@@ -362,7 +369,7 @@ public class VpnSettings extends SettingsPreferenceFragment
             return true;
 
         case CONTEXT_MENU_EDIT_ID:
-            startVpnEditor(p);
+                startVpnEditor(p, false);
             return true;
 
         case CONTEXT_MENU_DELETE_ID:
@@ -376,14 +383,21 @@ public class VpnSettings extends SettingsPreferenceFragment
     @Override
     public void onActivityResult(final int requestCode, final int resultCode,
             final Intent data) {
+
+        if (DEBUG) Log.d(TAG, "onActivityResult , result = " + resultCode + ", data = " + data);
         if ((resultCode == Activity.RESULT_CANCELED) || (data == null)) {
             Log.d(TAG, "no result returned by editor");
             return;
         }
 
         if (requestCode == REQUEST_SELECT_VPN_TYPE) {
-            String typeName = data.getStringExtra(KEY_VPN_TYPE);
-            startVpnEditor(createVpnProfile(typeName));
+            final String typeName = data.getStringExtra(KEY_VPN_TYPE);
+            mHandler.post(new Runnable() {
+
+                public void run() {
+                    startVpnEditor(createVpnProfile(typeName), true);
+                }
+            });
         } else if (requestCode == REQUEST_ADD_OR_EDIT_PROFILE) {
             VpnProfile p = data.getParcelableExtra(KEY_VPN_PROFILE);
             if (p == null) {
@@ -400,7 +414,7 @@ public class VpnSettings extends SettingsPreferenceFragment
                         p.getName()),
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
-                                startVpnEditor(profile);
+                                startVpnEditor(profile, false);
                             }
                         });
                 return;
@@ -431,7 +445,7 @@ public class VpnSettings extends SettingsPreferenceFragment
                 Util.showErrorMessage(activity, e + ": " + e.getMessage(),
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
-                                startVpnEditor(profile);
+                                startVpnEditor(profile, false);
                             }
                         });
             }
@@ -615,8 +629,9 @@ public class VpnSettings extends SettingsPreferenceFragment
     }
 
     private void startVpnTypeSelection() {
-        startFragment(this, VpnTypeSelection.class.getCanonicalName(),
-                REQUEST_SELECT_VPN_TYPE, null);
+        ((PreferenceActivity)getActivity()).startPreferencePanel(
+                VpnTypeSelection.class.getCanonicalName(), null, R.string.vpn_type_title, null,
+                this, REQUEST_SELECT_VPN_TYPE);
     }
 
     private boolean isKeyStoreUnlocked() {
@@ -666,11 +681,14 @@ public class VpnSettings extends SettingsPreferenceFragment
         return false;
     }
 
-    private void startVpnEditor(final VpnProfile profile) {
+    private void startVpnEditor(final VpnProfile profile, boolean add) {
         Bundle args = new Bundle();
         args.putParcelable(KEY_VPN_PROFILE, profile);
-        startFragment(this, VpnEditor.class.getCanonicalName(),
-                REQUEST_ADD_OR_EDIT_PROFILE, args);
+        // TODO: Show different titles for add and edit.
+        ((PreferenceActivity)getActivity()).startPreferencePanel(
+                VpnEditor.class.getCanonicalName(), args,
+                add ? R.string.vpn_details_title : R.string.vpn_details_title, null,
+                this, REQUEST_ADD_OR_EDIT_PROFILE);
     }
 
     private synchronized void connect(final VpnProfile p) {
index 5990ac0..45e33b9 100644 (file)
@@ -25,6 +25,7 @@ import android.net.vpn.VpnManager;
 import android.net.vpn.VpnType;
 import android.os.Bundle;
 import android.preference.Preference;
+import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 
 import java.util.HashMap;
@@ -46,8 +47,9 @@ public class VpnTypeSelection extends SettingsPreferenceFragment {
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen ps, Preference pref) {
-        setResult(mTypeMap.get(pref.getTitle().toString()));
-        finishFragment();
+        ((PreferenceActivity)getActivity())
+                .finishPreferencePanel(this, Activity.RESULT_OK,
+                        getResultIntent(mTypeMap.get(pref.getTitle().toString())));
         return true;
     }
 
@@ -67,9 +69,9 @@ public class VpnTypeSelection extends SettingsPreferenceFragment {
         }
     }
 
-    private void setResult(VpnType type) {
+    private Intent getResultIntent(VpnType type) {
         Intent intent = new Intent(getActivity(), VpnSettings.class);
         intent.putExtra(VpnSettings.KEY_VPN_TYPE, type.toString());
-        setResult(Activity.RESULT_OK, intent);
+        return intent;
     }
 }