ChooseLockGeneric.java revision 27d6f8d54b977757aa04aee1e1ea4ebd50ae80a3
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
1917e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Activity;
205541a86efe5f26956e54de49c4a59bf1dab79a78Jim Millerimport android.app.PendingIntent;
214037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
22abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Context;
23abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.content.Intent;
24783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.content.pm.UserInfo;
25abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackbornimport android.os.Bundle;
26783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport android.os.UserManager;
27bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.Preference;
28bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceActivity;
29bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerimport android.preference.PreferenceScreen;
30d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstromimport android.security.KeyStore;
3127d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich canningsimport android.util.EventLog;
32cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.LayoutInflater;
33cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.View;
34cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.view.ViewGroup;
35cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasaniimport android.widget.ListView;
36bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
376465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunneimport com.android.internal.widget.LockPatternUtils;
386465054995f8470e52ecaf68ea9508a28f8a5363Gilles Debunne
39783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Millerimport java.util.List;
40783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
4194c05482240f743daa8c8698a241d1d0dfe2404cSteven Rossimport libcore.util.MutableBoolean;
4294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross
43bbb4afa19f75694c585506b0c091372d60e07ca7Jim Millerpublic class ChooseLockGeneric extends PreferenceActivity {
44abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn
45abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    @Override
4617e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
4717e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
4817e9e1933055b207473b488595b2887bfcaea32eJim Miller        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockGenericFragment.class.getName());
4917e9e1933055b207473b488595b2887bfcaea32eJim Miller        modIntent.putExtra(EXTRA_NO_HEADERS, true);
5017e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
5117e9e1933055b207473b488595b2887bfcaea32eJim Miller    }
52bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
5317e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ChooseLockGenericFragment extends SettingsPreferenceFragment {
5417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int MIN_PASSWORD_LENGTH = 4;
555bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett        private static final String KEY_UNLOCK_BACKUP_INFO = "unlock_backup_info";
5617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_OFF = "unlock_set_off";
5717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_NONE = "unlock_set_none";
585541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        private static final String KEY_UNLOCK_SET_BIOMETRIC_WEAK = "unlock_set_biometric_weak";
5917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PIN = "unlock_set_pin";
6017e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PASSWORD = "unlock_set_password";
6117e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String KEY_UNLOCK_SET_PATTERN = "unlock_set_pattern";
6217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final int CONFIRM_EXISTING_REQUEST = 100;
6331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross        private static final int FALLBACK_REQUEST = 101;
6417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String PASSWORD_CONFIRMED = "password_confirmed";
6517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final String CONFIRM_CREDENTIALS = "confirm_credentials";
6647f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
67c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        private static final String FINISH_PENDING = "finish_pending";
68d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
6917e9e1933055b207473b488595b2887bfcaea32eJim Miller
7080412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett        private static final boolean ALWAY_SHOW_TUTORIAL = true;
7180412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett
7217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private ChooseLockSettingsHelper mChooseLockSettingsHelper;
7317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private DevicePolicyManager mDPM;
74d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private KeyStore mKeyStore;
7517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private boolean mPasswordConfirmed = false;
7647f1cd4325e839dd33273a451fa052e83789e483Jim Miller        private boolean mWaitingForConfirmation = false;
77c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        private boolean mFinishPending = false;
7817e9e1933055b207473b488595b2887bfcaea32eJim Miller
7917e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
8017e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
8117e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
8217e9e1933055b207473b488595b2887bfcaea32eJim Miller
8317e9e1933055b207473b488595b2887bfcaea32eJim Miller            mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
84d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            mKeyStore = KeyStore.getInstance();
8517e9e1933055b207473b488595b2887bfcaea32eJim Miller            mChooseLockSettingsHelper = new ChooseLockSettingsHelper(this.getActivity());
8617e9e1933055b207473b488595b2887bfcaea32eJim Miller
87c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            // Defaults to needing to confirm credentials
88c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            final boolean confirmCredentials = getActivity().getIntent()
89c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett                .getBooleanExtra(CONFIRM_CREDENTIALS, true);
90c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett            mPasswordConfirmed = !confirmCredentials;
91c474a88c2de30ea93ae03221b70e6365bb7f5f34Danielle Millett
9217e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (savedInstanceState != null) {
9317e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
9447f1cd4325e839dd33273a451fa052e83789e483Jim Miller                mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
95c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                mFinishPending = savedInstanceState.getBoolean(FINISH_PENDING);
9617e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
97bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
9847f1cd4325e839dd33273a451fa052e83789e483Jim Miller            if (mPasswordConfirmed) {
9947f1cd4325e839dd33273a451fa052e83789e483Jim Miller                updatePreferencesOrFinish();
10047f1cd4325e839dd33273a451fa052e83789e483Jim Miller            } else if (!mWaitingForConfirmation) {
1016370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                ChooseLockSettingsHelper helper =
1026370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        new ChooseLockSettingsHelper(this.getActivity(), this);
10317e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (!helper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, null, null)) {
10417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mPasswordConfirmed = true; // no password set, so no need to confirm
10517e9e1933055b207473b488595b2887bfcaea32eJim Miller                    updatePreferencesOrFinish();
10647f1cd4325e839dd33273a451fa052e83789e483Jim Miller                } else {
10747f1cd4325e839dd33273a451fa052e83789e483Jim Miller                    mWaitingForConfirmation = true;
10817e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
109bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
110bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
111bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
112c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        @Override
113c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        public void onResume() {
114c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            super.onResume();
115c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            if (mFinishPending) {
116c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                mFinishPending = false;
117c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
118c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            }
119c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani        }
12047f1cd4325e839dd33273a451fa052e83789e483Jim Miller
12117e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
12217e9e1933055b207473b488595b2887bfcaea32eJim Miller        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
12317e9e1933055b207473b488595b2887bfcaea32eJim Miller                Preference preference) {
12417e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String key = preference.getKey();
12517e9e1933055b207473b488595b2887bfcaea32eJim Miller            boolean handled = true;
12627d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
12727d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings            EventLog.writeEvent(EventLogTags.LOCK_SCREEN_TYPE, key);
12827d6f8d54b977757aa04aee1e1ea4ebd50ae80a3rich cannings
12917e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (KEY_UNLOCK_SET_OFF.equals(key)) {
1306370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                updateUnlockMethodAndFinish(
1316370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, true);
13217e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
1336370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                updateUnlockMethodAndFinish(
1346370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, false);
1355541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) {
1365541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                updateUnlockMethodAndFinish(
1375541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                        DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK, false);
1385541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            }else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
1396370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                updateUnlockMethodAndFinish(
1406370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, false);
14117e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
1426370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                updateUnlockMethodAndFinish(
1436370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, false);
14417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
1456370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                updateUnlockMethodAndFinish(
1466370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                        DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, false);
14717e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
14817e9e1933055b207473b488595b2887bfcaea32eJim Miller                handled = false;
14917e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
15017e9e1933055b207473b488595b2887bfcaea32eJim Miller            return handled;
151bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
152bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
15317e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
154cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani        public View onCreateView(LayoutInflater inflater, ViewGroup container,
155cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Bundle savedInstanceState) {
156cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            View v = super.onCreateView(inflater, container, savedInstanceState);
157cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final boolean onlyShowFallback = getActivity().getIntent()
158cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
159cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            if (onlyShowFallback) {
160cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                View header = v.inflate(getActivity(),
161cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        R.layout.weak_biometric_fallback_header, null);
162cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                ((ListView) v.findViewById(android.R.id.list)).addHeaderView(header, null, false);
163cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            }
164cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani
165cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            return v;
166cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani        }
167cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani
168cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani        @Override
16917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onActivityResult(int requestCode, int resultCode, Intent data) {
17017e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onActivityResult(requestCode, resultCode, data);
17147f1cd4325e839dd33273a451fa052e83789e483Jim Miller            mWaitingForConfirmation = false;
17217e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (requestCode == CONFIRM_EXISTING_REQUEST && resultCode == Activity.RESULT_OK) {
17317e9e1933055b207473b488595b2887bfcaea32eJim Miller                mPasswordConfirmed = true;
17417e9e1933055b207473b488595b2887bfcaea32eJim Miller                updatePreferencesOrFinish();
17531dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross            } else if(requestCode == FALLBACK_REQUEST) {
17631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                mChooseLockSettingsHelper.utils().deleteTempGallery();
17731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                getActivity().setResult(resultCode);
17831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                finish();
17917e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
18017e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_CANCELED);
18117e9e1933055b207473b488595b2887bfcaea32eJim Miller                finish();
18217e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
183bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
184bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
18517e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
18617e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onSaveInstanceState(Bundle outState) {
18717e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onSaveInstanceState(outState);
18817e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Saved so we don't force user to re-enter their password if configuration changes
18917e9e1933055b207473b488595b2887bfcaea32eJim Miller            outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
19047f1cd4325e839dd33273a451fa052e83789e483Jim Miller            outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
191c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            outState.putBoolean(FINISH_PENDING, mFinishPending);
19217e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
193bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
19417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void updatePreferencesOrFinish() {
1955541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent intent = getActivity().getIntent();
1965541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            int quality = intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, -1);
19717e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality == -1) {
1986370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                // If caller didn't specify password quality, show UI and allow the user to choose.
1995541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                quality = intent.getIntExtra(MINIMUM_QUALITY_KEY, -1);
20094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                MutableBoolean allowBiometric = new MutableBoolean(false);
20194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                quality = upgradeQuality(quality, allowBiometric);
20217e9e1933055b207473b488595b2887bfcaea32eJim Miller                final PreferenceScreen prefScreen = getPreferenceScreen();
20317e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (prefScreen != null) {
20417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    prefScreen.removeAll();
20517e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
20617e9e1933055b207473b488595b2887bfcaea32eJim Miller                addPreferencesFromResource(R.xml.security_settings_picker);
20794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                disableUnusablePreferences(quality, allowBiometric);
20817e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
20917e9e1933055b207473b488595b2887bfcaea32eJim Miller                updateUnlockMethodAndFinish(quality, false);
210bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
211abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
212bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
21394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross        /** increases the quality if necessary, and returns whether biometric is allowed */
21494c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross        private int upgradeQuality(int quality, MutableBoolean allowBiometric) {
215d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForDPM(quality);
216d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            quality = upgradeQualityForKeyStore(quality);
21794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross            int encryptionQuality = upgradeQualityForEncryption(quality);
21894c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross            if (encryptionQuality > quality) {
21994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                //The first case checks whether biometric is allowed, prior to the user making
22094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                //their selection from the list
22194c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                if (allowBiometric != null) {
22294c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                    allowBiometric.value = quality <=
22394c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                            DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK;
22494c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) {
22594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                    //When the user has selected biometric we shouldn't change that due to
22694c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                    //encryption
22794c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                    return quality;
22894c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                }
22994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross            }
23094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross            return encryptionQuality;
231d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
232d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
233d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForDPM(int quality) {
234d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            // Compare min allowed password quality
235d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            int minQuality = mDPM.getPasswordQuality(null);
236d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (quality < minQuality) {
237d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                quality = minQuality;
238d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
239d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
240d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
241d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
2426370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler        /**
2436370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * Mix in "encryption minimums" to any given quality value.  This prevents users
2446370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * from downgrading the pattern/pin/password to a level below the minimums.
2456370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         *
2466370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * ASSUMPTION:  Setting quality is sufficient (e.g. minimum lengths will be set
2476370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * appropriately.)
2486370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         */
2496370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler        private int upgradeQualityForEncryption(int quality) {
2506370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            int encryptionStatus = mDPM.getStorageEncryptionStatus();
2516370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            boolean encrypted = (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE)
2526370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                    || (encryptionStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING);
2536370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            if (encrypted) {
254d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                if (quality < CryptKeeperSettings.MIN_PASSWORD_QUALITY) {
255d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                    quality = CryptKeeperSettings.MIN_PASSWORD_QUALITY;
256d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                }
257d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            }
258d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            return quality;
259d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        }
260d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom
261d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom        private int upgradeQualityForKeyStore(int quality) {
262d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom            if (!mKeyStore.isEmpty()) {
263d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                if (quality < CredentialStorage.MIN_PASSWORD_QUALITY) {
264d4023b7cca11e33e84df39dee9e9a737efab47c2Brian Carlstrom                    quality = CredentialStorage.MIN_PASSWORD_QUALITY;
2656370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                }
2666370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            }
2676370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            return quality;
2686370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler        }
2696370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler
27017e9e1933055b207473b488595b2887bfcaea32eJim Miller        /***
27117e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Disables preferences that are less secure than required quality.
27217e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
27317e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param quality the requested quality.
27417e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
27594c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross        private void disableUnusablePreferences(final int quality, MutableBoolean allowBiometric) {
276cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            final PreferenceScreen entries = getPreferenceScreen();
2775541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            final boolean onlyShowFallback = getActivity().getIntent()
2785541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
2790fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett            final boolean weakBiometricAvailable =
2800fb158a685d753682afdcffb0b783be8e38e0f2bDanielle Millett                    mChooseLockSettingsHelper.utils().isBiometricWeakInstalled();
281783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
282783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            // if there are multiple users, disable "None" setting
283783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            UserManager mUm = (UserManager) getSystemService(Context.USER_SERVICE);
284783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            List<UserInfo> users = mUm.getUsers(true);
285783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller            final boolean singleUser = users.size() == 1;
286783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller
287cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani            for (int i = entries.getPreferenceCount() - 1; i >= 0; --i) {
288cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                Preference pref = entries.getPreference(i);
28917e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (pref instanceof PreferenceScreen) {
29017e9e1933055b207473b488595b2887bfcaea32eJim Miller                    final String key = ((PreferenceScreen) pref).getKey();
29117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    boolean enabled = true;
2925541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    boolean visible = true;
293cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                    if (KEY_UNLOCK_SET_OFF.equals(key)) {
29417e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
295783ea85bec4ec3b2f0fa9dd06cf065e527daf04cJim Miller                        visible = singleUser; // don't show when there's more than 1 user
29617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_NONE.equals(key)) {
29717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
2985541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (KEY_UNLOCK_SET_BIOMETRIC_WEAK.equals(key)) {
29994c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK ||
30094c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross                                allowBiometric.value;
3015541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                        visible = weakBiometricAvailable; // If not available, then don't show it.
30217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PATTERN.equals(key)) {
30317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
30417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PIN.equals(key)) {
30517e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
30617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    } else if (KEY_UNLOCK_SET_PASSWORD.equals(key)) {
30717e9e1933055b207473b488595b2887bfcaea32eJim Miller                        enabled = quality <= DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
30817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
3095541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    if (!visible || (onlyShowFallback && !allowedForFallback(key))) {
310cf26bb2dcc83803678bcd37bb58b677209ffb3fcAmith Yamasani                        entries.removePreference(pref);
3115541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                    } else if (!enabled) {
31217e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setSummary(R.string.unlock_set_unlock_disabled_summary);
31317e9e1933055b207473b488595b2887bfcaea32eJim Miller                        pref.setEnabled(false);
31417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    }
315bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller                }
316bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller            }
317bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller        }
318bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
31917e9e1933055b207473b488595b2887bfcaea32eJim Miller        /**
3205541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * Check whether the key is allowed for fallback (e.g. bio sensor). Returns true if it's
3215541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * supported as a backup.
3225541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         *
3235541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * @param key
3245541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         * @return true if allowed
3255541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller         */
3265541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        private boolean allowedForFallback(String key) {
3275bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett            return KEY_UNLOCK_BACKUP_INFO.equals(key)  ||
3285bae8739ea55702ec38df13550dd3f32137a9935Danielle Millett                    KEY_UNLOCK_SET_PATTERN.equals(key) || KEY_UNLOCK_SET_PIN.equals(key);
3295541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        }
3305541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
331487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett        private Intent getBiometricSensorIntent() {
3325541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            Intent fallBackIntent = new Intent().setClass(getActivity(), ChooseLockGeneric.class);
3335541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            fallBackIntent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, true);
3345541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            fallBackIntent.putExtra(CONFIRM_CREDENTIALS, false);
335940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett            fallBackIntent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE,
336940407eb6aac05a513d2f7d0626df9519be3a83cDanielle Millett                    R.string.backup_lock_settings_picker_title);
3375541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
33880412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett            boolean showTutorial = ALWAY_SHOW_TUTORIAL ||
33980412e70db62d64777cd3399a9afc6fafae6f0a4Danielle Millett                    !mChooseLockSettingsHelper.utils().isBiometricWeakEverChosen();
340c82ba86375fc3c58bd9ee572f73d336693d62b11Danielle Millett            Intent intent = new Intent();
341487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            intent.setClassName("com.android.facelock", "com.android.facelock.SetupIntro");
342487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett            intent.putExtra("showTutorial", showTutorial);
3435541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            PendingIntent pending = PendingIntent.getActivity(getActivity(), 0, fallBackIntent, 0);
3445541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            intent.putExtra("PendingIntent", pending);
3455541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            return intent;
3465541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        }
3475541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
3485541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller        /**
34917e9e1933055b207473b488595b2887bfcaea32eJim Miller         * Invokes an activity to change the user's pattern, password or PIN based on given quality
35017e9e1933055b207473b488595b2887bfcaea32eJim Miller         * and minimum quality specified by DevicePolicyManager. If quality is
35117e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}, password is cleared.
35217e9e1933055b207473b488595b2887bfcaea32eJim Miller         *
3536370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler         * @param quality the desired quality. Ignored if DevicePolicyManager requires more security
35417e9e1933055b207473b488595b2887bfcaea32eJim Miller         * @param disabled whether or not to show LockScreen at all. Only meaningful when quality is
35517e9e1933055b207473b488595b2887bfcaea32eJim Miller         * {@link DevicePolicyManager#PASSWORD_QUALITY_UNSPECIFIED}
35617e9e1933055b207473b488595b2887bfcaea32eJim Miller         */
35717e9e1933055b207473b488595b2887bfcaea32eJim Miller        void updateUnlockMethodAndFinish(int quality, boolean disabled) {
3586370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler            // Sanity check. We should never get here without confirming user's existing password.
35917e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (!mPasswordConfirmed) {
3606370c87a6b98abfc6badb31070a60f84b3f528b3Andy Stadler                throw new IllegalStateException("Tried to update password without confirming it");
36117e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
362bbb4afa19f75694c585506b0c091372d60e07ca7Jim Miller
3635541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            final boolean isFallback = getActivity().getIntent()
3645541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                .getBooleanExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, false);
3655541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller
36694c05482240f743daa8c8698a241d1d0dfe2404cSteven Ross            quality = upgradeQuality(quality, null);
367c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross
36817e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (quality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC) {
36917e9e1933055b207473b488595b2887bfcaea32eJim Miller                int minLength = mDPM.getPasswordMinimumLength(null);
37017e9e1933055b207473b488595b2887bfcaea32eJim Miller                if (minLength < MIN_PASSWORD_LENGTH) {
37117e9e1933055b207473b488595b2887bfcaea32eJim Miller                    minLength = MIN_PASSWORD_LENGTH;
37217e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
37317e9e1933055b207473b488595b2887bfcaea32eJim Miller                final int maxLength = mDPM.getPasswordMaximumLength(quality);
37417e9e1933055b207473b488595b2887bfcaea32eJim Miller                Intent intent = new Intent().setClass(getActivity(), ChooseLockPassword.class);
37517e9e1933055b207473b488595b2887bfcaea32eJim Miller                intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality);
37617e9e1933055b207473b488595b2887bfcaea32eJim Miller                intent.putExtra(ChooseLockPassword.PASSWORD_MIN_KEY, minLength);
37717e9e1933055b207473b488595b2887bfcaea32eJim Miller                intent.putExtra(ChooseLockPassword.PASSWORD_MAX_KEY, maxLength);
37817e9e1933055b207473b488595b2887bfcaea32eJim Miller                intent.putExtra(CONFIRM_CREDENTIALS, false);
3795541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
3805541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                        isFallback);
381c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                if (isFallback) {
38231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivityForResult(intent, FALLBACK_REQUEST);
38331dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    return;
3847caac4c19daf79a9220231a60ed1b8231968a619Steven Ross                } else {
385c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                    mFinishPending = true;
38631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
38731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivity(intent);
38831dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                }
38917e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING) {
39012c1451f1fbcbc8b2b0dbf68886b6742e8eb83e2Danielle Millett                Intent intent = new Intent(getActivity(), ChooseLockPattern.class);
39117e9e1933055b207473b488595b2887bfcaea32eJim Miller                intent.putExtra("key_lock_method", "pattern");
39217e9e1933055b207473b488595b2887bfcaea32eJim Miller                intent.putExtra(CONFIRM_CREDENTIALS, false);
3935541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
3945541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller                        isFallback);
395c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                if (isFallback) {
39631dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivityForResult(intent, FALLBACK_REQUEST);
39731dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    return;
3987caac4c19daf79a9220231a60ed1b8231968a619Steven Ross                } else {
399c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                    mFinishPending = true;
40031dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
40131dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                    startActivity(intent);
40231dac17c4b0b49b4968b42b2af6f0799a0508a2fSteven Ross                }
4035541a86efe5f26956e54de49c4a59bf1dab79a78Jim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) {
404487b16f3400b62b79f8108ca669cc3e937c69defDanielle Millett                Intent intent = getBiometricSensorIntent();
405c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                mFinishPending = true;
40617e9e1933055b207473b488595b2887bfcaea32eJim Miller                startActivity(intent);
40717e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
408c620ba41ce20e683aad3d124b3866cadaddcc87dSteven Ross                mChooseLockSettingsHelper.utils().clearLock(false);
40917e9e1933055b207473b488595b2887bfcaea32eJim Miller                mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
41017e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().setResult(Activity.RESULT_OK);
411c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
412c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani            } else {
413c666c65fab5e5db7ed0d1e5c53656e81969ea1f5Amith Yamasani                finish();
41417e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
415abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn        }
416b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
417b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        @Override
418b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        protected int getHelpResource() {
419b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani            return R.string.help_url_choose_lockscreen;
420b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani        }
421b0b37ae21c172491bc170659b5f429601858ddc1Amith Yamasani
422abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn    }
423abc3dc64cf61c9f5c28b6f2640b221d63cb86a0aDianne Hackborn}
424