Merge "Work around improper ListView recycling in TrustAgentSettings" into mnc-dev
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index b81607b..5b2461a 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -20,6 +20,8 @@
 import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
 import android.app.admin.DevicePolicyManager;
 import android.content.ActivityNotFoundException;
 import android.content.Context;
@@ -32,7 +34,6 @@
 import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
 import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
 import android.hardware.fingerprint.FingerprintManager.RemovalCallback;
-import android.net.Uri;
 import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Handler;
@@ -40,7 +41,6 @@
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
-import android.provider.Browser;
 import android.text.Annotation;
 import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
@@ -128,7 +128,6 @@
         protected static final boolean DEBUG = true;
 
         private FingerprintManager mFingerprintManager;
-        private EditText mDialogTextField;
         private CancellationSignal mFingerprintCancel;
         private int mMaxFingerprintAttempts;
         private byte[] mToken;
@@ -388,54 +387,19 @@
             } else if (pref instanceof FingerprintPreference) {
                 FingerprintPreference fpref = (FingerprintPreference) pref;
                 final Fingerprint fp =fpref.getFingerprint();
-                showRenameDeleteDialog(pref, fp);
+                showRenameDeleteDialog(fp);
                 return super.onPreferenceTreeClick(preferenceScreen, pref);
             }
             return true;
         }
 
-        private void showRenameDeleteDialog(Preference pref, final Fingerprint fp) {
-            final Activity activity = getActivity();
-            final AlertDialog dialog = new AlertDialog.Builder(activity)
-                    .setView(R.layout.fingerprint_rename_dialog)
-                    .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok,
-                            new DialogInterface.OnClickListener() {
-                                @Override
-                                public void onClick(DialogInterface dialog, int which) {
-                                    final String newName = mDialogTextField.getText().toString();
-                                    final CharSequence name = fp.getName();
-                                    if (!newName.equals(name)) {
-                                        if (DEBUG) Log.v(TAG, "rename " + name + " to " + newName);
-                                        mFingerprintManager.rename(fp.getFingerId(), newName);
-                                        updatePreferences();
-                                    }
-                                    dialog.dismiss();
-                                }
-                            })
-                    .setNegativeButton(R.string.security_settings_fingerprint_enroll_dialog_delete,
-                            new DialogInterface.OnClickListener() {
-                                @Override
-                                public void onClick(DialogInterface dialog, int which) {
-                                    if (DEBUG) Log.v(TAG, "Removing fpId=" + fp.getFingerId());
-                                    mFingerprintManager.remove(fp, mRemoveCallback);
-                                    dialog.dismiss();
-                                }
-                            })
-                    .create();
-            dialog.show();
-            mDialogTextField = (EditText) dialog.findViewById(R.id.fingerprint_rename_field);
-            mDialogTextField.setText(fp.getName());
-            mDialogTextField.selectAll();
-            // show the IME
-            mDialogTextField.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-                @Override
-                public void onFocusChange(View v, boolean hasFocus) {
-                    if (hasFocus) {
-                        dialog.getWindow().setSoftInputMode(
-                                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
-                    }
-                }
-            });
+        private void showRenameDeleteDialog(final Fingerprint fp) {
+            RenameDeleteDialog renameDeleteDialog = new RenameDeleteDialog();
+            Bundle args = new Bundle();
+            args.putParcelable("fingerprint", fp);
+            renameDeleteDialog.setArguments(args);
+            renameDeleteDialog.setTargetFragment(this, 0);
+            renameDeleteDialog.show(getFragmentManager(), RenameDeleteDialog.class.getName());
         }
 
         @Override
@@ -523,6 +487,102 @@
                 startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
             }
         }
+
+        private void deleteFingerPrint(Fingerprint fingerPrint) {
+            mFingerprintManager.remove(fingerPrint, mRemoveCallback);
+        }
+
+        private void renameFingerPrint(int fingerId, String newName) {
+            mFingerprintManager.rename(fingerId, newName);
+            updatePreferences();
+        }
+
+        public static class RenameDeleteDialog extends DialogFragment {
+
+            private Fingerprint mFp;
+            private EditText mDialogTextField;
+            private String mFingerName;
+            private Boolean mTextHadFocus;
+            private int mTextSelectionStart;
+            private int mTextSelectionEnd;
+
+            @Override
+            public Dialog onCreateDialog(Bundle savedInstanceState) {
+                mFp = getArguments().getParcelable("fingerprint");
+                if (savedInstanceState != null) {
+                    mFingerName = savedInstanceState.getString("fingerName");
+                    mTextHadFocus = savedInstanceState.getBoolean("textHadFocus");
+                    mTextSelectionStart = savedInstanceState.getInt("startSelection");
+                    mTextSelectionEnd = savedInstanceState.getInt("endSelection");
+                }
+                final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
+                        .setView(R.layout.fingerprint_rename_dialog)
+                        .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok,
+                                new DialogInterface.OnClickListener() {
+                                    @Override
+                                    public void onClick(DialogInterface dialog, int which) {
+                                        final String newName =
+                                                mDialogTextField.getText().toString();
+                                        final CharSequence name = mFp.getName();
+                                        if (!newName.equals(name)) {
+                                            if (DEBUG) {
+                                                Log.v(TAG, "rename " + name + " to " + newName);
+                                            }
+                                            FingerprintSettingsFragment parent
+                                                    = (FingerprintSettingsFragment)
+                                                    getTargetFragment();
+                                            parent.renameFingerPrint(mFp.getFingerId(),
+                                                    newName);
+                                        }
+                                        dialog.dismiss();
+                                    }
+                                })
+                        .setNegativeButton(
+                                R.string.security_settings_fingerprint_enroll_dialog_delete,
+                                new DialogInterface.OnClickListener() {
+                                    @Override
+                                    public void onClick(DialogInterface dialog, int which) {
+                                        if (DEBUG) Log.v(TAG, "Removing fpId=" + mFp.getFingerId());
+                                        FingerprintSettingsFragment parent
+                                                = (FingerprintSettingsFragment) getTargetFragment();
+                                        parent.deleteFingerPrint(mFp);
+                                        dialog.dismiss();
+                                    }
+                                })
+                        .create();
+                alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+                    @Override
+                    public void onShow(DialogInterface dialog) {
+                        mDialogTextField = (EditText) alertDialog.findViewById(
+                                R.id.fingerprint_rename_field);
+                        CharSequence name = mFingerName == null ? mFp.getName() : mFingerName;
+                        mDialogTextField.setText(name);
+                        if (mTextHadFocus == null) {
+                            mDialogTextField.selectAll();
+                        } else {
+                            mDialogTextField.setSelection(mTextSelectionStart, mTextSelectionEnd);
+                        }
+                    }
+                });
+                if (mTextHadFocus == null || mTextHadFocus) {
+                    // Request the IME
+                    alertDialog.getWindow().setSoftInputMode(
+                            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+                }
+                return alertDialog;
+            }
+
+            @Override
+            public void onSaveInstanceState(Bundle outState) {
+                super.onSaveInstanceState(outState);
+                if (mDialogTextField != null) {
+                    outState.putString("fingerName", mDialogTextField.getText().toString());
+                    outState.putBoolean("textHadFocus", mDialogTextField.hasFocus());
+                    outState.putInt("startSelection", mDialogTextField.getSelectionStart());
+                    outState.putInt("endSelection", mDialogTextField.getSelectionEnd());
+                }
+            }
+        }
     }
 
     public static class FingerprintPreference extends Preference {
diff --git a/src/com/android/settings/vpn2/VpnSettings.java b/src/com/android/settings/vpn2/VpnSettings.java
index 6ed00f7..a17781c 100644
--- a/src/com/android/settings/vpn2/VpnSettings.java
+++ b/src/com/android/settings/vpn2/VpnSettings.java
@@ -120,12 +120,6 @@
     }
 
     @Override
-    public void onDestroy() {
-        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
-        super.onDestroy();
-    }
-
-    @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
         inflater.inflate(R.menu.vpn, menu);
@@ -193,7 +187,7 @@
 
     @Override
     public void onPause() {
-        // Pause monitoring
+        // Stop monitoring
         mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
 
         if (mUpdater != null) {