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