ChooseLockGeneric.java revision bc18b40623316f308bc21dd78f840ade73b89257
1abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn/*
2abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
4abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * you may not use this file except in compliance with the License.
6abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * You may obtain a copy of the License at
7abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
8abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn *
10abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * Unless required by applicable law or agreed to in writing, software
11abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * See the License for the specific language governing permissions and
14abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn * limitations under the License.
15abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn */
16abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
17abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornpackage com.android.settings;
18abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
19524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.accessibilityservice.AccessibilityServiceInfo;
2017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Activity;
213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.AlertDialog;
223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.Dialog;
233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.DialogFragment;
2452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lamimport android.app.Fragment;
253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.app.FragmentManager;
264037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
27abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.content.DialogInterface;
29abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent;
30751de372750336c2dbc6ed656de84b881ede0858Ricky Waiimport android.content.pm.UserInfo;
3139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.Fingerprint;
3239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager;
3339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager.RemovalCallback;
34abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
3546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process;
365437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roosimport android.os.UserHandle;
37f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chenimport android.os.UserManager;
3823c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrenceimport android.os.storage.StorageManager;
39d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
4039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
4139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
4262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roosimport android.text.TextUtils;
4327d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog;
443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.util.Log;
4587fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lamimport android.view.View;
46524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager;
47d16c9b7c3100b7ba653dcd58db036500dd220896Jim Millerimport android.widget.Toast;
48d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
499d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
506465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
519c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
529c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedPreference;
539c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka
54751de372750336c2dbc6ed656de84b881ede0858Ricky Waiimport java.util.List;
55751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
569c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
576465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne
58263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity {
590698a216311acd9ab52224602d1a75c08bf89f04Jim Miller    public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
60abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
61abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    @Override
6217e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
6317e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
6452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
6592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini
6692779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        String action = modIntent.getAction();
6792779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        if (DevicePolicyManager.ACTION_SET_NEW_PASSWORD.equals(action)
6892779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini                || DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(action)) {
6992779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            modIntent.putExtra(EXTRA_HIDE_DRAWER, true);
7092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        }
7117e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
72a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
73a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
74a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
75a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
76a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true;
77a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
7817e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
79bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
8052c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    /* package */ Class<? extends Fragment> getFragmentClass() {
8152c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        return ChooseLockGenericFragment.class;
8252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    }
8352c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam
8466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    public static class InternalActivity extends ChooseLockGeneric {
8566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    }
8666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani
8717e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
883fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final String TAG = "ChooseLockGenericFragment";
8917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int MIN_PASSWORD_LENGTH = 4;
9017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
9117e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
9217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
9317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
9417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
95e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        private static final String KEY_UNLOCK_SET_MANAGED = "unlock_set_managed";
9617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String PASSWORD_CONFIRMED = "password_confirmed";
9747f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
98d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
993fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs";
10046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
10146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
1023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog";
10317e9e1933055b207473b488595b2887bfcaea32eJim Miller
1043fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CONFIRM_EXISTING_REQUEST = 100;
1053fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int ENABLE_ENCRYPTION_REQUEST = 101;
1063fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CHOOSE_LOCK_REQUEST = 102;
10780412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
10817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
10917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private DevicePolicyManager mDPM;
110d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private KeyStore mKeyStore;
1116609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private boolean mHasChallenge = false;
1126609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private long mChallenge;
11317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
11447f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
11546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private int mEncryptionRequestQuality;
11646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private boolean mEncryptionRequestDisabled;
1170698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private boolean mRequirePassword;
11862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos        private boolean mForChangeCredRequiredForBoot = false;
119a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private String mUserPassword;
1200698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private LockPatternUtils mLockPatternUtils;
1219218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private FingerprintManager mFingerprintManager;
122fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri        private int mUserId;
12392779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini        private boolean mHideDrawer = false;
124e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        private ManagedLockPasswordProvider mManagedPasswordProvider;
12517e9e1933055b207473b488595b2887bfcaea32eJim Miller
1268ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected boolean mForFingerprint = false;
1278ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
12817e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
1298a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        protected int getMetricsCategory() {
1309d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren            return MetricsEvent.CHOOSE_LOCK_GENERIC;
1318a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        }
1328a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1338a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        @Override
13417e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
13517e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
13617e9e1933055b207473b488595b2887bfcaea32eJim Miller
1379218687e4baaf0226ef16b58f78123d979711e5dJim Miller            mFingerprintManager =
1389218687e4baaf0226ef16b58f78123d979711e5dJim Miller                (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
13917e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
140d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
14117e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
1420698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
14317e9e1933055b207473b488595b2887bfcaea32eJim Miller
144c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
145c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
146c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
14766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
14866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                mPasswordConfirmed = !confirmCredentials;
14966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
15092779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false);
151c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
1526609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mHasChallenge = getActivity().getIntent().getBooleanExtra(
1536609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
1546609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mChallenge = getActivity().getIntent().getLongExtra(
1556609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
156c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam            mForFingerprint = getActivity().getIntent().getBooleanExtra(
157c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
15862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            mForChangeCredRequiredForBoot = getArguments() != null && getArguments().getBoolean(
15962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT);
1606609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
16117e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState != null) {
16217e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
16347f1cd4325e839dd33273a451fa052e83789e483Jim Miller                mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
16446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
16546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
16646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                        ENCRYPT_REQUESTED_DISABLED);
16717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
168bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
169ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz            int targetUser = Utils.getSecureTargetUser(
170ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    getActivity().getActivityToken(),
171ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    UserManager.get(getActivity()),
172ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    null,
173ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    getActivity().getIntent().getExtras()).getIdentifier();
174ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz            if (DevicePolicyManager.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD.equals(
175ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    getActivity().getIntent().getAction()) ||
176ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                    !mLockPatternUtils.isSeparateProfileChallengeAllowed(targetUser)) {
177ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                // Always use parent if explicitely requested or if profile challenge is not
178ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                // supported
1797f2a013619fee267c1d4d6b0cc352444eef2de07Clara Bayarri                Bundle arguments = getArguments();
1807f2a013619fee267c1d4d6b0cc352444eef2de07Clara Bayarri                mUserId = Utils.getUserIdFromBundle(getContext(), arguments != null ? arguments
1817f2a013619fee267c1d4d6b0cc352444eef2de07Clara Bayarri                        : getActivity().getIntent().getExtras());
182ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz            } else {
183ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz                mUserId = targetUser;
184ae07b5080aadd398598f8b5eea6cc2e260dcc8b1Benjamin Franz            }
185fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri
186bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra            if (DevicePolicyManager.ACTION_SET_NEW_PASSWORD
187bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                    .equals(getActivity().getIntent().getAction())
188bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                    && Utils.isManagedProfile(UserManager.get(getActivity()), mUserId)
189bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                    && mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {
190bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra                getActivity().setTitle(R.string.lock_settings_picker_title_profile);
191bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra            }
192bc18b40623316f308bc21dd78f840ade73b89257Mahaver Chopra
193e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            mManagedPasswordProvider = ManagedLockPasswordProvider.get(getActivity(), mUserId);
194e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
19547f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
19647f1cd4325e839dd33273a451fa052e83789e483Jim Miller                updatePreferencesOrFinish();
19762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
19862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    maybeEnableEncryption(mLockPatternUtils.getKeyguardStoredPasswordQuality(
19962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                            mUserId), false);
20062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
20147f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
2026370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
2036370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
2044bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                boolean managedProfileWithUnifiedLock = Utils
2054bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                        .isManagedProfile(UserManager.get(getActivity()), mUserId)
2064bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                        && !mLockPatternUtils.isSeparateProfileChallengeEnabled(mUserId);
2074bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                if (managedProfileWithUnifiedLock
2084bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                        || !helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
209fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                        getString(R.string.unlock_set_unlock_launch_picker_title), true, mUserId)) {
21017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
21117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updatePreferencesOrFinish();
21247f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
21347f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
21417e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
215bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
2168ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini            addHeaderView();
2178ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        }
2188ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
2198ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected void addHeaderView() {
22087fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            if (mForFingerprint) {
22139b467482d1bf256a111c757e9b7621c6f523271Jason Monk                setHeaderView(R.layout.choose_lock_generic_fingerprint_header);
22287fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            }
22387fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        }
22487fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam
22587fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        @Override
22639b467482d1bf256a111c757e9b7621c6f523271Jason Monk        public boolean onPreferenceTreeClick(Preference preference) {
22717e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
22827d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
229fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
2303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // Show the disabling FRP warning only when the user is switching from a secure
2313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // unlock method to an insecure one
2323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                showFactoryResetProtectionWarningDialog(key);
2333bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return true;
23417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
2353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return setUnlockMethod(key);
23617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
237bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
238bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
23946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        /**
24046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * If the device has encryption already enabled, then ask the user if they
24146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * also want to encrypt the phone with this password.
24246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         *
24346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param quality
24446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param disabled
24546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         */
246a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // TODO: why does this take disabled, its always called with a quality higher than
247a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // what makes sense with disabled == true
24846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private void maybeEnableEncryption(int quality, boolean disabled) {
249146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov            DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
250f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen            if (UserManager.get(getActivity()).isAdminUser()
25193bcfcb14d42ea0884b922ae1a4d84a6955ed835Clara Bayarri                    && mUserId == UserHandle.myUserId()
252f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen                    && LockPatternUtils.isDeviceEncryptionEnabled()
253fb4c583dba1fb8885ff9369bdab916eaa61b42bdPaul Lawrence                    && !LockPatternUtils.isFileEncryptionEnabled()
254146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov                    && !dpm.getDoNotAskCredentialsOnBoot()) {
25546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = quality;
25646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = disabled;
257edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // Get the intent that the encryption interstitial should start for creating
258edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // the new unlock method.
259edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                Intent unlockMethodIntent = getIntentForUnlockMethod(quality, disabled);
26062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                unlockMethodIntent.putExtra(
26162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT,
26262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        mForChangeCredRequiredForBoot);
263ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final Context context = getActivity();
2640698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // If accessibility is enabled and the user hasn't seen this dialog before, set the
2650698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // default state to agree with that which is compatible with accessibility
2660698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // (password not required).
267ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
2680698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
269edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                Intent intent = getEncryptionInterstitialIntent(context, quality, required,
270edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                        unlockMethodIntent);
271c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
272c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                        mForFingerprint);
27392779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini                intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer);
27446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
27546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else {
27662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
27762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    // Welp, couldn't change it. Oh well.
27862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    finish();
27962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    return;
28062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
2810698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = false; // device encryption not enabled or not device owner.
28246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(quality, disabled);
28346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            }
28446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        }
28546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
28617e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
28717e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
28817e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
28947f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
29017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
29117e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
292a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
29317e9e1933055b207473b488595b2887bfcaea32eJim Miller                updatePreferencesOrFinish();
29462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                if (mForChangeCredRequiredForBoot) {
29562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    if (!TextUtils.isEmpty(mUserPassword)) {
29662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        maybeEnableEncryption(
29762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                                mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId), false);
29862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    } else {
29962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                        finish();
30062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                    }
30162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                }
302e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam            } else if (requestCode == CHOOSE_LOCK_REQUEST
303e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    || requestCode == ENABLE_ENCRYPTION_REQUEST) {
30477181e947860056fb77d24ab9fa9e86365b244e6Adrian Roos                if (resultCode != RESULT_CANCELED || mForChangeCredRequiredForBoot) {
305e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    getActivity().setResult(resultCode, data);
306e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    finish();
307e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                }
30817e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
30917e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
31017e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
31117e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
31262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            if (requestCode == Activity.RESULT_CANCELED && mForChangeCredRequiredForBoot) {
31362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos                finish();
31462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos            }
315bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
316bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
31717e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
31817e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
31917e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
32017e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
32117e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
32247f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
32346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
32446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
32517e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
326bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
32717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void updatePreferencesOrFinish() {
3285541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
3295541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
33017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
3316370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
3325541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
333f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                quality = upgradeQuality(quality);
3343fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                final boolean hideDisabledPrefs = intent.getBooleanExtra(
3353fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                        HIDE_DISABLED_PREFS, false);
33617e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
33717e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
33817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
33917e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
3408ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini                addPreferences();
3413fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                disableUnusablePreferences(quality, hideDisabledPrefs);
342bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                updatePreferenceText();
3439a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                updateCurrentPreference();
344524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                updatePreferenceSummaryIfNeeded();
34517e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
34617e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateUnlockMethodAndFinish(quality, false);
347bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
348abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
349bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
3508ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        protected void addPreferences() {
3518ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini            addPreferencesFromResource(R.xml.security_settings_picker);
352a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey
353a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            // Used for testing purposes
354a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            findPreference(KEY_UNLOCK_SET_NONE).setViewId(R.id.lock_none);
355a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            findPreference(KEY_UNLOCK_SET_PIN).setViewId(R.id.lock_pin);
356a77652fea94fca598d530e40a815ca0c8e8c0d15Jeff Sharkey            findPreference(KEY_UNLOCK_SET_PASSWORD).setViewId(R.id.lock_password);
3578ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini        }
3588ef4c620031973187eefc1f1f1a330e8fd26696dUdam Saini
359bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini        private void updatePreferenceText() {
360bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini            if (mForFingerprint) {
361bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                Preference pattern = findPreference(KEY_UNLOCK_SET_PATTERN);
362bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                pattern.setTitle(R.string.fingerprint_unlock_set_unlock_pattern);
363bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini
364bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                Preference pin = findPreference(KEY_UNLOCK_SET_PIN);
365bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                pin.setTitle(R.string.fingerprint_unlock_set_unlock_pin);
366bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini
367bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                Preference password = findPreference(KEY_UNLOCK_SET_PASSWORD);
368bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini                password.setTitle(R.string.fingerprint_unlock_set_unlock_password);
369bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini            }
370e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
371e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            if (mManagedPasswordProvider.isSettingManagedPasswordSupported()) {
372e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                Preference managed = findPreference(KEY_UNLOCK_SET_MANAGED);
373e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                managed.setTitle(mManagedPasswordProvider.getPickerOptionTitle(mForFingerprint));
374e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else {
375e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                removePreference(KEY_UNLOCK_SET_MANAGED);
376e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            }
377bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini        }
378bf1483c383bfb42aaf78a7f9b0d2f5a41317ca86Udam Saini
3799a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private void updateCurrentPreference() {
3809a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            String currentKey = getKeyForCurrent();
3819a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            Preference preference = findPreference(currentKey);
3829a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            if (preference != null) {
3839a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                preference.setSummary(R.string.current_screen_lock);
3849a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
3859a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
3869a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
3879a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private String getKeyForCurrent() {
388e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk            final int credentialOwner = UserManager.get(getContext())
389e07c947ea35b07eb354dd43068a5670dd6cce2efJason Monk                    .getCredentialOwnerProfile(mUserId);
3907402b2514358e02a0e0adde982b6deb8552dc28aClara Bayarri            if (mLockPatternUtils.isLockScreenDisabled(credentialOwner)) {
3919a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                return KEY_UNLOCK_SET_OFF;
3929a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
3937402b2514358e02a0e0adde982b6deb8552dc28aClara Bayarri            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(credentialOwner)) {
3949a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
3959a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PATTERN;
3969a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
3979a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
3989a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PIN;
3999a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
4009a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
401e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
4029a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PASSWORD;
403e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
404e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    return KEY_UNLOCK_SET_MANAGED;
4059a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
4069a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_NONE;
4079a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
4089a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            return null;
4099a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
4109a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
411f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        /** increases the quality if necessary */
412f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        private int upgradeQuality(int quality) {
413d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForDPM(quality);
414b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence            return quality;
415d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
416d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
417d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForDPM(int quality) {
418d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            // Compare min allowed password quality
41925c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak            int minQuality = mDPM.getPasswordQuality(null, mUserId);
420d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (quality < minQuality) {
421d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                quality = minQuality;
422d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
423d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
424d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
425d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
42617e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
427df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * Disables preferences that are less secure than required quality. The actual
428df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * implementation is in disableUnusablePreferenceImpl.
429df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         *
430df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param quality the requested quality.
4313fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise
4323fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * they're not shown at all.
433df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         */
4343fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) {
4353fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            disableUnusablePreferencesImpl(quality, hideDisabledPrefs);
436df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        }
437df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
438df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        /***
43917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
44017e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
44117e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
442df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param hideDisabled whether to hide disable screen lock options.
44317e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
444df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        protected void disableUnusablePreferencesImpl(final int quality,
445f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                boolean hideDisabled) {
446cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
447783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
44825c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak            int adminEnforcedQuality = mDPM.getPasswordQuality(null, mUserId);
4499c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka            EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
450f755baf1c3b8fcbcee68720c8367e03381fffb4bSudheer Shanka                    getActivity(), mUserId);
451cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
452cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Preference pref = entries.getPreference(i);
4539c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                if (pref instanceof RestrictedPreference) {
454591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                    final String key = pref.getKey();
45517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean enabled = true;
4565541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    boolean visible = true;
4579c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    boolean disabledByAdmin = false;
458cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
45917e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
46005c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                        if (getResources().getBoolean(R.bool.config_hide_none_security_option)) {
46105c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                            enabled = false;
46205c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                            visible = false;
46305c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                        }
4649c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
4659c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
46617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
4676934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                        if (mUserId != UserHandle.myUserId()) {
4686934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                            // Swipe doesn't make sense for profiles.
4696934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                            visible = false;
4706934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                        }
47117e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
4729c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
4739c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
47417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
47517e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
4769c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
4779c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
47817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
4798fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
4809c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
4819c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
48217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
48317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
4849c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
4859c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
486e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    } else if (KEY_UNLOCK_SET_MANAGED.equals(key)) {
487e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_MANAGED
488e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                                && mManagedPasswordProvider.isManagedPasswordChoosable();
489e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                        disabledByAdmin = adminEnforcedQuality
490e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                                > DevicePolicyManager.PASSWORD_QUALITY_MANAGED;
49117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
492df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    if (hideDisabled) {
493591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                        visible = enabled;
494df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    }
495f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                    if (!visible) {
496cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
4979c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else if (disabledByAdmin && enforcedAdmin != null) {
4989c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(enforcedAdmin);
4995541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
5009c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // we need to setDisabledByAdmin to null first to disable the padlock
5019c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // in case it was set earlier.
5029c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
50317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
50417e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
5059c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else {
5069c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
50717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
508bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
509bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
510bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
511bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
512524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        private void updatePreferenceSummaryIfNeeded() {
51323c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            // On a default block encrypted device with accessibility, add a warning
51423c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            // that your data is not credential encrypted
51523c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            if (!StorageManager.isBlockEncrypted()) {
51623c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence                return;
51723c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            }
51823c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence
51923c2acfd4c01b270c998a4a497c658cc3d842473Paul Lawrence            if (StorageManager.isNonDefaultBlockEncrypted()) {
52040ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav                return;
52140ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            }
52240ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav
523524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
524524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
525524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                return;
526524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
527524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
528524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            CharSequence summary = getString(R.string.secure_lock_encryption_warning);
529524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
530524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            PreferenceScreen screen = getPreferenceScreen();
531524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            final int preferenceCount = screen.getPreferenceCount();
532524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            for (int i = 0; i < preferenceCount; i++) {
533524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                Preference preference = screen.getPreference(i);
534524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                switch (preference.getKey()) {
535524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PATTERN:
536524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PIN:
537e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    case KEY_UNLOCK_SET_PASSWORD:
538e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                    case KEY_UNLOCK_SET_MANAGED: {
539524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                        preference.setSummary(summary);
540524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    } break;
541524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                }
542524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
543524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        }
544524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
545e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        protected Intent getLockManagedPasswordIntent(boolean requirePassword, String password) {
546e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            return mManagedPasswordProvider.createIntent(requirePassword, password);
547e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic        }
548e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic
5496b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality,
550f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                int minLength, final int maxLength,
551fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                boolean requirePasswordToDecrypt, boolean confirmCredentials, int userId) {
552f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPassword.createIntent(context, quality, minLength,
553fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    maxLength, requirePasswordToDecrypt, confirmCredentials, userId);
5546b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
5556b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
5566609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        protected Intent getLockPasswordIntent(Context context, int quality,
5576609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                int minLength, final int maxLength,
558fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                boolean requirePasswordToDecrypt, long challenge, int userId) {
5596609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            return ChooseLockPassword.createIntent(context, quality, minLength,
560fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    maxLength, requirePasswordToDecrypt, challenge, userId);
5616609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
5626609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
5633859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality, int minLength,
564fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                int maxLength, boolean requirePasswordToDecrypt, String password, int userId) {
565a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
566fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    requirePasswordToDecrypt, password, userId);
567a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
568a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
569f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
570fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                final boolean confirmCredentials, int userId) {
571f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPattern.createIntent(context, requirePassword,
572fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    confirmCredentials, userId);
5736b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
5746b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
5756609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
576fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri               long challenge, int userId) {
577fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            return ChooseLockPattern.createIntent(context, requirePassword, challenge, userId);
5786609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
5796609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
5803859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
581fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                final String pattern, int userId) {
582fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            return ChooseLockPattern.createIntent(context, requirePassword, pattern, userId);
583a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
584a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
585ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
586edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                boolean required, Intent unlockMethodIntent) {
587edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return EncryptionInterstitial.createStartIntent(context, quality, required,
588edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                    unlockMethodIntent);
589ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        }
590ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam
5915541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
59217e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
59317e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
59417e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
59517e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
5966370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
59717e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
59817e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
59917e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
60017e9e1933055b207473b488595b2887bfcaea32eJim Miller        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
6016370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
60217e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
6036370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
60417e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
605bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
606f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            quality = upgradeQuality(quality);
607edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            Intent intent = getIntentForUnlockMethod(quality, disabled);
608edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (intent != null) {
609edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
610edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                return;
611edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
612edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
613edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
6144bbf0653c0197aca3baa587df80e76ba1159a4fbRicky Wai                mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, true, mUserPassword);
615edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                mChooseLockSettingsHelper.utils().clearLock(mUserId);
616edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
617751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                removeAllFingerprintForUserAndFinish(mUserId);
618edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                getActivity().setResult(Activity.RESULT_OK);
619edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            } else {
620751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                removeAllFingerprintForUserAndFinish(mUserId);
621edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
622edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini        }
623c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
624edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini        private Intent getIntentForUnlockMethod(int quality, boolean disabled) {
625edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            Intent intent = null;
6266b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam            final Context context = getActivity();
627e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
628e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                intent = getLockManagedPasswordIntent(mRequirePassword, mUserPassword);
629e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
63025c3c54c03dab4bd14dbe92ac48e85df9c15bd68Tony Mak                int minLength = mDPM.getPasswordMinimumLength(null, mUserId);
63117e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
63217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
63317e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
63417e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
6356609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                if (mHasChallenge) {
6366609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPasswordIntent(context, quality, minLength,
637fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                            maxLength, mRequirePassword, mChallenge, mUserId);
6386609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                } else {
6396609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPasswordIntent(context, quality, minLength,
640edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            maxLength, mRequirePassword, mUserPassword, mUserId);
6416609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                }
64217e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
6436609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                if (mHasChallenge) {
6446609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPatternIntent(context, mRequirePassword,
645edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            mChallenge, mUserId);
6466609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                } else {
6476609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPatternIntent(context, mRequirePassword,
648edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            mUserPassword, mUserId);
6496609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                }
65017e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
65192779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            if (intent != null) {
65292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini                intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer);
65392779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini            }
654edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return intent;
655abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
656b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
657751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        private void removeAllFingerprintForUserAndFinish(final int userId) {
658c2f6813a836014a5b38bcfaa24fe9e91671f4646Jim Miller            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()
659751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    && mFingerprintManager.hasEnrolledFingerprints(userId)) {
660751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                mFingerprintManager.setActiveUser(userId);
6615a8e522c6c3d71164f9d84ef98461de5dff4ccefJim Miller                // For the purposes of M and N, groupId is the same as userId.
6625a8e522c6c3d71164f9d84ef98461de5dff4ccefJim Miller                final int groupId = userId;
6635a8e522c6c3d71164f9d84ef98461de5dff4ccefJim Miller                Fingerprint finger = new Fingerprint(null, groupId, 0, 0);
6645a8e522c6c3d71164f9d84ef98461de5dff4ccefJim Miller                mFingerprintManager.remove(finger, userId,
665eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                        new RemovalCallback() {
666eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                            @Override
667eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                            public void onRemovalError(Fingerprint fp, int errMsgId,
668eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                                    CharSequence errString) {
669751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                Log.v(TAG, "Fingerprint removed: " + fp.getFingerId());
670751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                if (fp.getFingerId() == 0) {
671751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                    removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
672751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                }
673eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                            }
674eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri
675eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                            @Override
676eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                            public void onRemovalSucceeded(Fingerprint fingerprint) {
677751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                if (fingerprint.getFingerId() == 0) {
678751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                    removeManagedProfileFingerprintsAndFinishIfNecessary(userId);
679751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                                }
680eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                            }
681eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri                        });
6825a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini            } else {
6835a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // The removal callback will call finish, once all fingerprints are removed.
6845a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // We need to wait for that to occur, otherwise, the UI will still show that
6855a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // fingerprints exist even though they are (about to) be removed depending on
6865a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                // the race condition.
6875a1dbf815222ef0bf9d89fb124b759353238d065Udam Saini                finish();
6889218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
6899218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
6909218687e4baaf0226ef16b58f78123d979711e5dJim Miller
691751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        private void removeManagedProfileFingerprintsAndFinishIfNecessary(final int parentUserId) {
692751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            mFingerprintManager.setActiveUser(UserHandle.myUserId());
693751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            final UserManager um = UserManager.get(getActivity());
694751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            boolean hasChildProfile = false;
695751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            if (!um.getUserInfo(parentUserId).isManagedProfile()) {
696751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                // Current user is primary profile, remove work profile fingerprints if necessary
697751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                final List<UserInfo> profiles = um.getProfiles(parentUserId);
698751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                final int profilesSize = profiles.size();
699751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                for (int i = 0; i < profilesSize; i++) {
700751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    final UserInfo userInfo = profiles.get(i);
701751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    if (userInfo.isManagedProfile() && !mLockPatternUtils
702751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                            .isSeparateProfileChallengeEnabled(userInfo.id)) {
703751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        removeAllFingerprintForUserAndFinish(userInfo.id);
704751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        hasChildProfile = true;
705751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                        break;
706751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                    }
707751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                }
708751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            }
709751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            if (!hasChildProfile) {
710751de372750336c2dbc6ed656de84b881ede0858Ricky Wai                finish();
711751de372750336c2dbc6ed656de84b881ede0858Ricky Wai            }
712751de372750336c2dbc6ed656de84b881ede0858Ricky Wai        }
713751de372750336c2dbc6ed656de84b881ede0858Ricky Wai
7149218687e4baaf0226ef16b58f78123d979711e5dJim Miller        @Override
7159218687e4baaf0226ef16b58f78123d979711e5dJim Miller        public void onDestroy() {
7169218687e4baaf0226ef16b58f78123d979711e5dJim Miller            super.onDestroy();
7179218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
7189218687e4baaf0226ef16b58f78123d979711e5dJim Miller
719b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
720b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
721b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
722b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
723b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
72434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        private int getResIdForFactoryResetProtectionWarningTitle() {
72534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            boolean isProfile = Utils.isManagedProfile(UserManager.get(getActivity()), mUserId);
72634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            return isProfile ? R.string.unlock_disable_frp_warning_title_profile
72734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    : R.string.unlock_disable_frp_warning_title;
72834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri        }
72934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri
73038c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos        private int getResIdForFactoryResetProtectionWarningMessage() {
731eb8962d2734984d6e16f87261c01d8080ff16757Clara Bayarri            boolean hasFingerprints = mFingerprintManager.hasEnrolledFingerprints(mUserId);
73234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            boolean isProfile = Utils.isManagedProfile(UserManager.get(getActivity()), mUserId);
733fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
7343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
73534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
73634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
73734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_pattern_fingerprint_profile;
73834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
73934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern_fingerprint;
74034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
74134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern_profile;
74234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
74334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pattern;
74434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
7453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
7463bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
74734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
74834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint_profile;
74934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
75034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_fingerprint;
75134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
75234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin_profile;
75334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
75434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_pin;
75534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
7563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
7573bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
7583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
759e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
76034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
76134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
76234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_password_fingerprint_profile;
76334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
76434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password_fingerprint;
76534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
76634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password_profile;
76734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
76834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_password;
76934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
7703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                default:
77134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    if (hasFingerprints && isProfile) {
77234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string
77334ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                                .unlock_disable_frp_warning_content_unknown_fingerprint_profile;
77434ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (hasFingerprints && !isProfile) {
77534ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown_fingerprint;
77634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else if (isProfile) {
77734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown_profile;
77834ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    } else {
77934ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        return R.string.unlock_disable_frp_warning_content_unknown;
78034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    }
7813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
7823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
7833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
7843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean isUnlockMethodSecure(String unlockMethod) {
7853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) ||
7863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    KEY_UNLOCK_SET_NONE.equals(unlockMethod));
7873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
7883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
7893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean setUnlockMethod(String unlockMethod) {
7903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod);
7913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
7923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) {
7933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
7943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ );
7953bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) {
7963bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
7973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ );
798e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic            } else if (KEY_UNLOCK_SET_MANAGED.equals(unlockMethod)) {
799e7d6e4ddb2371dc49015e17e2d6b9dc604fbbf58Toni Barzic                maybeEnableEncryption(DevicePolicyManager.PASSWORD_QUALITY_MANAGED, false);
8003bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) {
8013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
8023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
8033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) {
8043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
8053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
8063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) {
8073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
8083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
8093bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else {
8103bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod);
8113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return false;
8123bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return true;
8143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8153bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8163bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
81734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            int title = getResIdForFactoryResetProtectionWarningTitle();
81838c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            int message = getResIdForFactoryResetProtectionWarningMessage();
8193bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            FactoryResetProtectionWarningDialog dialog =
82034ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    FactoryResetProtectionWarningDialog.newInstance(
82134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                            title, message, unlockMethodToSet);
8223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
8233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
8243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static class FactoryResetProtectionWarningDialog extends DialogFragment {
8263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
82734ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            private static final String ARG_TITLE_RES = "titleRes";
82838c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            private static final String ARG_MESSAGE_RES = "messageRes";
8293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
8303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
83134ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri            public static FactoryResetProtectionWarningDialog newInstance(
83234ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                    int titleRes, int messageRes, String unlockMethodToSet) {
8333bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                FactoryResetProtectionWarningDialog frag =
8343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        new FactoryResetProtectionWarningDialog();
8353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Bundle args = new Bundle();
83634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                args.putInt(ARG_TITLE_RES, titleRes);
83738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                args.putInt(ARG_MESSAGE_RES, messageRes);
8383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
8393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                frag.setArguments(args);
8403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return frag;
8413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8423bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8433bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
8443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public void show(FragmentManager manager, String tag) {
8453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                if (manager.findFragmentByTag(tag) == null) {
8463bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    // Prevent opening multiple dialogs if tapped on button quickly
8473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    super.show(manager, tag);
8483bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                }
8493bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
8523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public Dialog onCreateDialog(Bundle savedInstanceState) {
8533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                final Bundle args = getArguments();
8543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
8553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return new AlertDialog.Builder(getActivity())
85634ec5f97feaf8d73d533f104cfc2c2e68e995ae3Clara Bayarri                        .setTitle(args.getInt(ARG_TITLE_RES))
85738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setMessage(args.getInt(ARG_MESSAGE_RES))
85838c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setPositiveButton(R.string.unlock_disable_frp_warning_ok,
8593bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
8603bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
8613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
8623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        ((ChooseLockGenericFragment) getParentFragment())
8633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                .setUnlockMethod(
8643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                        args.getString(ARG_UNLOCK_METHOD_TO_SET));
8653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
8663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
8673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
8683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setNegativeButton(R.string.cancel,
8693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
8703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
8713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
8723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        dismiss();
8733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
8743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
8753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
8763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .create();
8773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
8783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
879abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
880abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
881