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; 2652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.content.res.Resources; 27b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog; 28b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog.Builder; 29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog; 30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog; 31d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.graphics.Color; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException; 33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager; 3452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionInfo; 3552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager; 3652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.TelephonyManager; 37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 38b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.util.Log; 39dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager; 40d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.widget.ImageView; 41dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/** 4353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler * Displays a PIN pad for unlocking. 44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 454e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardSimPinView extends KeyguardPinBasedInputView { 46b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private static final String LOG_TAG = "KeyguardSimPinView"; 4752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private static final boolean DEBUG = KeyguardConstants.DEBUG_SIM_STATES; 484fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller public static final String TAG = "KeyguardSimPinView"; 494b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller 50d6c48847ba6a68594ac602350a5994904b9a67baJim Miller private ProgressDialog mSimUnlockProgressDialog = null; 514fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller private CheckSimPin mCheckSimPinThread; 52d6c48847ba6a68594ac602350a5994904b9a67baJim Miller 53b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private AlertDialog mRemainingAttemptsDialog; 5452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private int mSubId; 55d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi private ImageView mSimImageView; 5652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 5752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { 5852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 5952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller public void onSimStateChanged(int subId, int slotId, State simState) { 6052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")"); 6152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller resetState(); 6252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller }; 6352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller }; 64b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 65d6c48847ba6a68594ac602350a5994904b9a67baJim Miller public KeyguardSimPinView(Context context) { 66dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 67dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 68dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSimPinView(Context context, AttributeSet attrs) { 70dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 72dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 7353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void resetState() { 744e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek super.resetState(); 7552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) Log.v(TAG, "Resetting state"); 7652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 7752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); 78a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville if (SubscriptionManager.isValidSubscriptionId(mSubId)) { 7952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller int count = TelephonyManager.getDefault().getSimCount(); 8052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Resources rez = getResources(); 8152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller final String msg; 82d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi int color = Color.WHITE; 8352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (count < 2) { 8452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller msg = rez.getString(R.string.kg_sim_pin_instructions); 8552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } else { 8652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); 8752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash 8852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); 89d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi if (info != null) { 90d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi color = info.getIconTint(); 91d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi } 9252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 9352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSecurityMessageDisplay.setMessage(msg, true); 94d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi mSimImageView.setImageTintList(ColorStateList.valueOf(color)); 9552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 9653149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler } 9753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 98b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private String getPinPasswordErrorMessage(int attemptsRemaining) { 99b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String displayMessage; 100b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 101b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining == 0) { 102b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); 103b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else if (attemptsRemaining > 0) { 104b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getResources() 105b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, 106b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville attemptsRemaining); 107b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 108b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_pin_failed); 109b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 110b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" 111b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); 112b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return displayMessage; 113b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 114b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 11553149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 1167d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller protected boolean shouldLockout(long deadline) { 1177d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller // SIM PIN doesn't have a timed lockout 1187d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller return false; 1197d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller } 1207d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 1217d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller @Override 12253149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected int getPasswordTextViewId() { 123fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi return R.id.simPinEntry; 124dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 127dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 128dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onFinishInflate(); 129dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 130b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default 13140a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi if (mEcaView instanceof EmergencyCarrierArea) { 13240a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true); 13340a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi } 134d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi mSimImageView = (ImageView) findViewById(R.id.keyguard_sim); 135dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1376fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 13852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onAttachedToWindow() { 13952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onAttachedToWindow(); 14052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); 14152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 14252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 14352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 14452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onDetachedFromWindow() { 14552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onDetachedFromWindow(); 14652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback); 14752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 14852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 14952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 1506fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 1516fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 1526fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 15353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 15453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler public void onPause() { 155dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // dismiss the dialog. 156dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog != null) { 157dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.dismiss(); 158dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = null; 159dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 160dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 161dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 162dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Since the IPC can block, we want to run the request in a separate thread 164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * with a callback. 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private abstract class CheckSimPin extends Thread { 167dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final String mPin; 16852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private int mSubId; 169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 17052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected CheckSimPin(String pin, int subId) { 171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPin = pin; 17252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSubId = subId; 173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 175b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville abstract void onSimCheckResponse(final int result, final int attemptsRemaining); 176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 177dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 178dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 18052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) { 18152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Log.v(TAG, "call supplyPinReportResultForSubscriber(subid=" + mSubId + ")"); 18252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 183b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville final int[] result = ITelephony.Stub.asInterface(ServiceManager 18452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .checkService("phone")).supplyPinReportResultForSubscriber(mSubId, mPin); 18552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) { 18652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Log.v(TAG, "supplyPinReportResult returned: " + result[0] + " " + result[1]); 18752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 190b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimCheckResponse(result[0], result[1]); 191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 193dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (RemoteException e) { 1944fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller Log.e(TAG, "RemoteException for supplyPinReportResult:", e); 195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 197b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); 198dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 202dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 203dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 204dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Dialog getSimUnlockProgressDialog() { 205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog == null) { 206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = new ProgressDialog(mContext); 207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setMessage( 208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); 209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setIndeterminate(true); 210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setCancelable(false); 211b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSimUnlockProgressDialog.getWindow().setType( 212b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mSimUnlockProgressDialog; 215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 217b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private Dialog getSimRemainingAttemptsDialog(int remaining) { 218b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String msg = getPinPasswordErrorMessage(remaining); 219b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (mRemainingAttemptsDialog == null) { 220b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville Builder builder = new AlertDialog.Builder(mContext); 221b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setMessage(msg); 222b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setCancelable(false); 223b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setNeutralButton(R.string.ok, null); 224b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog = builder.create(); 225b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.getWindow().setType( 226b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 227b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 228b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.setMessage(msg); 229b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 230b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return mRemainingAttemptsDialog; 231b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 232b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 23353149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler @Override 23453149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler protected void verifyPasswordAndUnlock() { 2354e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek String entry = mPasswordEntry.getText(); 2367d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 23753149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler if (entry.length() < 4) { 238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // otherwise, display a message to the user, and don't submit. 2390a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen mSecurityMessageDisplay.setMessage(R.string.kg_invalid_sim_pin_hint, true); 2404e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek resetPasswordText(true); 241b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mCallback.userActivity(); 242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return; 243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller getSimUnlockProgressDialog().show(); 246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 2474fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller if (mCheckSimPinThread == null) { 24852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mCheckSimPinThread = new CheckSimPin(mPasswordEntry.getText(), mSubId) { 249b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville void onSimCheckResponse(final int result, final int attemptsRemaining) { 2504b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller post(new Runnable() { 2514b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller public void run() { 2524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (mSimUnlockProgressDialog != null) { 2534b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimUnlockProgressDialog.hide(); 2544b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 25552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller resetPasswordText(true /* animate */); 256b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_RESULT_SUCCESS) { 25752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(getContext()) 25852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .reportSimUnlocked(mSubId); 2594b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.dismiss(true); 2604b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 261b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { 262b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining <= 2) { 263b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // this is getting critical - show dialog 264b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getSimRemainingAttemptsDialog(attemptsRemaining).show(); 265b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 266b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // show message 267b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage( 268b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getPinPasswordErrorMessage(attemptsRemaining), true); 269b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 270b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 271b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // "PIN operation failed!" - no idea what this was and no way to 272b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // find out. :/ 273b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage(getContext().getString( 274b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville R.string.kg_password_pin_failed), true); 275b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 276b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock " 277b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " CheckSimPin.onSimCheckResponse: " + result 278b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining); 2794b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 280b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mCallback.userActivity(); 2814fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPinThread = null; 282dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2834b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }); 2844b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 2854fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller }; 2864fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPinThread.start(); 2874b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 288dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 289c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi 290c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi @Override 291c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi public void startAppearAnimation() { 292c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi // noop. 293c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi } 29476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 29576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi @Override 29676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi public boolean startDisappearAnimation(Runnable finishRunnable) { 29776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return false; 29876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 299dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller} 30053149e69e9e70af0e2db4a6223bf4d6a7d01a1acDaniel Sandler 301