ChooseLockGeneric.java revision a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1
1abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn/*
2abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
4abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * you may not use this file except in compliance with the License.
6abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * You may obtain a copy of the License at
7abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
8abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
10abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * See the License for the specific language governing permissions and
14abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * limitations under the License.
15abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn */
16abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
17abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornpackage com.android.settings;
18abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
19524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.accessibilityservice.AccessibilityServiceInfo;
2017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Activity;
213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.AlertDialog;
223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.Dialog;
233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.DialogFragment;
2452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lamimport android.app.Fragment;
253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.FragmentManager;
264037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
27abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.content.DialogInterface;
29abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent;
30abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
3146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process;
32bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference;
33bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen;
34d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
35595982d2c34e6b84b7d08f1c3289535c60935830Jim Millerimport android.hardware.fingerprint.Fingerprint;
36595982d2c34e6b84b7d08f1c3289535c60935830Jim Millerimport android.hardware.fingerprint.FingerprintManager;
37595982d2c34e6b84b7d08f1c3289535c60935830Jim Millerimport android.hardware.fingerprint.FingerprintManager.RemovalCallback;
3827d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog;
393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.util.Log;
40524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager;
41d16c9b7c3100b7ba653dcd58db036500dd220896Jim Millerimport android.widget.Toast;
42d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
438a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
446465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
456465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne
46263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity {
470698a216311acd9ab52224602d1a75c08bf89f04Jim Miller    public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
48abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
49abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    @Override
5017e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
5117e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
5252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
5317e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
54a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
55a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
56a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
57a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
58a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true;
59a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
6017e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
61bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
6252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    /* package */ Class<? extends Fragment> getFragmentClass() {
6352c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        return ChooseLockGenericFragment.class;
6452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    }
6552c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam
6666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    public static class InternalActivity extends ChooseLockGeneric {
6766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    }
6866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani
6917e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
703fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final String TAG = "ChooseLockGenericFragment";
7117e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int MIN_PASSWORD_LENGTH = 4;
7217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
7317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
7417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
7517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
7617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
7717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String PASSWORD_CONFIRMED = "password_confirmed";
7847f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
79d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
803fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs";
8146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
8246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog";
8417e9e1933055b207473b488595b2887bfcaea32eJim Miller
853fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CONFIRM_EXISTING_REQUEST = 100;
863fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int ENABLE_ENCRYPTION_REQUEST = 101;
873fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CHOOSE_LOCK_REQUEST = 102;
8880412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
8917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
9017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private DevicePolicyManager mDPM;
91d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private KeyStore mKeyStore;
9217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
9347f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
9446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private int mEncryptionRequestQuality;
9546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private boolean mEncryptionRequestDisabled;
960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private boolean mRequirePassword;
97a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private String mUserPassword;
980698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private LockPatternUtils mLockPatternUtils;
999218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private FingerprintManager mFingerprintManager;
100d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller        private RemovalCallback mRemovalCallback = new RemovalCallback() {
101d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
102d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            @Override
103d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            public void onRemovalSucceeded(Fingerprint fingerprint) {
104d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller                Log.v(TAG, "Fingerprint removed: " + fingerprint.getFingerId());
105d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            }
106d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
107d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            @Override
108d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
109d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller                Toast.makeText(getActivity(), errString, Toast.LENGTH_SHORT);
110d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            }
111d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller        };
11217e9e1933055b207473b488595b2887bfcaea32eJim Miller
11317e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
1148a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        protected int getMetricsCategory() {
1158a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren            return MetricsLogger.CHOOSE_LOCK_GENERIC;
1168a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        }
1178a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1188a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        @Override
11917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
12017e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
12117e9e1933055b207473b488595b2887bfcaea32eJim Miller
1229218687e4baaf0226ef16b58f78123d979711e5dJim Miller            mFingerprintManager =
1239218687e4baaf0226ef16b58f78123d979711e5dJim Miller                (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
12417e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
125d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
12617e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
1270698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
12817e9e1933055b207473b488595b2887bfcaea32eJim Miller
129c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
130c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
131c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
13266026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
13366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                mPasswordConfirmed = !confirmCredentials;
13466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
135c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
13617e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState != null) {
13717e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
13847f1cd4325e839dd33273a451fa052e83789e483Jim Miller                mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
13946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
14046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
14146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                        ENCRYPT_REQUESTED_DISABLED);
14217e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
143bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
14447f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
14547f1cd4325e839dd33273a451fa052e83789e483Jim Miller                updatePreferencesOrFinish();
14647f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
1476370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
1486370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
1498a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
150a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                        getString(R.string.unlock_set_unlock_launch_picker_title), true)) {
15117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
15217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updatePreferencesOrFinish();
15347f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
15447f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
15517e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
156bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
157bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
158bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
159c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        @Override
16017e9e1933055b207473b488595b2887bfcaea32eJim Miller        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
16117e9e1933055b207473b488595b2887bfcaea32eJim Miller                Preference preference) {
16217e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
16327d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
1643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure()) {
1653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // Show the disabling FRP warning only when the user is switching from a secure
1663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // unlock method to an insecure one
1673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                showFactoryResetProtectionWarningDialog(key);
1683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return true;
16917e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
1703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return setUnlockMethod(key);
17117e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
172bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
173bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
17446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        /**
17546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * If the device has encryption already enabled, then ask the user if they
17646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * also want to encrypt the phone with this password.
17746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         *
17846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param quality
17946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param disabled
18046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         */
181a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // TODO: why does this take disabled, its always called with a quality higher than
182a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // what makes sense with disabled == true
18346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private void maybeEnableEncryption(int quality, boolean disabled) {
18446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
18546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = quality;
18646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = disabled;
187ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final Context context = getActivity();
1880698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // If accessibility is enabled and the user hasn't seen this dialog before, set the
1890698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // default state to agree with that which is compatible with accessibility
1900698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // (password not required).
191ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
1920698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
193ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                Intent intent = getEncryptionInterstitialIntent(context, quality, required);
19446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
19546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else {
1960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = false; // device encryption not enabled or not device owner.
19746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(quality, disabled);
19846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            }
19946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        }
20046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
20117e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
20217e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
20317e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
20447f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
20517e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
20617e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
207a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
20817e9e1933055b207473b488595b2887bfcaea32eJim Miller                updatePreferencesOrFinish();
20946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else if (requestCode == ENABLE_ENCRYPTION_REQUEST
21046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                    && resultCode == Activity.RESULT_OK) {
2110698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = data.getBooleanExtra(
2120698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                        EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
21346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled);
2149066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam            } else if (requestCode == CHOOSE_LOCK_REQUEST) {
2159066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                getActivity().setResult(resultCode, data);
2169066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                finish();
21717e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
21817e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
21917e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
22017e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
221bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
222bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
22317e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
22417e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
22517e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
22617e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
22717e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
22847f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
22946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
23046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
23117e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
232bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
23317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void updatePreferencesOrFinish() {
2345541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
2355541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
23617e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
2376370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
2385541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
239f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                quality = upgradeQuality(quality);
2403fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                final boolean hideDisabledPrefs = intent.getBooleanExtra(
2413fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                        HIDE_DISABLED_PREFS, false);
24217e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
24317e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
24417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
24517e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
24617e9e1933055b207473b488595b2887bfcaea32eJim Miller                addPreferencesFromResource(R.xml.security_settings_picker);
2473fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                disableUnusablePreferences(quality, hideDisabledPrefs);
2489a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                updateCurrentPreference();
249524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                updatePreferenceSummaryIfNeeded();
25017e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
25117e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateUnlockMethodAndFinish(quality, false);
252bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
253abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
254bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
2559a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private void updateCurrentPreference() {
2569a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            String currentKey = getKeyForCurrent();
2579a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            Preference preference = findPreference(currentKey);
2589a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            if (preference != null) {
2599a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                preference.setSummary(R.string.current_screen_lock);
2609a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
2619a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
2629a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
2639a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private String getKeyForCurrent() {
2649a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            if (mLockPatternUtils.isLockScreenDisabled()) {
2659a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                return KEY_UNLOCK_SET_OFF;
2669a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
2679a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
2689a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
2699a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PATTERN;
2709a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
2719a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
2729a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PIN;
2739a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
2749a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
2759a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PASSWORD;
2769a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
2779a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_NONE;
2789a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
2799a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            return null;
2809a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
2819a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
282f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        /** increases the quality if necessary */
283f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        private int upgradeQuality(int quality) {
284d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForDPM(quality);
285d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForKeyStore(quality);
286b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence            return quality;
287d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
288d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
289d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForDPM(int quality) {
290d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            // Compare min allowed password quality
291d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            int minQuality = mDPM.getPasswordQuality(null);
292d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (quality < minQuality) {
293d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                quality = minQuality;
294d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
295d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
296d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
297d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
298d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForKeyStore(int quality) {
299d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (!mKeyStore.isEmpty()) {
300d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) {
301d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                    quality = CredentialStorage.MIN_PASSWORD_QUALITY;
3026370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                }
3036370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            }
3046370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            return quality;
3056370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler        }
3066370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler
30717e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
308df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * Disables preferences that are less secure than required quality. The actual
309df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * implementation is in disableUnusablePreferenceImpl.
310df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         *
311df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param quality the requested quality.
3123fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise
3133fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * they're not shown at all.
314df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         */
3153fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) {
3163fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            disableUnusablePreferencesImpl(quality, hideDisabledPrefs);
317df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        }
318df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
319df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        /***
32017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
32117e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
32217e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
323df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param hideDisabled whether to hide disable screen lock options.
32417e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
325df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        protected void disableUnusablePreferencesImpl(final int quality,
326f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                boolean hideDisabled) {
327cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
328783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
329cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
330cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Preference pref = entries.getPreference(i);
33117e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (pref instanceof PreferenceScreen) {
332591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                    final String key = pref.getKey();
33317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean enabled = true;
3345541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    boolean visible = true;
335cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
33617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
33717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
33817e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
33917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
34017e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
34117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
3428fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
34317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
34417e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
34517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
346df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    if (hideDisabled) {
347591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                        visible = enabled;
348df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    }
349f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                    if (!visible) {
350cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
3515541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
35217e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
35317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
35417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
355bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
356bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
357bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
358bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
359524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        private void updatePreferenceSummaryIfNeeded() {
36040ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            if (LockPatternUtils.isDeviceEncrypted()) {
36140ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav                return;
36240ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            }
36340ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav
364524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
365524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
366524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                return;
367524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
368524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
369524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            CharSequence summary = getString(R.string.secure_lock_encryption_warning);
370524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
371524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            PreferenceScreen screen = getPreferenceScreen();
372524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            final int preferenceCount = screen.getPreferenceCount();
373524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            for (int i = 0; i < preferenceCount; i++) {
374524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                Preference preference = screen.getPreference(i);
375524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                switch (preference.getKey()) {
376524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PATTERN:
377524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PIN:
378524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PASSWORD: {
379524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                        preference.setSummary(summary);
380524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    } break;
381524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                }
382524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
383524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        }
384524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
3856b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality,
386f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                int minLength, final int maxLength,
3876b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                boolean requirePasswordToDecrypt, boolean confirmCredentials) {
388f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPassword.createIntent(context, quality, minLength,
3896b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                    maxLength, requirePasswordToDecrypt, confirmCredentials);
3906b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
3916b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
392a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // SetupWizard version will not need this as they will never be changing a password
393a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // TODO: confirm
394a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private Intent getLockPasswordIntent(Context context, int quality, int minLength,
395a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                final int maxLength, boolean requirePasswordToDecrypt, String password) {
396a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
397a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                    requirePasswordToDecrypt, password);
398a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
399a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
400f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
401f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                final boolean confirmCredentials) {
402f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPattern.createIntent(context, requirePassword,
4036b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                    confirmCredentials);
4046b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
4056b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
406a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // SetupWizard version will not need this as they will never be changing a password
407a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // TODO: confirm
408a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private Intent getLockPatternIntent(Context context, final boolean requirePassword,
409a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                final String pattern) {
410a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            return ChooseLockPattern.createIntent(context, requirePassword, pattern);
411a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
412a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
413ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
414ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                boolean required) {
415ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam            return EncryptionInterstitial.createStartIntent(context, quality, required);
416ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        }
417ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam
4185541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
41917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
42017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
42117e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
42217e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
4236370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
42417e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
42517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
42617e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
42717e9e1933055b207473b488595b2887bfcaea32eJim Miller        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
4286370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
42917e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
4306370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
43117e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
432bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
433f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            quality = upgradeQuality(quality);
434c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
4356b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam            final Context context = getActivity();
43617e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
43717e9e1933055b207473b488595b2887bfcaea32eJim Miller                int minLength = mDPM.getPasswordMinimumLength(null);
43817e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
43917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
44017e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
44117e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
442f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                Intent intent = getLockPasswordIntent(context, quality, minLength,
443a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                        maxLength, mRequirePassword, mUserPassword);
4449066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
44517e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
446f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                Intent intent = getLockPatternIntent(context, mRequirePassword,
447a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                        mUserPassword);
4489066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
44917e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
450f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                mChooseLockSettingsHelper.utils().clearLock();
45117e9e1933055b207473b488595b2887bfcaea32eJim Miller                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
4529218687e4baaf0226ef16b58f78123d979711e5dJim Miller                removeAllFingerprintTemplates();
45317e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_OK);
454c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
455c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            } else {
4569218687e4baaf0226ef16b58f78123d979711e5dJim Miller                removeAllFingerprintTemplates();
457c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
45817e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
459abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
460b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
4619218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private void removeAllFingerprintTemplates() {
462d52b577d490bfd87c8ffe2e519ad2e1f51104d87Jim Miller            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
463d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller                mFingerprintManager.remove(new Fingerprint(null, 0, 0, 0), mRemovalCallback);
4649218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
4659218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
4669218687e4baaf0226ef16b58f78123d979711e5dJim Miller
4679218687e4baaf0226ef16b58f78123d979711e5dJim Miller        @Override
4689218687e4baaf0226ef16b58f78123d979711e5dJim Miller        public void onDestroy() {
4699218687e4baaf0226ef16b58f78123d979711e5dJim Miller            super.onDestroy();
4709218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
4719218687e4baaf0226ef16b58f78123d979711e5dJim Miller
472b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
473b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
474b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
475b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
476b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
4773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private int getResIdForFactoryResetProtectionWarningTitle() {
4783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
4793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
4803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_pattern_summary;
4813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
4823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
4833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_pin_summary;
4843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
4853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
4863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
4873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_password_summary;
4883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                default:
4893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_unknown_summary;
4903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
4913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
4923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean isUnlockMethodSecure(String unlockMethod) {
4943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) ||
4953bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    KEY_UNLOCK_SET_NONE.equals(unlockMethod));
4963bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
4973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean setUnlockMethod(String unlockMethod) {
4993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod);
5003bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) {
5023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
5033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ );
5043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) {
5053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
5063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ );
5073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) {
5083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
5093bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
5103bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) {
5113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
5123bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
5133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) {
5143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
5153bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
5163bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else {
5173bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod);
5183bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return false;
5193bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5203bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return true;
5213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
5223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
5243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            int title = getResIdForFactoryResetProtectionWarningTitle();
5253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            FactoryResetProtectionWarningDialog dialog =
5263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    FactoryResetProtectionWarningDialog.newInstance(title, unlockMethodToSet);
5273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
5283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
5293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static class FactoryResetProtectionWarningDialog extends DialogFragment {
5313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_TITLE_RES = "titleRes";
5333bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
5343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public static FactoryResetProtectionWarningDialog newInstance(int title,
5363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    String unlockMethodToSet) {
5373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                FactoryResetProtectionWarningDialog frag =
5383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        new FactoryResetProtectionWarningDialog();
5393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Bundle args = new Bundle();
5403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putInt(ARG_TITLE_RES, title);
5413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
5423bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                frag.setArguments(args);
5433bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return frag;
5443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5463bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
5473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public void show(FragmentManager manager, String tag) {
5483bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                if (manager.findFragmentByTag(tag) == null) {
5493bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    // Prevent opening multiple dialogs if tapped on button quickly
5503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    super.show(manager, tag);
5513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                }
5523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
5553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public Dialog onCreateDialog(Bundle savedInstanceState) {
5563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                final Bundle args = getArguments();
5573bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return new AlertDialog.Builder(getActivity())
5593bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setTitle(args.getInt(ARG_TITLE_RES))
5603bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setMessage(R.string.unlock_disable_frp_warning_content)
5613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setPositiveButton(R.string.okay,
5623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
5633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
5643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
5653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        ((ChooseLockGenericFragment) getParentFragment())
5663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                .setUnlockMethod(
5673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                        args.getString(ARG_UNLOCK_METHOD_TO_SET));
5683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
5693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
5703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
5713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setNegativeButton(R.string.cancel,
5723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
5733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
5743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
5753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        dismiss();
5763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
5773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
5783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
5793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .create();
5803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
582abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
583abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
584