ChooseLockPassword.java revision 3b46f49d2a5abb47c1bdf239f855d2063b60595e
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 com.android.internal.widget.LockPatternUtils; 202f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Millerimport com.android.internal.widget.PasswordEntryKeyboardHelper; 212f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Millerimport com.android.internal.widget.PasswordEntryKeyboardView; 2200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 2300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.app.Activity; 2417e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 25af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Millerimport android.app.admin.DevicePolicyManager; 2600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.content.Intent; 272f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Millerimport android.inputmethodservice.KeyboardView; 2800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Bundle; 2900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Handler; 3017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.preference.PreferenceActivity; 3100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.text.Editable; 322e28acedc623527aa5e84ba66635700d6547569aJim Millerimport android.text.InputType; 33122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.Selection; 34122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.Spannable; 3500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.text.TextUtils; 36122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.text.TextWatcher; 37122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.KeyEvent; 3817e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 3900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View; 4017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.ViewGroup; 4100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View.OnClickListener; 42122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.inputmethod.EditorInfo; 4300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.Button; 4400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.TextView; 45122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.widget.TextView.OnEditorActionListener; 4600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 4700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 4817e9e1933055b207473b488595b2887bfcaea32eJim Millerpublic class ChooseLockPassword extends PreferenceActivity { 4900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller public static final String PASSWORD_MIN_KEY = "lockscreen.password_min"; 5000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller public static final String PASSWORD_MAX_KEY = "lockscreen.password_max"; 5157fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_LETTERS_KEY = "lockscreen.password_min_letters"; 5257fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_LOWERCASE_KEY = "lockscreen.password_min_lowercase"; 5357fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_UPPERCASE_KEY = "lockscreen.password_min_uppercase"; 5457fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_NUMERIC_KEY = "lockscreen.password_min_numeric"; 5557fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev public static final String PASSWORD_MIN_SYMBOLS_KEY = "lockscreen.password_min_symbols"; 562df65e4facac659314c2440d0af6316924166e2bKonstantin Lopyrev public static final String PASSWORD_MIN_NONLETTER_KEY = "lockscreen.password_min_nonletter"; 5700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 5817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 5917e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 6017e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 6117e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ChooseLockPasswordFragment.class.getName()); 6217e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_NO_HEADERS, true); 6317e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 6417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 65122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 6617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 6717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 6817e9e1933055b207473b488595b2887bfcaea32eJim Miller // TODO: Fix on phones 6917e9e1933055b207473b488595b2887bfcaea32eJim Miller // Disable IME on our window since we provide our own keyboard 7017e9e1933055b207473b488595b2887bfcaea32eJim Miller //getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, 7117e9e1933055b207473b488595b2887bfcaea32eJim Miller //WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 7217e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 737da8cae44b622518fbffd6d265f291c39e9fc722Jim Miller CharSequence msg = getText(R.string.lockpassword_choose_your_password_header); 747da8cae44b622518fbffd6d265f291c39e9fc722Jim Miller showBreadCrumbs(msg, msg); 7517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 76122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 7717e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ChooseLockPasswordFragment extends Fragment 7817e9e1933055b207473b488595b2887bfcaea32eJim Miller implements OnClickListener, OnEditorActionListener, TextWatcher { 7917e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_FIRST_PIN = "first_pin"; 8017e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final String KEY_UI_STAGE = "ui_stage"; 8117e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mPasswordEntry; 8217e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinLength = 4; 8317e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMaxLength = 16; 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinLetters = 0; 8517e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinUpperCase = 0; 8617e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinLowerCase = 0; 8717e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinSymbols = 0; 8817e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinNumeric = 0; 8917e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mPasswordMinNonLetter = 0; 9017e9e1933055b207473b488595b2887bfcaea32eJim Miller private LockPatternUtils mLockPatternUtils; 9117e9e1933055b207473b488595b2887bfcaea32eJim Miller private int mRequestedQuality = DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; 9217e9e1933055b207473b488595b2887bfcaea32eJim Miller private ChooseLockSettingsHelper mChooseLockSettingsHelper; 9317e9e1933055b207473b488595b2887bfcaea32eJim Miller private Stage mUiStage = Stage.Introduction; 9417e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mHeaderText; 9517e9e1933055b207473b488595b2887bfcaea32eJim Miller private String mFirstPin; 9617e9e1933055b207473b488595b2887bfcaea32eJim Miller private KeyboardView mKeyboardView; 9717e9e1933055b207473b488595b2887bfcaea32eJim Miller private PasswordEntryKeyboardHelper mKeyboardHelper; 9817e9e1933055b207473b488595b2887bfcaea32eJim Miller private boolean mIsAlphaMode; 9917e9e1933055b207473b488595b2887bfcaea32eJim Miller private Button mCancelButton; 10017e9e1933055b207473b488595b2887bfcaea32eJim Miller private Button mNextButton; 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller private static Handler mHandler = new Handler(); 10217e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final int CONFIRM_EXISTING_REQUEST = 58; 10317e9e1933055b207473b488595b2887bfcaea32eJim Miller static final int RESULT_FINISHED = RESULT_FIRST_USER; 10417e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final long ERROR_MESSAGE_TIMEOUT = 3000; 10500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 10600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller /** 10717e9e1933055b207473b488595b2887bfcaea32eJim Miller * Keep track internally of where the user is in choosing a pattern. 10800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller */ 10917e9e1933055b207473b488595b2887bfcaea32eJim Miller protected enum Stage { 11017e9e1933055b207473b488595b2887bfcaea32eJim Miller 11117e9e1933055b207473b488595b2887bfcaea32eJim Miller Introduction(R.string.lockpassword_choose_your_password_header, 11217e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_choose_your_pin_header, 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_continue_label), 11417e9e1933055b207473b488595b2887bfcaea32eJim Miller 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller NeedToConfirm(R.string.lockpassword_confirm_your_password_header, 11617e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_confirm_your_pin_header, 11717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_ok_label), 11817e9e1933055b207473b488595b2887bfcaea32eJim Miller 11917e9e1933055b207473b488595b2887bfcaea32eJim Miller ConfirmWrong(R.string.lockpassword_confirm_passwords_dont_match, 12017e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_confirm_pins_dont_match, 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_continue_label); 12217e9e1933055b207473b488595b2887bfcaea32eJim Miller 12317e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 12417e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param headerMessage The message displayed at the top. 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 12617e9e1933055b207473b488595b2887bfcaea32eJim Miller Stage(int hintInAlpha, int hintInNumeric, int nextButtonText) { 12717e9e1933055b207473b488595b2887bfcaea32eJim Miller this.alphaHint = hintInAlpha; 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller this.numericHint = hintInNumeric; 12917e9e1933055b207473b488595b2887bfcaea32eJim Miller this.buttonText = nextButtonText; 13017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 13117e9e1933055b207473b488595b2887bfcaea32eJim Miller 13217e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int alphaHint; 13317e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int numericHint; 13417e9e1933055b207473b488595b2887bfcaea32eJim Miller public final int buttonText; 13500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 13600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 13717e9e1933055b207473b488595b2887bfcaea32eJim Miller // required constructor for fragments 13817e9e1933055b207473b488595b2887bfcaea32eJim Miller public ChooseLockPasswordFragment() { 13900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 14000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 14100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 14217e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 14317e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 14517e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 14617e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = getActivity().getIntent(); 14717e9e1933055b207473b488595b2887bfcaea32eJim Miller mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY, 14817e9e1933055b207473b488595b2887bfcaea32eJim Miller mRequestedQuality), mLockPatternUtils.getRequestedPasswordQuality()); 14917e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLength = Math.max( 15017e9e1933055b207473b488595b2887bfcaea32eJim Miller intent.getIntExtra(PASSWORD_MIN_KEY, mPasswordMinLength), mLockPatternUtils 15117e9e1933055b207473b488595b2887bfcaea32eJim Miller .getRequestedMinimumPasswordLength()); 15217e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMaxLength = intent.getIntExtra(PASSWORD_MAX_KEY, mPasswordMaxLength); 15317e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLetters = Math.max(intent.getIntExtra(PASSWORD_MIN_LETTERS_KEY, 15417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLetters), mLockPatternUtils.getRequestedPasswordMinimumLetters()); 15517e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinUpperCase = Math.max(intent.getIntExtra(PASSWORD_MIN_UPPERCASE_KEY, 15617e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinUpperCase), mLockPatternUtils.getRequestedPasswordMinimumUpperCase()); 15717e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLowerCase = Math.max(intent.getIntExtra(PASSWORD_MIN_LOWERCASE_KEY, 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLowerCase), mLockPatternUtils.getRequestedPasswordMinimumLowerCase()); 15917e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNumeric = Math.max(intent.getIntExtra(PASSWORD_MIN_NUMERIC_KEY, 16017e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNumeric), mLockPatternUtils.getRequestedPasswordMinimumNumeric()); 16117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinSymbols = Math.max(intent.getIntExtra(PASSWORD_MIN_SYMBOLS_KEY, 16217e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinSymbols), mLockPatternUtils.getRequestedPasswordMinimumSymbols()); 16317e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNonLetter = Math.max(intent.getIntExtra(PASSWORD_MIN_NONLETTER_KEY, 16417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNonLetter), mLockPatternUtils.getRequestedPasswordMinimumNonLetter()); 16517e9e1933055b207473b488595b2887bfcaea32eJim Miller 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity()); 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 1682f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 17017e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 17117e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 17217e9e1933055b207473b488595b2887bfcaea32eJim Miller 17317e9e1933055b207473b488595b2887bfcaea32eJim Miller View view = inflater.inflate(R.layout.choose_lock_password, null); 17417e9e1933055b207473b488595b2887bfcaea32eJim Miller 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller mCancelButton = (Button) view.findViewById(R.id.cancel_button); 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller mCancelButton.setOnClickListener(this); 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton = (Button) view.findViewById(R.id.next_button); 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton.setOnClickListener(this); 17917e9e1933055b207473b488595b2887bfcaea32eJim Miller 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller mIsAlphaMode = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == mRequestedQuality 18117e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mRequestedQuality 18217e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality; 18317e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard); 18417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry = (TextView) view.findViewById(R.id.password_entry); 18517e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setOnEditorActionListener(this); 18617e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.addTextChangedListener(this); 18717e9e1933055b207473b488595b2887bfcaea32eJim Miller 1889757e30dfa0ab691c4c15366568367e166071a7dJim Miller final Activity activity = getActivity(); 1899757e30dfa0ab691c4c15366568367e166071a7dJim Miller mKeyboardHelper = new PasswordEntryKeyboardHelper(activity, 19017e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView, mPasswordEntry); 19117e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardHelper.setKeyboardMode(mIsAlphaMode ? 19217e9e1933055b207473b488595b2887bfcaea32eJim Miller PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC); 19417e9e1933055b207473b488595b2887bfcaea32eJim Miller 19517e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText = (TextView) view.findViewById(R.id.headerText); 19617e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView.requestFocus(); 19717e9e1933055b207473b488595b2887bfcaea32eJim Miller 1982e28acedc623527aa5e84ba66635700d6547569aJim Miller int currentType = mPasswordEntry.getInputType(); 1992e28acedc623527aa5e84ba66635700d6547569aJim Miller mPasswordEntry.setInputType(mIsAlphaMode ? currentType 2003b46f49d2a5abb47c1bdf239f855d2063b60595eJim Miller : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD)); 2012e28acedc623527aa5e84ba66635700d6547569aJim Miller 20217e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent intent = getActivity().getIntent(); 20317e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean confirmCredentials = intent.getBooleanExtra("confirm_credentials", true); 20417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (savedInstanceState == null) { 20517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.Introduction); 20617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (confirmCredentials) { 20717e9e1933055b207473b488595b2887bfcaea32eJim Miller mChooseLockSettingsHelper.launchConfirmationActivity(CONFIRM_EXISTING_REQUEST, 20817e9e1933055b207473b488595b2887bfcaea32eJim Miller null, null); 20917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 21017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 21117e9e1933055b207473b488595b2887bfcaea32eJim Miller mFirstPin = savedInstanceState.getString(KEY_FIRST_PIN); 21217e9e1933055b207473b488595b2887bfcaea32eJim Miller final String state = savedInstanceState.getString(KEY_UI_STAGE); 21317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (state != null) { 21417e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = Stage.valueOf(state); 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(mUiStage); 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 21717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 2189757e30dfa0ab691c4c15366568367e166071a7dJim Miller // Update the breadcrumb (title) if this is embedded in a PreferenceActivity 2199757e30dfa0ab691c4c15366568367e166071a7dJim Miller if (activity instanceof PreferenceActivity) { 2209757e30dfa0ab691c4c15366568367e166071a7dJim Miller final PreferenceActivity preferenceActivity = (PreferenceActivity) activity; 221d75905991c5a1783ca27dc188c2d086f8f13ff94Jim Miller int id = mIsAlphaMode ? R.string.lockpassword_choose_your_password_header 222d75905991c5a1783ca27dc188c2d086f8f13ff94Jim Miller : R.string.lockpassword_choose_your_pin_header; 2239757e30dfa0ab691c4c15366568367e166071a7dJim Miller CharSequence title = getText(id); 2249757e30dfa0ab691c4c15366568367e166071a7dJim Miller preferenceActivity.showBreadCrumbs(title, title); 2259757e30dfa0ab691c4c15366568367e166071a7dJim Miller } 22600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 22717e9e1933055b207473b488595b2887bfcaea32eJim Miller return view; 22817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 229122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 23017e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 23117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onResume() { 23217e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onResume(); 233122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller updateStage(mUiStage); 23417e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView.requestFocus(); 235122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 236122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 23717e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 23817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onSaveInstanceState(Bundle outState) { 23917e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onSaveInstanceState(outState); 24017e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_UI_STAGE, mUiStage.name()); 24117e9e1933055b207473b488595b2887bfcaea32eJim Miller outState.putString(KEY_FIRST_PIN, mFirstPin); 24200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 24300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 24417e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 24517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onActivityResult(int requestCode, int resultCode, 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent data) { 24717e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onActivityResult(requestCode, resultCode, data); 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (requestCode) { 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller case CONFIRM_EXISTING_REQUEST: 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (resultCode != Activity.RESULT_OK) { 25117e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_FINISHED); 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 25417e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 25600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 25717e9e1933055b207473b488595b2887bfcaea32eJim Miller 25817e9e1933055b207473b488595b2887bfcaea32eJim Miller protected void updateStage(Stage stage) { 25917e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = stage; 26017e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUi(); 26100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 26217e9e1933055b207473b488595b2887bfcaea32eJim Miller 26317e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 26417e9e1933055b207473b488595b2887bfcaea32eJim Miller * Validates PIN and returns a message to display if PIN fails test. 26517e9e1933055b207473b488595b2887bfcaea32eJim Miller * @param password the raw password the user typed in 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller * @return error message to show to user or null if password is OK 26717e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller private String validatePassword(String password) { 26917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (password.length() < mPasswordMinLength) { 27017e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(mIsAlphaMode ? 27117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_password_too_short 27217e9e1933055b207473b488595b2887bfcaea32eJim Miller : R.string.lockpassword_pin_too_short, mPasswordMinLength); 27300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 27417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (password.length() > mPasswordMaxLength) { 27517e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(mIsAlphaMode ? 27617e9e1933055b207473b488595b2887bfcaea32eJim Miller R.string.lockpassword_password_too_long 27717e9e1933055b207473b488595b2887bfcaea32eJim Miller : R.string.lockpassword_pin_too_long, mPasswordMaxLength); 27800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 27917e9e1933055b207473b488595b2887bfcaea32eJim Miller int letters = 0; 28017e9e1933055b207473b488595b2887bfcaea32eJim Miller int numbers = 0; 28117e9e1933055b207473b488595b2887bfcaea32eJim Miller int lowercase = 0; 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller int symbols = 0; 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller int uppercase = 0; 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller int nonletter = 0; 28517e9e1933055b207473b488595b2887bfcaea32eJim Miller for (int i = 0; i < password.length(); i++) { 28617e9e1933055b207473b488595b2887bfcaea32eJim Miller char c = password.charAt(i); 28717e9e1933055b207473b488595b2887bfcaea32eJim Miller // allow non white space Latin-1 characters only 28817e9e1933055b207473b488595b2887bfcaea32eJim Miller if (c <= 32 || c > 127) { 28917e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(R.string.lockpassword_illegal_character); 29017e9e1933055b207473b488595b2887bfcaea32eJim Miller } 29117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (c >= '0' && c <= '9') { 29217e9e1933055b207473b488595b2887bfcaea32eJim Miller numbers++; 29317e9e1933055b207473b488595b2887bfcaea32eJim Miller nonletter++; 29417e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (c >= 'A' && c <= 'Z') { 29517e9e1933055b207473b488595b2887bfcaea32eJim Miller letters++; 29617e9e1933055b207473b488595b2887bfcaea32eJim Miller uppercase++; 29717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (c >= 'a' && c <= 'z') { 29817e9e1933055b207473b488595b2887bfcaea32eJim Miller letters++; 29917e9e1933055b207473b488595b2887bfcaea32eJim Miller lowercase++; 30017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 30117e9e1933055b207473b488595b2887bfcaea32eJim Miller symbols++; 30217e9e1933055b207473b488595b2887bfcaea32eJim Miller nonletter++; 30317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 30457fbf694a53afb9c1924d81272179dceb3acfa4dKonstantin Lopyrev } 30517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (DevicePolicyManager.PASSWORD_QUALITY_NUMERIC == mRequestedQuality 30617e9e1933055b207473b488595b2887bfcaea32eJim Miller && (letters > 0 || symbols > 0)) { 30717e9e1933055b207473b488595b2887bfcaea32eJim Miller // This shouldn't be possible unless user finds some way to bring up 30817e9e1933055b207473b488595b2887bfcaea32eJim Miller // soft keyboard 30917e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(R.string.lockpassword_pin_contains_non_digits); 31017e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mRequestedQuality) { 31117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (letters < mPasswordMinLetters) { 31217e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 31317e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_letters, mPasswordMinLetters), 31417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLetters); 31517e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (numbers < mPasswordMinNumeric) { 31617e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 31717e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_numeric, mPasswordMinNumeric), 31817e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNumeric); 31917e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (lowercase < mPasswordMinLowerCase) { 32017e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 32117e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_lowercase, mPasswordMinLowerCase), 32217e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinLowerCase); 32317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (uppercase < mPasswordMinUpperCase) { 32417e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 32517e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_uppercase, mPasswordMinUpperCase), 32617e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinUpperCase); 32717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (symbols < mPasswordMinSymbols) { 32817e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 32917e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_symbols, mPasswordMinSymbols), 33017e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinSymbols); 33117e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (nonletter < mPasswordMinNonLetter) { 33217e9e1933055b207473b488595b2887bfcaea32eJim Miller return String.format(getResources().getQuantityString( 33317e9e1933055b207473b488595b2887bfcaea32eJim Miller R.plurals.lockpassword_password_requires_nonletter, mPasswordMinNonLetter), 33417e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordMinNonLetter); 33517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 33617e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 33717e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean alphabetic = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC 33817e9e1933055b207473b488595b2887bfcaea32eJim Miller == mRequestedQuality; 33917e9e1933055b207473b488595b2887bfcaea32eJim Miller final boolean alphanumeric = DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC 34017e9e1933055b207473b488595b2887bfcaea32eJim Miller == mRequestedQuality; 34117e9e1933055b207473b488595b2887bfcaea32eJim Miller if ((alphabetic || alphanumeric) && letters == 0) { 34217e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(R.string.lockpassword_password_requires_alpha); 34317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 34417e9e1933055b207473b488595b2887bfcaea32eJim Miller if (alphanumeric && numbers == 0) { 34517e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(R.string.lockpassword_password_requires_digit); 34617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 347af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } 34817e9e1933055b207473b488595b2887bfcaea32eJim Miller if(mLockPatternUtils.checkPasswordHistory(password)) { 34917e9e1933055b207473b488595b2887bfcaea32eJim Miller return getString(mIsAlphaMode ? R.string.lockpassword_password_recently_used 35017e9e1933055b207473b488595b2887bfcaea32eJim Miller : R.string.lockpassword_pin_recently_used); 351af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } 35217e9e1933055b207473b488595b2887bfcaea32eJim Miller return null; 353122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 35400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 35517e9e1933055b207473b488595b2887bfcaea32eJim Miller private void handleNext() { 35617e9e1933055b207473b488595b2887bfcaea32eJim Miller final String pin = mPasswordEntry.getText().toString(); 35717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (TextUtils.isEmpty(pin)) { 35817e9e1933055b207473b488595b2887bfcaea32eJim Miller return; 359122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 36017e9e1933055b207473b488595b2887bfcaea32eJim Miller String errorMsg = null; 36117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.Introduction) { 36217e9e1933055b207473b488595b2887bfcaea32eJim Miller errorMsg = validatePassword(pin); 36317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (errorMsg == null) { 36417e9e1933055b207473b488595b2887bfcaea32eJim Miller mFirstPin = pin; 36517e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.NeedToConfirm); 36617e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setText(""); 36717e9e1933055b207473b488595b2887bfcaea32eJim Miller } 36817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else if (mUiStage == Stage.NeedToConfirm) { 36917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mFirstPin.equals(pin)) { 37017e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternUtils.clearLock(); 37117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternUtils.saveLockPassword(pin, mRequestedQuality); 37217e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 37317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 37417e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(Stage.ConfirmWrong); 37517e9e1933055b207473b488595b2887bfcaea32eJim Miller CharSequence tmp = mPasswordEntry.getText(); 37617e9e1933055b207473b488595b2887bfcaea32eJim Miller if (tmp != null) { 37717e9e1933055b207473b488595b2887bfcaea32eJim Miller Selection.setSelection((Spannable) tmp, 0, tmp.length()); 37817e9e1933055b207473b488595b2887bfcaea32eJim Miller } 379122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 380122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 38117e9e1933055b207473b488595b2887bfcaea32eJim Miller if (errorMsg != null) { 38217e9e1933055b207473b488595b2887bfcaea32eJim Miller showError(errorMsg, mUiStage); 38317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 384122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 385122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 38617e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onClick(View v) { 38717e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (v.getId()) { 38817e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.next_button: 38917e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 39017e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 39100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 39217e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.cancel_button: 39317e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 39417e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 39517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 39600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 39700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 39817e9e1933055b207473b488595b2887bfcaea32eJim Miller private void showError(String msg, final Stage next) { 39917e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(msg); 40017e9e1933055b207473b488595b2887bfcaea32eJim Miller mHandler.postDelayed(new Runnable() { 40117e9e1933055b207473b488595b2887bfcaea32eJim Miller public void run() { 40217e9e1933055b207473b488595b2887bfcaea32eJim Miller updateStage(next); 40317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 40417e9e1933055b207473b488595b2887bfcaea32eJim Miller }, ERROR_MESSAGE_TIMEOUT); 40517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 406122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 40717e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 40817e9e1933055b207473b488595b2887bfcaea32eJim Miller // Check if this was the result of hitting the enter key 40917e9e1933055b207473b488595b2887bfcaea32eJim Miller if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) { 41017e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 41117e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 41217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 41317e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 414122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 415122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 41617e9e1933055b207473b488595b2887bfcaea32eJim Miller /** 41717e9e1933055b207473b488595b2887bfcaea32eJim Miller * Update the hint based on current Stage and length of password entry 41817e9e1933055b207473b488595b2887bfcaea32eJim Miller */ 41917e9e1933055b207473b488595b2887bfcaea32eJim Miller private void updateUi() { 42017e9e1933055b207473b488595b2887bfcaea32eJim Miller String password = mPasswordEntry.getText().toString(); 42117e9e1933055b207473b488595b2887bfcaea32eJim Miller final int length = password.length(); 42217e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.Introduction && length > 0) { 42317e9e1933055b207473b488595b2887bfcaea32eJim Miller if (length < mPasswordMinLength) { 42417e9e1933055b207473b488595b2887bfcaea32eJim Miller String msg = getString(mIsAlphaMode ? R.string.lockpassword_password_too_short 42517e9e1933055b207473b488595b2887bfcaea32eJim Miller : R.string.lockpassword_pin_too_short, mPasswordMinLength); 42617e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(msg); 427af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller mNextButton.setEnabled(false); 428af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } else { 42917e9e1933055b207473b488595b2887bfcaea32eJim Miller String error = validatePassword(password); 43017e9e1933055b207473b488595b2887bfcaea32eJim Miller if (error != null) { 43117e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(error); 43217e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton.setEnabled(false); 43317e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 43417e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(R.string.lockpassword_press_continue); 43517e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton.setEnabled(true); 43617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 437af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Miller } 43817e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 43917e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(mIsAlphaMode ? mUiStage.alphaHint : mUiStage.numericHint); 44017e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton.setEnabled(length > 0); 441122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 44217e9e1933055b207473b488595b2887bfcaea32eJim Miller mNextButton.setText(mUiStage.buttonText); 443122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 444122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 44517e9e1933055b207473b488595b2887bfcaea32eJim Miller public void afterTextChanged(Editable s) { 44617e9e1933055b207473b488595b2887bfcaea32eJim Miller // Changing the text while error displayed resets to NeedToConfirm state 44717e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mUiStage == Stage.ConfirmWrong) { 44817e9e1933055b207473b488595b2887bfcaea32eJim Miller mUiStage = Stage.NeedToConfirm; 44917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 45017e9e1933055b207473b488595b2887bfcaea32eJim Miller updateUi(); 451122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 452122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 45317e9e1933055b207473b488595b2887bfcaea32eJim Miller public void beforeTextChanged(CharSequence s, int start, int count, int after) { 454122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 45517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 456122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 45717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onTextChanged(CharSequence s, int start, int before, int count) { 458122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 45917e9e1933055b207473b488595b2887bfcaea32eJim Miller } 460122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 46100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller} 462