ChooseLockGeneric.java revision 3fb2fb8ac3717b32577c9d65b2e84f1839f4b349
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;
265541a86efe5f26956e54de49c4a59bf1dab79a78Jim Millerimport android.app.PendingIntent;
274037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
28abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.content.DialogInterface;
30abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent;
31783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.content.pm.UserInfo;
32abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
3346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process;
34783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager;
35bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference;
36bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen;
37d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
389218687e4baaf0226ef16b58f78123d979711e5dJim Millerimport android.service.fingerprint.FingerprintManager;
399218687e4baaf0226ef16b58f78123d979711e5dJim Millerimport android.service.fingerprint.FingerprintManagerReceiver;
4027d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog;
413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhangimport android.util.Log;
42309004706c54ba940651e95618b34f7cf693ad25Elliott Hughesimport android.util.MutableBoolean;
43cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater;
44cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View;
45cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup;
46524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager;
47cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView;
48bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
496465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
506465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne
51783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport java.util.List;
52783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
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;
9917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
10047f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
10146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private int mEncryptionRequestQuality;
10246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private boolean mEncryptionRequestDisabled;
1030698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private boolean mRequirePassword;
1040698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private LockPatternUtils mLockPatternUtils;
1059218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private FingerprintManager mFingerprintManager;
10617e9e1933055b207473b488595b2887bfcaea32eJim Miller
10717e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
10817e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
10917e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
11017e9e1933055b207473b488595b2887bfcaea32eJim Miller
1119218687e4baaf0226ef16b58f78123d979711e5dJim Miller            mFingerprintManager =
1129218687e4baaf0226ef16b58f78123d979711e5dJim Miller                (FingerprintManager) getActivity().getSystemService(Context.FINGERPRINT_SERVICE);
11317e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
114d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
11517e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
1160698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
11717e9e1933055b207473b488595b2887bfcaea32eJim Miller
118c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
119c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
120c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
12166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
12266026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                mPasswordConfirmed = !confirmCredentials;
12366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
124c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
12517e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState != null) {
12617e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
12747f1cd4325e839dd33273a451fa052e83789e483Jim Miller                mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
12846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
12946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
13046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                        ENCRYPT_REQUESTED_DISABLED);
13117e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
132bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
13347f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
13447f1cd4325e839dd33273a451fa052e83789e483Jim Miller                updatePreferencesOrFinish();
13547f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
1366370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
1376370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
13817e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) {
13917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
14017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updatePreferencesOrFinish();
14147f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
14247f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
14317e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
144bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
145bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
146bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
147c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        @Override
14817e9e1933055b207473b488595b2887bfcaea32eJim Miller        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
14917e9e1933055b207473b488595b2887bfcaea32eJim Miller                Preference preference) {
15017e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
15127d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
1523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure()) {
1533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // Show the disabling FRP warning only when the user is switching from a secure
1543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                // unlock method to an insecure one
1553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                showFactoryResetProtectionWarningDialog(key);
1563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return true;
15717e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
1583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return setUnlockMethod(key);
15917e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
160bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
161bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
16246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        /**
16346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * If the device has encryption already enabled, then ask the user if they
16446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * also want to encrypt the phone with this password.
16546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         *
16646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param quality
16746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param disabled
16846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         */
16946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private void maybeEnableEncryption(int quality, boolean disabled) {
17046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
17146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = quality;
17246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = disabled;
173ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final Context context = getActivity();
1740698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // If accessibility is enabled and the user hasn't seen this dialog before, set the
1750698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // default state to agree with that which is compatible with accessibility
1760698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // (password not required).
177ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                final boolean accEn = AccessibilityManager.getInstance(context).isEnabled();
1780698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
179ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                Intent intent = getEncryptionInterstitialIntent(context, quality, required);
18046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
18146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else {
1820698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = false; // device encryption not enabled or not device owner.
18346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(quality, disabled);
18446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            }
18546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        }
18646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
18717e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
18817e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
18917e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
19047f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
19117e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
19217e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
19317e9e1933055b207473b488595b2887bfcaea32eJim Miller                updatePreferencesOrFinish();
19446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else if (requestCode == ENABLE_ENCRYPTION_REQUEST
19546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                    && resultCode == Activity.RESULT_OK) {
1960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = data.getBooleanExtra(
1970698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                        EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
19846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled);
1999066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam            } else if (requestCode == CHOOSE_LOCK_REQUEST) {
2009066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                getActivity().setResult(resultCode, data);
2019066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                finish();
20217e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
20317e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
20417e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
20517e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
206bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
207bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
20817e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
20917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
21017e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
21117e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
21217e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
21347f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
21446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
21546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
21617e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
217bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
21817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void updatePreferencesOrFinish() {
2195541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
2205541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
22117e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
2226370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
2235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
224f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                quality = upgradeQuality(quality);
2253fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                final boolean hideDisabledPrefs = intent.getBooleanExtra(
2263fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                        HIDE_DISABLED_PREFS, false);
22717e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
22817e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
22917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
23017e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
23117e9e1933055b207473b488595b2887bfcaea32eJim Miller                addPreferencesFromResource(R.xml.security_settings_picker);
2323fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller                disableUnusablePreferences(quality, hideDisabledPrefs);
233524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                updatePreferenceSummaryIfNeeded();
23417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
23517e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateUnlockMethodAndFinish(quality, false);
236bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
237abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
238bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
239f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        /** increases the quality if necessary */
240f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        private int upgradeQuality(int quality) {
241d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForDPM(quality);
242d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForKeyStore(quality);
243b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence            return quality;
244d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
245d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
246d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForDPM(int quality) {
247d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            // Compare min allowed password quality
248d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            int minQuality = mDPM.getPasswordQuality(null);
249d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (quality < minQuality) {
250d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                quality = minQuality;
251d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
252d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
253d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
254d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
255d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForKeyStore(int quality) {
256d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (!mKeyStore.isEmpty()) {
257d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) {
258d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                    quality = CredentialStorage.MIN_PASSWORD_QUALITY;
2596370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                }
2606370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            }
2616370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            return quality;
2626370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler        }
2636370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler
26417e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
265df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * Disables preferences that are less secure than required quality. The actual
266df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * implementation is in disableUnusablePreferenceImpl.
267df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         *
268df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param quality the requested quality.
2693fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * @param hideDisabledPrefs if false preferences show why they were disabled; otherwise
2703fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller         * they're not shown at all.
271df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         */
2723fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller        protected void disableUnusablePreferences(final int quality, boolean hideDisabledPrefs) {
2733fb2fb8ac3717b32577c9d65b2e84f1839f4b349Jim Miller            disableUnusablePreferencesImpl(quality, hideDisabledPrefs);
274df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        }
275df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang
276df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        /***
27717e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
27817e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
27917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
280df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang         * @param hideDisabled whether to hide disable screen lock options.
28117e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
282df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang        protected void disableUnusablePreferencesImpl(final int quality,
283f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                boolean hideDisabled) {
284cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
285df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang            final Intent intent = getActivity().getIntent();
286783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
287783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            // if there are multiple users, disable "None" setting
288783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE);
289783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            List<UserInfo> users = mUm.getUsers(true);
290783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            final boolean singleUser = users.size() == 1;
291783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
292cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
293cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Preference pref = entries.getPreference(i);
29417e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (pref instanceof PreferenceScreen) {
29517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    final String key = ((PreferenceScreen) pref).getKey();
29617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean enabled = true;
2975541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    boolean visible = true;
298cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
29917e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
300783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller                        visible = singleUser; // don't show when there's more than 1 user
30117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
30217e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
30317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
30417e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
30517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
3068fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
30717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
30817e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
30917e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
310df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    if (hideDisabled) {
311df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                        visible = visible && enabled;
312df8566a9a1eb69ee19376457fe0ee8ad39774790Lucky Zhang                    }
313f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                    if (!visible) {
314cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
3155541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
31617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
31717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
31817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
319bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
320bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
321bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
322bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
323524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        private void updatePreferenceSummaryIfNeeded() {
32440ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            if (LockPatternUtils.isDeviceEncrypted()) {
32540ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav                return;
32640ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            }
32740ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav
328524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
329524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
330524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                return;
331524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
332524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
333524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            CharSequence summary = getString(R.string.secure_lock_encryption_warning);
334524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
335524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            PreferenceScreen screen = getPreferenceScreen();
336524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            final int preferenceCount = screen.getPreferenceCount();
337524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            for (int i = 0; i < preferenceCount; i++) {
338524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                Preference preference = screen.getPreference(i);
339524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                switch (preference.getKey()) {
340524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PATTERN:
341524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PIN:
342524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PASSWORD: {
343524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                        preference.setSummary(summary);
344524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    } break;
345524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                }
346524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
347524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        }
348524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
3496b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        protected Intent getLockPasswordIntent(Context context, int quality,
350f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                int minLength, final int maxLength,
3516b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                boolean requirePasswordToDecrypt, boolean confirmCredentials) {
352f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPassword.createIntent(context, quality, minLength,
3536b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                    maxLength, requirePasswordToDecrypt, confirmCredentials);
3546b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
3556b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
356f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos        protected Intent getLockPatternIntent(Context context, final boolean requirePassword,
357f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                final boolean confirmCredentials) {
358f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            return ChooseLockPattern.createIntent(context, requirePassword,
3596b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                    confirmCredentials);
3606b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam        }
3616b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam
362ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        protected Intent getEncryptionInterstitialIntent(Context context, int quality,
363ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam                boolean required) {
364ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam            return EncryptionInterstitial.createStartIntent(context, quality, required);
365ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam        }
366ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam
3675541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
36817e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
36917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
37017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
37117e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
3726370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
37317e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
37417e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
37517e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
37617e9e1933055b207473b488595b2887bfcaea32eJim Miller        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
3776370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
37817e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
3796370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
38017e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
381bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
382f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos            quality = upgradeQuality(quality);
383c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
3846b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam            final Context context = getActivity();
38517e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
38617e9e1933055b207473b488595b2887bfcaea32eJim Miller                int minLength = mDPM.getPasswordMinimumLength(null);
38717e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
38817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
38917e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
39017e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
391f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                Intent intent = getLockPasswordIntent(context, quality, minLength,
3926b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                        maxLength, mRequirePassword,  /* confirm credentials */false);
3939066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
39417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
395f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                Intent intent = getLockPatternIntent(context, mRequirePassword,
3966b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam                        /* confirm credentials */false);
3979066a5c8b3e2e6a2c8e9d961f306e53e399fca2fMaurice Lam                startActivityForResult(intent, CHOOSE_LOCK_REQUEST);
39817e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
399f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos                mChooseLockSettingsHelper.utils().clearLock();
40017e9e1933055b207473b488595b2887bfcaea32eJim Miller                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
4019218687e4baaf0226ef16b58f78123d979711e5dJim Miller                removeAllFingerprintTemplates();
40217e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_OK);
403c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
404c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            } else {
4059218687e4baaf0226ef16b58f78123d979711e5dJim Miller                removeAllFingerprintTemplates();
406c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
40717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
408abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
409b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
4109218687e4baaf0226ef16b58f78123d979711e5dJim Miller        // TODO: This is only required because we used to enforce clients have a listener,
4119218687e4baaf0226ef16b58f78123d979711e5dJim Miller        // which is no longer required in the new API.  Remove when that happens.
4129218687e4baaf0226ef16b58f78123d979711e5dJim Miller        FingerprintManagerReceiver mReceiver = new FingerprintManagerReceiver() {
4139218687e4baaf0226ef16b58f78123d979711e5dJim Miller            public void onRemoved(int fingerprintId) {
4149218687e4baaf0226ef16b58f78123d979711e5dJim Miller                Log.v(TAG, "onRemoved(id=" + fingerprintId + ")");
4159218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
4169218687e4baaf0226ef16b58f78123d979711e5dJim Miller        };
4179218687e4baaf0226ef16b58f78123d979711e5dJim Miller
4189218687e4baaf0226ef16b58f78123d979711e5dJim Miller        private void removeAllFingerprintTemplates() {
4199218687e4baaf0226ef16b58f78123d979711e5dJim Miller            mFingerprintManager.startListening(mReceiver);
4209218687e4baaf0226ef16b58f78123d979711e5dJim Miller            if (mFingerprintManager != null) {
4219218687e4baaf0226ef16b58f78123d979711e5dJim Miller                mFingerprintManager.remove(0 /* all fingerprint templates */);
4229218687e4baaf0226ef16b58f78123d979711e5dJim Miller            }
4239218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
4249218687e4baaf0226ef16b58f78123d979711e5dJim Miller
4259218687e4baaf0226ef16b58f78123d979711e5dJim Miller        @Override
4269218687e4baaf0226ef16b58f78123d979711e5dJim Miller        public void onDestroy() {
4279218687e4baaf0226ef16b58f78123d979711e5dJim Miller            super.onDestroy();
4289218687e4baaf0226ef16b58f78123d979711e5dJim Miller            mFingerprintManager.stopListening();
4299218687e4baaf0226ef16b58f78123d979711e5dJim Miller        }
4309218687e4baaf0226ef16b58f78123d979711e5dJim Miller
431b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
432b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
433b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
434b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
435b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
4363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private int getResIdForFactoryResetProtectionWarningTitle() {
4373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            switch (mLockPatternUtils.getKeyguardStoredPasswordQuality()) {
4383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
4393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_pattern_summary;
4403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
4413bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
4423bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_pin_summary;
4433bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
4443bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
4453bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
4463bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_password_summary;
4473bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                default:
4483bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    return R.string.unlock_disable_lock_unknown_summary;
4493bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
4503bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
4513bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4523bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean isUnlockMethodSecure(String unlockMethod) {
4533bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return !(KEY_UNLOCK_SET_OFF.equals(unlockMethod) ||
4543bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    KEY_UNLOCK_SET_NONE.equals(unlockMethod));
4553bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
4563bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4573bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private boolean setUnlockMethod(String unlockMethod) {
4583bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, unlockMethod);
4593bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4603bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            if (KEY_UNLOCK_SET_OFF.equals(unlockMethod)) {
4613bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
4623bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true /* disabled */ );
4633bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_NONE.equals(unlockMethod)) {
4643bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                updateUnlockMethodAndFinish(
4653bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false /* disabled */ );
4663bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PATTERN.equals(unlockMethod)) {
4673bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
4683bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
4693bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PIN.equals(unlockMethod)) {
4703bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
4713bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
4723bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else if (KEY_UNLOCK_SET_PASSWORD.equals(unlockMethod)) {
4733bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                maybeEnableEncryption(
4743bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
4753bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            } else {
4763bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Log.e(TAG, "Encountered unknown unlock method to set: " + unlockMethod);
4773bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return false;
4783bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
4793bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            return true;
4803bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
4813bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4823bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        private void showFactoryResetProtectionWarningDialog(String unlockMethodToSet) {
4833bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            int title = getResIdForFactoryResetProtectionWarningTitle();
4843bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            FactoryResetProtectionWarningDialog dialog =
4853bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    FactoryResetProtectionWarningDialog.newInstance(title, unlockMethodToSet);
4863bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            dialog.show(getChildFragmentManager(), TAG_FRP_WARNING_DIALOG);
4873bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
4883bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4893bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        public static class FactoryResetProtectionWarningDialog extends DialogFragment {
4903bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4913bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_TITLE_RES = "titleRes";
4923bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            private static final String ARG_UNLOCK_METHOD_TO_SET = "unlockMethodToSet";
4933bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
4943bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public static FactoryResetProtectionWarningDialog newInstance(int title,
4953bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    String unlockMethodToSet) {
4963bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                FactoryResetProtectionWarningDialog frag =
4973bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        new FactoryResetProtectionWarningDialog();
4983bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                Bundle args = new Bundle();
4993bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putInt(ARG_TITLE_RES, title);
5003bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                args.putString(ARG_UNLOCK_METHOD_TO_SET, unlockMethodToSet);
5013bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                frag.setArguments(args);
5023bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return frag;
5033bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5043bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5053bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
5063bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public void show(FragmentManager manager, String tag) {
5073bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                if (manager.findFragmentByTag(tag) == null) {
5083bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    // Prevent opening multiple dialogs if tapped on button quickly
5093bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                    super.show(manager, tag);
5103bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                }
5113bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5123bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5133bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            @Override
5143bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            public Dialog onCreateDialog(Bundle savedInstanceState) {
5153bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                final Bundle args = getArguments();
5163bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang
5173bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                return new AlertDialog.Builder(getActivity())
5183bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setTitle(args.getInt(ARG_TITLE_RES))
5193bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setMessage(R.string.unlock_disable_frp_warning_content)
5203bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setPositiveButton(R.string.okay,
5213bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
5223bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
5233bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
5243bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        ((ChooseLockGenericFragment) getParentFragment())
5253bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                .setUnlockMethod(
5263bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                                        args.getString(ARG_UNLOCK_METHOD_TO_SET));
5273bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
5283bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
5293bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
5303bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .setNegativeButton(R.string.cancel,
5313bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                new DialogInterface.OnClickListener() {
5323bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    @Override
5333bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    public void onClick(DialogInterface dialog, int whichButton) {
5343bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                        dismiss();
5353bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                    }
5363bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                                }
5373bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        )
5383bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang                        .create();
5393bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang            }
5403bcea0289b90dd543a2e7f4ea35a5b6ccdb95e14Lucky Zhang        }
541abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
542abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
543