11f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/* 21f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 41f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 51f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * you may not use this file except in compliance with the License. 61f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * You may obtain a copy of the License at 71f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 81f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 91f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * 101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * See the License for the specific language governing permissions and 141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * limitations under the License. 151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard_obsolete; 181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.Dialog; 201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.app.ProgressDialog; 211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.content.Context; 225475906f53e2d79807548932dfabbf9945143740Jim Millerimport android.content.res.Configuration; 231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.RemoteException; 241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.os.ServiceManager; 255475906f53e2d79807548932dfabbf9945143740Jim Miller 261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.telephony.ITelephony; 27c23024d32779b170dde32a50fbdd945ce521b874Jim Millerimport com.android.internal.widget.LockPatternUtils; 28c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.text.Editable; 301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.KeyEvent; 311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.LayoutInflater; 321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.View; 331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.view.WindowManager; 34c23024d32779b170dde32a50fbdd945ce521b874Jim Millerimport android.widget.Button; 351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.LinearLayout; 361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport android.widget.TextView; 371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectimport com.android.internal.R; 381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project/** 401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Displays a dialer like interface to unlock the SIM PIN. 411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 426b05d58018c2806459c121e507c005639b74aee9Jim Millerpublic class SimUnlockScreen extends LinearLayout implements KeyguardScreen, View.OnClickListener { 431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int DIGIT_PRESS_WAKE_MILLIS = 5000; 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final KeyguardUpdateMonitor mUpdateMonitor; 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final KeyguardScreenCallback mCallback; 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mHeaderText; 50d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project private TextView mPinText; 511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mOkButton; 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private View mBackSpaceButton; 551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final int[] mEnteredPin = {0, 0, 0, 0, 0, 0, 0, 0}; 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mEnteredDigits = 0; 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ProgressDialog mSimUnlockProgressDialog = null; 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 61c23024d32779b170dde32a50fbdd945ce521b874Jim Miller private LockPatternUtils mLockPatternUtils; 62c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 635475906f53e2d79807548932dfabbf9945143740Jim Miller private int mCreationOrientation; 645475906f53e2d79807548932dfabbf9945143740Jim Miller 655475906f53e2d79807548932dfabbf9945143740Jim Miller private int mKeyboardHidden; 665475906f53e2d79807548932dfabbf9945143740Jim Miller 676b05d58018c2806459c121e507c005639b74aee9Jim Miller private KeyguardStatusViewManager mKeyguardStatusViewManager; 686b05d58018c2806459c121e507c005639b74aee9Jim Miller 691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 715475906f53e2d79807548932dfabbf9945143740Jim Miller public SimUnlockScreen(Context context, Configuration configuration, 725475906f53e2d79807548932dfabbf9945143740Jim Miller KeyguardUpdateMonitor updateMonitor, KeyguardScreenCallback callback, 735475906f53e2d79807548932dfabbf9945143740Jim Miller LockPatternUtils lockpatternutils) { 741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project super(context); 751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor = updateMonitor; 761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback = callback; 775475906f53e2d79807548932dfabbf9945143740Jim Miller 785475906f53e2d79807548932dfabbf9945143740Jim Miller mCreationOrientation = configuration.orientation; 795475906f53e2d79807548932dfabbf9945143740Jim Miller mKeyboardHidden = configuration.hardKeyboardHidden; 80c23024d32779b170dde32a50fbdd945ce521b874Jim Miller mLockPatternUtils = lockpatternutils; 811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 825475906f53e2d79807548932dfabbf9945143740Jim Miller LayoutInflater inflater = LayoutInflater.from(context); 835475906f53e2d79807548932dfabbf9945143740Jim Miller if (mKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { 845475906f53e2d79807548932dfabbf9945143740Jim Miller inflater.inflate(R.layout.keyguard_screen_sim_pin_landscape, this, true); 851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 865475906f53e2d79807548932dfabbf9945143740Jim Miller inflater.inflate(R.layout.keyguard_screen_sim_pin_portrait, this, true); 871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project new TouchInput(); 881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHeaderText = (TextView) findViewById(R.id.headerText); 91d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project mPinText = (TextView) findViewById(R.id.pinDisplay); 921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mBackSpaceButton = findViewById(R.id.backspace); 931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mBackSpaceButton.setOnClickListener(this); 941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOkButton = (TextView) findViewById(R.id.ok); 961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHeaderText.setText(R.string.keyguard_password_enter_pin_code); 981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setFocusable(false); 991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOkButton.setOnClickListener(this); 1011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1026b05d58018c2806459c121e507c005639b74aee9Jim Miller mKeyguardStatusViewManager = new KeyguardStatusViewManager(this, updateMonitor, 1031f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller lockpatternutils, callback, false); 1040f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang 1051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project setFocusableInTouchMode(true); 1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean needsInput() { 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 112c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 1131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onPause() { 1156b05d58018c2806459c121e507c005639b74aee9Jim Miller mKeyguardStatusViewManager.onPause(); 1161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onResume() { 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // start fresh 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHeaderText.setText(R.string.keyguard_password_enter_pin_code); 1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // make sure that the number of entered digits is consistent when we 1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // erase the SIM unlock code, including orientation changes. 1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setText(""); 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits = 0; 127c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 1286b05d58018c2806459c121e507c005639b74aee9Jim Miller mKeyguardStatusViewManager.onResume(); 1291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void cleanUp() { 1337dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu // dismiss the dialog. 1341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mSimUnlockProgressDialog != null) { 1357dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu mSimUnlockProgressDialog.dismiss(); 1367dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu mSimUnlockProgressDialog = null; 1371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor.removeCallback(this); 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Since the IPC can block, we want to run the request in a separate thread 1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * with a callback. 1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private abstract class CheckSimPin extends Thread { 1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final String mPin; 1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected CheckSimPin(String pin) { 1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPin = pin; 1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project abstract void onSimLockChangedResponse(boolean success); 1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void run() { 1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project try { 1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean result = ITelephony.Stub.asInterface(ServiceManager 1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project .checkService("phone")).supplyPin(mPin); 1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project post(new Runnable() { 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void run() { 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project onSimLockChangedResponse(result); 1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }); 1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } catch (RemoteException e) { 1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project post(new Runnable() { 1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void run() { 1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project onSimLockChangedResponse(false); 1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }); 1721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onClick(View v) { 1771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (v == mBackSpaceButton) { 178d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project final Editable digits = mPinText.getEditableText(); 1791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final int len = digits.length(); 1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (len > 0) { 1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digits.delete(len-1, len); 1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits--; 1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.pokeWakelock(); 1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mOkButton) { 1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project checkPin(); 1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Dialog getSimUnlockProgressDialog() { 1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mSimUnlockProgressDialog == null) { 1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog = new ProgressDialog(mContext); 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.setMessage( 1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext.getString(R.string.lockscreen_sim_unlock_progress_dialog_message)); 1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.setIndeterminate(true); 1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.setCancelable(false); 1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.getWindow().setType( 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 1991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mSimUnlockProgressDialog; 2011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void checkPin() { 2041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // make sure that the pin is at least 4 digits long. 2061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits < 4) { 2071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // otherwise, display a message to the user, and don't submit. 2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHeaderText.setText(R.string.invalidPin); 2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setText(""); 2101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits = 0; 2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.pokeWakelock(); 2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project getSimUnlockProgressDialog().show(); 2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project new CheckSimPin(mPinText.getText().toString()) { 21790d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller void onSimLockChangedResponse(final boolean success) { 21890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mPinText.post(new Runnable() { 21990d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller public void run() { 22090d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller if (mSimUnlockProgressDialog != null) { 22190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mSimUnlockProgressDialog.hide(); 22290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller } 22390d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller if (success) { 22490d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller // before closing the keyguard, report back that 22590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller // the sim is unlocked so it knows right away 22690d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mUpdateMonitor.reportSimUnlocked(); 22790d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mCallback.goToUnlockScreen(); 22890d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller } else { 22990d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mHeaderText.setText(R.string.keyguard_password_wrong_pin_code); 23090d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mPinText.setText(""); 23190d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mEnteredDigits = 0; 23290d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller } 23390d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller mCallback.pokeWakelock(); 23490d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller } 23590d5d46b9e1bfc2df1a4a16b411eafb43c80eba5Jim Miller }); 2361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }.start(); 2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK) { 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.goToLockScreen(); 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final char match = event.getMatch(DIGITS); 2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (match != 0) { 2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project reportDigit(match - '0'); 2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_DEL) { 2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits > 0) { 2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.onKeyDown(keyCode, event); 2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits--; 2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_ENTER) { 2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project checkPin(); 2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void reportDigit(int digit) { 2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits == 0) { 2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setText(""); 2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits == 8) { 2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.append(Integer.toString(digit)); 2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredPin[mEnteredDigits++] = digit; 2771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 27975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn void updateConfiguration() { 28075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn Configuration newConfig = getResources().getConfiguration(); 2815475906f53e2d79807548932dfabbf9945143740Jim Miller if (newConfig.orientation != mCreationOrientation) { 2825475906f53e2d79807548932dfabbf9945143740Jim Miller mCallback.recreateMe(newConfig); 2835475906f53e2d79807548932dfabbf9945143740Jim Miller } else if (newConfig.hardKeyboardHidden != mKeyboardHidden) { 2845475906f53e2d79807548932dfabbf9945143740Jim Miller mKeyboardHidden = newConfig.hardKeyboardHidden; 2851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 28675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn } 2870f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang 28875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn @Override 28975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn protected void onAttachedToWindow() { 29075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn super.onAttachedToWindow(); 29175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn updateConfiguration(); 29275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn } 29375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn 29475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn /** {@inheritDoc} */ 29575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn @Override 29675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn protected void onConfigurationChanged(Configuration newConfig) { 29775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn super.onConfigurationChanged(newConfig); 29875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn updateConfiguration(); 2991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helper class to handle input from touch dialer. Only relevant when 3031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyboard is shut. 3041f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3051f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private class TouchInput implements View.OnClickListener { 3061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mZero; 3071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mOne; 3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mTwo; 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mThree; 3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mFour; 3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mFive; 3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mSix; 3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mSeven; 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mEight; 3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mNine; 3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mCancelButton; 3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TouchInput() { 3191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mZero = (TextView) findViewById(R.id.zero); 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOne = (TextView) findViewById(R.id.one); 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTwo = (TextView) findViewById(R.id.two); 3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mThree = (TextView) findViewById(R.id.three); 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFour = (TextView) findViewById(R.id.four); 3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFive = (TextView) findViewById(R.id.five); 3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSix = (TextView) findViewById(R.id.six); 3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSeven = (TextView) findViewById(R.id.seven); 3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEight = (TextView) findViewById(R.id.eight); 3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNine = (TextView) findViewById(R.id.nine); 3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCancelButton = (TextView) findViewById(R.id.cancel); 3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mZero.setText("0"); 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOne.setText("1"); 3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTwo.setText("2"); 3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mThree.setText("3"); 3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFour.setText("4"); 3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFive.setText("5"); 3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSix.setText("6"); 3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSeven.setText("7"); 3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEight.setText("8"); 3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNine.setText("9"); 3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mZero.setOnClickListener(this); 3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOne.setOnClickListener(this); 3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTwo.setOnClickListener(this); 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mThree.setOnClickListener(this); 3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFour.setOnClickListener(this); 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFive.setOnClickListener(this); 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSix.setOnClickListener(this); 3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSeven.setOnClickListener(this); 3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEight.setOnClickListener(this); 3511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNine.setOnClickListener(this); 3521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCancelButton.setOnClickListener(this); 3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onClick(View v) { 3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (v == mCancelButton) { 3589a3caf39e4c628c6dfcac92f7e2b7e4538a73009Jim Miller mPinText.setText(""); // clear the PIN entry field if the user cancels 3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.goToLockScreen(); 3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final int digit = checkDigit(v); 3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (digit >= 0) { 3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS); 3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project reportDigit(digit); 3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int checkDigit(View v) { 3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int digit = -1; 3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (v == mZero) { 3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 0; 3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mOne) { 3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 1; 3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mTwo) { 3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 2; 3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mThree) { 3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 3; 3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mFour) { 3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 4; 3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mFive) { 3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 5; 3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mSix) { 3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 6; 3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mSeven) { 3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 7; 3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mEight) { 3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 8; 3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mNine) { 3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 9; 3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return digit; 3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 397