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 193ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslavimport android.text.TextUtils; 2000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport com.android.internal.widget.LockPatternUtils; 212f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Millerimport com.android.internal.widget.PasswordEntryKeyboardHelper; 222f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Millerimport com.android.internal.widget.PasswordEntryKeyboardView; 2300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 249757e30dfa0ab691c4c15366568367e166071a7dJim Millerimport android.app.Activity; 2517e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.app.Fragment; 26af366a3ed66dcb3c3ecb1dd101e5d8869b518598Jim Millerimport android.app.admin.DevicePolicyManager; 2717e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.content.Intent; 2800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Bundle; 298184ea524519a67b1284266844e6e186f3a74cabAdrian Roosimport android.os.CountDownTimer; 3000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Handler; 318184ea524519a67b1284266844e6e186f3a74cabAdrian Roosimport android.os.SystemClock; 32d71c31ef946b35f73a0dded0a32c6ad6afc12227Paul Lawrenceimport android.os.storage.StorageManager; 3329c9073595e7ab25a4528d14873bb88627a48135Jim Millerimport android.text.Editable; 342e28acedc623527aa5e84ba66635700d6547569aJim Millerimport android.text.InputType; 3529c9073595e7ab25a4528d14873bb88627a48135Jim Millerimport android.text.TextWatcher; 36122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.KeyEvent; 3717e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater; 3800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View; 3900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View.OnClickListener; 403e8b76319d34e2e96819ec9e62d4f19ee7d4e2b4Jason parksimport android.view.ViewGroup; 41122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.inputmethod.EditorInfo; 4229c9073595e7ab25a4528d14873bb88627a48135Jim Millerimport android.widget.Button; 4300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.TextView; 44122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.widget.TextView.OnEditorActionListener; 4500d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 46263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Megliopublic class ConfirmLockPassword extends SettingsActivity { 4700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 483ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav public static final String PACKAGE = "com.android.settings"; 493ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav public static final String HEADER_TEXT = PACKAGE + ".ConfirmLockPattern.header"; 503ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav 51204440427aa198a836d55418060759a1e964abccPaul Lawrence public static class InternalActivity extends ConfirmLockPassword { 52204440427aa198a836d55418060759a1e964abccPaul Lawrence } 53204440427aa198a836d55418060759a1e964abccPaul Lawrence 5400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller @Override 5517e9e1933055b207473b488595b2887bfcaea32eJim Miller public Intent getIntent() { 5617e9e1933055b207473b488595b2887bfcaea32eJim Miller Intent modIntent = new Intent(super.getIntent()); 5717e9e1933055b207473b488595b2887bfcaea32eJim Miller modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ConfirmLockPasswordFragment.class.getName()); 5817e9e1933055b207473b488595b2887bfcaea32eJim Miller return modIntent; 5900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 6000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 6117e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 62a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani protected boolean isValidFragment(String fragmentName) { 63a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani if (ConfirmLockPasswordFragment.class.getName().equals(fragmentName)) return true; 64a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani return false; 65a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani } 66a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani 67a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani @Override 6817e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 692f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim 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_confirm_your_password_header); 74263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio setTitle(msg); 752f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller } 762f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller 7717e9e1933055b207473b488595b2887bfcaea32eJim Miller public static class ConfirmLockPasswordFragment extends Fragment implements OnClickListener, 7829c9073595e7ab25a4528d14873bb88627a48135Jim Miller OnEditorActionListener, TextWatcher { 790cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi private static final String KEY_NUM_WRONG_CONFIRM_ATTEMPTS 800cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi = "confirm_lock_password_fragment.key_num_wrong_confirm_attempts"; 8117e9e1933055b207473b488595b2887bfcaea32eJim Miller private static final long ERROR_MESSAGE_TIMEOUT = 3000; 8217e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mPasswordEntry; 8317e9e1933055b207473b488595b2887bfcaea32eJim Miller private LockPatternUtils mLockPatternUtils; 8417e9e1933055b207473b488595b2887bfcaea32eJim Miller private TextView mHeaderText; 8517e9e1933055b207473b488595b2887bfcaea32eJim Miller private Handler mHandler = new Handler(); 8617e9e1933055b207473b488595b2887bfcaea32eJim Miller private PasswordEntryKeyboardHelper mKeyboardHelper; 8717e9e1933055b207473b488595b2887bfcaea32eJim Miller private PasswordEntryKeyboardView mKeyboardView; 8829c9073595e7ab25a4528d14873bb88627a48135Jim Miller private Button mContinueButton; 898184ea524519a67b1284266844e6e186f3a74cabAdrian Roos private int mNumWrongConfirmAttempts; 908184ea524519a67b1284266844e6e186f3a74cabAdrian Roos private CountDownTimer mCountdownTimer; 918184ea524519a67b1284266844e6e186f3a74cabAdrian Roos private boolean mIsAlpha; 9200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 9317e9e1933055b207473b488595b2887bfcaea32eJim Miller // required constructor for fragments 9417e9e1933055b207473b488595b2887bfcaea32eJim Miller public ConfirmLockPasswordFragment() { 9517e9e1933055b207473b488595b2887bfcaea32eJim Miller 96122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 97122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 9817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 9917e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onCreate(Bundle savedInstanceState) { 10017e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onCreate(savedInstanceState); 10117e9e1933055b207473b488595b2887bfcaea32eJim Miller mLockPatternUtils = new LockPatternUtils(getActivity()); 1020cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi if (savedInstanceState != null) { 1030cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi mNumWrongConfirmAttempts = savedInstanceState.getInt( 1040cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi KEY_NUM_WRONG_CONFIRM_ATTEMPTS, 0); 1050cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi } 10617e9e1933055b207473b488595b2887bfcaea32eJim Miller } 10700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 10817e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 10917e9e1933055b207473b488595b2887bfcaea32eJim Miller public View onCreateView(LayoutInflater inflater, ViewGroup container, 11017e9e1933055b207473b488595b2887bfcaea32eJim Miller Bundle savedInstanceState) { 11117e9e1933055b207473b488595b2887bfcaea32eJim Miller final int storedQuality = mLockPatternUtils.getKeyguardStoredPasswordQuality(); 11217e9e1933055b207473b488595b2887bfcaea32eJim Miller View view = inflater.inflate(R.layout.confirm_lock_password, null); 11317e9e1933055b207473b488595b2887bfcaea32eJim Miller // Disable IME on our window since we provide our own keyboard 11417e9e1933055b207473b488595b2887bfcaea32eJim Miller 11517e9e1933055b207473b488595b2887bfcaea32eJim Miller view.findViewById(R.id.cancel_button).setOnClickListener(this); 11629c9073595e7ab25a4528d14873bb88627a48135Jim Miller mContinueButton = (Button) view.findViewById(R.id.next_button); 11729c9073595e7ab25a4528d14873bb88627a48135Jim Miller mContinueButton.setOnClickListener(this); 11829c9073595e7ab25a4528d14873bb88627a48135Jim Miller mContinueButton.setEnabled(false); // disable until the user enters at least one char 11929c9073595e7ab25a4528d14873bb88627a48135Jim Miller 12017e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry = (TextView) view.findViewById(R.id.password_entry); 12117e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setOnEditorActionListener(this); 12229c9073595e7ab25a4528d14873bb88627a48135Jim Miller mPasswordEntry.addTextChangedListener(this); 12329c9073595e7ab25a4528d14873bb88627a48135Jim Miller 12417e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard); 12517e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText = (TextView) view.findViewById(R.id.headerText); 1268184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mIsAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality 12717e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == storedQuality 12817e9e1933055b207473b488595b2887bfcaea32eJim Miller || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality; 1293ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav 1303ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav Intent intent = getActivity().getIntent(); 1313ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav if (intent != null) { 1323ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav CharSequence headerMessage = intent.getCharSequenceExtra(HEADER_TEXT); 1333ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav if (TextUtils.isEmpty(headerMessage)) { 1343ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav headerMessage = getString(getDefaultHeader()); 1353ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav } 1363ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav mHeaderText.setText(headerMessage); 1373ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav } 1389757e30dfa0ab691c4c15366568367e166071a7dJim Miller 1399757e30dfa0ab691c4c15366568367e166071a7dJim Miller final Activity activity = getActivity(); 1409757e30dfa0ab691c4c15366568367e166071a7dJim Miller mKeyboardHelper = new PasswordEntryKeyboardHelper(activity, 1419757e30dfa0ab691c4c15366568367e166071a7dJim Miller mKeyboardView, mPasswordEntry); 1428184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mKeyboardHelper.setKeyboardMode(mIsAlpha ? 1439757e30dfa0ab691c4c15366568367e166071a7dJim Miller PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA 14417e9e1933055b207473b488595b2887bfcaea32eJim Miller : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC); 14517e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView.requestFocus(); 1462e28acedc623527aa5e84ba66635700d6547569aJim Miller 1472e28acedc623527aa5e84ba66635700d6547569aJim Miller int currentType = mPasswordEntry.getInputType(); 1488184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mPasswordEntry.setInputType(mIsAlpha ? currentType 149025269df25d6094454a638c6f5eed0397580479cJim Miller : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD)); 1502e28acedc623527aa5e84ba66635700d6547569aJim Miller 151263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio if (activity instanceof SettingsActivity) { 152263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio final SettingsActivity sa = (SettingsActivity) activity; 1538184ea524519a67b1284266844e6e186f3a74cabAdrian Roos int id = getDefaultHeader(); 1549757e30dfa0ab691c4c15366568367e166071a7dJim Miller CharSequence title = getText(id); 155263bcc8b732dbb47d3ce63904e0e05191fabbad6Fabrice Di Meglio sa.setTitle(title); 1569757e30dfa0ab691c4c15366568367e166071a7dJim Miller } 1579757e30dfa0ab691c4c15366568367e166071a7dJim Miller 15817e9e1933055b207473b488595b2887bfcaea32eJim Miller return view; 15900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 16000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller 1618184ea524519a67b1284266844e6e186f3a74cabAdrian Roos private int getDefaultHeader() { 1628184ea524519a67b1284266844e6e186f3a74cabAdrian Roos return mIsAlpha ? R.string.lockpassword_confirm_your_password_header 1638184ea524519a67b1284266844e6e186f3a74cabAdrian Roos : R.string.lockpassword_confirm_your_pin_header; 1648184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 1658184ea524519a67b1284266844e6e186f3a74cabAdrian Roos 16617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 16717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onPause() { 16817e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onPause(); 16917e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView.requestFocus(); 1708184ea524519a67b1284266844e6e186f3a74cabAdrian Roos if (mCountdownTimer != null) { 1718184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mCountdownTimer.cancel(); 1728184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mCountdownTimer = null; 1738184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 17417e9e1933055b207473b488595b2887bfcaea32eJim Miller } 17517e9e1933055b207473b488595b2887bfcaea32eJim Miller 17617e9e1933055b207473b488595b2887bfcaea32eJim Miller @Override 17717e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onResume() { 17817e9e1933055b207473b488595b2887bfcaea32eJim Miller // TODO Auto-generated method stub 17917e9e1933055b207473b488595b2887bfcaea32eJim Miller super.onResume(); 18017e9e1933055b207473b488595b2887bfcaea32eJim Miller mKeyboardView.requestFocus(); 1818184ea524519a67b1284266844e6e186f3a74cabAdrian Roos long deadline = mLockPatternUtils.getLockoutAttemptDeadline(); 1828184ea524519a67b1284266844e6e186f3a74cabAdrian Roos if (deadline != 0) { 1838184ea524519a67b1284266844e6e186f3a74cabAdrian Roos handleAttemptLockout(deadline); 1848184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 18517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 18617e9e1933055b207473b488595b2887bfcaea32eJim Miller 1870cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi @Override 1880cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi public void onSaveInstanceState(Bundle outState) { 1890cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi super.onSaveInstanceState(outState); 1900cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi outState.putInt(KEY_NUM_WRONG_CONFIRM_ATTEMPTS, mNumWrongConfirmAttempts); 1910cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi } 1920cb467afe12c675fdfe4f349f83dd2bc4fe7cf79Jorim Jaggi 19317e9e1933055b207473b488595b2887bfcaea32eJim Miller private void handleNext() { 19417e9e1933055b207473b488595b2887bfcaea32eJim Miller final String pin = mPasswordEntry.getText().toString(); 19517e9e1933055b207473b488595b2887bfcaea32eJim Miller if (mLockPatternUtils.checkPassword(pin)) { 196025269df25d6094454a638c6f5eed0397580479cJim Miller 1973e8b76319d34e2e96819ec9e62d4f19ee7d4e2b4Jason parks Intent intent = new Intent(); 198204440427aa198a836d55418060759a1e964abccPaul Lawrence if (getActivity() instanceof ConfirmLockPassword.InternalActivity) { 199204440427aa198a836d55418060759a1e964abccPaul Lawrence intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE, 200204440427aa198a836d55418060759a1e964abccPaul Lawrence mIsAlpha ? StorageManager.CRYPT_TYPE_PASSWORD 201204440427aa198a836d55418060759a1e964abccPaul Lawrence : StorageManager.CRYPT_TYPE_PIN); 202204440427aa198a836d55418060759a1e964abccPaul Lawrence intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pin); 203204440427aa198a836d55418060759a1e964abccPaul Lawrence } 204025269df25d6094454a638c6f5eed0397580479cJim Miller 2053e8b76319d34e2e96819ec9e62d4f19ee7d4e2b4Jason parks getActivity().setResult(RESULT_OK, intent); 20617e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 20717e9e1933055b207473b488595b2887bfcaea32eJim Miller } else { 2088184ea524519a67b1284266844e6e186f3a74cabAdrian Roos if (++mNumWrongConfirmAttempts >= LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT) { 2098184ea524519a67b1284266844e6e186f3a74cabAdrian Roos long deadline = mLockPatternUtils.setLockoutAttemptDeadline(); 2108184ea524519a67b1284266844e6e186f3a74cabAdrian Roos handleAttemptLockout(deadline); 2118184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } else { 2128184ea524519a67b1284266844e6e186f3a74cabAdrian Roos showError(R.string.lockpattern_need_to_unlock_wrong); 2138184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 21400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller } 21517e9e1933055b207473b488595b2887bfcaea32eJim Miller } 21617e9e1933055b207473b488595b2887bfcaea32eJim Miller 2178184ea524519a67b1284266844e6e186f3a74cabAdrian Roos private void handleAttemptLockout(long elapsedRealtimeDeadline) { 2188184ea524519a67b1284266844e6e186f3a74cabAdrian Roos long elapsedRealtime = SystemClock.elapsedRealtime(); 2198184ea524519a67b1284266844e6e186f3a74cabAdrian Roos showError(R.string.lockpattern_too_many_failed_confirmation_attempts_header, 0); 2208184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mPasswordEntry.setEnabled(false); 2218184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mCountdownTimer = new CountDownTimer( 2228184ea524519a67b1284266844e6e186f3a74cabAdrian Roos elapsedRealtimeDeadline - elapsedRealtime, 2238184ea524519a67b1284266844e6e186f3a74cabAdrian Roos LockPatternUtils.FAILED_ATTEMPT_COUNTDOWN_INTERVAL_MS) { 2248184ea524519a67b1284266844e6e186f3a74cabAdrian Roos 2258184ea524519a67b1284266844e6e186f3a74cabAdrian Roos @Override 2268184ea524519a67b1284266844e6e186f3a74cabAdrian Roos public void onTick(long millisUntilFinished) { 2278184ea524519a67b1284266844e6e186f3a74cabAdrian Roos final int secondsCountdown = (int) (millisUntilFinished / 1000); 2288184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mHeaderText.setText(getString( 2298184ea524519a67b1284266844e6e186f3a74cabAdrian Roos R.string.lockpattern_too_many_failed_confirmation_attempts_footer, 2308184ea524519a67b1284266844e6e186f3a74cabAdrian Roos secondsCountdown)); 2318184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 2328184ea524519a67b1284266844e6e186f3a74cabAdrian Roos 2338184ea524519a67b1284266844e6e186f3a74cabAdrian Roos @Override 2348184ea524519a67b1284266844e6e186f3a74cabAdrian Roos public void onFinish() { 2358184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mPasswordEntry.setEnabled(true); 2368184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mHeaderText.setText(getDefaultHeader()); 2378184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mNumWrongConfirmAttempts = 0; 2388184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 2398184ea524519a67b1284266844e6e186f3a74cabAdrian Roos }.start(); 2408184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 2418184ea524519a67b1284266844e6e186f3a74cabAdrian Roos 24217e9e1933055b207473b488595b2887bfcaea32eJim Miller public void onClick(View v) { 24317e9e1933055b207473b488595b2887bfcaea32eJim Miller switch (v.getId()) { 24417e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.next_button: 24517e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 24617e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 247122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller 24817e9e1933055b207473b488595b2887bfcaea32eJim Miller case R.id.cancel_button: 24917e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().setResult(RESULT_CANCELED); 25017e9e1933055b207473b488595b2887bfcaea32eJim Miller getActivity().finish(); 25117e9e1933055b207473b488595b2887bfcaea32eJim Miller break; 25217e9e1933055b207473b488595b2887bfcaea32eJim Miller } 25317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 25417e9e1933055b207473b488595b2887bfcaea32eJim Miller 25517e9e1933055b207473b488595b2887bfcaea32eJim Miller private void showError(int msg) { 2568184ea524519a67b1284266844e6e186f3a74cabAdrian Roos showError(msg, ERROR_MESSAGE_TIMEOUT); 2578184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 2588184ea524519a67b1284266844e6e186f3a74cabAdrian Roos 2598184ea524519a67b1284266844e6e186f3a74cabAdrian Roos private final Runnable mResetErrorRunnable = new Runnable() { 2608184ea524519a67b1284266844e6e186f3a74cabAdrian Roos public void run() { 2618184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mHeaderText.setText(getDefaultHeader()); 2628184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 2638184ea524519a67b1284266844e6e186f3a74cabAdrian Roos }; 2648184ea524519a67b1284266844e6e186f3a74cabAdrian Roos 2658184ea524519a67b1284266844e6e186f3a74cabAdrian Roos private void showError(int msg, long timeout) { 26617e9e1933055b207473b488595b2887bfcaea32eJim Miller mHeaderText.setText(msg); 267eef72c39ae83697b1beaa148ec56aced67382fecalanv mHeaderText.announceForAccessibility(mHeaderText.getText()); 26817e9e1933055b207473b488595b2887bfcaea32eJim Miller mPasswordEntry.setText(null); 2698184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mHandler.removeCallbacks(mResetErrorRunnable); 2708184ea524519a67b1284266844e6e186f3a74cabAdrian Roos if (timeout != 0) { 2718184ea524519a67b1284266844e6e186f3a74cabAdrian Roos mHandler.postDelayed(mResetErrorRunnable, timeout); 2728184ea524519a67b1284266844e6e186f3a74cabAdrian Roos } 27317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 27417e9e1933055b207473b488595b2887bfcaea32eJim Miller 27529c9073595e7ab25a4528d14873bb88627a48135Jim Miller // {@link OnEditorActionListener} methods. 27617e9e1933055b207473b488595b2887bfcaea32eJim Miller public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 27774b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller // Check if this was the result of hitting the enter or "done" key 27874b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller if (actionId == EditorInfo.IME_NULL 27974b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller || actionId == EditorInfo.IME_ACTION_DONE 28074b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller || actionId == EditorInfo.IME_ACTION_NEXT) { 28117e9e1933055b207473b488595b2887bfcaea32eJim Miller handleNext(); 28217e9e1933055b207473b488595b2887bfcaea32eJim Miller return true; 28317e9e1933055b207473b488595b2887bfcaea32eJim Miller } 28417e9e1933055b207473b488595b2887bfcaea32eJim Miller return false; 285122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 28629c9073595e7ab25a4528d14873bb88627a48135Jim Miller 28729c9073595e7ab25a4528d14873bb88627a48135Jim Miller // {@link TextWatcher} methods. 28829c9073595e7ab25a4528d14873bb88627a48135Jim Miller public void beforeTextChanged(CharSequence s, int start, int count, int after) { 28929c9073595e7ab25a4528d14873bb88627a48135Jim Miller } 29029c9073595e7ab25a4528d14873bb88627a48135Jim Miller 29129c9073595e7ab25a4528d14873bb88627a48135Jim Miller public void onTextChanged(CharSequence s, int start, int before, int count) { 29229c9073595e7ab25a4528d14873bb88627a48135Jim Miller } 29329c9073595e7ab25a4528d14873bb88627a48135Jim Miller 29429c9073595e7ab25a4528d14873bb88627a48135Jim Miller public void afterTextChanged(Editable s) { 29529c9073595e7ab25a4528d14873bb88627a48135Jim Miller mContinueButton.setEnabled(mPasswordEntry.getText().length() > 0); 29629c9073595e7ab25a4528d14873bb88627a48135Jim Miller } 297122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller } 29800d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller} 299