100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller/* 200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * Copyright (C) 2010 The Android Open Source Project 300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * 400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * you may not use this file except in compliance with the License. 600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * You may obtain a copy of the License at 700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * 800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * http://www.apache.org/licenses/LICENSE-2.0 900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * 1000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * Unless required by applicable law or agreed to in writing, software 1100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 1200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * See the License for the specific language governing permissions and 1400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller * limitations under the License. 1500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller */ 1600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 172eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lampackage com.android.settings.password; 1800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 19c41e408aea1bf2f28160265cdadd7662e626d228Maurice Lamimport static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC; 20c41e408aea1bf2f28160265cdadd7662e626d228Maurice Lamimport static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC; 21c41e408aea1bf2f28160265cdadd7662e626d228Maurice Lamimport static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 22c41e408aea1bf2f28160265cdadd7662e626d228Maurice Lamimport static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; 23c41e408aea1bf2f28160265cdadd7662e626d228Maurice Lamimport static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; 24c41e408aea1bf2f28160265cdadd7662e626d228Maurice Lam 2500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.app.Activity; 2617e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 27af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Millerimport android.app.admin.DevicePolicyManager; 2827ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scullimport android.app.admin.PasswordMetrics; 290698a216311acd9ab52224602d1a75c08bf89f04Jim Millerimport android.content.Context; 3000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.content.Intent; 319990f397220703f4d2c922560a8e29e60bcce39fMaurice Lamimport android.content.res.Resources.Theme; 32edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lamimport android.graphics.Insets; 33ccbb4cfc2c3884389aecbe7c096d796fee8d3fc2Andrew Sappersteinimport android.graphics.Typeface; 3400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Bundle; 359ba765b875ebeb66d8a870a29a00fe53e9da306dTony Makimport android.os.Handler; 369ba765b875ebeb66d8a870a29a00fe53e9da306dTony Makimport android.os.Message; 37b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lamimport android.support.annotation.StringRes; 380bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Makimport android.support.v7.widget.LinearLayoutManager; 390bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Makimport android.support.v7.widget.RecyclerView; 4000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.text.Editable; 412e28acedc623527aa5e84ba66635700d6547569aJim Millerimport android.text.InputType; 42122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.Selection; 43122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.Spannable; 4400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.text.TextUtils; 45122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.TextWatcher; 4691e6c499ca8f33cc093fed4277d2b48ab780b309Andres Moralesimport android.util.Log; 47122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.KeyEvent; 4817e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 4900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View; 5000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View.OnClickListener; 5139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.view.ViewGroup; 52c41e408aea1bf2f28160265cdadd7662e626d228Maurice Lamimport android.view.inputmethod.EditorInfo; 5300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.Button; 54d189ac52a4e49291b729d817fc903116abc086d0Maurice Lamimport android.widget.LinearLayout; 5500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.TextView; 56122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.widget.TextView.OnEditorActionListener; 5700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 58265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 5939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternUtils; 6039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternUtils.RequestThrottledException; 6139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.TextViewInputDisabler; 622eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.EncryptionInterstitial; 632eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.R; 642eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.SettingsActivity; 659990f397220703f4d2c922560a8e29e60bcce39fMaurice Lamimport com.android.settings.SetupWizardUtils; 662eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lamimport com.android.settings.Utils; 672d0b3447360666847c483e6ce2521846c66c25c1Fan Zhangimport com.android.settings.core.InstrumentedPreferenceFragment; 6839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settings.notification.RedactionInterstitial; 69b0bcbed3722bcd16ba16f49f36c84ed8f8825ae3Tarandeep Singhimport com.android.settings.widget.ImeAwareEditText; 70d189ac52a4e49291b729d817fc903116abc086d0Maurice Lamimport com.android.setupwizardlib.GlifLayout; 7139b467482d1bf256a111c757e9b7621c6f523271Jason Monk 720bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Makimport java.util.ArrayList; 730bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Makimport java.util.List; 740bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 75263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockPassword extends SettingsActivity { 7600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller public static final String PASSWORD_MIN_KEY = "lockscreen.password_min"; 7700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller public static final String PASSWORD_MAX_KEY = "lockscreen.password_max"; 7857fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_LETTERS_KEY = "lockscreen.password_min_letters"; 7957fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_LOWERCASE_KEY = "lockscreen.password_min_lowercase"; 8057fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_UPPERCASE_KEY = "lockscreen.password_min_uppercase"; 8157fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_NUMERIC_KEY = "lockscreen.password_min_numeric"; 8257fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_SYMBOLS_KEY = "lockscreen.password_min_symbols"; 832df65e4facac659314c2440d0af6316924166e2bKonstantin Lopyrev public static final String PASSWORD_MIN_NONLETTER_KEY = "lockscreen.password_min_nonletter"; 8400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 8591e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales private static final String TAG = "ChooseLockPassword"; 8691e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales 8717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 8817e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 8917e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 906b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 9217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 93122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 949990f397220703f4d2c922560a8e29e60bcce39fMaurice Lam @Override 959990f397220703f4d2c922560a8e29e60bcce39fMaurice Lam protected void onApplyThemeResource(Theme theme, int resid, boolean first) { 969990f397220703f4d2c922560a8e29e60bcce39fMaurice Lam resid = SetupWizardUtils.getTheme(getIntent()); 979990f397220703f4d2c922560a8e29e60bcce39fMaurice Lam super.onApplyThemeResource(theme, resid, first); 989990f397220703f4d2c922560a8e29e60bcce39fMaurice Lam } 999990f397220703f4d2c922560a8e29e60bcce39fMaurice Lam 1002eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public static class IntentBuilder { 1012eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 1022eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam private final Intent mIntent; 1032eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 1042eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public IntentBuilder(Context context) { 1052eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent = new Intent(context, ChooseLockPassword.class); 1062eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, false); 1072eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, false); 10840e187b3641ac3084c706b10d2213b91a53da5d1Pavel Grafov mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); 1092eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 1102eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 1112eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public IntentBuilder setPasswordQuality(int quality) { 1122eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality); 1132eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam return this; 1142eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 1152eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 1162eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public IntentBuilder setPasswordLengthRange(int min, int max) { 1172eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(PASSWORD_MIN_KEY, min); 1182eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(PASSWORD_MAX_KEY, max); 1192eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam return this; 1202eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 1212eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 1222eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public IntentBuilder setUserId(int userId) { 1232eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(Intent.EXTRA_USER_ID, userId); 1242eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam return this; 1252eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 1262eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 1272eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public IntentBuilder setChallenge(long challenge) { 1282eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); 1292eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); 1302eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam return this; 1312eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 1322eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 1332eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public IntentBuilder setPassword(String password) { 1342eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password); 1352eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam return this; 1362eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 1372eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam 138b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam public IntentBuilder setForFingerprint(boolean forFingerprint) { 139b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam mIntent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, forFingerprint); 140b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam return this; 141b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam } 142b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam 1432eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam public Intent build() { 1442eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam return mIntent; 1452eb170cd6ff43db01dc0ff3c1fcac5ebba4489deMaurice Lam } 146fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri } 147fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 149a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 150a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockPasswordFragment.class.getName().equals(fragmentName)) return true; 151a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 152a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 153a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 1546b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam /* package */ Class<? extends Fragment> getFragmentClass() { 1556b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam return ChooseLockPasswordFragment.class; 1566b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 1576b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 158a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 15971fde52ae36f134e93835bee53bc4bfe5481bba0Udam Saini protected void onCreate(Bundle savedInstanceState) { 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 161b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam boolean forFingerprint = getIntent() 162b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam .getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false); 163b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam CharSequence msg = getText(forFingerprint 164b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam ? R.string.lockpassword_choose_your_password_header_for_fingerprint 165209410dd2ad89a69bdeceb1e9c2a946e316e5728Maurice Lam : R.string.lockpassword_choose_your_screen_lock_header); 166263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio setTitle(msg); 167d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam LinearLayout layout = (LinearLayout) findViewById(R.id.content_parent); 168d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam layout.setFitsSystemWindows(false); 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 170122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 1712d0b3447360666847c483e6ce2521846c66c25c1Fan Zhang public static class ChooseLockPasswordFragment extends InstrumentedPreferenceFragment 1720bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak implements OnClickListener, OnEditorActionListener, TextWatcher, 1733e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia SaveAndFinishWorker.Listener { 17417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_FIRST_PIN = "first_pin"; 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UI_STAGE = "ui_stage"; 176a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private static final String KEY_CURRENT_PASSWORD = "current_password"; 1773e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; 178a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 179a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private String mCurrentPassword; 180cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence private String mChosenPassword; 1816609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private boolean mHasChallenge; 1826609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private long mChallenge; 183b0bcbed3722bcd16ba16f49f36c84ed8f8825ae3Tarandeep Singh private ImeAwareEditText mPasswordEntry; 184f2c2c19339b5d821cb6196911cee04dc9ac647adXiyuan Xia private TextViewInputDisabler mPasswordEntryInputDisabler; 1854c00a611835e2257502ddcdd26b4e827c5b64f80Adrian Roos private int mPasswordMinLength = LockPatternUtils.MIN_LOCK_PASSWORD_SIZE; 18617e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMaxLength = 16; 18717e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinLetters = 0; 18817e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinUpperCase = 0; 18917e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinLowerCase = 0; 19017e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinSymbols = 0; 19117e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinNumeric = 0; 19217e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinNonLetter = 0; 1939ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak private int mPasswordMinLengthToFulfillAllPolicies = 0; 194edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam protected int mUserId; 1950bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private boolean mHideDrawer = false; 1960bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak /** 1970bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * Password requirements that we need to verify. 1980bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak */ 1990bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private int[] mPasswordRequirements; 2000bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 20117e9e1933055b207473b488595b2887bfcaea32eJim Miller private LockPatternUtils mLockPatternUtils; 2023e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private SaveAndFinishWorker mSaveAndFinishWorker; 20317e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 20562c0c3c324aca7eaf78d7d5e0c8a6ae0213e1f80Maurice Lam protected Stage mUiStage = Stage.Introduction; 2060bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private PasswordRequirementAdapter mPasswordRequirementAdapter; 2078df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam private GlifLayout mLayout; 208562e539516914435bf316e1a8aaa3572dcebfed9Maurice Lam protected boolean mForFingerprint; 2091f8fb0f8ce1e82266a3a12b3d31b9062cff3fc44Paul Lawrence 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller private String mFirstPin; 2110bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private RecyclerView mPasswordRestrictionView; 212edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam protected boolean mIsAlphaMode; 2134c930fc2d5bf3a3ea3caf5df6e5eddb6c9a90a60Maurice Lam protected Button mCancelButton; 214be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur private Button mClearButton; 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller private Button mNextButton; 2163eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam private TextView mMessage; 2170bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 2189ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak private TextChangedHandler mTextChangedHandler; 2199ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak 22017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int CONFIRM_EXISTING_REQUEST = 58; 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller static final int RESULT_FINISHED = RESULT_FIRST_USER; 222552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani 2230bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int MIN_LETTER_IN_PASSWORD = 0; 2240bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int MIN_UPPER_LETTERS_IN_PASSWORD = 1; 2250bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int MIN_LOWER_LETTERS_IN_PASSWORD = 2; 2260bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int MIN_SYMBOLS_IN_PASSWORD = 3; 2270bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int MIN_NUMBER_IN_PASSWORD = 4; 2280bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int MIN_NON_LETTER_IN_PASSWORD = 5; 2290bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 2300bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Error code returned from {@link #validatePassword(String)}. 2310bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int NO_ERROR = 0; 2320bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int CONTAIN_INVALID_CHARACTERS = 1 << 0; 2330bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int TOO_SHORT = 1 << 1; 2340bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int TOO_LONG = 1 << 2; 2350bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int CONTAIN_NON_DIGITS = 1 << 3; 2360bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int CONTAIN_SEQUENTIAL_DIGITS = 1 << 4; 2370bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int RECENTLY_USED = 1 << 5; 2380bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int NOT_ENOUGH_LETTER = 1 << 6; 2390bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int NOT_ENOUGH_UPPER_CASE = 1 << 7; 2400bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int NOT_ENOUGH_LOWER_CASE = 1 << 8; 2410bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int NOT_ENOUGH_DIGITS = 1 << 9; 2420bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int NOT_ENOUGH_SYMBOLS = 1 << 10; 2430bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private static final int NOT_ENOUGH_NON_LETTER = 1 << 11; 24400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 24500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller /** 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller * Keep track internally of where the user is in choosing a pattern. 24700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller */ 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller protected enum Stage { 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller 250b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam Introduction( 2513eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam R.string.lockpassword_choose_your_screen_lock_header, 252b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_choose_your_password_header_for_fingerprint, 2533eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam R.string.lockpassword_choose_your_screen_lock_header, 254b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_choose_your_pin_header_for_fingerprint, 2553eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam R.string.lockpassword_choose_your_password_message, 2563eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam R.string.lock_settings_picker_fingerprint_added_security_message, 2573eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam R.string.lockpassword_choose_your_pin_message, 2583eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam R.string.lock_settings_picker_fingerprint_added_security_message, 259c57b19d80c100bb4a19bb2d4b8589bc12cbfd66eMaurice Lam R.string.next_label), 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller 261b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam NeedToConfirm( 262b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_confirm_your_password_header, 263b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_confirm_your_password_header, 264b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_confirm_your_pin_header, 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_confirm_your_pin_header, 2663eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 2673eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 2683eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 2693eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 27017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_ok_label), 27117e9e1933055b207473b488595b2887bfcaea32eJim Miller 272b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam ConfirmWrong( 273b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_confirm_passwords_dont_match, 274b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_confirm_passwords_dont_match, 275b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam R.string.lockpassword_confirm_pins_dont_match, 27617e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_confirm_pins_dont_match, 2773eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 2783eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 2793eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 2803eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 0, 281c57b19d80c100bb4a19bb2d4b8589bc12cbfd66eMaurice Lam R.string.next_label); 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller 283b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam Stage(int hintInAlpha, int hintInAlphaForFingerprint, 2843eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam int hintInNumeric, int hintInNumericForFingerprint, 2853eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam int messageInAlpha, int messageInAlphaForFingerprint, 2863eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam int messageInNumeric, int messageInNumericForFingerprint, 2873eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam int nextButtonText) { 28817e9e1933055b207473b488595b2887bfcaea32eJim Miller this.alphaHint = hintInAlpha; 289b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam this.alphaHintForFingerprint = hintInAlphaForFingerprint; 29017e9e1933055b207473b488595b2887bfcaea32eJim Miller this.numericHint = hintInNumeric; 291b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam this.numericHintForFingerprint = hintInNumericForFingerprint; 2923eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam this.alphaMessage = messageInAlpha; 2933eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam this.alphaMessageForFingerprint = messageInAlphaForFingerprint; 2943eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam this.numericMessage = messageInNumeric; 2953eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam this.numericMessageForFingerprint = messageInNumericForFingerprint; 29617e9e1933055b207473b488595b2887bfcaea32eJim Miller this.buttonText = nextButtonText; 29717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller 29917e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int alphaHint; 300b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam public final int alphaHintForFingerprint; 30117e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int numericHint; 302b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam public final int numericHintForFingerprint; 3033eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam public final int alphaMessage; 3043eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam public final int alphaMessageForFingerprint; 3053eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam public final int numericMessage; 3063eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam public final int numericMessageForFingerprint; 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int buttonText; 308b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam 309b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam public @StringRes int getHint(boolean isAlpha, boolean isFingerprint) { 310b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam if (isAlpha) { 311b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam return isFingerprint ? alphaHintForFingerprint : alphaHint; 312b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam } else { 313b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam return isFingerprint ? numericHintForFingerprint : numericHint; 314b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam } 315b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam } 3163eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 3173eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam public @StringRes int getMessage(boolean isAlpha, boolean isFingerprint) { 3183eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam if (isAlpha) { 3193eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam return isFingerprint ? alphaMessageForFingerprint : alphaMessage; 3203eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam } else { 3213eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam return isFingerprint ? numericMessageForFingerprint : numericMessage; 3223eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam } 3233eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam } 32400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 32500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller // required constructor for fragments 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller public ChooseLockPasswordFragment() { 32800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 32900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 33000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 33217e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = getActivity().getIntent(); 33666026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (!(getActivity() instanceof ChooseLockPassword)) { 33766026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani throw new SecurityException("Fragment contained in wrong activity"); 33866026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 339fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri // Only take this argument into account if it belongs to the current profile. 340194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); 341b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam mForFingerprint = intent.getBooleanExtra( 342b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false); 3430bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak processPasswordRequirements(intent); 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 34592779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false); 34662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 34762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos if (intent.getBooleanExtra( 34862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT, false)) { 34962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos SaveAndFinishWorker w = new SaveAndFinishWorker(); 35062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos final boolean required = getActivity().getIntent().getBooleanExtra( 35162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 35262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos String current = intent.getStringExtra( 35362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 35462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.setBlocking(true); 35562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.setListener(this); 35662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.start(mChooseLockSettingsHelper.utils(), required, 35762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos false, 0, current, current, mRequestedQuality, mUserId); 35862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } 3599ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mTextChangedHandler = new TextChangedHandler(); 36017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 3612f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller 36217e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 36317e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 36417e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 36544f2736f5453ec3bf1fffd3471ecda24da57a094Maurice Lam return inflater.inflate(R.layout.choose_lock_password, container, false); 3666b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 36717e9e1933055b207473b488595b2887bfcaea32eJim Miller 3686b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam @Override 3696b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam public void onViewCreated(View view, Bundle savedInstanceState) { 3706b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam super.onViewCreated(view, savedInstanceState); 37117e9e1933055b207473b488595b2887bfcaea32eJim Miller 3728df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam mLayout = (GlifLayout) view; 3738df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam 374edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam // Make the password container consume the optical insets so the edit text is aligned 375edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam // with the sides of the parent visually. 376edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam ViewGroup container = view.findViewById(R.id.password_container); 377edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam container.setOpticalInsets(Insets.NONE); 378edb39449842dd1360fa5f92c990785bf7c8dcdcdMaurice Lam 37917e9e1933055b207473b488595b2887bfcaea32eJim Miller mCancelButton = (Button) view.findViewById(R.id.cancel_button); 38017e9e1933055b207473b488595b2887bfcaea32eJim Miller mCancelButton.setOnClickListener(this); 38117e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton = (Button) view.findViewById(R.id.next_button); 38217e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton.setOnClickListener(this); 383be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur mClearButton = view.findViewById(R.id.clear_button); 384be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur mClearButton.setOnClickListener(this); 38517e9e1933055b207473b488595b2887bfcaea32eJim Miller 3863eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam 3873eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam mMessage = view.findViewById(R.id.message); 388d793590678e803fda7248ccb067a82644d7e78e8Maurice Lam if (mForFingerprint) { 3897af28ecb66b6507803244bd7584b45415044ac70Ajay Nadathur mLayout.setIcon(getActivity().getDrawable(R.drawable.ic_fingerprint_header)); 390d793590678e803fda7248ccb067a82644d7e78e8Maurice Lam } 391d793590678e803fda7248ccb067a82644d7e78e8Maurice Lam 39217e9e1933055b207473b488595b2887bfcaea32eJim Miller mIsAlphaMode = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == mRequestedQuality 39317e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mRequestedQuality 39417e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality; 3950bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 3960bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak setupPasswordRequirementsView(view); 3970bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 3980bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRestrictionView.setLayoutManager(new LinearLayoutManager(getActivity())); 399b0bcbed3722bcd16ba16f49f36c84ed8f8825ae3Tarandeep Singh mPasswordEntry = view.findViewById(R.id.password_entry); 40017e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setOnEditorActionListener(this); 40117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.addTextChangedListener(this); 4029c26c9dba6998fda4b3af27e315220b8bec6e0c5Tony Mak mPasswordEntry.requestFocus(); 403f2c2c19339b5d821cb6196911cee04dc9ac647adXiyuan Xia mPasswordEntryInputDisabler = new TextViewInputDisabler(mPasswordEntry); 40417e9e1933055b207473b488595b2887bfcaea32eJim Miller 4059757e30dfa0ab691c4c15366568367e166071a7dJim Miller final Activity activity = getActivity(); 40617e9e1933055b207473b488595b2887bfcaea32eJim Miller 4072e28acedc623527aa5e84ba66635700d6547569aJim Miller int currentType = mPasswordEntry.getInputType(); 4082e28acedc623527aa5e84ba66635700d6547569aJim Miller mPasswordEntry.setInputType(mIsAlphaMode ? currentType 4093b46f49d2a5abb47c1bdf239f855d2063b60595eJim Miller : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD)); 410ccbb4cfc2c3884389aecbe7c096d796fee8d3fc2Andrew Sapperstein // Can't set via XML since setInputType resets the fontFamily to null 411ccbb4cfc2c3884389aecbe7c096d796fee8d3fc2Andrew Sapperstein mPasswordEntry.setTypeface(Typeface.create( 412ccbb4cfc2c3884389aecbe7c096d796fee8d3fc2Andrew Sapperstein getContext().getString(com.android.internal.R.string.config_headlineFontFamily), 413ccbb4cfc2c3884389aecbe7c096d796fee8d3fc2Andrew Sapperstein Typeface.NORMAL)); 4142e28acedc623527aa5e84ba66635700d6547569aJim Miller 41517e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = getActivity().getIntent(); 4166609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales final boolean confirmCredentials = intent.getBooleanExtra( 4176609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockGeneric.CONFIRM_CREDENTIALS, true); 418a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 4196609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mHasChallenge = intent.getBooleanExtra( 4206609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); 4216609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState == null) { 42317e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 42417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (confirmCredentials) { 42517e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, 426fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri getString(R.string.unlock_set_unlock_launch_picker_title), true, 427fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId); 42817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 42917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 430a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales // restore from previous state 43117e9e1933055b207473b488595b2887bfcaea32eJim Miller mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN); 43217e9e1933055b207473b488595b2887bfcaea32eJim Miller final String state = savedInstanceState.getString(KEY_UI_STAGE); 43317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (state != null) { 43417e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = Stage.valueOf(state); 43517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(mUiStage); 43617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 437a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 438a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales if (mCurrentPassword == null) { 439a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD); 440a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 4413e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 4423e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia // Re-attach to the exiting worker if there is one. 4433e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker = (SaveAndFinishWorker) getFragmentManager().findFragmentByTag( 4443e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia FRAGMENT_TAG_SAVE_AND_FINISH); 44517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 4460bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 447263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio if (activity instanceof SettingsActivity) { 448263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio final SettingsActivity sa = (SettingsActivity) activity; 449b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam int title = Stage.Introduction.getHint(mIsAlphaMode, mForFingerprint); 450263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio sa.setTitle(title); 4518df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam mLayout.setHeaderText(title); 4529757e30dfa0ab691c4c15366568367e166071a7dJim Miller } 45317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 454122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 4550bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private void setupPasswordRequirementsView(View view) { 4560bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Construct passwordRequirements and requirementDescriptions. 4570bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak List<Integer> passwordRequirements = new ArrayList<>(); 4580bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak List<String> requirementDescriptions = new ArrayList<>(); 4590bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinUpperCase > 0) { 4600bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak passwordRequirements.add(MIN_UPPER_LETTERS_IN_PASSWORD); 4610bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak requirementDescriptions.add(getResources().getQuantityString( 4620bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase, 4630bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinUpperCase)); 4640bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 4650bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinLowerCase > 0) { 4660bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak passwordRequirements.add(MIN_LOWER_LETTERS_IN_PASSWORD); 4670bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak requirementDescriptions.add(getResources().getQuantityString( 4680bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase, 4690bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLowerCase)); 4700bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 4710bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinLetters > 0) { 4729ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak if (mPasswordMinLetters > mPasswordMinUpperCase + mPasswordMinLowerCase) { 4739ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak passwordRequirements.add(MIN_LETTER_IN_PASSWORD); 4749ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak requirementDescriptions.add(getResources().getQuantityString( 4759ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters, 4769ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mPasswordMinLetters)); 4779ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 4780bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 4790bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinNumeric > 0) { 4800bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak passwordRequirements.add(MIN_NUMBER_IN_PASSWORD); 4810bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak requirementDescriptions.add(getResources().getQuantityString( 4820bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric, 4830bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNumeric)); 4840bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 4850bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinSymbols > 0) { 4860bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak passwordRequirements.add(MIN_SYMBOLS_IN_PASSWORD); 4870bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak requirementDescriptions.add(getResources().getQuantityString( 4880bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols, 4890bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinSymbols)); 4900bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 4910bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinNonLetter > 0) { 4929ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak if (mPasswordMinNonLetter > mPasswordMinNumeric + mPasswordMinSymbols) { 4939ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak passwordRequirements.add(MIN_NON_LETTER_IN_PASSWORD); 4949ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak requirementDescriptions.add(getResources().getQuantityString( 4959ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter, 4969ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak 4979ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mPasswordMinNonLetter)); 4989ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 4990bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 5000bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Convert list to array. 5010bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRequirements = passwordRequirements.stream().mapToInt(i -> i).toArray(); 5020bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRestrictionView = 5030bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak (RecyclerView) view.findViewById(R.id.password_requirements_view); 5040bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRestrictionView.setLayoutManager(new LinearLayoutManager(getActivity())); 5050bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRequirementAdapter = new PasswordRequirementAdapter(); 5060bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRestrictionView.setAdapter(mPasswordRequirementAdapter); 5070bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 5080bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 50917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 5106507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang public int getMetricsCategory() { 5119d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.CHOOSE_LOCK_PASSWORD; 5128a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 5138a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 5148a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 51517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onResume() { 51617e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onResume(); 517122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller updateStage(mUiStage); 5183e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 5193e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.setListener(this); 5203e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } else { 5219c26c9dba6998fda4b3af27e315220b8bec6e0c5Tony Mak mPasswordEntry.requestFocus(); 522b0bcbed3722bcd16ba16f49f36c84ed8f8825ae3Tarandeep Singh mPasswordEntry.scheduleShowSoftInput(); 5233e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 524122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 525122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 52617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 527552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani public void onPause() { 5283e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 5293e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.setListener(null); 530bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 531552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani super.onPause(); 532552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani } 533552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani 534552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani @Override 53517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 53617e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 53717e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_UI_STAGE, mUiStage.name()); 53817e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_FIRST_PIN, mFirstPin); 539a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword); 54000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 54100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 54217e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 54317e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, 54417e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent data) { 54517e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 54617e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (requestCode) { 54717e9e1933055b207473b488595b2887bfcaea32eJim Miller case CONFIRM_EXISTING_REQUEST: 54817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (resultCode != Activity.RESULT_OK) { 54917e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 55017e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 551a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } else { 552a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPassword = data.getStringExtra( 553a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 55417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 55517e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 55617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 55700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 55817e9e1933055b207473b488595b2887bfcaea32eJim Miller 559ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam protected Intent getRedactionInterstitialIntent(Context context) { 560f6077f4757183ae8b31af0928c895c806241b593Clara Bayarri return RedactionInterstitial.createStartIntent(context, mUserId); 561ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam } 562ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam 56317e9e1933055b207473b488595b2887bfcaea32eJim Miller protected void updateStage(Stage stage) { 564eef72c39ae83697b1beaa148ec56aced67382fecalanv final Stage previousStage = mUiStage; 56517e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = stage; 56617e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUi(); 567eef72c39ae83697b1beaa148ec56aced67382fecalanv 568eef72c39ae83697b1beaa148ec56aced67382fecalanv // If the stage changed, announce the header for accessibility. This 569eef72c39ae83697b1beaa148ec56aced67382fecalanv // is a no-op when accessibility is disabled. 570eef72c39ae83697b1beaa148ec56aced67382fecalanv if (previousStage != stage) { 5718df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam mLayout.announceForAccessibility(mLayout.getHeaderText()); 572eef72c39ae83697b1beaa148ec56aced67382fecalanv } 57300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 57417e9e1933055b207473b488595b2887bfcaea32eJim Miller 57517e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 5760bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * Read the requirements from {@link DevicePolicyManager} and intent and aggregate them. 5770bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * 5780bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * @param intent the incoming intent 5790bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak */ 5800bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private void processPasswordRequirements(Intent intent) { 5810bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak final int dpmPasswordQuality = mLockPatternUtils.getRequestedPasswordQuality(mUserId); 5820bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, 5830bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mRequestedQuality), dpmPasswordQuality); 5840bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLength = Math.max(Math.max( 5850bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak LockPatternUtils.MIN_LOCK_PASSWORD_SIZE, 5860bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak intent.getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength)), 5870bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mLockPatternUtils.getRequestedMinimumPasswordLength(mUserId)); 5880bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMaxLength = intent.getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength); 5890bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLetters = Math.max(intent.getIntExtra(PASSWORD_MIN_LETTERS_KEY, 5900bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLetters), mLockPatternUtils.getRequestedPasswordMinimumLetters( 5910bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mUserId)); 5920bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinUpperCase = Math.max(intent.getIntExtra(PASSWORD_MIN_UPPERCASE_KEY, 5930bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinUpperCase), mLockPatternUtils.getRequestedPasswordMinimumUpperCase( 5940bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mUserId)); 5950bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLowerCase = Math.max(intent.getIntExtra(PASSWORD_MIN_LOWERCASE_KEY, 5960bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLowerCase), mLockPatternUtils.getRequestedPasswordMinimumLowerCase( 5970bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mUserId)); 5980bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNumeric = Math.max(intent.getIntExtra(PASSWORD_MIN_NUMERIC_KEY, 5990bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNumeric), mLockPatternUtils.getRequestedPasswordMinimumNumeric( 6000bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mUserId)); 6010bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinSymbols = Math.max(intent.getIntExtra(PASSWORD_MIN_SYMBOLS_KEY, 6020bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinSymbols), mLockPatternUtils.getRequestedPasswordMinimumSymbols( 6030bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mUserId)); 6040bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNonLetter = Math.max(intent.getIntExtra(PASSWORD_MIN_NONLETTER_KEY, 6050bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter( 6060bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mUserId)); 6070bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 6080bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Modify the value based on dpm policy. 6090bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak switch (dpmPasswordQuality) { 6100bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case PASSWORD_QUALITY_ALPHABETIC: 6110bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinLetters == 0) { 6120bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLetters = 1; 6130bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6140bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 6150bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case PASSWORD_QUALITY_ALPHANUMERIC: 6160bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinLetters == 0) { 6170bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLetters = 1; 6180bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6190bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mPasswordMinNumeric == 0) { 6200bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNumeric = 1; 6210bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6220bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 6230bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case PASSWORD_QUALITY_COMPLEX: 6240bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Reserve all the requirements. 6250bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 6260bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak default: 6270bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNumeric = 0; 6280bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLetters = 0; 6290bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinUpperCase = 0; 6300bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLowerCase = 0; 6310bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinSymbols = 0; 6320bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNonLetter = 0; 6330bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6349ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mPasswordMinLengthToFulfillAllPolicies = getMinLengthToFulfillAllPolicies(); 6350bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6360bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 6370bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak /** 6380bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * Validates PIN and returns the validation result. 6390bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * 64017e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param password the raw password the user typed in 6410bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * @return the validation result. 64217e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 6430bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private int validatePassword(String password) { 6440bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak int errorCode = NO_ERROR; 6450bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 64617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (password.length() < mPasswordMinLength) { 6479ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak if (mPasswordMinLength > mPasswordMinLengthToFulfillAllPolicies) { 6489ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak errorCode |= TOO_SHORT; 6499ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 6500bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } else if (password.length() > mPasswordMaxLength) { 6510bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= TOO_LONG; 6520bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } else { 6530bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // The length requirements are fulfilled. 6540bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mRequestedQuality == PASSWORD_QUALITY_NUMERIC_COMPLEX) { 6550bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Check for repeated characters or sequences (e.g. '1234', '0000', '2468') 65627ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull final int sequence = PasswordMetrics.maxLengthSequence(password); 65727ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (sequence > PasswordMetrics.MAX_ALLOWED_SEQUENCE) { 6580bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= CONTAIN_SEQUENTIAL_DIGITS; 6590bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6600bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6610bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Is the password recently used? 6620bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mLockPatternUtils.checkPasswordHistory(password, mUserId)) { 6630bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= RECENTLY_USED; 6640bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 66500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 6660bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 66727ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull // Allow non-control Latin-1 characters only. 66817e9e1933055b207473b488595b2887bfcaea32eJim Miller for (int i = 0; i < password.length(); i++) { 66917e9e1933055b207473b488595b2887bfcaea32eJim Miller char c = password.charAt(i); 6707e7912de4fb44481ded8e17d5ac1d7a1c9a0d184Nick Kralevich if (c < 32 || c > 127) { 6710bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= CONTAIN_INVALID_CHARACTERS; 67227ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull break; 67317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 67457fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev } 6750bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 67627ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull final PasswordMetrics metrics = PasswordMetrics.computeForPassword(password); 67727ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull 6780bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Ensure no non-digits if we are requesting numbers. This shouldn't be possible unless 6790bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // user finds some way to bring up soft keyboard. 6800bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (mRequestedQuality == PASSWORD_QUALITY_NUMERIC 6810bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak || mRequestedQuality == PASSWORD_QUALITY_NUMERIC_COMPLEX) { 68227ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (metrics.letters > 0 || metrics.symbols > 0) { 6830bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= CONTAIN_NON_DIGITS; 68417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 685af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } 6868fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot 6870bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Check the requirements one by one. 6880bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak for (int i = 0; i < mPasswordRequirements.length; i++) { 6890bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak int passwordRestriction = mPasswordRequirements[i]; 6900bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak switch (passwordRestriction) { 6910bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case MIN_LETTER_IN_PASSWORD: 69227ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (metrics.letters < mPasswordMinLetters) { 6930bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= NOT_ENOUGH_LETTER; 6940bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 6950bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 6960bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case MIN_UPPER_LETTERS_IN_PASSWORD: 69727ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (metrics.upperCase < mPasswordMinUpperCase) { 6980bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= NOT_ENOUGH_UPPER_CASE; 6990bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7000bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 7010bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case MIN_LOWER_LETTERS_IN_PASSWORD: 70227ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (metrics.lowerCase < mPasswordMinLowerCase) { 7030bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= NOT_ENOUGH_LOWER_CASE; 7040bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7050bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 7060bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case MIN_SYMBOLS_IN_PASSWORD: 70727ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (metrics.symbols < mPasswordMinSymbols) { 7080bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= NOT_ENOUGH_SYMBOLS; 7090bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7100bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 7110bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case MIN_NUMBER_IN_PASSWORD: 71227ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (metrics.numeric < mPasswordMinNumeric) { 7130bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= NOT_ENOUGH_DIGITS; 7140bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7150bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 7160bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak case MIN_NON_LETTER_IN_PASSWORD: 71727ca263b7f6cf64f6a789a052a0f737b18a9aef3Andrew Scull if (metrics.nonLetter < mPasswordMinNonLetter) { 7180bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak errorCode |= NOT_ENOUGH_NON_LETTER; 7190bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7200bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak break; 7210bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7220bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7230bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak return errorCode; 724122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 72500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 726cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence public void handleNext() { 7273e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) return; 728cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mChosenPassword = mPasswordEntry.getText().toString(); 729cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (TextUtils.isEmpty(mChosenPassword)) { 73017e9e1933055b207473b488595b2887bfcaea32eJim Miller return; 731122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 73217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.Introduction) { 7330bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if (validatePassword(mChosenPassword) == NO_ERROR) { 734cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mFirstPin = mChosenPassword; 73517e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setText(""); 736eef72c39ae83697b1beaa148ec56aced67382fecalanv updateStage(Stage.NeedToConfirm); 73717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 73817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage == Stage.NeedToConfirm) { 739cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (mFirstPin.equals(mChosenPassword)) { 7403e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia startSaveAndFinish(); 74117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 74217e9e1933055b207473b488595b2887bfcaea32eJim Miller CharSequence tmp = mPasswordEntry.getText(); 74317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (tmp != null) { 74417e9e1933055b207473b488595b2887bfcaea32eJim Miller Selection.setSelection((Spannable) tmp, 0, tmp.length()); 74517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 746eef72c39ae83697b1beaa148ec56aced67382fecalanv updateStage(Stage.ConfirmWrong); 747122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 748122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 749122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 750122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 751af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setNextEnabled(boolean enabled) { 752af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mNextButton.setEnabled(enabled); 753af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 754af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 755af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setNextText(int text) { 756af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mNextButton.setText(text); 757af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 758af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 75917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onClick(View v) { 76017e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (v.getId()) { 76117e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.next_button: 76217e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 76317e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 76400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 76517e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.cancel_button: 76617e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 76717e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 768be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur 769be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur case R.id.clear_button: 770be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur mPasswordEntry.setText(""); 771be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur break; 77217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 77300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 77400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 77517e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 77674b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller // Check if this was the result of hitting the enter or "done" key 77774b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller if (actionId == EditorInfo.IME_NULL 77874b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller || actionId == EditorInfo.IME_ACTION_DONE 77974b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller || actionId == EditorInfo.IME_ACTION_NEXT) { 78017e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 78117e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 78217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 78317e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 784122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 785122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 78617e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 7870bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * @param errorCode error code returned from {@link #validatePassword(String)}. 7880bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak * @return an array of messages describing the error, important messages come first. 7890bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak */ 7900bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private String[] convertErrorCodeToMessages(int errorCode) { 7910bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak List<String> messages = new ArrayList<>(); 7920bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & CONTAIN_INVALID_CHARACTERS) > 0) { 7930bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getString(R.string.lockpassword_illegal_character)); 7940bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7950bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & CONTAIN_NON_DIGITS) > 0) { 7960bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getString(R.string.lockpassword_pin_contains_non_digits)); 7970bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 7980bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & NOT_ENOUGH_UPPER_CASE) > 0) { 7990bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getResources().getQuantityString( 8000bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase, 8010bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinUpperCase)); 8020bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8030bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & NOT_ENOUGH_LOWER_CASE) > 0) { 8040bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getResources().getQuantityString( 8050bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase, 8060bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinLowerCase)); 8070bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8089ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak if ((errorCode & NOT_ENOUGH_LETTER) > 0) { 8099ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak messages.add(getResources().getQuantityString( 8109ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters, 8119ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mPasswordMinLetters)); 8129ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 8130bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & NOT_ENOUGH_DIGITS) > 0) { 8140bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getResources().getQuantityString( 8150bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric, 8160bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNumeric)); 8170bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8180bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & NOT_ENOUGH_SYMBOLS) > 0) { 8190bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getResources().getQuantityString( 8200bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols, 8210bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinSymbols)); 8220bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8230bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & NOT_ENOUGH_NON_LETTER) > 0) { 8240bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getResources().getQuantityString( 8250bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter, 8260bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordMinNonLetter)); 8270bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8280bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & TOO_SHORT) > 0) { 8290bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getString(mIsAlphaMode ? 8300bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.string.lockpassword_password_too_short 8310bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak : R.string.lockpassword_pin_too_short, mPasswordMinLength)); 8320bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8330bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & TOO_LONG) > 0) { 8340bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getString(mIsAlphaMode ? 8350bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak R.string.lockpassword_password_too_long 8360bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak : R.string.lockpassword_pin_too_long, mPasswordMaxLength + 1)); 8370bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8380bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & CONTAIN_SEQUENTIAL_DIGITS) > 0) { 8390bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getString(R.string.lockpassword_pin_no_sequential_digits)); 8400bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8410bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak if ((errorCode & RECENTLY_USED) > 0) { 8420bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak messages.add(getString((mIsAlphaMode) ? R.string.lockpassword_password_recently_used 8430bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak : R.string.lockpassword_pin_recently_used)); 8440bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8450bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak return messages.toArray(new String[0]); 8460bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 8470bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 8489ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak private int getMinLengthToFulfillAllPolicies() { 8499ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak final int minLengthForLetters = Math.max(mPasswordMinLetters, 8509ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mPasswordMinUpperCase + mPasswordMinLowerCase); 8519ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak final int minLengthForNonLetters = Math.max(mPasswordMinNonLetter, 8529ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mPasswordMinSymbols + mPasswordMinNumeric); 8539ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak return minLengthForLetters + minLengthForNonLetters; 8549ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 8559ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak 8560bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak /** 85717e9e1933055b207473b488595b2887bfcaea32eJim Miller * Update the hint based on current Stage and length of password entry 85817e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 85962c0c3c324aca7eaf78d7d5e0c8a6ae0213e1f80Maurice Lam protected void updateUi() { 8603e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia final boolean canInput = mSaveAndFinishWorker == null; 86117e9e1933055b207473b488595b2887bfcaea32eJim Miller String password = mPasswordEntry.getText().toString(); 86217e9e1933055b207473b488595b2887bfcaea32eJim Miller final int length = password.length(); 863163dee9fb78ef7c86929b250d150fa989484c2c7Maurice Lam if (mUiStage == Stage.Introduction) { 8640bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRestrictionView.setVisibility(View.VISIBLE); 8650bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak final int errorCode = validatePassword(password); 8660bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak String[] messages = convertErrorCodeToMessages(errorCode); 8670bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Update the fulfillment of requirements. 8680bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRequirementAdapter.setRequirements(messages); 8690bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Enable/Disable the next button accordingly. 8700bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak setNextEnabled(errorCode == NO_ERROR); 87117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 8720bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Hide password requirement view when we are just asking user to confirm the pw. 8730bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak mPasswordRestrictionView.setVisibility(View.GONE); 874b49526ee282f13a83ee38358473fcb628b5727a5Maurice Lam setHeaderText(getString(mUiStage.getHint(mIsAlphaMode, mForFingerprint))); 8753e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setNextEnabled(canInput && length > 0); 876be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur mClearButton.setEnabled(canInput && length > 0); 877122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 8783eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam int message = mUiStage.getMessage(mIsAlphaMode, mForFingerprint); 8793eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam if (message != 0) { 8803eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam mMessage.setVisibility(View.VISIBLE); 8813eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam mMessage.setText(message); 8823eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam } else { 8833eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam mMessage.setVisibility(View.INVISIBLE); 8843eb4c8333e3821a85d19e8b281f315d3608d5b2bMaurice Lam } 885be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur 886be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur mClearButton.setVisibility(toVisibility(mUiStage != Stage.Introduction)); 887be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur mCancelButton.setVisibility(toVisibility(mUiStage == Stage.Introduction)); 888be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur 889af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setNextText(mUiStage.buttonText); 8903e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mPasswordEntryInputDisabler.setInputEnabled(canInput); 891122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 892122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 893be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur private int toVisibility(boolean visibleOrGone) { 894be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur return visibleOrGone ? View.VISIBLE : View.GONE; 895be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur } 896be2246bee734263970b4f6a5c393b72fccbdea2aAjay Nadathur 8970bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak private void setHeaderText(String text) { 8980bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak // Only set the text if it is different than the existing one to avoid announcing again. 8998df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam if (!TextUtils.isEmpty(mLayout.getHeaderText()) 9008df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam && mLayout.getHeaderText().toString().equals(text)) { 9010bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak return; 9020bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 9038df7173043d2c9dd5213f1701fd6f68c9e2383dbMaurice Lam mLayout.setHeaderText(text); 9040bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak } 9050bbcdccdbfa1f8473eb1c14e275c7de6dd43b4d4Tony Mak 90617e9e1933055b207473b488595b2887bfcaea32eJim Miller public void afterTextChanged(Editable s) { 90717e9e1933055b207473b488595b2887bfcaea32eJim Miller // Changing the text while error displayed resets to NeedToConfirm state 90817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.ConfirmWrong) { 90917e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = Stage.NeedToConfirm; 91017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 9119ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak // Schedule the UI update. 9129ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak mTextChangedHandler.notifyAfterTextChanged(); 913122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 914122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 91517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void beforeTextChanged(CharSequence s, int start, int count, int after) { 916122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 91717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 918122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 91917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onTextChanged(CharSequence s, int start, int before, int count) { 920122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 92117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 9223e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9233e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private void startSaveAndFinish() { 9243e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 9253e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Log.w(TAG, "startSaveAndFinish with an existing SaveAndFinishWorker."); 9263e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return; 9273e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 9283e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9293e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mPasswordEntryInputDisabler.setInputEnabled(false); 9303e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setNextEnabled(false); 9313e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9323e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker = new SaveAndFinishWorker(); 9335bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee mSaveAndFinishWorker.setListener(this); 9345bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee 9353e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia getFragmentManager().beginTransaction().add(mSaveAndFinishWorker, 9363e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia FRAGMENT_TAG_SAVE_AND_FINISH).commit(); 9375bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee getFragmentManager().executePendingTransactions(); 9383e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9393e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia final boolean required = getActivity().getIntent().getBooleanExtra( 9403e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 9413e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.start(mLockPatternUtils, required, mHasChallenge, mChallenge, 942fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mChosenPassword, mCurrentPassword, mRequestedQuality, mUserId); 9433e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 9443e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9453e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 9463e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { 9473e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia getActivity().setResult(RESULT_FINISHED, resultData); 9483e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9493e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (!wasSecureBefore) { 9503e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Intent intent = getRedactionInterstitialIntent(getActivity()); 9513e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (intent != null) { 95292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer); 9533e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia startActivity(intent); 9543e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 9553e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 956686ae494f485a5025dfa456b4f32427b3715c337Udam Saini getActivity().finish(); 9573e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 9589ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak 9599ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak class TextChangedHandler extends Handler { 9609ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak private static final int ON_TEXT_CHANGED = 1; 9619ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak private static final int DELAY_IN_MILLISECOND = 100; 9629ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak 9639ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak /** 9649ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak * With the introduction of delay, we batch processing the text changed event to reduce 9659ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak * unnecessary UI updates. 9669ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak */ 9679ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak private void notifyAfterTextChanged() { 9689ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak removeMessages(ON_TEXT_CHANGED); 9699ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak sendEmptyMessageDelayed(ON_TEXT_CHANGED, DELAY_IN_MILLISECOND); 9709ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 9719ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak 9729ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak @Override 9739ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak public void handleMessage(Message msg) { 974f958f2e14ee07098543291181113c0afdb3b193fDoris Ling if (getActivity() == null) { 975f958f2e14ee07098543291181113c0afdb3b193fDoris Ling return; 976f958f2e14ee07098543291181113c0afdb3b193fDoris Ling } 9779ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak if (msg.what == ON_TEXT_CHANGED) { 9789ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak updateUi(); 9799ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 9809ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 9819ba765b875ebeb66d8a870a29a00fe53e9da306dTony Mak } 9823e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 9833e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 98477c4345373bdf6d6543bc06a04abc026ce762dbeClara Bayarri public static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { 9853e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9863e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private String mChosenPassword; 9873e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private String mCurrentPassword; 9883e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private int mRequestedQuality; 9893e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9903e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void start(LockPatternUtils utils, boolean required, 9913e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia boolean hasChallenge, long challenge, 992fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri String chosenPassword, String currentPassword, int requestedQuality, int userId) { 993b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri prepare(utils, required, hasChallenge, challenge, userId); 9943e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 9953e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mChosenPassword = chosenPassword; 9963e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mCurrentPassword = currentPassword; 9973e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mRequestedQuality = requestedQuality; 998fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId = userId; 9993e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 10003e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia start(); 10013e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 10023e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 10033e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 10043e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected Intent saveAndVerifyInBackground() { 10053e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Intent result = null; 10063e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mUtils.saveLockPassword(mChosenPassword, mCurrentPassword, mRequestedQuality, 1007fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId); 10083e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 10093e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mHasChallenge) { 10103e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia byte[] token; 10113e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia try { 1012fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri token = mUtils.verifyPassword(mChosenPassword, mChallenge, mUserId); 10133e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } catch (RequestThrottledException e) { 10143e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia token = null; 10153e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 10163e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 10173e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (token == null) { 10183e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Log.e(TAG, "critical: no token returned for known good password."); 10193e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 10203e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 10213e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia result = new Intent(); 10223e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia result.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); 10233e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 10243e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 10253e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return result; 10263e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 1027122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 102800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller} 1029