Fix 2594148: confirm PIN/Password before resetting device

This fixes a bug where user was allowed to factory reset the device
without entering their PIN/Password.

It also fixes the same issue with MediaFormat (Settings->SD Card->Format).

Change-Id: I0677a50aa771ad8663513fd7ec398a70953dcde2
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 7578078..0672ad9 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -54,7 +54,7 @@
 
         if (!mPasswordConfirmed) {
             ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
-            if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST)) {
+            if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) {
                 mPasswordConfirmed = true; // no password set, so no need to confirm
                 updatePreferencesOrFinish();
             }
diff --git a/src/com/android/settings/ChooseLockPassword.java b/src/com/android/settings/ChooseLockPassword.java
index 63c7896..b5e72d7 100644
--- a/src/com/android/settings/ChooseLockPassword.java
+++ b/src/com/android/settings/ChooseLockPassword.java
@@ -119,7 +119,8 @@
         if (savedInstanceState == null) {
             updateStage(Stage.Introduction);
             if (confirmCredentials) {
-                mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST);
+                mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
+                        null, null);
             }
         }
     }
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index 786d563..b5c0e80 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -288,7 +288,8 @@
                 // there isn't an existing password or the user confirms their password.
                 updateStage(Stage.NeedToConfirm);
                 boolean launchedConfirmationActivity =
-                    mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST);
+                    mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
+                            null, null);
                 if (!launchedConfirmationActivity) {
                     updateStage(Stage.Introduction);
                 }
diff --git a/src/com/android/settings/ChooseLockSettingsHelper.java b/src/com/android/settings/ChooseLockSettingsHelper.java
index 6382891..ba83f8e 100644
--- a/src/com/android/settings/ChooseLockSettingsHelper.java
+++ b/src/com/android/settings/ChooseLockSettingsHelper.java
@@ -37,18 +37,22 @@
 
     /**
      * If a pattern, password or PIN exists, prompt the user before allowing them to change it.
+     * @param message optional message to display about the action about to be done
+     * @param details optional detail message to display
      * @return true if one exists and we launched an activity to confirm it
      * @see #onActivityResult(int, int, android.content.Intent)
      */
-    protected boolean launchConfirmationActivity(int request) {
+    protected boolean launchConfirmationActivity(int request,
+            CharSequence message, CharSequence details) {
         boolean launched = false;
         switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
             case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
-                launched = confirmPattern(request);
+                launched = confirmPattern(request, message, details);
                 break;
             case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
             case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
             case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
+                // TODO: update UI layout for ConfirmPassword to show message and details
                 launched = confirmPassword(request);
                 break;
         }
@@ -57,14 +61,19 @@
 
     /**
      * Launch screen to confirm the existing lock pattern.
+     * @param message shown in header of ConfirmLockPattern if not null
+     * @param details shown in footer of ConfirmLockPattern if not null
      * @see #onActivityResult(int, int, android.content.Intent)
      * @return true if we launched an activity to confirm pattern
      */
-    private boolean confirmPattern(int request) {
+    private boolean confirmPattern(int request, CharSequence message, CharSequence details) {
         if (!mLockPatternUtils.isLockPatternEnabled() || !mLockPatternUtils.savedPatternExists()) {
             return false;
         }
         final Intent intent = new Intent();
+        // supply header and footer text in the intent
+        intent.putExtra(ConfirmLockPattern.HEADER_TEXT, message);
+        intent.putExtra(ConfirmLockPattern.FOOTER_TEXT, details);
         intent.setClassName("com.android.settings", "com.android.settings.ConfirmLockPattern");
         mActivity.startActivityForResult(intent, request);
         return true;
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 7e408d1..4de0e44 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -69,19 +69,16 @@
         };
 
     /**
-     *  Keyguard validation is run using the standard {@link ConfirmLockPattern}
+     * Keyguard validation is run using the standard {@link ConfirmLockPattern}
      * component as a subactivity
+     * @param request the request code to be returned once confirmation finishes
+     * @return true if confirmation launched
      */
-    private void runKeyguardConfirmation() {
-        final Intent intent = new Intent();
-        intent.setClassName("com.android.settings",
-                "com.android.settings.ConfirmLockPattern");
-        // supply header and footer text in the intent
-        intent.putExtra(ConfirmLockPattern.HEADER_TEXT,
-                getText(R.string.master_clear_gesture_prompt));
-        intent.putExtra(ConfirmLockPattern.FOOTER_TEXT,
-                getText(R.string.master_clear_gesture_explanation));
-        startActivityForResult(intent, KEYGUARD_REQUEST);
+    private boolean runKeyguardConfirmation(int request) {
+        return new ChooseLockSettingsHelper(this)
+                .launchConfirmationActivity(request,
+                        getText(R.string.master_clear_gesture_prompt),
+                        getText(R.string.master_clear_gesture_explanation));
     }
 
     @Override
@@ -96,6 +93,8 @@
         // confirmation prompt; otherwise, go back to the initial state.
         if (resultCode == Activity.RESULT_OK) {
             establishFinalConfirmationState();
+        } else if (resultCode == Activity.RESULT_CANCELED) {
+            finish();
         } else {
             establishInitialState();
         }
@@ -108,9 +107,7 @@
      */
     private Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
             public void onClick(View v) {
-                if (mLockUtils.isLockPatternEnabled()) {
-                    runKeyguardConfirmation();
-                } else {
+                if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
                     establishFinalConfirmationState();
                 }
             }
diff --git a/src/com/android/settings/MediaFormat.java b/src/com/android/settings/MediaFormat.java
index 075534d..b78ff62 100644
--- a/src/com/android/settings/MediaFormat.java
+++ b/src/com/android/settings/MediaFormat.java
@@ -88,16 +88,11 @@
      *  Keyguard validation is run using the standard {@link ConfirmLockPattern}
      * component as a subactivity
      */
-    private void runKeyguardConfirmation() {
-        final Intent intent = new Intent();
-        intent.setClassName("com.android.settings",
-                "com.android.settings.ConfirmLockPattern");
-        // supply header and footer text in the intent
-        intent.putExtra(ConfirmLockPattern.HEADER_TEXT,
-                getText(R.string.media_format_gesture_prompt));
-        intent.putExtra(ConfirmLockPattern.FOOTER_TEXT,
-                getText(R.string.media_format_gesture_explanation));
-        startActivityForResult(intent, KEYGUARD_REQUEST);
+    private boolean runKeyguardConfirmation(int request) {
+        return new ChooseLockSettingsHelper(this)
+                .launchConfirmationActivity(request,
+                        getText(R.string.media_format_gesture_prompt),
+                        getText(R.string.media_format_gesture_explanation));
     }
 
     @Override
@@ -112,6 +107,8 @@
         // confirmation prompt; otherwise, go back to the initial state.
         if (resultCode == Activity.RESULT_OK) {
             establishFinalConfirmationState();
+        } else if (resultCode == Activity.RESULT_CANCELED) {
+            finish();
         } else {
             establishInitialState();
         }
@@ -124,9 +121,7 @@
      */
     private Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
             public void onClick(View v) {
-                if (mLockUtils.isLockPatternEnabled()) {
-                    runKeyguardConfirmation();
-                } else {
+                if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
                     establishFinalConfirmationState();
                 }
             }