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
172eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lampackage com.android.settings.password;
18abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
194fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD;
204fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PASSWORD;
212eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam
222eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport static com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED;
234fdcec71dce130be3363dba93e685789797fee8eSteven Ng
24524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.accessibilityservice.AccessibilityServiceInfo;
2517e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Activity;
263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.AlertDialog;
273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.Dialog;
2852c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lamimport android.app.Fragment;
293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.FragmentManager;
304037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
31abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
32abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent;
33751de372750336c2dbc6ed656de84b881ede0858Ricky Waiimport android.content.pm.UserInfo;
3439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.Fingerprint;
3539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager;
3639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager.RemovalCallback;
37abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
385437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roosimport android.os.UserHandle;
39f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chenimport android.os.UserManager;
4023c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrenceimport android.os.storage.StorageManager;
41d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
42edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lamimport android.support.annotation.StringRes;
4339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
4439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
4562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roosimport android.text.TextUtils;
4627d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog;
473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.util.Log;
48524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager;
494fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport android.widget.TextView;
50d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
51265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
526465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
532eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.EncryptionInterstitial;
542eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.EventLogTags;
552eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.R;
562eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.SettingsActivity;
572eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.SettingsPreferenceFragment;
582eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.Utils;
59ac5e5932233eb4b485bd76087987182009be2c2fFan Zhangimport com.android.settings.core.instrumentation.InstrumentedDialogFragment;
604fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport com.android.settings.fingerprint.FingerprintEnrollBase;
614fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport com.android.settings.fingerprint.FingerprintEnrollFindSensor;
629c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
632eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
649c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedPreference;
659c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka
66751de372750336c2dbc6ed656de84b881ede0858Ricky Waiimport java.util.List;
67751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
68263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity {
690698a216311acd9ab52224602d1a75c08bf89f04Jim Miller    public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
70abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
71abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    @Override
7217e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
7317e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
7452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
7592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini
7692779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        String action = modIntent.getAction();
774fdcec71dce130be3363dba93e685789797fee8eSteven Ng        if (ACTION_SET_NEW_PASSWORD.equals(action)
784fdcec71dce130be3363dba93e685789797fee8eSteven Ng                || ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(action)) {
7992779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            modIntent.putExtra(EXTRA_HIDE_DRAWER, true);
8092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        }
8117e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
82a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
83a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
84a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
85a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
86a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true;
87a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
8817e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
89bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
9052c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    /* package */ Class<? extends Fragment> getFragmentClass() {
9152c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        return ChooseLockGenericFragment.class;
9252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    }
9352c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam
9466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    public static class InternalActivity extends ChooseLockGeneric {
9566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    }
9666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani
9717e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
98edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
993fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final String TAG = "ChooseLockGenericFragment";
10017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int MIN_PASSWORD_LENGTH = 4;
1014fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private static final String KEY_SKIP_FINGERPRINT = "unlock_skip_fingerprint";
10217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String PASSWORD_CONFIRMED = "password_confirmed";
10347f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
104d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
1053fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs";
10646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
10746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
1083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog";
10917e9e1933055b207473b488595b2887bfcaea32eJim Miller
110edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        /**
111edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * Boolean extra determining whether a "screen lock options" button should be shown. This
112edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * extra is both sent and received by ChooseLockGeneric.
113edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         *
114edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * When this extra is false, nothing will be done.
115edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * When ChooseLockGeneric receives this extra set as true, and if ChooseLockGeneric is
116edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * starting ChooseLockPassword or ChooseLockPattern automatically without user interaction,
117edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * ChooseLockGeneric will set this extra to true when starting ChooseLockPassword/Pattern.
118edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         *
119edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * This gives the user the choice to select a different screen lock type, even if
120edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * ChooseLockGeneric selected a default.
121edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         */
122edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        public static final String EXTRA_SHOW_OPTIONS_BUTTON = "show_options_button";
123edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
124edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        /**
125edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * Original intent extras used to start this activity. This is passed to ChooseLockPassword
126edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * when the "screen lock options" button is shown, so that when that button is clicked,
127edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * ChooseLockGeneric can be relaunched with the same extras.
128edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         */
129edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        public static final String EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS = "choose_lock_generic_extras";
130edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
1313fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CONFIRM_EXISTING_REQUEST = 100;
1323fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int ENABLE_ENCRYPTION_REQUEST = 101;
1333fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CHOOSE_LOCK_REQUEST = 102;
1344fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private static final int CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST = 103;
1354fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private static final int SKIP_FINGERPRINT_REQUEST = 104;
13680412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
13717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
13817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private DevicePolicyManager mDPM;
139d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private KeyStore mKeyStore;
1406609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private boolean mHasChallenge = false;
1416609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private long mChallenge;
14217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
14347f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
14446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private int mEncryptionRequestQuality;
14546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private boolean mEncryptionRequestDisabled;
14662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private boolean mForChangeCredRequiredForBoot = false;
147a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private String mUserPassword;
1480698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private LockPatternUtils mLockPatternUtils;
1499218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private FingerprintManager mFingerprintManager;
150fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri        private int mUserId;
15192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        private boolean mHideDrawer = false;
152e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        private ManagedLockPasswordProvider mManagedPasswordProvider;
1534fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private boolean mIsSetNewPassword = false;
154ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn        private UserManager mUserManager;
155edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        private ChooseLockGenericController mController;
15617e9e1933055b207473b488595b2887bfcaea32eJim Miller
1578ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected boolean mForFingerprint = false;
1588ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
15917e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
1606507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang        public int getMetricsCategory() {
1619d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren            return MetricsEvent.CHOOSE_LOCK_GENERIC;
1628a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        }
1638a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1648a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        @Override
16517e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
16617e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
16717e9e1933055b207473b488595b2887bfcaea32eJim Miller
1684fdcec71dce130be3363dba93e685789797fee8eSteven Ng            String chooseLockAction = getActivity().getIntent().getAction();
169ab50807d1edacb4fca5447525bb5270a853eaafcJeff Sharkey            mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity());
17017e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
171d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
17217e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
1730698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
1744fdcec71dce130be3363dba93e685789797fee8eSteven Ng            mIsSetNewPassword = ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(chooseLockAction)
1754fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    || ACTION_SET_NEW_PASSWORD.equals(chooseLockAction);
17617e9e1933055b207473b488595b2887bfcaea32eJim Miller
177c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
178c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
179c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
18066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
18166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                mPasswordConfirmed = !confirmCredentials;
18240e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                mUserPassword = getActivity().getIntent().getStringExtra(
18340e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                        ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
18466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
18592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false);
186c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
1876609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mHasChallenge = getActivity().getIntent().getBooleanExtra(
1886609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
1896609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mChallenge = getActivity().getIntent().getLongExtra(
1906609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
191c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam            mForFingerprint = getActivity().getIntent().getBooleanExtra(
192c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
19362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mForChangeCredRequiredForBoot = getArguments() != null && getArguments().getBoolean(
19462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT);
195ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn            mUserManager = UserManager.get(getActivity());
1966609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
19717e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState != null) {
19817e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
19947f1cd4325e839dd33273a451fa052e83789e483Jim Miller                mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
20046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
20146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
20246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                        ENCRYPT_REQUESTED_DISABLED);
20340e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                if (mUserPassword == null) {
20440e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                    mUserPassword = savedInstanceState.getString(
20540e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                            ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
20640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                }
20717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
208bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
2098f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            // a) If this is started from other user, use that user id.
2108f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            // b) If this is started from the same user, read the extra if this is launched
2118f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            //    from Settings app itself.
2128f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            // c) Otherwise, use UserHandle.myUserId().
2138f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            mUserId = Utils.getSecureTargetUser(
214ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    getActivity().getActivityToken(),
215ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    UserManager.get(getActivity()),
2168f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                    getArguments(),
217ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    getActivity().getIntent().getExtras()).getIdentifier();
218edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            mController = new ChooseLockGenericController(getContext(), mUserId);
2194fdcec71dce130be3363dba93e685789797fee8eSteven Ng            if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction)
220788671647c6d615684d159a94ffb5b4367df6896Robin Lee                    && UserManager.get(getActivity()).isManagedProfile(mUserId)
221bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                    && mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {
222bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                getActivity().setTitle(R.string.lock_settings_picker_title_profile);
223bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra            }
224bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra
225e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            mManagedPasswordProvider = ManagedLockPasswordProvider.get(getActivity(), mUserId);
226e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
22747f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
2282bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam                updatePreferencesOrFinish(savedInstanceState != null);
22962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
23062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    maybeEnableEncryption(mLockPatternUtils.getKeyguardStoredPasswordQuality(
23162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                            mUserId), false);
23262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
23347f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
2346370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
2356370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
236788671647c6d615684d159a94ffb5b4367df6896Robin Lee                boolean managedProfileWithUnifiedLock =
237788671647c6d615684d159a94ffb5b4367df6896Robin Lee                        UserManager.get(getActivity()).isManagedProfile(mUserId)
2384bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                        && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId);
2394bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                if (managedProfileWithUnifiedLock
2404bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                        || !helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
241fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                        getString(R.string.unlock_set_unlock_launch_picker_title), true, mUserId)) {
24217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
2432bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam                    updatePreferencesOrFinish(savedInstanceState != null);
24447f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
24547f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
24617e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
247bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
2488ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini            addHeaderView();
2498ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        }
2508ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
2518ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected void addHeaderView() {
25287fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            if (mForFingerprint) {
25339b467482d1bf256a111c757e9b7621c6f523271Jason Monk                setHeaderView(R.layout.choose_lock_generic_fingerprint_header);
2544fdcec71dce130be3363dba93e685789797fee8eSteven Ng                if (mIsSetNewPassword) {
2554fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    ((TextView) getHeaderView().findViewById(R.id.fingerprint_header_description))
2564fdcec71dce130be3363dba93e685789797fee8eSteven Ng                            .setText(R.string.fingerprint_unlock_title);
2574fdcec71dce130be3363dba93e685789797fee8eSteven Ng                }
25887fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            }
25987fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        }
26087fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam
26187fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        @Override
26239b467482d1bf256a111c757e9b7621c6f523271Jason Monk        public boolean onPreferenceTreeClick(Preference preference) {
26317e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
26427d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
265fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
2663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // Show the disabling FRP warning only when the user is switching from a secure
2673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // unlock method to an insecure one
2683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                showFactoryResetProtectionWarningDialog(key);
2693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return true;
2704fdcec71dce130be3363dba93e685789797fee8eSteven Ng            } else if (KEY_SKIP_FINGERPRINT.equals(key)) {
271436256c36d69549c77320d073bef27649c1b1d6eSteven Ng                Intent chooseLockGenericIntent = new Intent(getActivity(),
272436256c36d69549c77320d073bef27649c1b1d6eSteven Ng                    ChooseLockGeneric.InternalActivity.class);
2734fdcec71dce130be3363dba93e685789797fee8eSteven Ng                chooseLockGenericIntent.setAction(getIntent().getAction());
2748f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                // Forward the target user id to  ChooseLockGeneric.
2758f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                chooseLockGenericIntent.putExtra(Intent.EXTRA_USER_ID, mUserId);
276436256c36d69549c77320d073bef27649c1b1d6eSteven Ng                chooseLockGenericIntent.putExtra(CONFIRM_CREDENTIALS, !mPasswordConfirmed);
27740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                if (mUserPassword != null) {
27840e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                    chooseLockGenericIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD,
27940e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                            mUserPassword);
28040e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                }
2814fdcec71dce130be3363dba93e685789797fee8eSteven Ng                startActivityForResult(chooseLockGenericIntent, SKIP_FINGERPRINT_REQUEST);
2824fdcec71dce130be3363dba93e685789797fee8eSteven Ng                return true;
28317e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
2843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return setUnlockMethod(key);
28517e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
286bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
287bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
28846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        /**
28946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * If the device has encryption already enabled, then ask the user if they
29046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * also want to encrypt the phone with this password.
29146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         *
29246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param quality
29346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param disabled
29446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         */
295a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // TODO: why does this take disabled, its always called with a quality higher than
296a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // what makes sense with disabled == true
29746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private void maybeEnableEncryption(int quality, boolean disabled) {
298146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov            DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
299f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen            if (UserManager.get(getActivity()).isAdminUser()
30093bcfcb14d42ea0884b922ae1a4d84a6955ed835Clara Bayarri                    && mUserId == UserHandle.myUserId()
301f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen                    && LockPatternUtils.isDeviceEncryptionEnabled()
302fb4c583dba1fb8885ff9369bdab916eaa61b42bdPaul Lawrence                    && !LockPatternUtils.isFileEncryptionEnabled()
303146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov                    && !dpm.getDoNotAskCredentialsOnBoot()) {
30446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = quality;
30546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = disabled;
306edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // Get the intent that the encryption interstitial should start for creating
307edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // the new unlock method.
3082eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                Intent unlockMethodIntent = getIntentForUnlockMethod(quality);
30962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                unlockMethodIntent.putExtra(
31062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT,
31162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        mForChangeCredRequiredForBoot);
312ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final Context context = getActivity();
3130698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // If accessibility is enabled and the user hasn't seen this dialog before, set the
3140698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // default state to agree with that which is compatible with accessibility
3150698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // (password not required).
316ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
3170698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
318edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                Intent intent = getEncryptionInterstitialIntent(context, quality, required,
319edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                        unlockMethodIntent);
320c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
321c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                        mForFingerprint);
32292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini                intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer);
323378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                startActivityForResult(
324378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                        intent,
325378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                        mIsSetNewPassword && mHasChallenge
326378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
327378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                                : ENABLE_ENCRYPTION_REQUEST);
32846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else {
32962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
33062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    // Welp, couldn't change it. Oh well.
33162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    finish();
33262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    return;
33362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
334edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                updateUnlockMethodAndFinish(quality, disabled, false /* chooseLockSkipped */);
33546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            }
33646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        }
33746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
33817e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
33917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
34017e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
34147f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
34217e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
34317e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
344a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
3452bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam                updatePreferencesOrFinish(false /* isRecreatingActivity */);
34662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
34762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    if (!TextUtils.isEmpty(mUserPassword)) {
34862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        maybeEnableEncryption(
34962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                                mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId), false);
35062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    } else {
35162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        finish();
35262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    }
35362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
354e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam            } else if (requestCode == CHOOSE_LOCK_REQUEST
355e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    || requestCode == ENABLE_ENCRYPTION_REQUEST) {
35677181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos                if (resultCode != RESULT_CANCELED || mForChangeCredRequiredForBoot) {
357e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    getActivity().setResult(resultCode, data);
358e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    finish();
359edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                } else {
360edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    // If PASSWORD_TYPE_KEY is set, this activity is used as a trampoline to start
361edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    // the actual password enrollment. If the result is canceled, which means the
362edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    // user pressed back, finish the activity with result canceled.
363edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    int quality = getIntent().getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
364edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    if (quality != -1) {
365edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        getActivity().setResult(RESULT_CANCELED, data);
366edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        finish();
367edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    }
368e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                }
3694fdcec71dce130be3363dba93e685789797fee8eSteven Ng            } else if (requestCode == CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
3704fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    && resultCode == FingerprintEnrollBase.RESULT_FINISHED) {
371d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini                Intent intent = getFindSensorIntent(getActivity());
3724fdcec71dce130be3363dba93e685789797fee8eSteven Ng                if (data != null) {
3734fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    intent.putExtras(data.getExtras());
3744fdcec71dce130be3363dba93e685789797fee8eSteven Ng                }
3758f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                // Forward the target user id to fingerprint setup page.
3768f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
3774fdcec71dce130be3363dba93e685789797fee8eSteven Ng                startActivity(intent);
3784fdcec71dce130be3363dba93e685789797fee8eSteven Ng                finish();
3794fdcec71dce130be3363dba93e685789797fee8eSteven Ng            } else if (requestCode == SKIP_FINGERPRINT_REQUEST) {
3804fdcec71dce130be3363dba93e685789797fee8eSteven Ng                if (resultCode != RESULT_CANCELED) {
3814fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    getActivity().setResult(
3824fdcec71dce130be3363dba93e685789797fee8eSteven Ng                            resultCode == RESULT_FINISHED ? RESULT_OK : resultCode, data);
3834fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    finish();
3844fdcec71dce130be3363dba93e685789797fee8eSteven Ng                }
38517e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
38617e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
38717e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
38817e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
38962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (requestCode == Activity.RESULT_CANCELED && mForChangeCredRequiredForBoot) {
39062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                finish();
39162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
392bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
393bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
394d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini        protected Intent getFindSensorIntent(Context context) {
395d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini            return new Intent(context, FingerprintEnrollFindSensor.class);
396d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini        }
397d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini
39817e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
39917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
40017e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
40117e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
40217e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
40347f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
40446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
40546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
40640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov            if (mUserPassword != null) {
40740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov                outState.putString(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, mUserPassword);
40840e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov            }
40917e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
410bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
4112bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam        private void updatePreferencesOrFinish(boolean isRecreatingActivity) {
4125541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
4135541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
41417e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
4156370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
4165541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
417edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                quality = mController.upgradeQuality(quality);
4183fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                final boolean hideDisabledPrefs = intent.getBooleanExtra(
4193fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                        HIDE_DISABLED_PREFS, false);
42017e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
42117e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
42217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
42317e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
4248ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini                addPreferences();
4253fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                disableUnusablePreferences(quality, hideDisabledPrefs);
426bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                updatePreferenceText();
4279a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                updateCurrentPreference();
428524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                updatePreferenceSummaryIfNeeded();
4292bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam            } else if (!isRecreatingActivity) {
4302bb62380449da124cd36fac80d6072ad6c4d0592Maurice Lam                // Don't start the activity again if we are recreated for configuration change
431edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                updateUnlockMethodAndFinish(quality, false, true /* chooseLockSkipped */);
432bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
433abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
434bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
4358ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected void addPreferences() {
4368ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini            addPreferencesFromResource(R.xml.security_settings_picker);
437a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey
438a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            // Used for testing purposes
439edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            findPreference(ScreenLockType.NONE.preferenceKey).setViewId(R.id.lock_none);
440159dff63a5e8e1286f0d42d400b64d43fb104649Jeff Sharkey            findPreference(KEY_SKIP_FINGERPRINT).setViewId(R.id.lock_none);
441edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            findPreference(ScreenLockType.PIN.preferenceKey).setViewId(R.id.lock_pin);
442edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            findPreference(ScreenLockType.PASSWORD.preferenceKey).setViewId(R.id.lock_password);
4438ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        }
4448ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
445bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini        private void updatePreferenceText() {
446bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini            if (mForFingerprint) {
447edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                setPreferenceTitle(ScreenLockType.PATTERN,
448edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        R.string.fingerprint_unlock_set_unlock_pattern);
449edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                setPreferenceTitle(ScreenLockType.PIN, R.string.fingerprint_unlock_set_unlock_pin);
450edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                setPreferenceTitle(ScreenLockType.PASSWORD,
451edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        R.string.fingerprint_unlock_set_unlock_password);
452bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini            }
453e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
454e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            if (mManagedPasswordProvider.isSettingManagedPasswordSupported()) {
455edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                setPreferenceTitle(ScreenLockType.MANAGED,
456edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        mManagedPasswordProvider.getPickerOptionTitle(mForFingerprint));
457e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else {
458edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                removePreference(ScreenLockType.MANAGED.preferenceKey);
459e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            }
4604fdcec71dce130be3363dba93e685789797fee8eSteven Ng
4614fdcec71dce130be3363dba93e685789797fee8eSteven Ng            if (!(mForFingerprint && mIsSetNewPassword)) {
4624fdcec71dce130be3363dba93e685789797fee8eSteven Ng                removePreference(KEY_SKIP_FINGERPRINT);
4634fdcec71dce130be3363dba93e685789797fee8eSteven Ng            }
464bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini        }
465bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini
466edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        private void setPreferenceTitle(ScreenLockType lock, @StringRes int title) {
467edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            Preference preference = findPreference(lock.preferenceKey);
468edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            if (preference != null) {
469edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                preference.setTitle(title);
470edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            }
471edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        }
472edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
473edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        private void setPreferenceTitle(ScreenLockType lock, CharSequence title) {
474edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            Preference preference = findPreference(lock.preferenceKey);
475edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            if (preference != null) {
476edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                preference.setTitle(title);
477edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            }
478edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        }
479edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
480edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        private void setPreferenceSummary(ScreenLockType lock, @StringRes int summary) {
481edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            Preference preference = findPreference(lock.preferenceKey);
482edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            if (preference != null) {
483edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                preference.setSummary(summary);
484edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            }
485edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        }
486edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
4879a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private void updateCurrentPreference() {
4889a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            String currentKey = getKeyForCurrent();
4899a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            Preference preference = findPreference(currentKey);
4909a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            if (preference != null) {
4919a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                preference.setSummary(R.string.current_screen_lock);
4929a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
4939a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
4949a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
4959a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private String getKeyForCurrent() {
496e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk            final int credentialOwner = UserManager.get(getContext())
497e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk                    .getCredentialOwnerProfile(mUserId);
4987402b2514358e02a0e0adde982b6deb8552dc28aClara Bayarri            if (mLockPatternUtils.isLockScreenDisabled(credentialOwner)) {
499edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                return ScreenLockType.NONE.preferenceKey;
5009a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
501edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            ScreenLockType lock =
502edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    ScreenLockType.fromQuality(
503edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                            mLockPatternUtils.getKeyguardStoredPasswordQuality(credentialOwner));
504edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            return lock != null ? lock.preferenceKey : null;
505d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
506d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
50717e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
508df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * Disables preferences that are less secure than required quality. The actual
509df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * implementation is in disableUnusablePreferenceImpl.
510df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         *
511df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param quality the requested quality.
5123fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise
5133fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * they're not shown at all.
514df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         */
5153fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) {
5163fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            disableUnusablePreferencesImpl(quality, hideDisabledPrefs);
517df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        }
518df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
519df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        /***
52017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
52117e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
52217e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
523df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param hideDisabled whether to hide disable screen lock options.
52417e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
525df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        protected void disableUnusablePreferencesImpl(final int quality,
526f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                boolean hideDisabled) {
527cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
528783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
52925c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak            int adminEnforcedQuality = mDPM.getPasswordQuality(null, mUserId);
5309c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka            EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
531f755baf1c3b8fcbcee68720c8367e03381fffb4bSudheer Shanka                    getActivity(), mUserId);
532edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam
533edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            for (ScreenLockType lock : ScreenLockType.values()) {
534edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                String key = lock.preferenceKey;
535edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                Preference pref = findPreference(key);
5369c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                if (pref instanceof RestrictedPreference) {
537edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    boolean visible = mController.isScreenLockVisible(lock);
538edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    boolean enabled = mController.isScreenLockEnabled(lock, quality);
539edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    boolean disabledByAdmin =
540edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                            mController.isScreenLockDisabledByAdmin(lock, adminEnforcedQuality);
541df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    if (hideDisabled) {
542edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        visible = visible && enabled;
543df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    }
544f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                    if (!visible) {
545cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
5469c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else if (disabledByAdmin && enforcedAdmin != null) {
5479c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(enforcedAdmin);
5485541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
5499c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // we need to setDisabledByAdmin to null first to disable the padlock
5509c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // in case it was set earlier.
5519c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
55217e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
55317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
5549c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else {
5559c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
55617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
557bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
558bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
559bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
560bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
561524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        private void updatePreferenceSummaryIfNeeded() {
56223c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            // On a default block encrypted device with accessibility, add a warning
56323c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            // that your data is not credential encrypted
56423c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            if (!StorageManager.isBlockEncrypted()) {
56523c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence                return;
56623c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            }
56723c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence
56823c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            if (StorageManager.isNonDefaultBlockEncrypted()) {
56940ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav                return;
57040ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            }
57140ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav
572524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
573524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
574524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                return;
575524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
576524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
577edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            setPreferenceSummary(ScreenLockType.PATTERN, R.string.secure_lock_encryption_warning);
578edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            setPreferenceSummary(ScreenLockType.PIN, R.string.secure_lock_encryption_warning);
579edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            setPreferenceSummary(ScreenLockType.PASSWORD, R.string.secure_lock_encryption_warning);
580edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            setPreferenceSummary(ScreenLockType.MANAGED, R.string.secure_lock_encryption_warning);
581524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        }
582524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
5832eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam        protected Intent getLockManagedPasswordIntent(String password) {
5842eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            return mManagedPasswordProvider.createIntent(false, password);
5856b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
5866b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
5872eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam        protected Intent getLockPasswordIntent(int quality, int minLength, int maxLength) {
5882eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            ChooseLockPassword.IntentBuilder builder =
5892eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                    new ChooseLockPassword.IntentBuilder(getContext())
5902eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                            .setPasswordQuality(quality)
5912eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                            .setPasswordLengthRange(minLength, maxLength)
592b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam                            .setForFingerprint(mForFingerprint)
5932eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                            .setUserId(mUserId);
5942eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            if (mHasChallenge) {
5952eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                builder.setChallenge(mChallenge);
59640e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov            }
59740e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov            if (mUserPassword != null) {
5982eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                builder.setPassword(mUserPassword);
5992eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            }
6002eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            return builder.build();
6016609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
6026609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
6032eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam        protected Intent getLockPatternIntent() {
6042eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            ChooseLockPattern.IntentBuilder builder =
6052eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                    new ChooseLockPattern.IntentBuilder(getContext())
606b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam                            .setForFingerprint(mForFingerprint)
6072eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                            .setUserId(mUserId);
6082eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            if (mHasChallenge) {
6092eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                builder.setChallenge(mChallenge);
61040e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov            }
61140e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov            if (mUserPassword != null) {
6122eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                builder.setPattern(mUserPassword);
6132eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            }
6142eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            return builder.build();
615a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
616a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
617ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
618edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                boolean required, Intent unlockMethodIntent) {
619edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return EncryptionInterstitial.createStartIntent(context, quality, required,
620edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                    unlockMethodIntent);
621ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        }
622ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam
6235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
62417e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
62517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
62617e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
62717e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
6286370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
62917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
630edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * @param chooseLockSkipped whether or not this activity is skipped. This is true when this
631edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * activity was not shown to the user at all, instead automatically proceeding based on
632edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam         * the given intent extras, typically {@link LockPatternUtils#PASSWORD_TYPE_KEY}.
63317e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
63417e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
635edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam        void updateUnlockMethodAndFinish(int quality, boolean disabled, boolean chooseLockSkipped) {
6366370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
63717e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
6386370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
63917e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
640bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
641edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            quality = mController.upgradeQuality(quality);
6422eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam            Intent intent = getIntentForUnlockMethod(quality);
643edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (intent != null) {
644edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                if (getIntent().getBooleanExtra(EXTRA_SHOW_OPTIONS_BUTTON, false)) {
645edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    intent.putExtra(EXTRA_SHOW_OPTIONS_BUTTON, chooseLockSkipped);
646edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                }
647edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                intent.putExtra(EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS, getIntent().getExtras());
6484fdcec71dce130be3363dba93e685789797fee8eSteven Ng                startActivityForResult(intent,
6494fdcec71dce130be3363dba93e685789797fee8eSteven Ng                        mIsSetNewPassword && mHasChallenge
6504fdcec71dce130be3363dba93e685789797fee8eSteven Ng                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
6514fdcec71dce130be3363dba93e685789797fee8eSteven Ng                                : CHOOSE_LOCK_REQUEST);
652edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                return;
653edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
654edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
655edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
6564bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true, mUserPassword);
65779b4ebffebb48449d5d2126795f6c729eea25ec4Rubin Xu                mChooseLockSettingsHelper.utils().clearLock(mUserPassword, mUserId);
658edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
659edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                getActivity().setResult(Activity.RESULT_OK);
6604fdcec71dce130be3363dba93e685789797fee8eSteven Ng                removeAllFingerprintForUserAndFinish(mUserId);
661edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            } else {
662751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                removeAllFingerprintForUserAndFinish(mUserId);
663edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
664edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini        }
665c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
6662eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam        private Intent getIntentForUnlockMethod(int quality) {
667edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            Intent intent = null;
668e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
6692eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                intent = getLockManagedPasswordIntent(mUserPassword);
670e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
67125c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak                int minLength = mDPM.getPasswordMinimumLength(null, mUserId);
67217e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
67317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
67417e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
67517e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
6762eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                intent = getLockPasswordIntent(quality, minLength, maxLength);
67717e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
6782eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam                intent = getLockPatternIntent();
67917e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
68092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            if (intent != null) {
68192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini                intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer);
68292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            }
683edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return intent;
684abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
685b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
686751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        private void removeAllFingerprintForUserAndFinish(final int userId) {
687dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
688dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                if (mFingerprintManager.hasEnrolledFingerprints(userId)) {
689dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    mFingerprintManager.setActiveUser(userId);
690dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    // For the purposes of M and N, groupId is the same as userId.
691dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    final int groupId = userId;
692dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    Fingerprint finger = new Fingerprint(null, groupId, 0, 0);
693dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    mFingerprintManager.remove(finger, userId,
694dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                            new RemovalCallback() {
695dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                @Override
696dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                public void onRemovalError(Fingerprint fp, int errMsgId,
697dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                        CharSequence errString) {
6987569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    Log.e(TAG, String.format(
6997569bb18815437a2f656fc7ff4d57274c5055477Charles He                                            "Can't remove fingerprint %d in group %d. Reason: %s",
7007569bb18815437a2f656fc7ff4d57274c5055477Charles He                                            fp.getFingerId(), fp.getGroupId(), errString));
7017569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    // TODO: need to proceed with the removal of managed profile
7027569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    // fingerprints and finish() gracefully.
703751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                }
704eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri
705dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                @Override
7067569bb18815437a2f656fc7ff4d57274c5055477Charles He                                public void onRemovalSucceeded(Fingerprint fp, int remaining) {
7077569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    if (remaining == 0) {
708dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                        removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
709dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                    }
710751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                }
711dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                            });
712dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                } else {
713dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    // No fingerprints in this user, we may also want to delete managed profile
714dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    // fingerprints
715dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
716dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                }
7175a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini            } else {
7185a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // The removal callback will call finish, once all fingerprints are removed.
7195a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // We need to wait for that to occur, otherwise, the UI will still show that
7205a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // fingerprints exist even though they are (about to) be removed depending on
7215a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // the race condition.
7225a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                finish();
7239218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
7249218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
7259218687e4baaf0226ef16b58f78123d979711e5dJim Miller
726751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        private void removeManagedProfileFingerprintsAndFinishIfNecessary(final int parentUserId) {
7278d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
7288d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey                mFingerprintManager.setActiveUser(UserHandle.myUserId());
7298d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            }
730751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            boolean hasChildProfile = false;
731ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn            if (!mUserManager.getUserInfo(parentUserId).isManagedProfile()) {
732751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                // Current user is primary profile, remove work profile fingerprints if necessary
733ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn                final List<UserInfo> profiles = mUserManager.getProfiles(parentUserId);
734751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                final int profilesSize = profiles.size();
735751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                for (int i = 0; i < profilesSize; i++) {
736751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    final UserInfo userInfo = profiles.get(i);
737751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    if (userInfo.isManagedProfile() && !mLockPatternUtils
738751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                            .isSeparateProfileChallengeEnabled(userInfo.id)) {
739751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        removeAllFingerprintForUserAndFinish(userInfo.id);
740751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        hasChildProfile = true;
741751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        break;
742751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    }
743751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                }
744751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            }
745751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            if (!hasChildProfile) {
746751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                finish();
747751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            }
748751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        }
749751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
7509218687e4baaf0226ef16b58f78123d979711e5dJim Miller        @Override
7519218687e4baaf0226ef16b58f78123d979711e5dJim Miller        public void onDestroy() {
7529218687e4baaf0226ef16b58f78123d979711e5dJim Miller            super.onDestroy();
7539218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
7549218687e4baaf0226ef16b58f78123d979711e5dJim Miller
755b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
756b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
757b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
758b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
759b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
76034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        private int getResIdForFactoryResetProtectionWarningTitle() {
761788671647c6d615684d159a94ffb5b4367df6896Robin Lee            boolean isProfile = UserManager.get(getActivity()).isManagedProfile(mUserId);
76234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            return isProfile ? R.string.unlock_disable_frp_warning_title_profile
76334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    : R.string.unlock_disable_frp_warning_title;
76434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        }
76534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
76638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos        private int getResIdForFactoryResetProtectionWarningMessage() {
7678d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            final boolean hasFingerprints;
7688d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
7698d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey                hasFingerprints = mFingerprintManager.hasEnrolledFingerprints(mUserId);
7708d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            } else {
7718d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey                hasFingerprints = false;
7728d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            }
773788671647c6d615684d159a94ffb5b4367df6896Robin Lee            boolean isProfile = UserManager.get(getActivity()).isManagedProfile(mUserId);
774fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
7753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
77634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
77734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
77834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_pattern_fingerprint_profile;
77934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
78034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern_fingerprint;
78134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
78234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern_profile;
78334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
78434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern;
78534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
7863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
7873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
78834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
78934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint_profile;
79034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
79134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint;
79234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
79334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_profile;
79434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
79534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin;
79634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
7973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
7983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
7993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
800e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
80134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
80234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
80334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_password_fingerprint_profile;
80434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
80534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password_fingerprint;
80634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
80734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password_profile;
80834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
80934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password;
81034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
8113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                default:
81234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
81334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
81434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_unknown_fingerprint_profile;
81534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
81634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown_fingerprint;
81734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
81834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown_profile;
81934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
82034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown;
82134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
8223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean isUnlockMethodSecure(String unlockMethod) {
826edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            return !(ScreenLockType.SWIPE.preferenceKey.equals(unlockMethod) ||
827edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    ScreenLockType.NONE.preferenceKey.equals(unlockMethod));
8283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean setUnlockMethod(String unlockMethod) {
8313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod);
8323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
833edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            ScreenLockType lock = ScreenLockType.fromKey(unlockMethod);
834edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            if (lock != null) {
835edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                switch (lock) {
836edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    case NONE:
837edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    case SWIPE:
838edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        updateUnlockMethodAndFinish(
839edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                lock.defaultQuality,
840edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                lock == ScreenLockType.NONE,
841edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                false /* chooseLockSkipped */);
842edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        return true;
843edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    case PATTERN:
844edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    case PIN:
845edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    case PASSWORD:
846edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                    case MANAGED:
847edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        maybeEnableEncryption(lock.defaultQuality, false);
848edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        return true;
849edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                }
8503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
851edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod);
852edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam            return false;
8533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
85634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            int title = getResIdForFactoryResetProtectionWarningTitle();
85738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            int message = getResIdForFactoryResetProtectionWarningMessage();
8583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            FactoryResetProtectionWarningDialog dialog =
85934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    FactoryResetProtectionWarningDialog.newInstance(
86034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                            title, message, unlockMethodToSet);
8613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
8623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
864ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang        public static class FactoryResetProtectionWarningDialog extends InstrumentedDialogFragment {
8653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
86634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            private static final String ARG_TITLE_RES = "titleRes";
86738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            private static final String ARG_MESSAGE_RES = "messageRes";
8683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
8693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
87034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            public static FactoryResetProtectionWarningDialog newInstance(
87134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    int titleRes, int messageRes, String unlockMethodToSet) {
8723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                FactoryResetProtectionWarningDialog frag =
8733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        new FactoryResetProtectionWarningDialog();
8743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Bundle args = new Bundle();
87534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                args.putInt(ARG_TITLE_RES, titleRes);
87638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                args.putInt(ARG_MESSAGE_RES, messageRes);
8773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
8783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                frag.setArguments(args);
8793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return frag;
8803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
8833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public void show(FragmentManager manager, String tag) {
8843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                if (manager.findFragmentByTag(tag) == null) {
8853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    // Prevent opening multiple dialogs if tapped on button quickly
8863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    super.show(manager, tag);
8873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                }
8883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
8913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public Dialog onCreateDialog(Bundle savedInstanceState) {
8923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                final Bundle args = getArguments();
8933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return new AlertDialog.Builder(getActivity())
89534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        .setTitle(args.getInt(ARG_TITLE_RES))
89638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setMessage(args.getInt(ARG_MESSAGE_RES))
89738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setPositiveButton(R.string.unlock_disable_frp_warning_ok,
898edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                (dialog, whichButton) -> {
899edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                    String unlockMethod = args.getString(ARG_UNLOCK_METHOD_TO_SET);
900edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                    ((ChooseLockGenericFragment) getParentFragment())
901edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                            .setUnlockMethod(unlockMethod);
902edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                                })
903edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam                        .setNegativeButton(R.string.cancel, (dialog, whichButton) -> dismiss())
9043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .create();
9053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
906ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang
907ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang            @Override
908ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang            public int getMetricsCategory() {
909ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang                return MetricsEvent.DIALOG_FRP;
910ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang            }
9113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
912abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
913abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
914