ChooseLockGeneric.java revision 7569bb18815437a2f656fc7ff4d57274c5055477
1abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn/*
2abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
4abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * you may not use this file except in compliance with the License.
6abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * You may obtain a copy of the License at
7abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
8abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
10abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * See the License for the specific language governing permissions and
14abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * limitations under the License.
15abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn */
16abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
17abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornpackage com.android.settings;
18abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
194fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD;
204fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_SET_NEW_PASSWORD;
214fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport static com.android.settings.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED;
224fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
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;
323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.content.DialogInterface;
33abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent;
34751de372750336c2dbc6ed656de84b881ede0858Ricky Waiimport android.content.pm.UserInfo;
3539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.Fingerprint;
3639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager;
3739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager.RemovalCallback;
38abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
395437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roosimport android.os.UserHandle;
40f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chenimport android.os.UserManager;
4123c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrenceimport android.os.storage.StorageManager;
42d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
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;
53ac5e5932233eb4b485bd76087987182009be2c2fFan Zhangimport com.android.settings.core.instrumentation.InstrumentedDialogFragment;
544fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport com.android.settings.fingerprint.FingerprintEnrollBase;
554fdcec71dce130be3363dba93e685789797fee8eSteven Ngimport com.android.settings.fingerprint.FingerprintEnrollFindSensor;
569c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
579c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedPreference;
589c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka
59751de372750336c2dbc6ed656de84b881ede0858Ricky Waiimport java.util.List;
60751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
61263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity {
620698a216311acd9ab52224602d1a75c08bf89f04Jim Miller    public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
63abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
64abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    @Override
6517e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
6617e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
6752c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
6892779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini
6992779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        String action = modIntent.getAction();
704fdcec71dce130be3363dba93e685789797fee8eSteven Ng        if (ACTION_SET_NEW_PASSWORD.equals(action)
714fdcec71dce130be3363dba93e685789797fee8eSteven Ng                || ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(action)) {
7292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            modIntent.putExtra(EXTRA_HIDE_DRAWER, true);
7392779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        }
7417e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
75a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
76a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
77a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
78a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
79a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true;
80a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
8117e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
82bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
8352c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    /* package */ Class<? extends Fragment> getFragmentClass() {
8452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        return ChooseLockGenericFragment.class;
8552c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    }
8652c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam
8766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    public static class InternalActivity extends ChooseLockGeneric {
8866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    }
8966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani
9017e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
913fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final String TAG = "ChooseLockGenericFragment";
9217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int MIN_PASSWORD_LENGTH = 4;
9317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
9417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
9517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
9617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
9717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
98e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        private static final String KEY_UNLOCK_SET_MANAGED = "unlock_set_managed";
994fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private static final String KEY_SKIP_FINGERPRINT = "unlock_skip_fingerprint";
10017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String PASSWORD_CONFIRMED = "password_confirmed";
10147f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
102d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
1033fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs";
10446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
10546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
1063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog";
10717e9e1933055b207473b488595b2887bfcaea32eJim Miller
1083fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CONFIRM_EXISTING_REQUEST = 100;
1093fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int ENABLE_ENCRYPTION_REQUEST = 101;
1103fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CHOOSE_LOCK_REQUEST = 102;
1114fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private static final int CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST = 103;
1124fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private static final int SKIP_FINGERPRINT_REQUEST = 104;
11380412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
11417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
11517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private DevicePolicyManager mDPM;
116d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private KeyStore mKeyStore;
1176609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private boolean mHasChallenge = false;
1186609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private long mChallenge;
11917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
12047f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
12146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private int mEncryptionRequestQuality;
12246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private boolean mEncryptionRequestDisabled;
1230698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private boolean mRequirePassword;
12462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private boolean mForChangeCredRequiredForBoot = false;
125a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private String mUserPassword;
1260698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private LockPatternUtils mLockPatternUtils;
1279218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private FingerprintManager mFingerprintManager;
128fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri        private int mUserId;
12992779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        private boolean mHideDrawer = false;
130e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        private ManagedLockPasswordProvider mManagedPasswordProvider;
1314fdcec71dce130be3363dba93e685789797fee8eSteven Ng        private boolean mIsSetNewPassword = false;
132ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn        private UserManager mUserManager;
13317e9e1933055b207473b488595b2887bfcaea32eJim Miller
1348ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected boolean mForFingerprint = false;
1358ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
13617e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
1376507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang        public int getMetricsCategory() {
1389d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren            return MetricsEvent.CHOOSE_LOCK_GENERIC;
1398a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        }
1408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1418a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        @Override
14217e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
14317e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
14417e9e1933055b207473b488595b2887bfcaea32eJim Miller
1454fdcec71dce130be3363dba93e685789797fee8eSteven Ng            String chooseLockAction = getActivity().getIntent().getAction();
146ab50807d1edacb4fca5447525bb5270a853eaafcJeff Sharkey            mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity());
14717e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
148d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
14917e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
1500698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
1514fdcec71dce130be3363dba93e685789797fee8eSteven Ng            mIsSetNewPassword = ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(chooseLockAction)
1524fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    || ACTION_SET_NEW_PASSWORD.equals(chooseLockAction);
15317e9e1933055b207473b488595b2887bfcaea32eJim Miller
154c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
155c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
156c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
15766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
15866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                mPasswordConfirmed = !confirmCredentials;
15966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
16092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false);
161c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
1626609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mHasChallenge = getActivity().getIntent().getBooleanExtra(
1636609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
1646609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mChallenge = getActivity().getIntent().getLongExtra(
1656609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
166c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam            mForFingerprint = getActivity().getIntent().getBooleanExtra(
167c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
16862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mForChangeCredRequiredForBoot = getArguments() != null && getArguments().getBoolean(
16962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT);
170ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn            mUserManager = UserManager.get(getActivity());
1716609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
17217e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState != null) {
17317e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
17447f1cd4325e839dd33273a451fa052e83789e483Jim Miller                mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
17546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
17646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
17746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                        ENCRYPT_REQUESTED_DISABLED);
17817e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
179bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
1808f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            // a) If this is started from other user, use that user id.
1818f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            // b) If this is started from the same user, read the extra if this is launched
1828f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            //    from Settings app itself.
1838f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            // c) Otherwise, use UserHandle.myUserId().
1848f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak            mUserId = Utils.getSecureTargetUser(
185ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    getActivity().getActivityToken(),
186ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    UserManager.get(getActivity()),
1878f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                    getArguments(),
188ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    getActivity().getIntent().getExtras()).getIdentifier();
1894fdcec71dce130be3363dba93e685789797fee8eSteven Ng            if (ACTION_SET_NEW_PASSWORD.equals(chooseLockAction)
190788671647c6d615684d159a94ffb5b4367df6896Robin Lee                    && UserManager.get(getActivity()).isManagedProfile(mUserId)
191bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                    && mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {
192bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                getActivity().setTitle(R.string.lock_settings_picker_title_profile);
193bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra            }
194bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra
195e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            mManagedPasswordProvider = ManagedLockPasswordProvider.get(getActivity(), mUserId);
196e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
19747f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
19847f1cd4325e839dd33273a451fa052e83789e483Jim Miller                updatePreferencesOrFinish();
19962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
20062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    maybeEnableEncryption(mLockPatternUtils.getKeyguardStoredPasswordQuality(
20162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                            mUserId), false);
20262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
20347f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
2046370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
2056370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
206788671647c6d615684d159a94ffb5b4367df6896Robin Lee                boolean managedProfileWithUnifiedLock =
207788671647c6d615684d159a94ffb5b4367df6896Robin Lee                        UserManager.get(getActivity()).isManagedProfile(mUserId)
2084bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                        && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId);
2094bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                if (managedProfileWithUnifiedLock
2104bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                        || !helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
211fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                        getString(R.string.unlock_set_unlock_launch_picker_title), true, mUserId)) {
21217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
21317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updatePreferencesOrFinish();
21447f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
21547f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
21617e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
217bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
2188ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini            addHeaderView();
2198ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        }
2208ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
2218ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected void addHeaderView() {
22287fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            if (mForFingerprint) {
22339b467482d1bf256a111c757e9b7621c6f523271Jason Monk                setHeaderView(R.layout.choose_lock_generic_fingerprint_header);
2244fdcec71dce130be3363dba93e685789797fee8eSteven Ng                if (mIsSetNewPassword) {
2254fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    ((TextView) getHeaderView().findViewById(R.id.fingerprint_header_description))
2264fdcec71dce130be3363dba93e685789797fee8eSteven Ng                            .setText(R.string.fingerprint_unlock_title);
2274fdcec71dce130be3363dba93e685789797fee8eSteven Ng                }
22887fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            }
22987fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        }
23087fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam
23187fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        @Override
23239b467482d1bf256a111c757e9b7621c6f523271Jason Monk        public boolean onPreferenceTreeClick(Preference preference) {
23317e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
23427d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
235fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
2363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // Show the disabling FRP warning only when the user is switching from a secure
2373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // unlock method to an insecure one
2383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                showFactoryResetProtectionWarningDialog(key);
2393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return true;
2404fdcec71dce130be3363dba93e685789797fee8eSteven Ng            } else if (KEY_SKIP_FINGERPRINT.equals(key)) {
241436256c36d69549c77320d073bef27649c1b1d6eSteven Ng                Intent chooseLockGenericIntent = new Intent(getActivity(),
242436256c36d69549c77320d073bef27649c1b1d6eSteven Ng                    ChooseLockGeneric.InternalActivity.class);
2434fdcec71dce130be3363dba93e685789797fee8eSteven Ng                chooseLockGenericIntent.setAction(getIntent().getAction());
2448f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                // Forward the target user id to  ChooseLockGeneric.
2458f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                chooseLockGenericIntent.putExtra(Intent.EXTRA_USER_ID, mUserId);
246436256c36d69549c77320d073bef27649c1b1d6eSteven Ng                chooseLockGenericIntent.putExtra(CONFIRM_CREDENTIALS, !mPasswordConfirmed);
2474fdcec71dce130be3363dba93e685789797fee8eSteven Ng                startActivityForResult(chooseLockGenericIntent, SKIP_FINGERPRINT_REQUEST);
2484fdcec71dce130be3363dba93e685789797fee8eSteven Ng                return true;
24917e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
2503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return setUnlockMethod(key);
25117e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
252bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
253bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
25446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        /**
25546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * If the device has encryption already enabled, then ask the user if they
25646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * also want to encrypt the phone with this password.
25746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         *
25846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param quality
25946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param disabled
26046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         */
261a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // TODO: why does this take disabled, its always called with a quality higher than
262a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // what makes sense with disabled == true
26346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private void maybeEnableEncryption(int quality, boolean disabled) {
264146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov            DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
265f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen            if (UserManager.get(getActivity()).isAdminUser()
26693bcfcb14d42ea0884b922ae1a4d84a6955ed835Clara Bayarri                    && mUserId == UserHandle.myUserId()
267f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen                    && LockPatternUtils.isDeviceEncryptionEnabled()
268fb4c583dba1fb8885ff9369bdab916eaa61b42bdPaul Lawrence                    && !LockPatternUtils.isFileEncryptionEnabled()
269146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov                    && !dpm.getDoNotAskCredentialsOnBoot()) {
27046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = quality;
27146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = disabled;
272edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // Get the intent that the encryption interstitial should start for creating
273edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // the new unlock method.
274edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                Intent unlockMethodIntent = getIntentForUnlockMethod(quality, disabled);
27562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                unlockMethodIntent.putExtra(
27662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT,
27762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        mForChangeCredRequiredForBoot);
278ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final Context context = getActivity();
2790698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // If accessibility is enabled and the user hasn't seen this dialog before, set the
2800698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // default state to agree with that which is compatible with accessibility
2810698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // (password not required).
282ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
2830698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
284edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                Intent intent = getEncryptionInterstitialIntent(context, quality, required,
285edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                        unlockMethodIntent);
286c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
287c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                        mForFingerprint);
28892779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini                intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer);
289378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                startActivityForResult(
290378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                        intent,
291378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                        mIsSetNewPassword && mHasChallenge
292378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
293378dec149569f57a4f8bfcbf5ece3fd458ab6263Steven Ng                                : ENABLE_ENCRYPTION_REQUEST);
29446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else {
29562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
29662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    // Welp, couldn't change it. Oh well.
29762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    finish();
29862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    return;
29962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
3000698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = false; // device encryption not enabled or not device owner.
30146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(quality, disabled);
30246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            }
30346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        }
30446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
30517e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
30617e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
30717e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
30847f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
30917e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
31017e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
311a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
31217e9e1933055b207473b488595b2887bfcaea32eJim Miller                updatePreferencesOrFinish();
31362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
31462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    if (!TextUtils.isEmpty(mUserPassword)) {
31562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        maybeEnableEncryption(
31662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                                mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId), false);
31762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    } else {
31862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        finish();
31962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    }
32062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
321e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam            } else if (requestCode == CHOOSE_LOCK_REQUEST
322e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    || requestCode == ENABLE_ENCRYPTION_REQUEST) {
32377181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos                if (resultCode != RESULT_CANCELED || mForChangeCredRequiredForBoot) {
324e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    getActivity().setResult(resultCode, data);
325e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    finish();
326e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                }
3274fdcec71dce130be3363dba93e685789797fee8eSteven Ng            } else if (requestCode == CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
3284fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    && resultCode == FingerprintEnrollBase.RESULT_FINISHED) {
329d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini                Intent intent = getFindSensorIntent(getActivity());
3304fdcec71dce130be3363dba93e685789797fee8eSteven Ng                if (data != null) {
3314fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    intent.putExtras(data.getExtras());
3324fdcec71dce130be3363dba93e685789797fee8eSteven Ng                }
3338f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                // Forward the target user id to fingerprint setup page.
3348f41b9b665369356aae5a2410ebc62e79b9122a2Tony Mak                intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
3354fdcec71dce130be3363dba93e685789797fee8eSteven Ng                startActivity(intent);
3364fdcec71dce130be3363dba93e685789797fee8eSteven Ng                finish();
3374fdcec71dce130be3363dba93e685789797fee8eSteven Ng            } else if (requestCode == SKIP_FINGERPRINT_REQUEST) {
3384fdcec71dce130be3363dba93e685789797fee8eSteven Ng                if (resultCode != RESULT_CANCELED) {
3394fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    getActivity().setResult(
3404fdcec71dce130be3363dba93e685789797fee8eSteven Ng                            resultCode == RESULT_FINISHED ? RESULT_OK : resultCode, data);
3414fdcec71dce130be3363dba93e685789797fee8eSteven Ng                    finish();
3424fdcec71dce130be3363dba93e685789797fee8eSteven Ng                }
34317e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
34417e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
34517e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
34617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
34762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (requestCode == Activity.RESULT_CANCELED && mForChangeCredRequiredForBoot) {
34862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                finish();
34962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
350bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
351bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
352d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini        protected Intent getFindSensorIntent(Context context) {
353d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini            return new Intent(context, FingerprintEnrollFindSensor.class);
354d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini        }
355d6b1c666c56e15c6806d891002c6abd8ed81aa2dUdam Saini
35617e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
35717e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
35817e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
35917e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
36017e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
36147f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
36246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
36346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
36417e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
365bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
36617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void updatePreferencesOrFinish() {
3675541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
3685541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
36917e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
3706370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
3715541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
372f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                quality = upgradeQuality(quality);
3733fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                final boolean hideDisabledPrefs = intent.getBooleanExtra(
3743fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                        HIDE_DISABLED_PREFS, false);
37517e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
37617e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
37717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
37817e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
3798ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini                addPreferences();
3803fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                disableUnusablePreferences(quality, hideDisabledPrefs);
381bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                updatePreferenceText();
3829a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                updateCurrentPreference();
383524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                updatePreferenceSummaryIfNeeded();
38417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
38517e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateUnlockMethodAndFinish(quality, false);
386bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
387abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
388bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
3898ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected void addPreferences() {
3908ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini            addPreferencesFromResource(R.xml.security_settings_picker);
391a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey
392a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            // Used for testing purposes
393a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            findPreference(KEY_UNLOCK_SET_NONE).setViewId(R.id.lock_none);
394159dff63a5e8e1286f0d42d400b64d43fb104649Jeff Sharkey            findPreference(KEY_SKIP_FINGERPRINT).setViewId(R.id.lock_none);
395a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            findPreference(KEY_UNLOCK_SET_PIN).setViewId(R.id.lock_pin);
396a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            findPreference(KEY_UNLOCK_SET_PASSWORD).setViewId(R.id.lock_password);
3978ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        }
3988ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
399bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini        private void updatePreferenceText() {
400bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini            if (mForFingerprint) {
40106458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                final String key[] = { KEY_UNLOCK_SET_PATTERN,
40206458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                        KEY_UNLOCK_SET_PIN,
40306458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                        KEY_UNLOCK_SET_PASSWORD };
40406458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                final int res[] = { R.string.fingerprint_unlock_set_unlock_pattern,
40506458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                        R.string.fingerprint_unlock_set_unlock_pin,
40606458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                        R.string.fingerprint_unlock_set_unlock_password };
40706458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                for (int i = 0; i < key.length; i++) {
40806458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                    Preference pref = findPreference(key[i]);
40906458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                    if (pref != null) { // can be removed by device admin
41006458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                        pref.setTitle(res[i]);
41106458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                    }
41206458be226f2e2862d70ea29f85a93bb767b46bcJim Miller                }
413bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini            }
414e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
415e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            if (mManagedPasswordProvider.isSettingManagedPasswordSupported()) {
416e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                Preference managed = findPreference(KEY_UNLOCK_SET_MANAGED);
417e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                managed.setTitle(mManagedPasswordProvider.getPickerOptionTitle(mForFingerprint));
418e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else {
419e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                removePreference(KEY_UNLOCK_SET_MANAGED);
420e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            }
4214fdcec71dce130be3363dba93e685789797fee8eSteven Ng
4224fdcec71dce130be3363dba93e685789797fee8eSteven Ng            if (!(mForFingerprint && mIsSetNewPassword)) {
4234fdcec71dce130be3363dba93e685789797fee8eSteven Ng                removePreference(KEY_SKIP_FINGERPRINT);
4244fdcec71dce130be3363dba93e685789797fee8eSteven Ng            }
425bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini        }
426bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini
4279a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private void updateCurrentPreference() {
4289a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            String currentKey = getKeyForCurrent();
4299a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            Preference preference = findPreference(currentKey);
4309a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            if (preference != null) {
4319a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                preference.setSummary(R.string.current_screen_lock);
4329a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
4339a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
4349a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
4359a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private String getKeyForCurrent() {
436e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk            final int credentialOwner = UserManager.get(getContext())
437e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk                    .getCredentialOwnerProfile(mUserId);
4387402b2514358e02a0e0adde982b6deb8552dc28aClara Bayarri            if (mLockPatternUtils.isLockScreenDisabled(credentialOwner)) {
4399a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                return KEY_UNLOCK_SET_OFF;
4409a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
4417402b2514358e02a0e0adde982b6deb8552dc28aClara Bayarri            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(credentialOwner)) {
4429a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
4439a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PATTERN;
4449a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
4459a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
4469a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PIN;
4479a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
4489a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
449e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
4509a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PASSWORD;
451e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
452e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    return KEY_UNLOCK_SET_MANAGED;
4539a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
4549a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_NONE;
4559a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
4569a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            return null;
4579a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
4589a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
459f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        /** increases the quality if necessary */
460f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        private int upgradeQuality(int quality) {
461d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForDPM(quality);
462b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence            return quality;
463d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
464d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
465d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForDPM(int quality) {
466d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            // Compare min allowed password quality
46725c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak            int minQuality = mDPM.getPasswordQuality(null, mUserId);
468d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (quality < minQuality) {
469d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                quality = minQuality;
470d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
471d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
472d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
473d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
47417e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
475df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * Disables preferences that are less secure than required quality. The actual
476df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * implementation is in disableUnusablePreferenceImpl.
477df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         *
478df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param quality the requested quality.
4793fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise
4803fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * they're not shown at all.
481df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         */
4823fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) {
4833fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            disableUnusablePreferencesImpl(quality, hideDisabledPrefs);
484df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        }
485df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
486df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        /***
48717e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
48817e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
48917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
490df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param hideDisabled whether to hide disable screen lock options.
49117e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
492df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        protected void disableUnusablePreferencesImpl(final int quality,
493f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                boolean hideDisabled) {
494cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
495783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
49625c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak            int adminEnforcedQuality = mDPM.getPasswordQuality(null, mUserId);
4979c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka            EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
498f755baf1c3b8fcbcee68720c8367e03381fffb4bSudheer Shanka                    getActivity(), mUserId);
499cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
500cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Preference pref = entries.getPreference(i);
5019c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                if (pref instanceof RestrictedPreference) {
502591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                    final String key = pref.getKey();
50317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean enabled = true;
5045541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    boolean visible = true;
5059c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    boolean disabledByAdmin = false;
506cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
50717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
50805c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                        if (getResources().getBoolean(R.bool.config_hide_none_security_option)) {
50905c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                            enabled = false;
51005c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                            visible = false;
51105c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                        }
5129c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
5139c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
51417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
515bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                        if (getResources().getBoolean(R.bool.config_hide_swipe_security_option)) {
516bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                            enabled = false;
5176934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                            visible = false;
518bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                        } else {
519bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                            if (mUserId != UserHandle.myUserId()) {
520bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                                // Swipe doesn't make sense for profiles.
521bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                                visible = false;
522bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                            }
523bb70e4f69658b70e0f45154ec52c7ff8882b70bbEvan Rosky                            enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
5246934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                        }
5259c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
5269c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
52717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
52817e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
5299c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
5309c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
53117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
5328fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
5339c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
5349c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
53517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
53617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
5379c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
5389c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
539e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    } else if (KEY_UNLOCK_SET_MANAGED.equals(key)) {
540e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_MANAGED
541e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                                && mManagedPasswordProvider.isManagedPasswordChoosable();
542e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                        disabledByAdmin = adminEnforcedQuality
543e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                                > DevicePolicyManager.PASSWORD_QUALITY_MANAGED;
54417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
545df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    if (hideDisabled) {
546591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                        visible = enabled;
547df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    }
548f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                    if (!visible) {
549cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
5509c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else if (disabledByAdmin && enforcedAdmin != null) {
5519c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(enforcedAdmin);
5525541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
5539c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // we need to setDisabledByAdmin to null first to disable the padlock
5549c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // in case it was set earlier.
5559c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
55617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
55717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
5589c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else {
5599c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
56017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
561bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
562bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
563bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
564bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
565524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        private void updatePreferenceSummaryIfNeeded() {
56623c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            // On a default block encrypted device with accessibility, add a warning
56723c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            // that your data is not credential encrypted
56823c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            if (!StorageManager.isBlockEncrypted()) {
56923c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence                return;
57023c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            }
57123c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence
57223c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            if (StorageManager.isNonDefaultBlockEncrypted()) {
57340ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav                return;
57440ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            }
57540ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav
576524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
577524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
578524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                return;
579524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
580524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
581524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            CharSequence summary = getString(R.string.secure_lock_encryption_warning);
582524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
583524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            PreferenceScreen screen = getPreferenceScreen();
584524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            final int preferenceCount = screen.getPreferenceCount();
585524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            for (int i = 0; i < preferenceCount; i++) {
586524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                Preference preference = screen.getPreference(i);
587524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                switch (preference.getKey()) {
588524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PATTERN:
589524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PIN:
590e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    case KEY_UNLOCK_SET_PASSWORD:
591e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    case KEY_UNLOCK_SET_MANAGED: {
592524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                        preference.setSummary(summary);
593524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    } break;
594524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                }
595524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
596524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        }
597524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
598e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        protected Intent getLockManagedPasswordIntent(boolean requirePassword, String password) {
599e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            return mManagedPasswordProvider.createIntent(requirePassword, password);
600e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        }
601e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
6026b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality,
603f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                int minLength, final int maxLength,
604fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                boolean requirePasswordToDecrypt, boolean confirmCredentials, int userId) {
605f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPassword.createIntent(context, quality, minLength,
606fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    maxLength, requirePasswordToDecrypt, confirmCredentials, userId);
6076b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
6086b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
6096609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        protected Intent getLockPasswordIntent(Context context, int quality,
6106609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                int minLength, final int maxLength,
611fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                boolean requirePasswordToDecrypt, long challenge, int userId) {
6126609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            return ChooseLockPassword.createIntent(context, quality, minLength,
613fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    maxLength, requirePasswordToDecrypt, challenge, userId);
6146609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
6156609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
6163859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality, int minLength,
617fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                int maxLength, boolean requirePasswordToDecrypt, String password, int userId) {
618a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
619fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    requirePasswordToDecrypt, password, userId);
620a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
621a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
622f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
623fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                final boolean confirmCredentials, int userId) {
624f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPattern.createIntent(context, requirePassword,
625fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    confirmCredentials, userId);
6266b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
6276b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
6286609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
629fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri               long challenge, int userId) {
630fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            return ChooseLockPattern.createIntent(context, requirePassword, challenge, userId);
6316609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
6326609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
6333859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
634fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                final String pattern, int userId) {
635fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            return ChooseLockPattern.createIntent(context, requirePassword, pattern, userId);
636a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
637a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
638ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
639edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                boolean required, Intent unlockMethodIntent) {
640edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return EncryptionInterstitial.createStartIntent(context, quality, required,
641edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                    unlockMethodIntent);
642ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        }
643ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam
6445541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
64517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
64617e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
64717e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
64817e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
6496370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
65017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
65117e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
65217e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
65317e9e1933055b207473b488595b2887bfcaea32eJim Miller        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
6546370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
65517e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
6566370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
65717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
658bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
659f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            quality = upgradeQuality(quality);
660edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            Intent intent = getIntentForUnlockMethod(quality, disabled);
661edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (intent != null) {
6624fdcec71dce130be3363dba93e685789797fee8eSteven Ng                startActivityForResult(intent,
6634fdcec71dce130be3363dba93e685789797fee8eSteven Ng                        mIsSetNewPassword && mHasChallenge
6644fdcec71dce130be3363dba93e685789797fee8eSteven Ng                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
6654fdcec71dce130be3363dba93e685789797fee8eSteven Ng                                : CHOOSE_LOCK_REQUEST);
666edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                return;
667edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
668edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
669edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
6704bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true, mUserPassword);
67179b4ebffebb48449d5d2126795f6c729eea25ec4Rubin Xu                mChooseLockSettingsHelper.utils().clearLock(mUserPassword, mUserId);
672edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
673edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                getActivity().setResult(Activity.RESULT_OK);
6744fdcec71dce130be3363dba93e685789797fee8eSteven Ng                removeAllFingerprintForUserAndFinish(mUserId);
675edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            } else {
676751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                removeAllFingerprintForUserAndFinish(mUserId);
677edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
678edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini        }
679c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
680edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini        private Intent getIntentForUnlockMethod(int quality, boolean disabled) {
681edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            Intent intent = null;
6826b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam            final Context context = getActivity();
683e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
684e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                intent = getLockManagedPasswordIntent(mRequirePassword, mUserPassword);
685e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
68625c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak                int minLength = mDPM.getPasswordMinimumLength(null, mUserId);
68717e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
68817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
68917e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
69017e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
6916609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                if (mHasChallenge) {
6926609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPasswordIntent(context, quality, minLength,
693fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                            maxLength, mRequirePassword, mChallenge, mUserId);
6946609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                } else {
6956609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPasswordIntent(context, quality, minLength,
696edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            maxLength, mRequirePassword, mUserPassword, mUserId);
6976609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                }
69817e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
6996609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                if (mHasChallenge) {
7006609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPatternIntent(context, mRequirePassword,
701edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            mChallenge, mUserId);
7026609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                } else {
7036609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPatternIntent(context, mRequirePassword,
704edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            mUserPassword, mUserId);
7056609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                }
70617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
70792779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            if (intent != null) {
70892779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini                intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer);
70992779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            }
710edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return intent;
711abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
712b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
713751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        private void removeAllFingerprintForUserAndFinish(final int userId) {
714dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
715dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                if (mFingerprintManager.hasEnrolledFingerprints(userId)) {
716dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    mFingerprintManager.setActiveUser(userId);
717dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    // For the purposes of M and N, groupId is the same as userId.
718dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    final int groupId = userId;
719dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    Fingerprint finger = new Fingerprint(null, groupId, 0, 0);
720dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    mFingerprintManager.remove(finger, userId,
721dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                            new RemovalCallback() {
722dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                @Override
723dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                public void onRemovalError(Fingerprint fp, int errMsgId,
724dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                        CharSequence errString) {
7257569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    Log.e(TAG, String.format(
7267569bb18815437a2f656fc7ff4d57274c5055477Charles He                                            "Can't remove fingerprint %d in group %d. Reason: %s",
7277569bb18815437a2f656fc7ff4d57274c5055477Charles He                                            fp.getFingerId(), fp.getGroupId(), errString));
7287569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    // TODO: need to proceed with the removal of managed profile
7297569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    // fingerprints and finish() gracefully.
730751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                }
731eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri
732dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                @Override
7337569bb18815437a2f656fc7ff4d57274c5055477Charles He                                public void onRemovalSucceeded(Fingerprint fp, int remaining) {
7347569bb18815437a2f656fc7ff4d57274c5055477Charles He                                    if (remaining == 0) {
735dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                        removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
736dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                                    }
737751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                }
738dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                            });
739dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                } else {
740dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    // No fingerprints in this user, we may also want to delete managed profile
741dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    // fingerprints
742dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                    removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
743dae1ac5cb081a8f4de283711e6e1763051cf4dd6Ricky Wai                }
7445a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini            } else {
7455a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // The removal callback will call finish, once all fingerprints are removed.
7465a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // We need to wait for that to occur, otherwise, the UI will still show that
7475a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // fingerprints exist even though they are (about to) be removed depending on
7485a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // the race condition.
7495a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                finish();
7509218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
7519218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
7529218687e4baaf0226ef16b58f78123d979711e5dJim Miller
753751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        private void removeManagedProfileFingerprintsAndFinishIfNecessary(final int parentUserId) {
7548d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
7558d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey                mFingerprintManager.setActiveUser(UserHandle.myUserId());
7568d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            }
757751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            boolean hasChildProfile = false;
758ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn            if (!mUserManager.getUserInfo(parentUserId).isManagedProfile()) {
759751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                // Current user is primary profile, remove work profile fingerprints if necessary
760ae16e55dd5d93db547cbcdb848a98242db8ad9f7Kevin Chyn                final List<UserInfo> profiles = mUserManager.getProfiles(parentUserId);
761751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                final int profilesSize = profiles.size();
762751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                for (int i = 0; i < profilesSize; i++) {
763751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    final UserInfo userInfo = profiles.get(i);
764751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    if (userInfo.isManagedProfile() && !mLockPatternUtils
765751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                            .isSeparateProfileChallengeEnabled(userInfo.id)) {
766751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        removeAllFingerprintForUserAndFinish(userInfo.id);
767751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        hasChildProfile = true;
768751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        break;
769751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    }
770751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                }
771751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            }
772751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            if (!hasChildProfile) {
773751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                finish();
774751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            }
775751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        }
776751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
7779218687e4baaf0226ef16b58f78123d979711e5dJim Miller        @Override
7789218687e4baaf0226ef16b58f78123d979711e5dJim Miller        public void onDestroy() {
7799218687e4baaf0226ef16b58f78123d979711e5dJim Miller            super.onDestroy();
7809218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
7819218687e4baaf0226ef16b58f78123d979711e5dJim Miller
782b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
783b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
784b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
785b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
786b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
78734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        private int getResIdForFactoryResetProtectionWarningTitle() {
788788671647c6d615684d159a94ffb5b4367df6896Robin Lee            boolean isProfile = UserManager.get(getActivity()).isManagedProfile(mUserId);
78934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            return isProfile ? R.string.unlock_disable_frp_warning_title_profile
79034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    : R.string.unlock_disable_frp_warning_title;
79134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        }
79234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
79338c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos        private int getResIdForFactoryResetProtectionWarningMessage() {
7948d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            final boolean hasFingerprints;
7958d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()) {
7968d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey                hasFingerprints = mFingerprintManager.hasEnrolledFingerprints(mUserId);
7978d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            } else {
7988d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey                hasFingerprints = false;
7998d8bb6ee1dd070f612133da4573df02d9ef267aaJeff Sharkey            }
800788671647c6d615684d159a94ffb5b4367df6896Robin Lee            boolean isProfile = UserManager.get(getActivity()).isManagedProfile(mUserId);
801fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
8023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
80334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
80434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
80534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_pattern_fingerprint_profile;
80634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
80734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern_fingerprint;
80834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
80934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern_profile;
81034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
81134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern;
81234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
8133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
8143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
81534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
81634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint_profile;
81734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
81834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint;
81934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
82034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_profile;
82134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
82234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin;
82334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
8243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
8253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
8263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
827e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
82834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
82934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
83034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_password_fingerprint_profile;
83134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
83234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password_fingerprint;
83334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
83434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password_profile;
83534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
83634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password;
83734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
8383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                default:
83934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
84034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
84134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_unknown_fingerprint_profile;
84234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
84334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown_fingerprint;
84434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
84534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown_profile;
84634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
84734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown;
84834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
8493bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean isUnlockMethodSecure(String unlockMethod) {
8533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) ||
8543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    KEY_UNLOCK_SET_NONE.equals(unlockMethod));
8553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8573bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean setUnlockMethod(String unlockMethod) {
8583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod);
8593bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8603bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) {
8613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
8623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ );
8633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) {
8643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
8653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ );
866e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else if (KEY_UNLOCK_SET_MANAGED.equals(unlockMethod)) {
867e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                maybeEnableEncryption(DevicePolicyManager.PASSWORD_QUALITY_MANAGED, false);
8683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) {
8693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
8703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
8713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) {
8723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
8733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
8743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) {
8753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
8763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
8773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else {
8783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod);
8793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return false;
8803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return true;
8823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
88534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            int title = getResIdForFactoryResetProtectionWarningTitle();
88638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            int message = getResIdForFactoryResetProtectionWarningMessage();
8873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            FactoryResetProtectionWarningDialog dialog =
88834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    FactoryResetProtectionWarningDialog.newInstance(
88934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                            title, message, unlockMethodToSet);
8903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
8913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
893ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang        public static class FactoryResetProtectionWarningDialog extends InstrumentedDialogFragment {
8943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
89534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            private static final String ARG_TITLE_RES = "titleRes";
89638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            private static final String ARG_MESSAGE_RES = "messageRes";
8973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
8983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
89934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            public static FactoryResetProtectionWarningDialog newInstance(
90034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    int titleRes, int messageRes, String unlockMethodToSet) {
9013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                FactoryResetProtectionWarningDialog frag =
9023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        new FactoryResetProtectionWarningDialog();
9033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Bundle args = new Bundle();
90434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                args.putInt(ARG_TITLE_RES, titleRes);
90538c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                args.putInt(ARG_MESSAGE_RES, messageRes);
9063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
9073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                frag.setArguments(args);
9083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return frag;
9093bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
9103bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
9113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
9123bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public void show(FragmentManager manager, String tag) {
9133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                if (manager.findFragmentByTag(tag) == null) {
9143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    // Prevent opening multiple dialogs if tapped on button quickly
9153bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    super.show(manager, tag);
9163bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                }
9173bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
9183bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
9193bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
9203bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public Dialog onCreateDialog(Bundle savedInstanceState) {
9213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                final Bundle args = getArguments();
9223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
9233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return new AlertDialog.Builder(getActivity())
92434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        .setTitle(args.getInt(ARG_TITLE_RES))
92538c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setMessage(args.getInt(ARG_MESSAGE_RES))
92638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setPositiveButton(R.string.unlock_disable_frp_warning_ok,
9273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
9283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
9293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
9303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        ((ChooseLockGenericFragment) getParentFragment())
9313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                .setUnlockMethod(
9323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                        args.getString(ARG_UNLOCK_METHOD_TO_SET));
9333bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
9343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
9353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
9363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setNegativeButton(R.string.cancel,
9373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
9383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
9393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
9403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        dismiss();
9413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
9423bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
9433bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
9443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .create();
9453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
946ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang
947ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang            @Override
948ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang            public int getMetricsCategory() {
949ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang                return MetricsEvent.DIALOG_FRP;
950ac5e5932233eb4b485bd76087987182009be2c2fFan Zhang            }
9513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
952abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
953abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
954