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;
22a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasaniimport com.android.settings.ChooseLockGeneric.ChooseLockGenericFragment;
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;
2900d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.os.Handler;
3017e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.preference.PreferenceActivity;
3129c9073595e7ab25a4528d14873bb88627a48135Jim Millerimport android.text.Editable;
322e28acedc623527aa5e84ba66635700d6547569aJim Millerimport android.text.InputType;
3329c9073595e7ab25a4528d14873bb88627a48135Jim Millerimport android.text.TextWatcher;
34122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.KeyEvent;
3517e9e1933055b207473b488595b2887bfcaea32eJim Millerimport android.view.LayoutInflater;
3600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View;
3700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.view.View.OnClickListener;
383e8b76319d34e2e96819ec9e62d4f19ee7d4e2b4Jason parksimport android.view.ViewGroup;
39eef72c39ae83697b1beaa148ec56aced67382fecalanvimport android.view.accessibility.AccessibilityEvent;
40122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.view.inputmethod.EditorInfo;
4129c9073595e7ab25a4528d14873bb88627a48135Jim Millerimport android.widget.Button;
4200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Millerimport android.widget.TextView;
43122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Millerimport android.widget.TextView.OnEditorActionListener;
4400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
4517e9e1933055b207473b488595b2887bfcaea32eJim Millerpublic class ConfirmLockPassword extends PreferenceActivity {
4600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
4700d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    @Override
4817e9e1933055b207473b488595b2887bfcaea32eJim Miller    public Intent getIntent() {
4917e9e1933055b207473b488595b2887bfcaea32eJim Miller        Intent modIntent = new Intent(super.getIntent());
5017e9e1933055b207473b488595b2887bfcaea32eJim Miller        modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ConfirmLockPasswordFragment.class.getName());
5117e9e1933055b207473b488595b2887bfcaea32eJim Miller        modIntent.putExtra(EXTRA_NO_HEADERS, true);
5217e9e1933055b207473b488595b2887bfcaea32eJim Miller        return modIntent;
5300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller    }
5400d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
5517e9e1933055b207473b488595b2887bfcaea32eJim Miller    @Override
56a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    protected boolean isValidFragment(String fragmentName) {
57a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        if (ConfirmLockPasswordFragment.class.getName().equals(fragmentName)) return true;
58a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani        return false;
59a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    }
60a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani
61a677ee210c67d13d15ba0663887675bda16354d8Amith Yamasani    @Override
6217e9e1933055b207473b488595b2887bfcaea32eJim Miller    public void onCreate(Bundle savedInstanceState) {
632f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller        // Disable IME on our window since we provide our own keyboard
6417e9e1933055b207473b488595b2887bfcaea32eJim Miller        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
6517e9e1933055b207473b488595b2887bfcaea32eJim Miller                //WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
6617e9e1933055b207473b488595b2887bfcaea32eJim Miller        super.onCreate(savedInstanceState);
677da8cae44b622518fbffd6d265f291c39e9fc722Jim Miller        CharSequence msg = getText(R.string.lockpassword_confirm_your_password_header);
687da8cae44b622518fbffd6d265f291c39e9fc722Jim Miller        showBreadCrumbs(msg, msg);
692f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller    }
702f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller
7117e9e1933055b207473b488595b2887bfcaea32eJim Miller    public static class ConfirmLockPasswordFragment extends Fragment implements OnClickListener,
7229c9073595e7ab25a4528d14873bb88627a48135Jim Miller            OnEditorActionListener, TextWatcher {
7317e9e1933055b207473b488595b2887bfcaea32eJim Miller        private static final long ERROR_MESSAGE_TIMEOUT = 3000;
7417e9e1933055b207473b488595b2887bfcaea32eJim Miller        private TextView mPasswordEntry;
7517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private LockPatternUtils mLockPatternUtils;
7617e9e1933055b207473b488595b2887bfcaea32eJim Miller        private TextView mHeaderText;
7717e9e1933055b207473b488595b2887bfcaea32eJim Miller        private Handler mHandler = new Handler();
7817e9e1933055b207473b488595b2887bfcaea32eJim Miller        private PasswordEntryKeyboardHelper mKeyboardHelper;
7917e9e1933055b207473b488595b2887bfcaea32eJim Miller        private PasswordEntryKeyboardView mKeyboardView;
8029c9073595e7ab25a4528d14873bb88627a48135Jim Miller        private Button mContinueButton;
812f9dbcb49174d85218dd18e3b2097d3b9fc789c7Jim Miller
8200d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
8317e9e1933055b207473b488595b2887bfcaea32eJim Miller        // required constructor for fragments
8417e9e1933055b207473b488595b2887bfcaea32eJim Miller        public ConfirmLockPasswordFragment() {
8517e9e1933055b207473b488595b2887bfcaea32eJim Miller
86122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
87122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
8817e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
8917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onCreate(Bundle savedInstanceState) {
9017e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onCreate(savedInstanceState);
9117e9e1933055b207473b488595b2887bfcaea32eJim Miller            mLockPatternUtils = new LockPatternUtils(getActivity());
9217e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
9300d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
9417e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
9517e9e1933055b207473b488595b2887bfcaea32eJim Miller        public View onCreateView(LayoutInflater inflater, ViewGroup container,
9617e9e1933055b207473b488595b2887bfcaea32eJim Miller                Bundle savedInstanceState) {
9717e9e1933055b207473b488595b2887bfcaea32eJim Miller            final int storedQuality = mLockPatternUtils.getKeyguardStoredPasswordQuality();
9817e9e1933055b207473b488595b2887bfcaea32eJim Miller            View view = inflater.inflate(R.layout.confirm_lock_password, null);
9917e9e1933055b207473b488595b2887bfcaea32eJim Miller            // Disable IME on our window since we provide our own keyboard
10017e9e1933055b207473b488595b2887bfcaea32eJim Miller
10117e9e1933055b207473b488595b2887bfcaea32eJim Miller            view.findViewById(R.id.cancel_button).setOnClickListener(this);
10229c9073595e7ab25a4528d14873bb88627a48135Jim Miller            mContinueButton = (Button) view.findViewById(R.id.next_button);
10329c9073595e7ab25a4528d14873bb88627a48135Jim Miller            mContinueButton.setOnClickListener(this);
10429c9073595e7ab25a4528d14873bb88627a48135Jim Miller            mContinueButton.setEnabled(false); // disable until the user enters at least one char
10529c9073595e7ab25a4528d14873bb88627a48135Jim Miller
10617e9e1933055b207473b488595b2887bfcaea32eJim Miller            mPasswordEntry = (TextView) view.findViewById(R.id.password_entry);
10717e9e1933055b207473b488595b2887bfcaea32eJim Miller            mPasswordEntry.setOnEditorActionListener(this);
10829c9073595e7ab25a4528d14873bb88627a48135Jim Miller            mPasswordEntry.addTextChangedListener(this);
10929c9073595e7ab25a4528d14873bb88627a48135Jim Miller
11017e9e1933055b207473b488595b2887bfcaea32eJim Miller            mKeyboardView = (PasswordEntryKeyboardView) view.findViewById(R.id.keyboard);
11117e9e1933055b207473b488595b2887bfcaea32eJim Miller            mHeaderText = (TextView) view.findViewById(R.id.headerText);
11217e9e1933055b207473b488595b2887bfcaea32eJim Miller            final boolean isAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality
11317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == storedQuality
11417e9e1933055b207473b488595b2887bfcaea32eJim Miller                    || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality;
11517e9e1933055b207473b488595b2887bfcaea32eJim Miller            mHeaderText.setText(isAlpha ? R.string.lockpassword_confirm_your_password_header
11617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    : R.string.lockpassword_confirm_your_pin_header);
1179757e30dfa0ab691c4c15366568367e166071a7dJim Miller
1189757e30dfa0ab691c4c15366568367e166071a7dJim Miller            final Activity activity = getActivity();
1199757e30dfa0ab691c4c15366568367e166071a7dJim Miller            mKeyboardHelper = new PasswordEntryKeyboardHelper(activity,
1209757e30dfa0ab691c4c15366568367e166071a7dJim Miller                    mKeyboardView, mPasswordEntry);
1219757e30dfa0ab691c4c15366568367e166071a7dJim Miller            mKeyboardHelper.setKeyboardMode(isAlpha ?
1229757e30dfa0ab691c4c15366568367e166071a7dJim Miller                    PasswordEntryKeyboardHelper.KEYBOARD_MODE_ALPHA
12317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    : PasswordEntryKeyboardHelper.KEYBOARD_MODE_NUMERIC);
12417e9e1933055b207473b488595b2887bfcaea32eJim Miller            mKeyboardView.requestFocus();
1252e28acedc623527aa5e84ba66635700d6547569aJim Miller
1262e28acedc623527aa5e84ba66635700d6547569aJim Miller            int currentType = mPasswordEntry.getInputType();
1272e28acedc623527aa5e84ba66635700d6547569aJim Miller            mPasswordEntry.setInputType(isAlpha ? currentType
128025269df25d6094454a638c6f5eed0397580479cJim Miller                    : (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
1292e28acedc623527aa5e84ba66635700d6547569aJim Miller
1309757e30dfa0ab691c4c15366568367e166071a7dJim Miller            // Update the breadcrumb (title) if this is embedded in a PreferenceActivity
1319757e30dfa0ab691c4c15366568367e166071a7dJim Miller            if (activity instanceof PreferenceActivity) {
1329757e30dfa0ab691c4c15366568367e166071a7dJim Miller                final PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
1339757e30dfa0ab691c4c15366568367e166071a7dJim Miller                int id = isAlpha ? R.string.lockpassword_confirm_your_password_header
1349757e30dfa0ab691c4c15366568367e166071a7dJim Miller                        : R.string.lockpassword_confirm_your_pin_header;
1359757e30dfa0ab691c4c15366568367e166071a7dJim Miller                CharSequence title = getText(id);
1369757e30dfa0ab691c4c15366568367e166071a7dJim Miller                preferenceActivity.showBreadCrumbs(title, title);
1379757e30dfa0ab691c4c15366568367e166071a7dJim Miller            }
1389757e30dfa0ab691c4c15366568367e166071a7dJim Miller
13917e9e1933055b207473b488595b2887bfcaea32eJim Miller            return view;
14000d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller        }
14100d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller
14217e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
14317e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onPause() {
14417e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onPause();
14517e9e1933055b207473b488595b2887bfcaea32eJim Miller            mKeyboardView.requestFocus();
14617e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
14717e9e1933055b207473b488595b2887bfcaea32eJim Miller
14817e9e1933055b207473b488595b2887bfcaea32eJim Miller        @Override
14917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onResume() {
15017e9e1933055b207473b488595b2887bfcaea32eJim Miller            // TODO Auto-generated method stub
15117e9e1933055b207473b488595b2887bfcaea32eJim Miller            super.onResume();
15217e9e1933055b207473b488595b2887bfcaea32eJim Miller            mKeyboardView.requestFocus();
15317e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
15417e9e1933055b207473b488595b2887bfcaea32eJim Miller
15517e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void handleNext() {
15617e9e1933055b207473b488595b2887bfcaea32eJim Miller            final String pin = mPasswordEntry.getText().toString();
15717e9e1933055b207473b488595b2887bfcaea32eJim Miller            if (mLockPatternUtils.checkPassword(pin)) {
158025269df25d6094454a638c6f5eed0397580479cJim Miller
1593e8b76319d34e2e96819ec9e62d4f19ee7d4e2b4Jason parks                Intent intent = new Intent();
1600e88f4dd19a80e9e4d759595439773fb3e1f0c50Brian Carlstrom                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, pin);
161025269df25d6094454a638c6f5eed0397580479cJim Miller
1623e8b76319d34e2e96819ec9e62d4f19ee7d4e2b4Jason parks                getActivity().setResult(RESULT_OK, intent);
16317e9e1933055b207473b488595b2887bfcaea32eJim Miller                getActivity().finish();
16417e9e1933055b207473b488595b2887bfcaea32eJim Miller            } else {
16517e9e1933055b207473b488595b2887bfcaea32eJim Miller                showError(R.string.lockpattern_need_to_unlock_wrong);
16600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller            }
16717e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
16817e9e1933055b207473b488595b2887bfcaea32eJim Miller
16917e9e1933055b207473b488595b2887bfcaea32eJim Miller        public void onClick(View v) {
17017e9e1933055b207473b488595b2887bfcaea32eJim Miller            switch (v.getId()) {
17117e9e1933055b207473b488595b2887bfcaea32eJim Miller                case R.id.next_button:
17217e9e1933055b207473b488595b2887bfcaea32eJim Miller                    handleNext();
17317e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
174122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller
17517e9e1933055b207473b488595b2887bfcaea32eJim Miller                case R.id.cancel_button:
17617e9e1933055b207473b488595b2887bfcaea32eJim Miller                    getActivity().setResult(RESULT_CANCELED);
17717e9e1933055b207473b488595b2887bfcaea32eJim Miller                    getActivity().finish();
17817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    break;
17917e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
18017e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
18117e9e1933055b207473b488595b2887bfcaea32eJim Miller
18217e9e1933055b207473b488595b2887bfcaea32eJim Miller        private void showError(int msg) {
18317e9e1933055b207473b488595b2887bfcaea32eJim Miller            mHeaderText.setText(msg);
184eef72c39ae83697b1beaa148ec56aced67382fecalanv            mHeaderText.announceForAccessibility(mHeaderText.getText());
18517e9e1933055b207473b488595b2887bfcaea32eJim Miller            mPasswordEntry.setText(null);
18617e9e1933055b207473b488595b2887bfcaea32eJim Miller            mHandler.postDelayed(new Runnable() {
18717e9e1933055b207473b488595b2887bfcaea32eJim Miller                public void run() {
18817e9e1933055b207473b488595b2887bfcaea32eJim Miller                    mHeaderText.setText(R.string.lockpassword_confirm_your_password_header);
18917e9e1933055b207473b488595b2887bfcaea32eJim Miller                }
19017e9e1933055b207473b488595b2887bfcaea32eJim Miller            }, ERROR_MESSAGE_TIMEOUT);
19117e9e1933055b207473b488595b2887bfcaea32eJim Miller        }
19217e9e1933055b207473b488595b2887bfcaea32eJim Miller
19329c9073595e7ab25a4528d14873bb88627a48135Jim Miller        // {@link OnEditorActionListener} methods.
19417e9e1933055b207473b488595b2887bfcaea32eJim Miller        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
19574b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller            // Check if this was the result of hitting the enter or "done" key
19674b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller            if (actionId == EditorInfo.IME_NULL
19774b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller                    || actionId == EditorInfo.IME_ACTION_DONE
19874b1e0a7330af195621ad0965748bee66c46f4b6Jim Miller                    || actionId == EditorInfo.IME_ACTION_NEXT) {
19917e9e1933055b207473b488595b2887bfcaea32eJim Miller                handleNext();
20017e9e1933055b207473b488595b2887bfcaea32eJim Miller                return true;
20117e9e1933055b207473b488595b2887bfcaea32eJim Miller            }
20217e9e1933055b207473b488595b2887bfcaea32eJim Miller            return false;
203122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller        }
20429c9073595e7ab25a4528d14873bb88627a48135Jim Miller
20529c9073595e7ab25a4528d14873bb88627a48135Jim Miller        // {@link TextWatcher} methods.
20629c9073595e7ab25a4528d14873bb88627a48135Jim Miller        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
20729c9073595e7ab25a4528d14873bb88627a48135Jim Miller        }
20829c9073595e7ab25a4528d14873bb88627a48135Jim Miller
20929c9073595e7ab25a4528d14873bb88627a48135Jim Miller        public void onTextChanged(CharSequence s, int start, int before, int count) {
21029c9073595e7ab25a4528d14873bb88627a48135Jim Miller        }
21129c9073595e7ab25a4528d14873bb88627a48135Jim Miller
21229c9073595e7ab25a4528d14873bb88627a48135Jim Miller        public void afterTextChanged(Editable s) {
21329c9073595e7ab25a4528d14873bb88627a48135Jim Miller            mContinueButton.setEnabled(mPasswordEntry.getText().length() > 0);
21429c9073595e7ab25a4528d14873bb88627a48135Jim Miller        }
215122b6c85a9bc7076eacc388142f8c4fccc5462c9Jim Miller    }
21600d2476d8fc122b4eef59d6be6f7aa41e9c56fdeJim Miller}
217