ChooseLockGeneric.java revision 52c75baa122e9a8a1c27f54c3884253d2360e257
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;
2146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.app.ActivityManagerNative;
2252c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lamimport android.app.Fragment;
235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Millerimport android.app.PendingIntent;
244037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
25abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
26abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent;
27783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.content.pm.UserInfo;
28abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
2946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.Process;
3046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.RemoteException;
3146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Millerimport android.os.UserHandle;
32783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager;
33bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference;
34bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen;
35d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
3627d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog;
37309004706c54ba940651e95618b34f7cf693ad25Elliott Hughesimport android.util.MutableBoolean;
38cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater;
39cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View;
40cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup;
41524484426855f814ff1f3189fd5221dd630dbf8cSvetoslavimport android.view.accessibility.AccessibilityManager;
42cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView;
43bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
446465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
456465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne
46783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport java.util.List;
47783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
48263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockGeneric extends SettingsActivity {
490698a216311acd9ab52224602d1a75c08bf89f04Jim Miller    public static final String CONFIRM_CREDENTIALS = "confirm_credentials";
50abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
51abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    @Override
5217e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
5317e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
5452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName());
5517e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
56a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
57a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
58a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
59a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
60a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ChooseLockGenericFragment.class.getName().equals(fragmentName)) return true;
61a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
6217e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
63bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
6452c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    /* package */ Class<? extends Fragment> getFragmentClass() {
6552c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam        return ChooseLockGenericFragment.class;
6652c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam    }
6752c75baa122e9a8a1c27f54c3884253d2360e257Maurice Lam
6866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    public static class InternalActivity extends ChooseLockGeneric {
6966026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani    }
7066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani
7117e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
7217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int MIN_PASSWORD_LENGTH = 4;
735bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett        private static final String KEY_UNLOCK_BACKUP_INFO = "unlock_backup_info";
7417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
7517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
765541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        private static final String KEY_UNLOCK_SET_BIOMETRIC_WEAK = "unlock_set_biometric_weak";
7717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
7817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
7917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
8017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int CONFIRM_EXISTING_REQUEST = 100;
8131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross        private static final int FALLBACK_REQUEST = 101;
8246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private static final int ENABLE_ENCRYPTION_REQUEST = 102;
8317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String PASSWORD_CONFIRMED = "password_confirmed";
840698a216311acd9ab52224602d1a75c08bf89f04Jim Miller
8547f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
86c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        private static final String FINISH_PENDING = "finish_pending";
87d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
8846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_QUALITY = "encrypt_requested_quality";
8946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        public static final String ENCRYPT_REQUESTED_DISABLED = "encrypt_requested_disabled";
9017e9e1933055b207473b488595b2887bfcaea32eJim Miller
9180412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett        private static final boolean ALWAY_SHOW_TUTORIAL = true;
9280412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
9317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
9417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private DevicePolicyManager mDPM;
95d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private KeyStore mKeyStore;
9617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
9747f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
98c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        private boolean mFinishPending = false;
9946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private int mEncryptionRequestQuality;
10046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private boolean mEncryptionRequestDisabled;
1010698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private boolean mRequirePassword;
1020698a216311acd9ab52224602d1a75c08bf89f04Jim Miller        private LockPatternUtils mLockPatternUtils;
10317e9e1933055b207473b488595b2887bfcaea32eJim Miller
10417e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
10517e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
10617e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
10717e9e1933055b207473b488595b2887bfcaea32eJim Miller
10817e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
109d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
11017e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
1110698a216311acd9ab52224602d1a75c08bf89f04Jim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
11217e9e1933055b207473b488595b2887bfcaea32eJim Miller
113c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
114c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
115c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
11666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            if (getActivity() instanceof ChooseLockGeneric.InternalActivity) {
11766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                mPasswordConfirmed = !confirmCredentials;
11866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            }
119c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
12017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState != null) {
12117e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
12247f1cd4325e839dd33273a451fa052e83789e483Jim Miller                mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
123c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                mFinishPending = savedInstanceState.getBoolean(FINISH_PENDING);
12446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = savedInstanceState.getInt(ENCRYPT_REQUESTED_QUALITY);
12546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = savedInstanceState.getBoolean(
12646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                        ENCRYPT_REQUESTED_DISABLED);
12717e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
128bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
12947f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
13047f1cd4325e839dd33273a451fa052e83789e483Jim Miller                updatePreferencesOrFinish();
13147f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
1326370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
1336370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
13417e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) {
13517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
13617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updatePreferencesOrFinish();
13747f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
13847f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
13917e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
140bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
141bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
142bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
143c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        @Override
144c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        public void onResume() {
145c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            super.onResume();
146c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            if (mFinishPending) {
147c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                mFinishPending = false;
148c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
149c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            }
150c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        }
15147f1cd4325e839dd33273a451fa052e83789e483Jim Miller
15217e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
15317e9e1933055b207473b488595b2887bfcaea32eJim Miller        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
15417e9e1933055b207473b488595b2887bfcaea32eJim Miller                Preference preference) {
15517e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
15617e9e1933055b207473b488595b2887bfcaea32eJim Miller            boolean handled = true;
15727d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
15827d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, key);
15927d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
16017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (KEY_UNLOCK_SET_OFF.equals(key)) {
1616370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                updateUnlockMethodAndFinish(
1626370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true);
16317e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
1646370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                updateUnlockMethodAndFinish(
1656370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false);
1665541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) {
16746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                maybeEnableEncryption(
1685541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                        DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false);
1695541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
17046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                maybeEnableEncryption(
1716370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
17217e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
17346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                maybeEnableEncryption(
1746370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
17517e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
17646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                maybeEnableEncryption(
1776370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
17817e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
17917e9e1933055b207473b488595b2887bfcaea32eJim Miller                handled = false;
18017e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
18117e9e1933055b207473b488595b2887bfcaea32eJim Miller            return handled;
182bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
183bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
18446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        /**
18546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * If the device has encryption already enabled, then ask the user if they
18646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * also want to encrypt the phone with this password.
18746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         *
18846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param quality
18946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         * @param disabled
19046c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller         */
19146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        private void maybeEnableEncryption(int quality, boolean disabled) {
19246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            if (Process.myUserHandle().isOwner() && LockPatternUtils.isDeviceEncryptionEnabled()) {
19346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestQuality = quality;
19446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                mEncryptionRequestDisabled = disabled;
1950698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // If accessibility is enabled and the user hasn't seen this dialog before, set the
1960698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // default state to agree with that which is compatible with accessibility
1970698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                // (password not required).
1980698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled();
1990698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                final boolean required = mLockPatternUtils.isCredentialRequiredToDecrypt(!accEn);
2000698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                Intent intent = EncryptionInterstitial.createStartIntent(
2010698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                        getActivity(), quality, required);
20246c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                startActivityForResult(intent, ENABLE_ENCRYPTION_REQUEST);
20346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else {
2040698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = false; // device encryption not enabled or not device owner.
20546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(quality, disabled);
20646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            }
20746c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller        }
20846c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller
20917e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
210cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani        public View onCreateView(LayoutInflater inflater, ViewGroup container,
211cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Bundle savedInstanceState) {
212cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            View v = super.onCreateView(inflater, container, savedInstanceState);
213cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final boolean onlyShowFallback = getActivity().getIntent()
214cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
215cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            if (onlyShowFallback) {
216cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                View header = v.inflate(getActivity(),
217cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        R.layout.weak_biometric_fallback_header, null);
218cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                ((ListView) v.findViewById(android.R.id.list)).addHeaderView(header, null, false);
219cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            }
220cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani
221cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            return v;
222cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani        }
223cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani
224cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani        @Override
22517e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
22617e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
22747f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
22817e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
22917e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
23017e9e1933055b207473b488595b2887bfcaea32eJim Miller                updatePreferencesOrFinish();
23146c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else if (requestCode == FALLBACK_REQUEST) {
23231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                mChooseLockSettingsHelper.utils().deleteTempGallery();
23331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                getActivity().setResult(resultCode);
23431dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                finish();
23546c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            } else if (requestCode == ENABLE_ENCRYPTION_REQUEST
23646c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                    && resultCode == Activity.RESULT_OK) {
2370698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                mRequirePassword = data.getBooleanExtra(
2380698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                        EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true);
23946c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller                updateUnlockMethodAndFinish(mEncryptionRequestQuality, mEncryptionRequestDisabled);
24017e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
24117e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
24217e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
24317e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
244bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
245bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
24617e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
24717e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
24817e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
24917e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
25017e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
25147f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
252c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            outState.putBoolean(FINISH_PENDING, mFinishPending);
25346c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putInt(ENCRYPT_REQUESTED_QUALITY, mEncryptionRequestQuality);
25446c7f6d6f32efec26bc9343f591ad1ddbe8f3b4aJim Miller            outState.putBoolean(ENCRYPT_REQUESTED_DISABLED, mEncryptionRequestDisabled);
25517e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
256bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
25717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void updatePreferencesOrFinish() {
2585541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
2595541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
26017e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
2616370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
2625541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
26394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                MutableBoolean allowBiometric = new MutableBoolean(false);
26494c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                quality = upgradeQuality(quality, allowBiometric);
26517e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
26617e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
26717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
26817e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
26917e9e1933055b207473b488595b2887bfcaea32eJim Miller                addPreferencesFromResource(R.xml.security_settings_picker);
27094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                disableUnusablePreferences(quality, allowBiometric);
271524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                updatePreferenceSummaryIfNeeded();
27217e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
27317e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateUnlockMethodAndFinish(quality, false);
274bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
275abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
276bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
27794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross        /** increases the quality if necessary, and returns whether biometric is allowed */
27894c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross        private int upgradeQuality(int quality, MutableBoolean allowBiometric) {
279d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForDPM(quality);
280d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForKeyStore(quality);
281b05f39d186d8ce1b53bb4da3cb4c2cd22986f513Paul Lawrence            return quality;
282d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
283d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
284d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForDPM(int quality) {
285d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            // Compare min allowed password quality
286d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            int minQuality = mDPM.getPasswordQuality(null);
287d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (quality < minQuality) {
288d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                quality = minQuality;
289d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
290d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
291d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
292d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
293d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForKeyStore(int quality) {
294d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (!mKeyStore.isEmpty()) {
295d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) {
296d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                    quality = CredentialStorage.MIN_PASSWORD_QUALITY;
2976370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                }
2986370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            }
2996370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            return quality;
3006370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler        }
3016370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler
30217e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
30317e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
30417e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
30517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
30617e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
30794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross        private void disableUnusablePreferences(final int quality, MutableBoolean allowBiometric) {
308cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
3095541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            final boolean onlyShowFallback = getActivity().getIntent()
3105541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
3110fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett            final boolean weakBiometricAvailable =
3120fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett                    mChooseLockSettingsHelper.utils().isBiometricWeakInstalled();
313783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
314783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            // if there are multiple users, disable "None" setting
315783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE);
316783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            List<UserInfo> users = mUm.getUsers(true);
317783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            final boolean singleUser = users.size() == 1;
318783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
319cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
320cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Preference pref = entries.getPreference(i);
32117e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (pref instanceof PreferenceScreen) {
32217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    final String key = ((PreferenceScreen) pref).getKey();
32317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean enabled = true;
3245541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    boolean visible = true;
325cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
32617e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
327783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller                        visible = singleUser; // don't show when there's more than 1 user
32817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
32917e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
3305541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) {
33194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK ||
33294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                                allowBiometric.value;
3335541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                        visible = weakBiometricAvailable; // If not available, then don't show it.
33417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
33517e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
33617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
3378fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX;
33817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
33917e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
34017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
3415541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    if (!visible || (onlyShowFallback && !allowedForFallback(key))) {
342cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
3435541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
34417e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
34517e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
34617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
347bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
348bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
349bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
350bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
351524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        private void updatePreferenceSummaryIfNeeded() {
35240ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            if (LockPatternUtils.isDeviceEncrypted()) {
35340ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav                return;
35440ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav            }
35540ca78f6f3d75897a1a5fd3ec999f487430d4b40Svetoslav
356524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            if (AccessibilityManager.getInstance(getActivity()).getEnabledAccessibilityServiceList(
357524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    AccessibilityServiceInfo.FEEDBACK_ALL_MASK).isEmpty()) {
358524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                return;
359524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
360524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
361524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            CharSequence summary = getString(R.string.secure_lock_encryption_warning);
362524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
363524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            PreferenceScreen screen = getPreferenceScreen();
364524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            final int preferenceCount = screen.getPreferenceCount();
365524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            for (int i = 0; i < preferenceCount; i++) {
366524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                Preference preference = screen.getPreference(i);
367524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                switch (preference.getKey()) {
368524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PATTERN:
369524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PIN:
370524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    case KEY_UNLOCK_SET_PASSWORD: {
371524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                        preference.setSummary(summary);
372524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                    } break;
373524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav                }
374524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav            }
375524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav        }
376524484426855f814ff1f3189fd5221dd630dbf8cSvetoslav
37717e9e1933055b207473b488595b2887bfcaea32eJim Miller        /**
3785541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's
3795541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * supported as a backup.
3805541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         *
3815541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * @param key
3825541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * @return true if allowed
3835541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         */
3845541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        private boolean allowedForFallback(String key) {
3855bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett            return KEY_UNLOCK_BACKUP_INFO.equals(key)  ||
3865bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett                    KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key);
3875541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        }
3885541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
389487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        private Intent getBiometricSensorIntent() {
39066026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani            Intent fallBackIntent = new Intent().setClass(getActivity(),
39166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani                    ChooseLockGeneric.InternalActivity.class);
3925541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true);
3935541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false);
394940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett            fallBackIntent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE,
395940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett                    R.string.backup_lock_settings_picker_title);
3965541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
39780412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett            boolean showTutorial = ALWAY_SHOW_TUTORIAL ||
39880412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett                    !mChooseLockSettingsHelper.utils().isBiometricWeakEverChosen();
399c82ba86375fc3c58bd9ee572f73d336693d62b11Danielle Millett            Intent intent = new Intent();
400487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            intent.setClassName("com.android.facelock", "com.android.facelock.SetupIntro");
401487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            intent.putExtra("showTutorial", showTutorial);
4025541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0);
4035541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            intent.putExtra("PendingIntent", pending);
4045541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            return intent;
4055541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        }
4065541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
4075541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
40817e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
40917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
41017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
41117e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
4126370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
41317e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
41417e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
41517e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
41617e9e1933055b207473b488595b2887bfcaea32eJim Miller        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
4176370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
41817e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
4196370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
42017e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
421bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
4225541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            final boolean isFallback = getActivity().getIntent()
4235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
4245541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
42594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross            quality = upgradeQuality(quality, null);
426c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
42717e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
42817e9e1933055b207473b488595b2887bfcaea32eJim Miller                int minLength = mDPM.getPasswordMinimumLength(null);
42917e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
43017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
43117e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
43217e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
4330698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                Intent intent = ChooseLockPassword.createIntent(getActivity(), quality, isFallback,
4340698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                        minLength, maxLength, mRequirePassword, false /* confirm credentials */);
435c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                if (isFallback) {
43631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivityForResult(intent, FALLBACK_REQUEST);
43731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    return;
4387caac4c19daf79a9220231a60ed1b8231968a619Steven Ross                } else {
439c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                    mFinishPending = true;
44031dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
44131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivity(intent);
44231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                }
44317e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
4440698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                Intent intent = ChooseLockPattern.createIntent(getActivity(),
4450698a216311acd9ab52224602d1a75c08bf89f04Jim Miller                        isFallback, mRequirePassword, false /* confirm credentials */);
446c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                if (isFallback) {
44731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivityForResult(intent, FALLBACK_REQUEST);
44831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    return;
4497caac4c19daf79a9220231a60ed1b8231968a619Steven Ross                } else {
450c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                    mFinishPending = true;
45131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
45231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivity(intent);
45331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                }
4545541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) {
455487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                Intent intent = getBiometricSensorIntent();
456c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                mFinishPending = true;
45717e9e1933055b207473b488595b2887bfcaea32eJim Miller                startActivity(intent);
45817e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
459c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross                mChooseLockSettingsHelper.utils().clearLock(false);
46017e9e1933055b207473b488595b2887bfcaea32eJim Miller                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
46117e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_OK);
462c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
463c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            } else {
464c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
46517e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
466abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
467b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
468b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
469b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
470b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
471b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
472b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
473abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
474abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
475