1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/* 2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Copyright (C) 2012 The Android Open Source Project 3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * you may not use this file except in compliance with the License. 6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * You may obtain a copy of the License at 7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * http://www.apache.org/licenses/LICENSE-2.0 9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * 10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Unless required by applicable law or agreed to in writing, software 11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * See the License for the specific language governing permissions and 14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * limitations under the License. 15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 16dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard; 18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport com.android.internal.telephony.ITelephony; 2052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants; 2152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants.State; 22b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport com.android.internal.telephony.PhoneConstants; 2353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 2453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandlerimport android.content.Context; 25d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.content.res.ColorStateList; 26ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggiimport android.content.res.Configuration; 2752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.content.res.Resources; 28b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog; 29b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog.Builder; 30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog; 31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog; 32d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.graphics.Color; 33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException; 34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager; 3552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionInfo; 3652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager; 3752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.TelephonyManager; 383d7687421f0045374f8406cdea749176dbb56043qingxiimport android.telephony.euicc.EuiccManager; 39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 40b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.util.Log; 4112f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxiimport android.view.View; 42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager; 43d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.widget.ImageView; 44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 45dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/** 4653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler * Displays a PIN pad for unlocking. 47dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 484e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardSimPinView extends KeyguardPinBasedInputView { 49b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private static final String LOG_TAG = "KeyguardSimPinView"; 5052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private static final boolean DEBUG = KeyguardConstants.DEBUG_SIM_STATES; 514fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller public static final String TAG = "KeyguardSimPinView"; 524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 53d6c48847ba6a68594ac602350a5994904b9a67baJim Miller private ProgressDialog mSimUnlockProgressDialog = null; 544fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller private CheckSimPin mCheckSimPinThread; 55d6c48847ba6a68594ac602350a5994904b9a67baJim Miller 56b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private AlertDialog mRemainingAttemptsDialog; 5752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private int mSubId; 58d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi private ImageView mSimImageView; 5952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 6052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { 6152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 6252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller public void onSimStateChanged(int subId, int slotId, State simState) { 6322ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")"); 6422ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger switch(simState) { 6522ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger // If the SIM is removed, then we must remove the keyguard. It will be put up 6622ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger // again when the PUK locked SIM is re-entered. 6722ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger case ABSENT: { 6822ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked(mSubId); 693311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger // onSimStateChanged callback can fire when the SIM PIN lock is not currently 703311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger // active and mCallback is null. 713311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger if (mCallback != null) { 723311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); 733311859a489a5f01e2f84c6220f3a7cf6044e526Brad Ebinger } 7422ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger break; 7522ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger } 7622ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger default: 7722ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger resetState(); 7822ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger } 7922ed1f9a3558129d1bd8b1788c9d8b374cd0a84aBrad Ebinger } 8052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller }; 81b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 82d6c48847ba6a68594ac602350a5994904b9a67baJim Miller public KeyguardSimPinView(Context context) { 83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSimPinView(Context context, AttributeSet attrs) { 87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 904db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller @Override 9153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void resetState() { 924e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek super.resetState(); 9352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) Log.v(TAG, "Resetting state"); 9452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 9552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); 9612f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); 97a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville if (SubscriptionManager.isValidSubscriptionId(mSubId)) { 9852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller int count = TelephonyManager.getDefault().getSimCount(); 9952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Resources rez = getResources(); 1003d7687421f0045374f8406cdea749176dbb56043qingxi String msg; 101d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi int color = Color.WHITE; 10252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (count < 2) { 10352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller msg = rez.getString(R.string.kg_sim_pin_instructions); 10452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } else { 10552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); 10652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash 10752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); 108d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi if (info != null) { 109d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi color = info.getIconTint(); 110d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi } 11152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 11212f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi if (isEsimLocked) { 1133d7687421f0045374f8406cdea749176dbb56043qingxi msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); 1143d7687421f0045374f8406cdea749176dbb56043qingxi } 115db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(msg); 116d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi mSimImageView.setImageTintList(ColorStateList.valueOf(color)); 11752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 11812f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area); 11912f2de4f4fcdb5a20ddca80c340076bcc09cc8eaqingxi esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE); 12053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 12153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 1223122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek @Override 123ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi protected void onConfigurationChanged(Configuration newConfig) { 124ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi super.onConfigurationChanged(newConfig); 125ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi resetState(); 126ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi } 127ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi 128ad371b2e2215c76bc0f852dabc4ddb563c603af3Jorim Jaggi @Override 1293122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek protected int getPromtReasonStringRes(int reason) { 1303122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek // No message on SIM Pin 1313122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek return 0; 1323122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 1333122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek 134b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private String getPinPasswordErrorMessage(int attemptsRemaining) { 135b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String displayMessage; 136b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 137b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining == 0) { 138b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); 139b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else if (attemptsRemaining > 0) { 140b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getResources() 141b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, 142b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville attemptsRemaining); 143b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 144b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_pin_failed); 145b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 146b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" 147b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); 148b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return displayMessage; 149b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 150b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 15153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 1527d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller protected boolean shouldLockout(long deadline) { 1537d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller // SIM PIN doesn't have a timed lockout 1547d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller return false; 1557d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller } 1567d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 1577d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller @Override 15853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected int getPasswordTextViewId() { 159fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi return R.id.simPinEntry; 160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onFinishInflate(); 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 16640a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi if (mEcaView instanceof EmergencyCarrierArea) { 16740a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true); 16840a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi } 16951efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette mSimImageView = findViewById(R.id.keyguard_sim); 170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1726fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 17352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onAttachedToWindow() { 17452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onAttachedToWindow(); 17552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); 17652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 17752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 17852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 17952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onDetachedFromWindow() { 18052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onDetachedFromWindow(); 18152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback); 18252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 18352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 18452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 1856fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 1866fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1876fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 18853149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 18953149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onPause() { 190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // dismiss the dialog. 191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog != null) { 192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.dismiss(); 193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = null; 194dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Since the IPC can block, we want to run the request in a separate thread 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * with a callback. 200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private abstract class CheckSimPin extends Thread { 202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final String mPin; 20352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private int mSubId; 204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 20552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected CheckSimPin(String pin, int subId) { 206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPin = pin; 20752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSubId = subId; 208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 210b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville abstract void onSimCheckResponse(final int result, final int attemptsRemaining); 211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 21552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) { 21652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Log.v(TAG, "call supplyPinReportResultForSubscriber(subid=" + mSubId + ")"); 21752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 218b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville final int[] result = ITelephony.Stub.asInterface(ServiceManager 21952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .checkService("phone")).supplyPinReportResultForSubscriber(mSubId, mPin); 22052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) { 22152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]); 22252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 2244db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller @Override 225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 226b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimCheckResponse(result[0], result[1]); 227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (RemoteException e) { 2304fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller Log.e(TAG, "RemoteException for supplyPinReportResult:", e); 231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 2324db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller @Override 233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 234b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); 235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 239dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 240dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 241dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Dialog getSimUnlockProgressDialog() { 242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog == null) { 243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = new ProgressDialog(mContext); 244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setMessage( 245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); 246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setIndeterminate(true); 247dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setCancelable(false); 248b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSimUnlockProgressDialog.getWindow().setType( 249b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 250dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mSimUnlockProgressDialog; 252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 253dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 254b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private Dialog getSimRemainingAttemptsDialog(int remaining) { 255b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String msg = getPinPasswordErrorMessage(remaining); 256b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (mRemainingAttemptsDialog == null) { 257b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville Builder builder = new AlertDialog.Builder(mContext); 258b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setMessage(msg); 259b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setCancelable(false); 260b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setNeutralButton(R.string.ok, null); 261b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog = builder.create(); 262b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.getWindow().setType( 263b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 264b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 265b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.setMessage(msg); 266b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 267b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return mRemainingAttemptsDialog; 268b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 269b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 27053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 27153149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected void verifyPasswordAndUnlock() { 2724e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek String entry = mPasswordEntry.getText(); 2737d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 27453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (entry.length() < 4) { 275dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, display a message to the user, and don't submit. 276db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint); 2774db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller resetPasswordText(true /* animate */, true /* announce */); 278b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mCallback.userActivity(); 279dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return; 280dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 281dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 282dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller getSimUnlockProgressDialog().show(); 283dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 2844fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller if (mCheckSimPinThread == null) { 28552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText(), mSubId) { 2864db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller @Override 287b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville void onSimCheckResponse(final int result, final int attemptsRemaining) { 2884b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller post(new Runnable() { 2894db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller @Override 2904b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller public void run() { 2914b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (mSimUnlockProgressDialog != null) { 2924b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimUnlockProgressDialog.hide(); 2934b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2944db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller resetPasswordText(true /* animate */, 2954db942c21bac097a4c87b479d07d47cc3d7cc002Jim Miller result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */); 296b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_RESULT_SUCCESS) { 29752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(getContext()) 29852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .reportSimUnlocked(mSubId); 2998702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); 3004b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 301b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { 302b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining <= 2) { 303b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // this is getting critical - show dialog 304b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getSimRemainingAttemptsDialog(attemptsRemaining).show(); 305b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 306b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // show message 307b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage( 308db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos getPinPasswordErrorMessage(attemptsRemaining)); 309b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 310b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 311b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // "PIN operation failed!" - no idea what this was and no way to 312b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // find out. :/ 313b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage(getContext().getString( 314db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos R.string.kg_password_pin_failed)); 315b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 316b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock " 317b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " CheckSimPin.onSimCheckResponse: " + result 318b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining); 3194b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 320b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mCallback.userActivity(); 3214fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPinThread = null; 322dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 3234b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }); 3244b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 3254fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller }; 3264fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPinThread.start(); 3274b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 328dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 329c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi 330c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi @Override 331c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi public void startAppearAnimation() { 332c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi // noop. 333c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi } 33476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 33576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi @Override 33676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi public boolean startDisappearAnimation(Runnable finishRunnable) { 33776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return false; 33876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 339dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 34053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 341