SimUnlockScreen.java revision 0f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdeb
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 171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpackage com.android.internal.policy.impl; 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 */ 421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Projectpublic class SimUnlockScreen extends LinearLayout implements KeyguardScreen, View.OnClickListener, 435475906f53e2d79807548932dfabbf9945143740Jim Miller KeyguardUpdateMonitor.InfoCallback { 441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private static final int DIGIT_PRESS_WAKE_MILLIS = 5000; 461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final KeyguardUpdateMonitor mUpdateMonitor; 481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final KeyguardScreenCallback mCallback; 491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mHeaderText; 51d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project private TextView mPinText; 521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mOkButton; 54c23024d32779b170dde32a50fbdd945ce521b874Jim Miller private Button mEmergencyCallButton; 551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private View mBackSpaceButton; 571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final int[] mEnteredPin = {0, 0, 0, 0, 0, 0, 0, 0}; 591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int mEnteredDigits = 0; 601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private ProgressDialog mSimUnlockProgressDialog = null; 621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 63c23024d32779b170dde32a50fbdd945ce521b874Jim Miller private LockPatternUtils mLockPatternUtils; 64c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 655475906f53e2d79807548932dfabbf9945143740Jim Miller private int mCreationOrientation; 665475906f53e2d79807548932dfabbf9945143740Jim Miller 675475906f53e2d79807548932dfabbf9945143740Jim Miller private int mKeyboardHidden; 685475906f53e2d79807548932dfabbf9945143740Jim 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 1020f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang mEmergencyCallButton = (Button) findViewById(R.id.emergencyCall); 1030f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang mEmergencyCallButton.setOnClickListener(this); 1040f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton); 1050f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang 1061f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project setFocusableInTouchMode(true); 1071f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean needsInput() { 1111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 1121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 113c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 1141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onPause() { 1161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onResume() { 1211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // start fresh 1221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHeaderText.setText(R.string.keyguard_password_enter_pin_code); 1231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // make sure that the number of entered digits is consistent when we 1251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // erase the SIM unlock code, including orientation changes. 1261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setText(""); 1271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits = 0; 128c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 129c23024d32779b170dde32a50fbdd945ce521b874Jim Miller mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton); 1301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** {@inheritDoc} */ 1331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void cleanUp() { 1347dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu // dismiss the dialog. 1351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mSimUnlockProgressDialog != null) { 1367dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu mSimUnlockProgressDialog.dismiss(); 1377dda196e34c6c51bd219c79e8087f1d83cbbe8c3Yuling Liu mSimUnlockProgressDialog = null; 1381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mUpdateMonitor.removeCallback(this); 1401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 1441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Since the IPC can block, we want to run the request in a separate thread 1451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * with a callback. 1461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 1471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private abstract class CheckSimPin extends Thread { 1481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private final String mPin; 1501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project protected CheckSimPin(String pin) { 1521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPin = pin; 1531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project abstract void onSimLockChangedResponse(boolean success); 1561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project @Override 1581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void run() { 1591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project try { 1601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final boolean result = ITelephony.Stub.asInterface(ServiceManager 1611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project .checkService("phone")).supplyPin(mPin); 1621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project post(new Runnable() { 1631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void run() { 1641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project onSimLockChangedResponse(result); 1651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }); 1671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } catch (RemoteException e) { 1681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project post(new Runnable() { 1691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void run() { 1701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project onSimLockChangedResponse(false); 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 1771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onClick(View v) { 1781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (v == mBackSpaceButton) { 179d06b097626bd83745c2ef3400d7044d675f01b70The Android Open Source Project final Editable digits = mPinText.getEditableText(); 1801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final int len = digits.length(); 1811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (len > 0) { 1821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digits.delete(len-1, len); 1831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits--; 1841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.pokeWakelock(); 1861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mEmergencyCallButton) { 1871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.takeEmergencyCallAction(); 1881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mOkButton) { 1891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project checkPin(); 1901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 1921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 1931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private Dialog getSimUnlockProgressDialog() { 1941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mSimUnlockProgressDialog == null) { 1951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog = new ProgressDialog(mContext); 1961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.setMessage( 1971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mContext.getString(R.string.lockscreen_sim_unlock_progress_dialog_message)); 1981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.setIndeterminate(true); 1991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.setCancelable(false); 2001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.getWindow().setType( 2011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 2028d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn if (!mContext.getResources().getBoolean( 2038d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn com.android.internal.R.bool.config_sf_slowBlur)) { 2048d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn mSimUnlockProgressDialog.getWindow().setFlags( 2058d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn WindowManager.LayoutParams.FLAG_BLUR_BEHIND, 2068d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 2078d93c3e46cc975b93a6c56d2813e5600d643b99dDianne Hackborn } 2081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return mSimUnlockProgressDialog; 2101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void checkPin() { 2131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // make sure that the pin is at least 4 digits long. 2151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits < 4) { 2161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // otherwise, display a message to the user, and don't submit. 2171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHeaderText.setText(R.string.invalidPin); 2181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setText(""); 2191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits = 0; 2201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.pokeWakelock(); 2211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 2221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project getSimUnlockProgressDialog().show(); 2241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project new CheckSimPin(mPinText.getText().toString()) { 2261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project void onSimLockChangedResponse(boolean success) { 2271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mSimUnlockProgressDialog != null) { 2281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSimUnlockProgressDialog.hide(); 2291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (success) { 2311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // before closing the keyguard, report back that 2321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project // the sim is unlocked so it knows right away 2330f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang mUpdateMonitor.reportSimUnlocked(); 2341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.goToUnlockScreen(); 2351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else { 2361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mHeaderText.setText(R.string.keyguard_password_wrong_pin_code); 2371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setText(""); 2381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits = 0; 2391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2405e0f7ba8fa8045aab98664b5103d8620e9ac7f06Jim Miller mCallback.pokeWakelock(); 2411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project }.start(); 2431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public boolean onKeyDown(int keyCode, KeyEvent event) { 2471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_BACK) { 2481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.goToLockScreen(); 2491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final char match = event.getMatch(DIGITS); 2531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (match != 0) { 2541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project reportDigit(match - '0'); 2551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_DEL) { 2581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits > 0) { 2591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.onKeyDown(keyCode, event); 2601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredDigits--; 2611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (keyCode == KeyEvent.KEYCODE_ENTER) { 2661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project checkPin(); 2671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return true; 2681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return false; 2711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 2731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private void reportDigit(int digit) { 2741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits == 0) { 2751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.setText(""); 2761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (mEnteredDigits == 8) { 2781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 2791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mPinText.append(Integer.toString(digit)); 2811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEnteredPin[mEnteredDigits++] = digit; 2821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 2831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 28475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn void updateConfiguration() { 28575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn Configuration newConfig = getResources().getConfiguration(); 2865475906f53e2d79807548932dfabbf9945143740Jim Miller if (newConfig.orientation != mCreationOrientation) { 2875475906f53e2d79807548932dfabbf9945143740Jim Miller mCallback.recreateMe(newConfig); 2885475906f53e2d79807548932dfabbf9945143740Jim Miller } else if (newConfig.hardKeyboardHidden != mKeyboardHidden) { 2895475906f53e2d79807548932dfabbf9945143740Jim Miller mKeyboardHidden = newConfig.hardKeyboardHidden; 2905475906f53e2d79807548932dfabbf9945143740Jim Miller final boolean isKeyboardOpen = mKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO; 2915475906f53e2d79807548932dfabbf9945143740Jim Miller if (mUpdateMonitor.isKeyguardBypassEnabled() && isKeyboardOpen) { 2925475906f53e2d79807548932dfabbf9945143740Jim Miller mCallback.goToUnlockScreen(); 2935475906f53e2d79807548932dfabbf9945143740Jim Miller } 2941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 29575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn } 2960f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang 29775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn @Override 29875787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn protected void onAttachedToWindow() { 29975787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn super.onAttachedToWindow(); 30075787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn updateConfiguration(); 30175787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn } 30275787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn 30375787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn /** {@inheritDoc} */ 30475787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn @Override 30575787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn protected void onConfigurationChanged(Configuration newConfig) { 30675787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn super.onConfigurationChanged(newConfig); 30775787398fa5db9add16f3d3bc298198ed2c6671fDianne Hackborn updateConfiguration(); 3081f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3091f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3101f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project /** 3111f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * Helper class to handle input from touch dialer. Only relevant when 3121f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project * the keyboard is shut. 3131f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project */ 3141f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private class TouchInput implements View.OnClickListener { 3151f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mZero; 3161f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mOne; 3171f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mTwo; 3181f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mThree; 3191f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mFour; 3201f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mFive; 3211f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mSix; 3221f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mSeven; 3231f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mEight; 3241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mNine; 3251f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TextView mCancelButton; 3261f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3271f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private TouchInput() { 3281f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mZero = (TextView) findViewById(R.id.zero); 3291f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOne = (TextView) findViewById(R.id.one); 3301f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTwo = (TextView) findViewById(R.id.two); 3311f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mThree = (TextView) findViewById(R.id.three); 3321f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFour = (TextView) findViewById(R.id.four); 3331f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFive = (TextView) findViewById(R.id.five); 3341f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSix = (TextView) findViewById(R.id.six); 3351f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSeven = (TextView) findViewById(R.id.seven); 3361f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEight = (TextView) findViewById(R.id.eight); 3371f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNine = (TextView) findViewById(R.id.nine); 3381f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCancelButton = (TextView) findViewById(R.id.cancel); 3391f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3401f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mZero.setText("0"); 3411f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOne.setText("1"); 3421f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTwo.setText("2"); 3431f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mThree.setText("3"); 3441f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFour.setText("4"); 3451f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFive.setText("5"); 3461f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSix.setText("6"); 3471f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSeven.setText("7"); 3481f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEight.setText("8"); 3491f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNine.setText("9"); 3501f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3511f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mZero.setOnClickListener(this); 3521f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mOne.setOnClickListener(this); 3531f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mTwo.setOnClickListener(this); 3541f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mThree.setOnClickListener(this); 3551f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFour.setOnClickListener(this); 3561f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mFive.setOnClickListener(this); 3571f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSix.setOnClickListener(this); 3581f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mSeven.setOnClickListener(this); 3591f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mEight.setOnClickListener(this); 3601f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mNine.setOnClickListener(this); 3611f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCancelButton.setOnClickListener(this); 3621f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3631f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3641f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3651f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project public void onClick(View v) { 3661f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (v == mCancelButton) { 3671f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.goToLockScreen(); 3681f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return; 3691f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3701f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3711f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project final int digit = checkDigit(v); 3721f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (digit >= 0) { 3731f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project mCallback.pokeWakelock(DIGIT_PRESS_WAKE_MILLIS); 3741f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project reportDigit(digit); 3751f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3761f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 3771f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project 3781f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project private int checkDigit(View v) { 3791f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project int digit = -1; 3801f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project if (v == mZero) { 3811f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 0; 3821f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mOne) { 3831f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 1; 3841f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mTwo) { 3851f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 2; 3861f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mThree) { 3871f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 3; 3881f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mFour) { 3891f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 4; 3901f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mFive) { 3911f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 5; 3921f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mSix) { 3931f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 6; 3941f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mSeven) { 3951f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 7; 3961f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mEight) { 3971f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 8; 3981f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } else if (v == mNine) { 3991f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project digit = 9; 4001f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4011f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project return digit; 4021f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 4031f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project } 404c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 405c23024d32779b170dde32a50fbdd945ce521b874Jim Miller public void onPhoneStateChanged(String newState) { 4060f7b3f8ba5c2f0b8f96e072bd866c9fb374ebdebJohn Wang mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton); 407c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 408c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 409c23024d32779b170dde32a50fbdd945ce521b874Jim Miller public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, int batteryLevel) { 410c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 411c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 412c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 413c23024d32779b170dde32a50fbdd945ce521b874Jim Miller public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) { 414c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 415c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 416c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 417c23024d32779b170dde32a50fbdd945ce521b874Jim Miller public void onRingerModeChanged(int state) { 418c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 419c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 420c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 421c23024d32779b170dde32a50fbdd945ce521b874Jim Miller public void onTimeChanged() { 422c23024d32779b170dde32a50fbdd945ce521b874Jim Miller 423c23024d32779b170dde32a50fbdd945ce521b874Jim Miller } 4241f838aaece3cd61d07ab9e41c5c6af761d643324The Android Open Source Project} 425