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