ChooseLockGeneric.java revision 9c32468cd59cbe5b8e7692235a67034c936b4788
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;
3039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.Fingerprint;
3139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager;
3239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.hardware.fingerprint.FingerprintManager.RemovalCallback;
33abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
3446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process;
355437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roosimport android.os.UserHandle;
36f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chenimport android.os.UserManager;
37d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
3839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
3939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceScreen;
4027d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog;
413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.util.Log;
4287fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lamimport android.view.View;
43524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager;
44d16c9b7c3100b7ba653dcd58db036500dd220896Jim Millerimport android.widget.Toast;
45d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
468a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger;
476465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
489c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
499c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport com.android.settingslib.RestrictedPreference;
509c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka
519c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
526465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne
53263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity {
540698a216311acd9ab52224602d1a75c08bf89f04Jim Miller    public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
55abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
56abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    @Override
5717e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
5817e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
5952c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
6017e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
61a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
62a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
63a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
64a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
65a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true;
66a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
6717e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
68bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
6952c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    /* package */ Class<? extends Fragment> getFragmentClass() {
7052c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        return ChooseLockGenericFragment.class;
7152c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    }
7252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam
7366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    public static class InternalActivity extends ChooseLockGeneric {
7466026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    }
7566026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani
7617e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
773fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final String TAG = "ChooseLockGenericFragment";
7817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int MIN_PASSWORD_LENGTH = 4;
7917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
8017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
8117e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
8217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
8317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
8417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String PASSWORD_CONFIRMED = "password_confirmed";
8547f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
86d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
873fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        public static final String HIDE_DISABLED_PREFS = "hide_disabled_prefs";
8846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
8946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static final String TAG_FRP_WARNING_DIALOG = "frp_warning_dialog";
9117e9e1933055b207473b488595b2887bfcaea32eJim Miller
923fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CONFIRM_EXISTING_REQUEST = 100;
933fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int ENABLE_ENCRYPTION_REQUEST = 101;
943fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        private static final int CHOOSE_LOCK_REQUEST = 102;
9580412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
9617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
9717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private DevicePolicyManager mDPM;
98d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private KeyStore mKeyStore;
996609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private boolean mHasChallenge = false;
1006609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        private long mChallenge;
10117e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
10247f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
10346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private int mEncryptionRequestQuality;
10446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private boolean mEncryptionRequestDisabled;
1050698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private boolean mRequirePassword;
106c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam        private boolean mForFingerprint = false;
107a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        private String mUserPassword;
1080698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private LockPatternUtils mLockPatternUtils;
1099218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private FingerprintManager mFingerprintManager;
110fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri        private int mUserId;
111d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller        private RemovalCallback mRemovalCallback = new RemovalCallback() {
112d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
113d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            @Override
114d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            public void onRemovalSucceeded(Fingerprint fingerprint) {
115d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller                Log.v(TAG, "Fingerprint removed: " + fingerprint.getFingerId());
116f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                if (mFingerprintManager.getEnrolledFingerprints().size() == 0) {
117f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                    finish();
118f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                }
119d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            }
120d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller
121d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            @Override
122d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
123f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                Activity activity = getActivity();
124f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                if (activity != null) {
125f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                    Toast.makeText(getActivity(), errString, Toast.LENGTH_SHORT);
126f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                }
127f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                finish();
128d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller            }
129d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller        };
13017e9e1933055b207473b488595b2887bfcaea32eJim Miller
13117e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
1328a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        protected int getMetricsCategory() {
1338a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren            return MetricsLogger.CHOOSE_LOCK_GENERIC;
1348a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        }
1358a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1368a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren        @Override
13717e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
13817e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
13917e9e1933055b207473b488595b2887bfcaea32eJim Miller
1409218687e4baaf0226ef16b58f78123d979711e5dJim Miller            mFingerprintManager =
1419218687e4baaf0226ef16b58f78123d979711e5dJim Miller                (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
14217e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
143d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
14417e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
1450698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
14617e9e1933055b207473b488595b2887bfcaea32eJim Miller
147c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
148c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
149c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
15066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
15166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                mPasswordConfirmed = !confirmCredentials;
15266026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
153c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
1546609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mHasChallenge = getActivity().getIntent().getBooleanExtra(
1556609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
1566609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            mChallenge = getActivity().getIntent().getLongExtra(
1576609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
158c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam            mForFingerprint = getActivity().getIntent().getBooleanExtra(
159c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                    ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
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
169fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            // Only take this argument into account if it belongs to the current profile.
170fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            mUserId = Utils.getSameOwnerUserId(getContext(), getArguments());
171fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri
17247f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
17347f1cd4325e839dd33273a451fa052e83789e483Jim Miller                updatePreferencesOrFinish();
17447f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
1756370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
1766370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
1778a09b619aeb233e2aab1919301f162d8acf1f0f0Jorim Jaggi                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST,
178fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                        getString(R.string.unlock_set_unlock_launch_picker_title), true, mUserId)) {
17917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
18017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updatePreferencesOrFinish();
18147f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
18247f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
18317e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
184bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
185bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
186bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
187c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        @Override
18887fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        public void onViewCreated(View view, Bundle savedInstanceState) {
18987fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            super.onViewCreated(view, savedInstanceState);
19087fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            if (mForFingerprint) {
19139b467482d1bf256a111c757e9b7621c6f523271Jason Monk                setHeaderView(R.layout.choose_lock_generic_fingerprint_header);
19287fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam            }
19387fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        }
19487fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam
19587fadbe6d96e482fa8fc94f502afa10a522285a4Maurice Lam        @Override
19639b467482d1bf256a111c757e9b7621c6f523271Jason Monk        public boolean onPreferenceTreeClick(Preference preference) {
19717e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
19827d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
199fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
2003bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // Show the disabling FRP warning only when the user is switching from a secure
2013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // unlock method to an insecure one
2023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                showFactoryResetProtectionWarningDialog(key);
2033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return true;
20417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
2053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return setUnlockMethod(key);
20617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
207bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
208bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
20946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        /**
21046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * If the device has encryption already enabled, then ask the user if they
21146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * also want to encrypt the phone with this password.
21246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         *
21346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param quality
21446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param disabled
21546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         */
216a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // TODO: why does this take disabled, its always called with a quality higher than
217a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        // what makes sense with disabled == true
21846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private void maybeEnableEncryption(int quality, boolean disabled) {
219146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov            DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
220f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen            if (UserManager.get(getActivity()).isAdminUser()
22193bcfcb14d42ea0884b922ae1a4d84a6955ed835Clara Bayarri                    && mUserId == UserHandle.myUserId()
222f9ee84dba4299962742befdd4d390436d82b3c49Xiaohui Chen                    && LockPatternUtils.isDeviceEncryptionEnabled()
223146fc11958ae93d4c97ce83839188ece762f3275Andrei Kapishnikov                    && !dpm.getDoNotAskCredentialsOnBoot()) {
22446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = quality;
22546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = disabled;
226edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // Get the intent that the encryption interstitial should start for creating
227edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                // the new unlock method.
228edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                Intent unlockMethodIntent = getIntentForUnlockMethod(quality, disabled);
229ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final Context context = getActivity();
2300698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // If accessibility is enabled and the user hasn't seen this dialog before, set the
2310698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // default state to agree with that which is compatible with accessibility
2320698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // (password not required).
233ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
2340698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
235edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                Intent intent = getEncryptionInterstitialIntent(context, quality, required,
236edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                        unlockMethodIntent);
237c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
238c0e7879684d7d9c5cd102b124ee8cf1a2637d49dMaurice Lam                        mForFingerprint);
23946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
24046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else {
2410698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = false; // device encryption not enabled or not device owner.
24246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(quality, disabled);
24346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            }
24446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        }
24546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
24617e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
24717e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
24817e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
24947f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
25017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
25117e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
252a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales                mUserPassword = data.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD);
25317e9e1933055b207473b488595b2887bfcaea32eJim Miller                updatePreferencesOrFinish();
254e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam            } else if (requestCode == CHOOSE_LOCK_REQUEST
255e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    || requestCode == ENABLE_ENCRYPTION_REQUEST) {
256e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                if (resultCode != RESULT_CANCELED) {
257e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    getActivity().setResult(resultCode, data);
258e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                    finish();
259e9d2abca86ef3a83fb25b9562e206e459a5b4e2bMaurice Lam                }
26017e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
26117e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
26217e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
26317e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
264bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
265bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
26617e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
26717e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
26817e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
26917e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
27017e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
27147f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
27246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
27346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
27417e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
275bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
27617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void updatePreferencesOrFinish() {
2775541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
2785541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
27917e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
2806370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
2815541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
282f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                quality = upgradeQuality(quality);
2833fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                final boolean hideDisabledPrefs = intent.getBooleanExtra(
2843fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                        HIDE_DISABLED_PREFS, false);
28517e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
28617e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
28717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
28817e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
28917e9e1933055b207473b488595b2887bfcaea32eJim Miller                addPreferencesFromResource(R.xml.security_settings_picker);
2903fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                disableUnusablePreferences(quality, hideDisabledPrefs);
2919a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                updateCurrentPreference();
292524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                updatePreferenceSummaryIfNeeded();
29317e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
29417e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateUnlockMethodAndFinish(quality, false);
295bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
296abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
297bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
2989a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private void updateCurrentPreference() {
2999a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            String currentKey = getKeyForCurrent();
3009a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            Preference preference = findPreference(currentKey);
3019a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            if (preference != null) {
3029a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                preference.setSummary(R.string.current_screen_lock);
3039a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
3049a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
3059a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
3069a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        private String getKeyForCurrent() {
307fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            if (mLockPatternUtils.isLockScreenDisabled(mUserId)) {
3089a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                return KEY_UNLOCK_SET_OFF;
3099a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
310fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
3119a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
3129a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PATTERN;
3139a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
3149a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
3159a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PIN;
3169a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
3179a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
3189a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_PASSWORD;
3199a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
3209a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk                    return KEY_UNLOCK_SET_NONE;
3219a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            }
3229a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk            return null;
3239a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk        }
3249a64a4215e9a8ac6d3af72479aa162d0701deb48Jason Monk
325f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        /** increases the quality if necessary */
326f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        private int upgradeQuality(int quality) {
327d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForDPM(quality);
328b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence            return quality;
329d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
330d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
331d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForDPM(int quality) {
332d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            // Compare min allowed password quality
333d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            int minQuality = mDPM.getPasswordQuality(null);
334d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (quality < minQuality) {
335d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                quality = minQuality;
336d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
337d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
338d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
339d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
34017e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
341df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * Disables preferences that are less secure than required quality. The actual
342df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * implementation is in disableUnusablePreferenceImpl.
343df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         *
344df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param quality the requested quality.
3453fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise
3463fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * they're not shown at all.
347df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         */
3483fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) {
3493fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            disableUnusablePreferencesImpl(quality, hideDisabledPrefs);
350df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        }
351df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
352df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        /***
35317e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
35417e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
35517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
356df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param hideDisabled whether to hide disable screen lock options.
35717e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
358df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        protected void disableUnusablePreferencesImpl(final int quality,
359f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                boolean hideDisabled) {
360cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
361783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
3629c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka            int adminEnforcedQuality = mDPM.getPasswordQuality(null);
3639c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka            EnforcedAdmin enforcedAdmin = RestrictedLockUtils.checkIfPasswordQualityIsSet(
3649c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    getActivity());
365cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
366cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Preference pref = entries.getPreference(i);
3679c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                if (pref instanceof RestrictedPreference) {
368591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                    final String key = pref.getKey();
36917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean enabled = true;
3705541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    boolean visible = true;
3719c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    boolean disabledByAdmin = false;
372cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
37317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
37405c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                        if (getResources().getBoolean(R.bool.config_hide_none_security_option)) {
37505c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                            enabled = false;
37605c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                            visible = false;
37705c7dde1f3a6044db7b687dfcbacbde50f3befb1Sungmin Choi                        }
3789c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
3799c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
38017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
3816934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                        if (mUserId != UserHandle.myUserId()) {
3826934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                            // Swipe doesn't make sense for profiles.
3836934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                            visible = false;
3846934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri                        }
38517e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
3869c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
3879c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
38817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
38917e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
3909c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
3919c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
39217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
3938fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
3949c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
3959c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
39617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
39717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
3989c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        disabledByAdmin = adminEnforcedQuality
3999c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                                > DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
40017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
401df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    if (hideDisabled) {
402591dc85017ea19e56c416ae6d1a55b82e29743f4Adrian Roos                        visible = enabled;
403df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    }
404f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                    if (!visible) {
405cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
4069c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else if (disabledByAdmin && enforcedAdmin != null) {
4079c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(enforcedAdmin);
4085541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
4099c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // we need to setDisabledByAdmin to null first to disable the padlock
4109c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        // in case it was set earlier.
4119c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
41217e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
41317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
4149c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                    } else {
4159c32468cd59cbe5b8e7692235a67034c936b4788Sudheer Shanka                        ((RestrictedPreference) pref).setDisabledByAdmin(null);
41617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
417bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
418bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
419bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
420bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
421524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        private void updatePreferenceSummaryIfNeeded() {
42240ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            if (LockPatternUtils.isDeviceEncrypted()) {
42340ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav                return;
42440ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            }
42540ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav
426524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
427524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
428524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                return;
429524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
430524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
431524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            CharSequence summary = getString(R.string.secure_lock_encryption_warning);
432524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
433524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            PreferenceScreen screen = getPreferenceScreen();
434524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            final int preferenceCount = screen.getPreferenceCount();
435524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            for (int i = 0; i < preferenceCount; i++) {
436524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                Preference preference = screen.getPreference(i);
437524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                switch (preference.getKey()) {
438524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PATTERN:
439524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PIN:
440524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PASSWORD: {
441524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                        preference.setSummary(summary);
442524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    } break;
443524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                }
444524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
445524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        }
446524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
4476b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality,
448f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                int minLength, final int maxLength,
449fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                boolean requirePasswordToDecrypt, boolean confirmCredentials, int userId) {
450f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPassword.createIntent(context, quality, minLength,
451fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    maxLength, requirePasswordToDecrypt, confirmCredentials, userId);
4526b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
4536b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
4546609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        protected Intent getLockPasswordIntent(Context context, int quality,
4556609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                int minLength, final int maxLength,
456fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                boolean requirePasswordToDecrypt, long challenge, int userId) {
4576609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales            return ChooseLockPassword.createIntent(context, quality, minLength,
458fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    maxLength, requirePasswordToDecrypt, challenge, userId);
4596609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
4606609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
4613859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality, int minLength,
462fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                int maxLength, boolean requirePasswordToDecrypt, String password, int userId) {
463a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales            return ChooseLockPassword.createIntent(context, quality, minLength, maxLength,
464fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    requirePasswordToDecrypt, password, userId);
465a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
466a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
467f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
468fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                final boolean confirmCredentials, int userId) {
469f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPattern.createIntent(context, requirePassword,
470fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                    confirmCredentials, userId);
4716b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
4726b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
4736609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
474fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri               long challenge, int userId) {
475fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            return ChooseLockPattern.createIntent(context, requirePassword, challenge, userId);
4766609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales        }
4776609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales
4783859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
479fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                final String pattern, int userId) {
480fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            return ChooseLockPattern.createIntent(context, requirePassword, pattern, userId);
481a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales        }
482a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales
483ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
484edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                boolean required, Intent unlockMethodIntent) {
485edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return EncryptionInterstitial.createStartIntent(context, quality, required,
486edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                    unlockMethodIntent);
487ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        }
488ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam
4895541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
49017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
49117e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
49217e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
49317e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
4946370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
49517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
49617e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
49717e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
49817e9e1933055b207473b488595b2887bfcaea32eJim Miller        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
4996370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
50017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
5016370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
50217e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
503bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
504f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            quality = upgradeQuality(quality);
505edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            Intent intent = getIntentForUnlockMethod(quality, disabled);
506edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (intent != null) {
507edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
508edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                return;
509edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
510edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini
511edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
512edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                mChooseLockSettingsHelper.utils().clearLock(mUserId);
513edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled, mUserId);
514b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri                mLockPatternUtils.setSeparateProfileChallengeEnabled(mUserId, false);
515edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                removeAllFingerprintTemplatesAndFinish();
516edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                getActivity().setResult(Activity.RESULT_OK);
517edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            } else {
518edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                removeAllFingerprintTemplatesAndFinish();
519edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            }
520edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini        }
521c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
522edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini        private Intent getIntentForUnlockMethod(int quality, boolean disabled) {
523edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            Intent intent = null;
5246b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam            final Context context = getActivity();
52517e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
52617e9e1933055b207473b488595b2887bfcaea32eJim Miller                int minLength = mDPM.getPasswordMinimumLength(null);
52717e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
52817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
52917e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
53017e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
5316609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                if (mHasChallenge) {
5326609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPasswordIntent(context, quality, minLength,
533fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri                            maxLength, mRequirePassword, mChallenge, mUserId);
5346609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                } else {
5356609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPasswordIntent(context, quality, minLength,
536edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            maxLength, mRequirePassword, mUserPassword, mUserId);
5376609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                }
53817e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
5396609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                if (mHasChallenge) {
5406609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPatternIntent(context, mRequirePassword,
541edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            mChallenge, mUserId);
5426609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                } else {
5436609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                    intent = getLockPatternIntent(context, mRequirePassword,
544edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini                            mUserPassword, mUserId);
5456609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales                }
54617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
547edac136e162d3935ea1ccedf6c630eff4c591d7eUdam Saini            return intent;
548abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
549b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
550f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi        private void removeAllFingerprintTemplatesAndFinish() {
551c2f6813a836014a5b38bcfaa24fe9e91671f4646Jim Miller            if (mFingerprintManager != null && mFingerprintManager.isHardwareDetected()
552c2f6813a836014a5b38bcfaa24fe9e91671f4646Jim Miller                    && mFingerprintManager.getEnrolledFingerprints().size() > 0) {
553d16c9b7c3100b7ba653dcd58db036500dd220896Jim Miller                mFingerprintManager.remove(new Fingerprint(null, 0, 0, 0), mRemovalCallback);
554f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi            } else {
555f92fbc1c49ec09762a2ed81297002865638f37aeJorim Jaggi                finish();
5569218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
5579218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
5589218687e4baaf0226ef16b58f78123d979711e5dJim Miller
5599218687e4baaf0226ef16b58f78123d979711e5dJim Miller        @Override
5609218687e4baaf0226ef16b58f78123d979711e5dJim Miller        public void onDestroy() {
5619218687e4baaf0226ef16b58f78123d979711e5dJim Miller            super.onDestroy();
5629218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
5639218687e4baaf0226ef16b58f78123d979711e5dJim Miller
564b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
565b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
566b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
567b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
568b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
56938c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos        private int getResIdForFactoryResetProtectionWarningMessage() {
57038c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            boolean hasFingerprints = mFingerprintManager.hasEnrolledFingerprints();
571fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality(mUserId)) {
5723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
57338c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                    return hasFingerprints
57438c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            ? R.string.unlock_disable_frp_warning_content_pattern_fingerprint
57538c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            : R.string.unlock_disable_frp_warning_content_pattern;
5763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
5773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
57838c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                    return hasFingerprints
57938c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            ? R.string.unlock_disable_frp_warning_content_pin_fingerprint
58038c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            : R.string.unlock_disable_frp_warning_content_pin;
5813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
5823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
5833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
58438c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                    return hasFingerprints
58538c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            ? R.string.unlock_disable_frp_warning_content_password_fingerprint
58638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            : R.string.unlock_disable_frp_warning_content_password;
5873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                default:
58838c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                    return hasFingerprints
58938c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            ? R.string.unlock_disable_frp_warning_content_unknown_fingerprint
59038c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                            : R.string.unlock_disable_frp_warning_content_unknown;
5913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
5933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean isUnlockMethodSecure(String unlockMethod) {
5953bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) ||
5963bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    KEY_UNLOCK_SET_NONE.equals(unlockMethod));
5973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
5983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean setUnlockMethod(String unlockMethod) {
6003bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod);
6013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
6023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) {
6033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
6043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ );
6053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) {
6063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
6073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ );
6083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) {
6093bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
6103bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
6113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) {
6123bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
6133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
6143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) {
6153bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
6163bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
6173bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else {
6183bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod);
6193bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return false;
6203bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
6213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return true;
6223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
6233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
6243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
62538c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            int message = getResIdForFactoryResetProtectionWarningMessage();
6263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            FactoryResetProtectionWarningDialog dialog =
62738c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                    FactoryResetProtectionWarningDialog.newInstance(message, unlockMethodToSet);
6283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
6293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
6303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
6313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static class FactoryResetProtectionWarningDialog extends DialogFragment {
6323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
63338c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            private static final String ARG_MESSAGE_RES = "messageRes";
6343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
6353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
63638c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos            public static FactoryResetProtectionWarningDialog newInstance(int messageRes,
6373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    String unlockMethodToSet) {
6383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                FactoryResetProtectionWarningDialog frag =
6393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        new FactoryResetProtectionWarningDialog();
6403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Bundle args = new Bundle();
64138c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                args.putInt(ARG_MESSAGE_RES, messageRes);
6423bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
6433bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                frag.setArguments(args);
6443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return frag;
6453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
6463bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
6473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
6483bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public void show(FragmentManager manager, String tag) {
6493bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                if (manager.findFragmentByTag(tag) == null) {
6503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    // Prevent opening multiple dialogs if tapped on button quickly
6513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    super.show(manager, tag);
6523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                }
6533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
6543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
6553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
6563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public Dialog onCreateDialog(Bundle savedInstanceState) {
6573bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                final Bundle args = getArguments();
6583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
6593bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return new AlertDialog.Builder(getActivity())
66038c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setTitle(R.string.unlock_disable_frp_warning_title)
66138c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setMessage(args.getInt(ARG_MESSAGE_RES))
66238c9b9eb5ee2734c4f6f78854951e79bd9e9d3cfAdrian Roos                        .setPositiveButton(R.string.unlock_disable_frp_warning_ok,
6633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
6643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
6653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
6663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        ((ChooseLockGenericFragment) getParentFragment())
6673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                .setUnlockMethod(
6683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                        args.getString(ARG_UNLOCK_METHOD_TO_SET));
6693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
6703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
6713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
6723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setNegativeButton(R.string.cancel,
6733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
6743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
6753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
6763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        dismiss();
6773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
6783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
6793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
6803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .create();
6813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
6823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
683abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
684abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
685