ChooseLockPassword.java revision d189ac52a4e49291b729d817fc903116abc086d0
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 1700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerpackage com.android.settings; 1800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 1900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.app.Activity; 2017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 21af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Millerimport android.app.admin.DevicePolicyManager; 220698a216311acd9ab52224602d1a75c08bf89f04Jim Millerimport android.content.Context; 2300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.content.Intent; 242f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Millerimport android.inputmethodservice.KeyboardView; 2500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Bundle; 2600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Handler; 27552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasaniimport android.os.Message; 2800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.text.Editable; 292e28acedc623527aa5e84ba66635700d6547569aJim Millerimport android.text.InputType; 30122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.Selection; 31122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.Spannable; 3200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.text.TextUtils; 33122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.TextWatcher; 3491e6c499ca8f33cc093fed4277d2b48ab780b309Andres Moralesimport android.util.Log; 35122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.KeyEvent; 3617e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 3700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View; 3800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View.OnClickListener; 3939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.view.ViewGroup; 40122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.inputmethod.EditorInfo; 4100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.Button; 42d189ac52a4e49291b729d817fc903116abc086d0Maurice Lamimport android.widget.LinearLayout; 4300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.TextView; 44122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.widget.TextView.OnEditorActionListener; 4500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 469d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 4739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternUtils; 4839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.LockPatternUtils.RequestThrottledException; 4939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.PasswordEntryKeyboardHelper; 5039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.PasswordEntryKeyboardView; 5139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.internal.widget.TextViewInputDisabler; 5239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settings.notification.RedactionInterstitial; 53d189ac52a4e49291b729d817fc903116abc086d0Maurice Lamimport com.android.setupwizardlib.GlifLayout; 5439b467482d1bf256a111c757e9b7621c6f523271Jason Monk 55263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ChooseLockPassword extends SettingsActivity { 5600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller public static final String PASSWORD_MIN_KEY = "lockscreen.password_min"; 5700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller public static final String PASSWORD_MAX_KEY = "lockscreen.password_max"; 5857fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_LETTERS_KEY = "lockscreen.password_min_letters"; 5957fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_LOWERCASE_KEY = "lockscreen.password_min_lowercase"; 6057fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_UPPERCASE_KEY = "lockscreen.password_min_uppercase"; 6157fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_NUMERIC_KEY = "lockscreen.password_min_numeric"; 6257fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_SYMBOLS_KEY = "lockscreen.password_min_symbols"; 632df65e4facac659314c2440d0af6316924166e2bKonstantin Lopyrev public static final String PASSWORD_MIN_NONLETTER_KEY = "lockscreen.password_min_nonletter"; 6400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 6591e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales private static final String TAG = "ChooseLockPassword"; 6691e6c499ca8f33cc093fed4277d2b48ab780b309Andres Morales 6717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 6817e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 706b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam modIntent.putExtra(EXTRA_SHOW_FRAGMENT, getFragmentClass().getName()); 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 73122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 74f788718f2142e5546bbf1b6847793d59ffea898bAdrian Roos public static Intent createIntent(Context context, int quality, 750698a216311acd9ab52224602d1a75c08bf89f04Jim Miller int minLength, final int maxLength, boolean requirePasswordToDecrypt, 760698a216311acd9ab52224602d1a75c08bf89f04Jim Miller boolean confirmCredentials) { 770698a216311acd9ab52224602d1a75c08bf89f04Jim Miller Intent intent = new Intent().setClass(context, ChooseLockPassword.class); 780698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(LockPatternUtils.PASSWORD_TYPE_KEY, quality); 790698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(PASSWORD_MIN_KEY, minLength); 800698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(PASSWORD_MAX_KEY, maxLength); 810698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, confirmCredentials); 820698a216311acd9ab52224602d1a75c08bf89f04Jim Miller intent.putExtra(EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, requirePasswordToDecrypt); 830698a216311acd9ab52224602d1a75c08bf89f04Jim Miller return intent; 840698a216311acd9ab52224602d1a75c08bf89f04Jim Miller } 850698a216311acd9ab52224602d1a75c08bf89f04Jim Miller 86a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales public static Intent createIntent(Context context, int quality, 87fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri int minLength, final int maxLength, boolean requirePasswordToDecrypt, 88fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri boolean confirmCredentials, int userId) { 89fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri Intent intent = createIntent(context, quality, minLength, maxLength, 90fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri requirePasswordToDecrypt, confirmCredentials); 916934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri intent.putExtra(Intent.EXTRA_USER_ID, userId); 92fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri return intent; 93fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri } 94fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri 95fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri public static Intent createIntent(Context context, int quality, 96a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales int minLength, final int maxLength, boolean requirePasswordToDecrypt, String password) { 973859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam Intent intent = createIntent(context, quality, minLength, maxLength, 983859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam requirePasswordToDecrypt, false); 99a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, password); 100a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales return intent; 101a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 102a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 103fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri public static Intent createIntent(Context context, int quality, int minLength, 104fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri int maxLength, boolean requirePasswordToDecrypt, String password, int userId) { 105fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri Intent intent = createIntent(context, quality, minLength, maxLength, 106fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri requirePasswordToDecrypt, password); 1076934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri intent.putExtra(Intent.EXTRA_USER_ID, userId); 108fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri return intent; 109fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri } 110fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri 1116609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales public static Intent createIntent(Context context, int quality, 1126609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales int minLength, final int maxLength, boolean requirePasswordToDecrypt, long challenge) { 1133859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam Intent intent = createIntent(context, quality, minLength, maxLength, 1143859643c5b65bd54dcacce029a3a97a0386ede25Maurice Lam requirePasswordToDecrypt, false); 1156609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); 1166609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); 1176609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales return intent; 1186609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 1196609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 120fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri public static Intent createIntent(Context context, int quality, int minLength, 121fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri int maxLength, boolean requirePasswordToDecrypt, long challenge, int userId) { 122fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri Intent intent = createIntent(context, quality, minLength, maxLength, 123fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri requirePasswordToDecrypt, challenge); 1246934a044b8ebf4dac28d1c1142b6eee4ecc64f66Clara Bayarri intent.putExtra(Intent.EXTRA_USER_ID, userId); 125fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri return intent; 126fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri } 127fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 129a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 130a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ChooseLockPasswordFragment.class.getName().equals(fragmentName)) return true; 131a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 132a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 133a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 1346b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam /* package */ Class<? extends Fragment> getFragmentClass() { 1356b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam return ChooseLockPasswordFragment.class; 1366b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 1376b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam 138a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 13971fde52ae36f134e93835bee53bc4bfe5481bba0Udam Saini protected void onCreate(Bundle savedInstanceState) { 14017e9e1933055b207473b488595b2887bfcaea32eJim Miller // TODO: Fix on phones 14117e9e1933055b207473b488595b2887bfcaea32eJim Miller // Disable IME on our window since we provide our own keyboard 14217e9e1933055b207473b488595b2887bfcaea32eJim Miller //getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, 14317e9e1933055b207473b488595b2887bfcaea32eJim Miller //WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 1457da8cae44b622518fbffd6d265f291c39e9fc722Jim Miller CharSequence msg = getText(R.string.lockpassword_choose_your_password_header); 146263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio setTitle(msg); 147d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam LinearLayout layout = (LinearLayout) findViewById(R.id.content_parent); 148d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam layout.setFitsSystemWindows(false); 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 150122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 1518a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren public static class ChooseLockPasswordFragment extends InstrumentedFragment 1523e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia implements OnClickListener, OnEditorActionListener, TextWatcher, 1533e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia SaveAndFinishWorker.Listener { 15417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_FIRST_PIN = "first_pin"; 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UI_STAGE = "ui_stage"; 156a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private static final String KEY_CURRENT_PASSWORD = "current_password"; 1573e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker"; 158a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 159a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales private String mCurrentPassword; 160cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence private String mChosenPassword; 1616609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private boolean mHasChallenge; 1626609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales private long mChallenge; 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mPasswordEntry; 164f2c2c19339b5d821cb6196911cee04dc9ac647adXiyuan Xia private TextViewInputDisabler mPasswordEntryInputDisabler; 1654c00a611835e2257502ddcdd26b4e827c5b64f80Adrian Roos private int mPasswordMinLength = LockPatternUtils.MIN_LOCK_PASSWORD_SIZE; 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMaxLength = 16; 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinLetters = 0; 16817e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinUpperCase = 0; 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinLowerCase = 0; 17017e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinSymbols = 0; 17117e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinNumeric = 0; 17217e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinNonLetter = 0; 17317e9e1933055b207473b488595b2887bfcaea32eJim Miller private LockPatternUtils mLockPatternUtils; 1743e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private SaveAndFinishWorker mSaveAndFinishWorker; 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller private Stage mUiStage = Stage.Introduction; 1781f8fb0f8ce1e82266a3a12b3d31b9062cff3fc44Paul Lawrence 17917e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mHeaderText; 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller private String mFirstPin; 18117e9e1933055b207473b488595b2887bfcaea32eJim Miller private KeyboardView mKeyboardView; 18217e9e1933055b207473b488595b2887bfcaea32eJim Miller private PasswordEntryKeyboardHelper mKeyboardHelper; 18317e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mIsAlphaMode; 18417e9e1933055b207473b488595b2887bfcaea32eJim Miller private Button mCancelButton; 18517e9e1933055b207473b488595b2887bfcaea32eJim Miller private Button mNextButton; 18617e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int CONFIRM_EXISTING_REQUEST = 58; 18717e9e1933055b207473b488595b2887bfcaea32eJim Miller static final int RESULT_FINISHED = RESULT_FIRST_USER; 18817e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final long ERROR_MESSAGE_TIMEOUT = 3000; 189552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani private static final int MSG_SHOW_ERROR = 1; 190552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani 191fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri private int mUserId; 19292779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini private boolean mHideDrawer = false; 193fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri 194552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani private Handler mHandler = new Handler() { 195552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani @Override 196552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani public void handleMessage(Message msg) { 197552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani if (msg.what == MSG_SHOW_ERROR) { 198552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani updateStage((Stage) msg.obj); 199552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani } 200552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani } 201552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani }; 20200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 20300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller /** 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller * Keep track internally of where the user is in choosing a pattern. 20500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller */ 20617e9e1933055b207473b488595b2887bfcaea32eJim Miller protected enum Stage { 20717e9e1933055b207473b488595b2887bfcaea32eJim Miller 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller Introduction(R.string.lockpassword_choose_your_password_header, 20917e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_choose_your_pin_header, 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_continue_label), 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller NeedToConfirm(R.string.lockpassword_confirm_your_password_header, 21317e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_confirm_your_pin_header, 21417e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_ok_label), 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmWrong(R.string.lockpassword_confirm_passwords_dont_match, 21717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_confirm_pins_dont_match, 21817e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_continue_label); 21917e9e1933055b207473b488595b2887bfcaea32eJim Miller 22017e9e1933055b207473b488595b2887bfcaea32eJim Miller Stage(int hintInAlpha, int hintInNumeric, int nextButtonText) { 22117e9e1933055b207473b488595b2887bfcaea32eJim Miller this.alphaHint = hintInAlpha; 22217e9e1933055b207473b488595b2887bfcaea32eJim Miller this.numericHint = hintInNumeric; 22317e9e1933055b207473b488595b2887bfcaea32eJim Miller this.buttonText = nextButtonText; 22417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 22517e9e1933055b207473b488595b2887bfcaea32eJim Miller 22617e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int alphaHint; 22717e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int numericHint; 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int buttonText; 22900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 23000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 23117e9e1933055b207473b488595b2887bfcaea32eJim Miller // required constructor for fragments 23217e9e1933055b207473b488595b2887bfcaea32eJim Miller public ChooseLockPasswordFragment() { 23300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 23400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 23500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 23617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 23717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 23817e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 23917e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 24017e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = getActivity().getIntent(); 24166026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani if (!(getActivity() instanceof ChooseLockPassword)) { 24266026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani throw new SecurityException("Fragment contained in wrong activity"); 24366026773bbf1d7631743a5b892a4f768c694f868Amith Yamasani } 244fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri // Only take this argument into account if it belongs to the current profile. 245194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras()); 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, 2475437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos mRequestedQuality), mLockPatternUtils.getRequestedPasswordQuality( 248fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId)); 2494c00a611835e2257502ddcdd26b4e827c5b64f80Adrian Roos mPasswordMinLength = Math.max(Math.max( 2504c00a611835e2257502ddcdd26b4e827c5b64f80Adrian Roos LockPatternUtils.MIN_LOCK_PASSWORD_SIZE, 2514c00a611835e2257502ddcdd26b4e827c5b64f80Adrian Roos intent.getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength)), 252fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mLockPatternUtils.getRequestedMinimumPasswordLength(mUserId)); 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMaxLength = intent.getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength); 25417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLetters = Math.max(intent.getIntExtra(PASSWORD_MIN_LETTERS_KEY, 2555437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos mPasswordMinLetters), mLockPatternUtils.getRequestedPasswordMinimumLetters( 256fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId)); 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinUpperCase = Math.max(intent.getIntExtra(PASSWORD_MIN_UPPERCASE_KEY, 2585437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos mPasswordMinUpperCase), mLockPatternUtils.getRequestedPasswordMinimumUpperCase( 259fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId)); 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLowerCase = Math.max(intent.getIntExtra(PASSWORD_MIN_LOWERCASE_KEY, 2615437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos mPasswordMinLowerCase), mLockPatternUtils.getRequestedPasswordMinimumLowerCase( 262fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId)); 26317e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNumeric = Math.max(intent.getIntExtra(PASSWORD_MIN_NUMERIC_KEY, 2645437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos mPasswordMinNumeric), mLockPatternUtils.getRequestedPasswordMinimumNumeric( 265fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId)); 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinSymbols = Math.max(intent.getIntExtra(PASSWORD_MIN_SYMBOLS_KEY, 2675437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos mPasswordMinSymbols), mLockPatternUtils.getRequestedPasswordMinimumSymbols( 268fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId)); 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNonLetter = Math.max(intent.getIntExtra(PASSWORD_MIN_NONLETTER_KEY, 2705437588abd69bf3eff59684528aaf50e09b6cffcAdrian Roos mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter( 271fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId)); 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 27492779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini mHideDrawer = getActivity().getIntent().getBooleanExtra(EXTRA_HIDE_DRAWER, false); 27562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos 27662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos if (intent.getBooleanExtra( 27762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT, false)) { 27862775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos SaveAndFinishWorker w = new SaveAndFinishWorker(); 27962775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos final boolean required = getActivity().getIntent().getBooleanExtra( 28062775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 28162775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos String current = intent.getStringExtra( 28262775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 28362775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.setBlocking(true); 28462775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.setListener(this); 28562775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos w.start(mChooseLockSettingsHelper.utils(), required, 28662775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos false, 0, current, current, mRequestedQuality, mUserId); 28762775bf756a8eca9423bb4fab3fc7b71ab22d1a7Adrian Roos } 28817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 2892f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller 29017e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 29117e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 29217e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 293d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam GlifLayout layout = (GlifLayout) inflater.inflate( 294d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam R.layout.choose_lock_password, container, false); 295d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam layout.setHeaderText(getActivity().getTitle()); 296d189ac52a4e49291b729d817fc903116abc086d0Maurice Lam return layout; 2976b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam } 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller 2996b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam @Override 3006b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam public void onViewCreated(View view, Bundle savedInstanceState) { 3016b19fa9017800b94c75238339a337fd8f6c3e808Maurice Lam super.onViewCreated(view, savedInstanceState); 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller 30317e9e1933055b207473b488595b2887bfcaea32eJim Miller mCancelButton = (Button) view.findViewById(R.id.cancel_button); 30417e9e1933055b207473b488595b2887bfcaea32eJim Miller mCancelButton.setOnClickListener(this); 30517e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton = (Button) view.findViewById(R.id.next_button); 30617e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton.setOnClickListener(this); 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller 30817e9e1933055b207473b488595b2887bfcaea32eJim Miller mIsAlphaMode = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == mRequestedQuality 30917e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mRequestedQuality 31017e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality; 31117e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard); 31217e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry = (TextView) view.findViewById(R.id.password_entry); 31317e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setOnEditorActionListener(this); 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.addTextChangedListener(this); 315f2c2c19339b5d821cb6196911cee04dc9ac647adXiyuan Xia mPasswordEntryInputDisabler = new TextViewInputDisabler(mPasswordEntry); 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller 3179757e30dfa0ab691c4c15366568367e166071a7dJim Miller final Activity activity = getActivity(); 3189757e30dfa0ab691c4c15366568367e166071a7dJim Miller mKeyboardHelper = new PasswordEntryKeyboardHelper(activity, 31917e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView, mPasswordEntry); 32017e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardHelper.setKeyboardMode(mIsAlphaMode ? 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC); 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText = (TextView) view.findViewById(R.id.headerText); 32517e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView.requestFocus(); 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller 3272e28acedc623527aa5e84ba66635700d6547569aJim Miller int currentType = mPasswordEntry.getInputType(); 3282e28acedc623527aa5e84ba66635700d6547569aJim Miller mPasswordEntry.setInputType(mIsAlphaMode ? currentType 3293b46f49d2a5abb47c1bdf239f855d2063b60595eJim Miller : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD)); 3302e28acedc623527aa5e84ba66635700d6547569aJim Miller 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = getActivity().getIntent(); 3326609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales final boolean confirmCredentials = intent.getBooleanExtra( 3336609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockGeneric.CONFIRM_CREDENTIALS, true); 334a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPassword = intent.getStringExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 3356609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mHasChallenge = intent.getBooleanExtra( 3366609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false); 3376609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales mChallenge = intent.getLongExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0); 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState == null) { 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (confirmCredentials) { 34117e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, 342fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri getString(R.string.unlock_set_unlock_launch_picker_title), true, 343fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId); 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 346a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales // restore from previous state 34717e9e1933055b207473b488595b2887bfcaea32eJim Miller mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN); 34817e9e1933055b207473b488595b2887bfcaea32eJim Miller final String state = savedInstanceState.getString(KEY_UI_STAGE); 34917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (state != null) { 35017e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = Stage.valueOf(state); 35117e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(mUiStage); 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 353a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales 354a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales if (mCurrentPassword == null) { 355a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPassword = savedInstanceState.getString(KEY_CURRENT_PASSWORD); 356a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } 3573e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 3583e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia // Re-attach to the exiting worker if there is one. 3593e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker = (SaveAndFinishWorker) getFragmentManager().findFragmentByTag( 3603e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia FRAGMENT_TAG_SAVE_AND_FINISH); 36117e9e1933055b207473b488595b2887bfcaea32eJim Miller } 362263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio if (activity instanceof SettingsActivity) { 363263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio final SettingsActivity sa = (SettingsActivity) activity; 364d75905991c5a1783ca27dc188c2d086f8f13ff94Jim Miller int id = mIsAlphaMode ? R.string.lockpassword_choose_your_password_header 365d75905991c5a1783ca27dc188c2d086f8f13ff94Jim Miller : R.string.lockpassword_choose_your_pin_header; 3669757e30dfa0ab691c4c15366568367e166071a7dJim Miller CharSequence title = getText(id); 367263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio sa.setTitle(title); 3689757e30dfa0ab691c4c15366568367e166071a7dJim Miller } 36917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 370122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 37117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 3728a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 3739d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.CHOOSE_LOCK_PASSWORD; 3748a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 3758a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 3768a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 37717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onResume() { 37817e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onResume(); 379122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller updateStage(mUiStage); 3803e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 3813e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.setListener(this); 3823e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } else { 3833e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mKeyboardView.requestFocus(); 3843e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 385122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 386122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 388552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani public void onPause() { 389552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani mHandler.removeMessages(MSG_SHOW_ERROR); 3903e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 3913e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.setListener(null); 392bf9ac6b4fb6428d0194a5163181b30cccaedb8ebXiyuan Xia } 393552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani 394552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani super.onPause(); 395552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani } 396552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani 397552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani @Override 39817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 39917e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 40017e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_UI_STAGE, mUiStage.name()); 40117e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_FIRST_PIN, mFirstPin); 402a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales outState.putString(KEY_CURRENT_PASSWORD, mCurrentPassword); 40300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 40400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 40517e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 40617e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, 40717e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent data) { 40817e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (requestCode) { 41017e9e1933055b207473b488595b2887bfcaea32eJim Miller case CONFIRM_EXISTING_REQUEST: 41117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (resultCode != Activity.RESULT_OK) { 41217e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 41317e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 414a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales } else { 415a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales mCurrentPassword = data.getStringExtra( 416a0e1236fa970ea953bfbcc84fcae1f3fb7f189d1Andres Morales ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD); 41717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 41817e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 41917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 42000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 42117e9e1933055b207473b488595b2887bfcaea32eJim Miller 422ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam protected Intent getRedactionInterstitialIntent(Context context) { 423f6077f4757183ae8b31af0928c895c806241b593Clara Bayarri return RedactionInterstitial.createStartIntent(context, mUserId); 424ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam } 425ecd2b7b81fd2faa2f2f3dbe5a169c749321f3d89Maurice Lam 42617e9e1933055b207473b488595b2887bfcaea32eJim Miller protected void updateStage(Stage stage) { 427eef72c39ae83697b1beaa148ec56aced67382fecalanv final Stage previousStage = mUiStage; 42817e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = stage; 42917e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUi(); 430eef72c39ae83697b1beaa148ec56aced67382fecalanv 431eef72c39ae83697b1beaa148ec56aced67382fecalanv // If the stage changed, announce the header for accessibility. This 432eef72c39ae83697b1beaa148ec56aced67382fecalanv // is a no-op when accessibility is disabled. 433eef72c39ae83697b1beaa148ec56aced67382fecalanv if (previousStage != stage) { 434eef72c39ae83697b1beaa148ec56aced67382fecalanv mHeaderText.announceForAccessibility(mHeaderText.getText()); 435eef72c39ae83697b1beaa148ec56aced67382fecalanv } 43600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 43717e9e1933055b207473b488595b2887bfcaea32eJim Miller 43817e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 43917e9e1933055b207473b488595b2887bfcaea32eJim Miller * Validates PIN and returns a message to display if PIN fails test. 44017e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param password the raw password the user typed in 44117e9e1933055b207473b488595b2887bfcaea32eJim Miller * @return error message to show to user or null if password is OK 44217e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 44317e9e1933055b207473b488595b2887bfcaea32eJim Miller private String validatePassword(String password) { 44417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (password.length() < mPasswordMinLength) { 44517e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(mIsAlphaMode ? 44617e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_password_too_short 44717e9e1933055b207473b488595b2887bfcaea32eJim Miller : R.string.lockpassword_pin_too_short, mPasswordMinLength); 44800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 44917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (password.length() > mPasswordMaxLength) { 45017e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(mIsAlphaMode ? 45117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_password_too_long 4529afb14de3b8bbc8c3905926eb3765a65c414e414Jim Miller : R.string.lockpassword_pin_too_long, mPasswordMaxLength + 1); 45300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 45417e9e1933055b207473b488595b2887bfcaea32eJim Miller int letters = 0; 45517e9e1933055b207473b488595b2887bfcaea32eJim Miller int numbers = 0; 45617e9e1933055b207473b488595b2887bfcaea32eJim Miller int lowercase = 0; 45717e9e1933055b207473b488595b2887bfcaea32eJim Miller int symbols = 0; 45817e9e1933055b207473b488595b2887bfcaea32eJim Miller int uppercase = 0; 45917e9e1933055b207473b488595b2887bfcaea32eJim Miller int nonletter = 0; 46017e9e1933055b207473b488595b2887bfcaea32eJim Miller for (int i = 0; i < password.length(); i++) { 46117e9e1933055b207473b488595b2887bfcaea32eJim Miller char c = password.charAt(i); 4627e7912de4fb44481ded8e17d5ac1d7a1c9a0d184Nick Kralevich // allow non control Latin-1 characters only 4637e7912de4fb44481ded8e17d5ac1d7a1c9a0d184Nick Kralevich if (c < 32 || c > 127) { 46417e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(R.string.lockpassword_illegal_character); 46517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 46617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (c >= '0' && c <= '9') { 46717e9e1933055b207473b488595b2887bfcaea32eJim Miller numbers++; 46817e9e1933055b207473b488595b2887bfcaea32eJim Miller nonletter++; 46917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (c >= 'A' && c <= 'Z') { 47017e9e1933055b207473b488595b2887bfcaea32eJim Miller letters++; 47117e9e1933055b207473b488595b2887bfcaea32eJim Miller uppercase++; 47217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (c >= 'a' && c <= 'z') { 47317e9e1933055b207473b488595b2887bfcaea32eJim Miller letters++; 47417e9e1933055b207473b488595b2887bfcaea32eJim Miller lowercase++; 47517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 47617e9e1933055b207473b488595b2887bfcaea32eJim Miller symbols++; 47717e9e1933055b207473b488595b2887bfcaea32eJim Miller nonletter++; 47817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 47957fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev } 48017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (DevicePolicyManager.PASSWORD_QUALITY_NUMERIC == mRequestedQuality 4818fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot || DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX == mRequestedQuality) { 4828fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot if (letters > 0 || symbols > 0) { 4838fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot // This shouldn't be possible unless user finds some way to bring up 4848fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot // soft keyboard 4858fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot return getString(R.string.lockpassword_pin_contains_non_digits); 4868fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot } 4878fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot // Check for repeated characters or sequences (e.g. '1234', '0000', '2468') 4888fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot final int sequence = LockPatternUtils.maxLengthSequence(password); 4898fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot if (DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX == mRequestedQuality 4908fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot && sequence > LockPatternUtils.MAX_ALLOWED_SEQUENCE) { 4918fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot return getString(R.string.lockpassword_pin_no_sequential_digits); 4928fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot } 49317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality) { 49417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (letters < mPasswordMinLetters) { 49517e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 49617e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters), 49717e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLetters); 49817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (numbers < mPasswordMinNumeric) { 49917e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 50017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric), 50117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNumeric); 50217e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (lowercase < mPasswordMinLowerCase) { 50317e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 50417e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase), 50517e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLowerCase); 50617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (uppercase < mPasswordMinUpperCase) { 50717e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 50817e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase), 50917e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinUpperCase); 51017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (symbols < mPasswordMinSymbols) { 51117e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 51217e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols), 51317e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinSymbols); 51417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (nonletter < mPasswordMinNonLetter) { 51517e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 51617e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter), 51717e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNonLetter); 51817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 51917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 52017e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean alphabetic = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC 52117e9e1933055b207473b488595b2887bfcaea32eJim Miller == mRequestedQuality; 52217e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean alphanumeric = DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC 52317e9e1933055b207473b488595b2887bfcaea32eJim Miller == mRequestedQuality; 52417e9e1933055b207473b488595b2887bfcaea32eJim Miller if ((alphabetic || alphanumeric) && letters == 0) { 52517e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(R.string.lockpassword_password_requires_alpha); 52617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 52717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (alphanumeric && numbers == 0) { 52817e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(R.string.lockpassword_password_requires_digit); 52917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 530af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } 531fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri if(mLockPatternUtils.checkPasswordHistory(password, mUserId)) { 53217e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(mIsAlphaMode ? R.string.lockpassword_password_recently_used 53317e9e1933055b207473b488595b2887bfcaea32eJim Miller : R.string.lockpassword_pin_recently_used); 534af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } 5358fd852e7c2f488650095024aca9c51f8c7ddc3b3Nicolas Prevot 53617e9e1933055b207473b488595b2887bfcaea32eJim Miller return null; 537122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 53800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 539cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence public void handleNext() { 5403e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) return; 541cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mChosenPassword = mPasswordEntry.getText().toString(); 542cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (TextUtils.isEmpty(mChosenPassword)) { 54317e9e1933055b207473b488595b2887bfcaea32eJim Miller return; 544122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 54517e9e1933055b207473b488595b2887bfcaea32eJim Miller String errorMsg = null; 54617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.Introduction) { 547cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence errorMsg = validatePassword(mChosenPassword); 54817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (errorMsg == null) { 549cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence mFirstPin = mChosenPassword; 55017e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setText(""); 551eef72c39ae83697b1beaa148ec56aced67382fecalanv updateStage(Stage.NeedToConfirm); 55217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 55317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage == Stage.NeedToConfirm) { 554cff37ecbdd4a3d8f9b81fc295155bde5fcf8ea0cPaul Lawrence if (mFirstPin.equals(mChosenPassword)) { 5553e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia startSaveAndFinish(); 55617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 55717e9e1933055b207473b488595b2887bfcaea32eJim Miller CharSequence tmp = mPasswordEntry.getText(); 55817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (tmp != null) { 55917e9e1933055b207473b488595b2887bfcaea32eJim Miller Selection.setSelection((Spannable) tmp, 0, tmp.length()); 56017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 561eef72c39ae83697b1beaa148ec56aced67382fecalanv updateStage(Stage.ConfirmWrong); 562122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 563122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 56417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (errorMsg != null) { 56517e9e1933055b207473b488595b2887bfcaea32eJim Miller showError(errorMsg, mUiStage); 56617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 567122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 568122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 569af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setNextEnabled(boolean enabled) { 570af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mNextButton.setEnabled(enabled); 571af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 572af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 573af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam protected void setNextText(int text) { 574af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam mNextButton.setText(text); 575af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam } 576af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam 57717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onClick(View v) { 57817e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (v.getId()) { 57917e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.next_button: 58017e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 58117e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 58200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 58317e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.cancel_button: 58417e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 58517e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 58617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 58700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 58800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 58917e9e1933055b207473b488595b2887bfcaea32eJim Miller private void showError(String msg, final Stage next) { 59017e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(msg); 591eef72c39ae83697b1beaa148ec56aced67382fecalanv mHeaderText.announceForAccessibility(mHeaderText.getText()); 592552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani Message mesg = mHandler.obtainMessage(MSG_SHOW_ERROR, next); 593552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani mHandler.removeMessages(MSG_SHOW_ERROR); 594552bc61ae2aaf67fd2f19564ca2ced002e8675e6Amith Yamasani mHandler.sendMessageDelayed(mesg, ERROR_MESSAGE_TIMEOUT); 59517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 596122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 59717e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 59874b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller // Check if this was the result of hitting the enter or "done" key 59974b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller if (actionId == EditorInfo.IME_NULL 60074b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller || actionId == EditorInfo.IME_ACTION_DONE 60174b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller || actionId == EditorInfo.IME_ACTION_NEXT) { 60217e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 60317e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 60417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 60517e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 606122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 607122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 60817e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 60917e9e1933055b207473b488595b2887bfcaea32eJim Miller * Update the hint based on current Stage and length of password entry 61017e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 61117e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updateUi() { 6123e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia final boolean canInput = mSaveAndFinishWorker == null; 61317e9e1933055b207473b488595b2887bfcaea32eJim Miller String password = mPasswordEntry.getText().toString(); 61417e9e1933055b207473b488595b2887bfcaea32eJim Miller final int length = password.length(); 615163dee9fb78ef7c86929b250d150fa989484c2c7Maurice Lam if (mUiStage == Stage.Introduction) { 61617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (length < mPasswordMinLength) { 61717e9e1933055b207473b488595b2887bfcaea32eJim Miller String msg = getString(mIsAlphaMode ? R.string.lockpassword_password_too_short 61817e9e1933055b207473b488595b2887bfcaea32eJim Miller : R.string.lockpassword_pin_too_short, mPasswordMinLength); 61917e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(msg); 620af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setNextEnabled(false); 621af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } else { 62217e9e1933055b207473b488595b2887bfcaea32eJim Miller String error = validatePassword(password); 62317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (error != null) { 62417e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(error); 625af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setNextEnabled(false); 62617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 6279757152d16c2f4564d1ea826b266fe03c27103b6Udam Saini mHeaderText.setText(null); 628af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setNextEnabled(true); 62917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 630af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } 63117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 63217e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(mIsAlphaMode ? mUiStage.alphaHint : mUiStage.numericHint); 6333e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setNextEnabled(canInput && length > 0); 634122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 635af103b4eb476881fb27cfb9b6dc94b3fa5e74f28Maurice Lam setNextText(mUiStage.buttonText); 6363e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mPasswordEntryInputDisabler.setInputEnabled(canInput); 637122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 638122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 63917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void afterTextChanged(Editable s) { 64017e9e1933055b207473b488595b2887bfcaea32eJim Miller // Changing the text while error displayed resets to NeedToConfirm state 64117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.ConfirmWrong) { 64217e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = Stage.NeedToConfirm; 64317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 64417e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUi(); 645122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 646122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 64717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void beforeTextChanged(CharSequence s, int start, int count, int after) { 648122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 64917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 650122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 65117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onTextChanged(CharSequence s, int start, int before, int count) { 652122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 65317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 6543e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6553e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private void startSaveAndFinish() { 6563e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mSaveAndFinishWorker != null) { 6573e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Log.w(TAG, "startSaveAndFinish with an existing SaveAndFinishWorker."); 6583e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return; 6593e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 6603e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6613e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mPasswordEntryInputDisabler.setInputEnabled(false); 6623e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia setNextEnabled(false); 6633e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6643e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker = new SaveAndFinishWorker(); 6655bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee mSaveAndFinishWorker.setListener(this); 6665bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee 6673e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia getFragmentManager().beginTransaction().add(mSaveAndFinishWorker, 6683e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia FRAGMENT_TAG_SAVE_AND_FINISH).commit(); 6695bb1e4fb909a5f0e0574d3572ea1edcf32a2190fRobin Lee getFragmentManager().executePendingTransactions(); 6703e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6713e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia final boolean required = getActivity().getIntent().getBooleanExtra( 6723e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true); 6733e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mSaveAndFinishWorker.start(mLockPatternUtils, required, mHasChallenge, mChallenge, 674fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mChosenPassword, mCurrentPassword, mRequestedQuality, mUserId); 6753e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 6763e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6773e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 6783e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void onChosenLockSaveFinished(boolean wasSecureBefore, Intent resultData) { 6793e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia getActivity().setResult(RESULT_FINISHED, resultData); 6803e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6813e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (!wasSecureBefore) { 6823e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Intent intent = getRedactionInterstitialIntent(getActivity()); 6833e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (intent != null) { 68492779ce70156031f4fa3b8c2d84305f5b3b44105Udam Saini intent.putExtra(EXTRA_HIDE_DRAWER, mHideDrawer); 6853e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia startActivity(intent); 6863e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 6873e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 688686ae494f485a5025dfa456b4f32427b3715c337Udam Saini getActivity().finish(); 6893e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 6903e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 6913e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6923e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private static class SaveAndFinishWorker extends SaveChosenLockWorkerBase { 6933e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6943e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private String mChosenPassword; 6953e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private String mCurrentPassword; 6963e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia private int mRequestedQuality; 6973e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 6983e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia public void start(LockPatternUtils utils, boolean required, 6993e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia boolean hasChallenge, long challenge, 700fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri String chosenPassword, String currentPassword, int requestedQuality, int userId) { 701b8a22e42d42e6de8fce1a2026c112c12fd0f0f7aClara Bayarri prepare(utils, required, hasChallenge, challenge, userId); 7023e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7033e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mChosenPassword = chosenPassword; 7043e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mCurrentPassword = currentPassword; 7053e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mRequestedQuality = requestedQuality; 706fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId = userId; 7073e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7083e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia start(); 7093e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 7103e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7113e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia @Override 7123e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia protected Intent saveAndVerifyInBackground() { 7133e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Intent result = null; 7143e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia mUtils.saveLockPassword(mChosenPassword, mCurrentPassword, mRequestedQuality, 715fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri mUserId); 7163e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7173e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (mHasChallenge) { 7183e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia byte[] token; 7193e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia try { 720fe432e838e5588cd4ac664d7e74f3d70a99d7df1Clara Bayarri token = mUtils.verifyPassword(mChosenPassword, mChallenge, mUserId); 7213e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } catch (RequestThrottledException e) { 7223e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia token = null; 7233e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 7243e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7253e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia if (token == null) { 7263e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia Log.e(TAG, "critical: no token returned for known good password."); 7273e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 7283e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7293e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia result = new Intent(); 7303e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia result.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token); 7313e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 7323e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia 7333e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia return result; 7343e7e3d6c594018e4bc7fc77acc19e148d8bf1bddXiyuan Xia } 735122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 73600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller} 737