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; 185ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller 195ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerimport android.content.Context; 20d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.content.res.ColorStateList; 2152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.content.res.Resources; 22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Activity; 23b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.app.AlertDialog; 24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.Dialog; 25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.app.ProgressDialog; 26d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.graphics.Color; 27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.RemoteException; 28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.ServiceManager; 2952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionInfo; 3052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.SubscriptionManager; 3152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport android.telephony.TelephonyManager; 32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 33b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport android.util.Log; 34dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.WindowManager; 35d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggiimport android.widget.ImageView; 36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 37b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport com.android.internal.telephony.ITelephony; 3852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants; 39b896b9f74225d61af67c2661f44eceadb9e22013Wink Savilleimport com.android.internal.telephony.PhoneConstants; 4052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Millerimport com.android.internal.telephony.IccCardConstants.State; 41b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 42b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 4323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler/** 4423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler * Displays a PIN pad for entering a PUK (Pin Unlock Kode) provided by a carrier. 4523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler */ 464e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinekpublic class KeyguardSimPukView extends KeyguardPinBasedInputView { 47b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private static final String LOG_TAG = "KeyguardSimPukView"; 485cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static final boolean DEBUG = KeyguardConstants.DEBUG; 494fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller public static final String TAG = "KeyguardSimPukView"; 50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private ProgressDialog mSimUnlockProgressDialog = null; 524fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller private CheckSimPuk mCheckSimPukThread; 533efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private String mPukText; 543efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private String mPinText; 553efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private StateMachine mStateMachine = new StateMachine(); 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) { 6352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")"); 6452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller resetState(); 6552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller }; 6652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller }; 6752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 6852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller public KeyguardSimPukView(Context context) { 6952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller this(context, null); 7052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 7152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 7252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller public KeyguardSimPukView(Context context, AttributeSet attrs) { 7352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super(context, attrs); 7452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 753efe106264262924a9218268d3c7d19d272fb7a2Jim Miller 763efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private class StateMachine { 773efe106264262924a9218268d3c7d19d272fb7a2Jim Miller final int ENTER_PUK = 0; 783efe106264262924a9218268d3c7d19d272fb7a2Jim Miller final int ENTER_PIN = 1; 793efe106264262924a9218268d3c7d19d272fb7a2Jim Miller final int CONFIRM_PIN = 2; 803efe106264262924a9218268d3c7d19d272fb7a2Jim Miller final int DONE = 3; 813efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private int state = ENTER_PUK; 823efe106264262924a9218268d3c7d19d272fb7a2Jim Miller 833efe106264262924a9218268d3c7d19d272fb7a2Jim Miller public void next() { 843efe106264262924a9218268d3c7d19d272fb7a2Jim Miller int msg = 0; 853efe106264262924a9218268d3c7d19d272fb7a2Jim Miller if (state == ENTER_PUK) { 863efe106264262924a9218268d3c7d19d272fb7a2Jim Miller if (checkPuk()) { 873efe106264262924a9218268d3c7d19d272fb7a2Jim Miller state = ENTER_PIN; 883efe106264262924a9218268d3c7d19d272fb7a2Jim Miller msg = R.string.kg_puk_enter_pin_hint; 893efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } else { 903efe106264262924a9218268d3c7d19d272fb7a2Jim Miller msg = R.string.kg_invalid_sim_puk_hint; 913efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 923efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } else if (state == ENTER_PIN) { 933efe106264262924a9218268d3c7d19d272fb7a2Jim Miller if (checkPin()) { 943efe106264262924a9218268d3c7d19d272fb7a2Jim Miller state = CONFIRM_PIN; 953efe106264262924a9218268d3c7d19d272fb7a2Jim Miller msg = R.string.kg_enter_confirm_pin_hint; 963efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } else { 973efe106264262924a9218268d3c7d19d272fb7a2Jim Miller msg = R.string.kg_invalid_sim_pin_hint; 983efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 993efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } else if (state == CONFIRM_PIN) { 1003efe106264262924a9218268d3c7d19d272fb7a2Jim Miller if (confirmPin()) { 1013efe106264262924a9218268d3c7d19d272fb7a2Jim Miller state = DONE; 1025ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller msg = R.string.keyguard_sim_unlock_progress_dialog_message; 1033efe106264262924a9218268d3c7d19d272fb7a2Jim Miller updateSim(); 1043efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } else { 10523d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler state = ENTER_PIN; // try again? 1063efe106264262924a9218268d3c7d19d272fb7a2Jim Miller msg = R.string.kg_invalid_confirm_pin_hint; 1073efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 1083efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 1094e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek resetPasswordText(true); 1103efe106264262924a9218268d3c7d19d272fb7a2Jim Miller if (msg != 0) { 1110a4f900463024908220d0c9bf4b291a6e1284846Adam Cohen mSecurityMessageDisplay.setMessage(msg, true); 1123efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 1133efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 1143efe106264262924a9218268d3c7d19d272fb7a2Jim Miller 1153efe106264262924a9218268d3c7d19d272fb7a2Jim Miller void reset() { 1163efe106264262924a9218268d3c7d19d272fb7a2Jim Miller mPinText=""; 1173efe106264262924a9218268d3c7d19d272fb7a2Jim Miller mPukText=""; 1183efe106264262924a9218268d3c7d19d272fb7a2Jim Miller state = ENTER_PUK; 11952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 12052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED); 121a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville if (SubscriptionManager.isValidSubscriptionId(mSubId)) { 12252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller int count = TelephonyManager.getDefault().getSimCount(); 12352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Resources rez = getResources(); 12452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller final String msg; 125d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi int color = Color.WHITE; 12652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (count < 2) { 12752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller msg = rez.getString(R.string.kg_puk_enter_puk_hint); 12852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } else { 12952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); 13052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller CharSequence displayName = info != null ? info.getDisplayName() : ""; 13152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); 132d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi if (info != null) { 133d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi color = info.getIconTint(); 134d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi } 13552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 13652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSecurityMessageDisplay.setMessage(msg, true); 137d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi mSimImageView.setImageTintList(ColorStateList.valueOf(color)); 13852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 13923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mPasswordEntry.requestFocus(); 1403efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 1413efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 1423efe106264262924a9218268d3c7d19d272fb7a2Jim Miller 1433122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek @Override 1443122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek protected int getPromtReasonStringRes(int reason) { 1453122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek // No message on SIM Puk 1463122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek return 0; 1473122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 1483122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek 149b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private String getPukPasswordErrorMessage(int attemptsRemaining) { 150b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String displayMessage; 151b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 152b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining == 0) { 153b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); 154b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else if (attemptsRemaining > 0) { 155b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getResources() 156b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining, 157b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville attemptsRemaining); 158b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 159b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_puk_failed); 160b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 161b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:" 162b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); 163b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return displayMessage; 164b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 165b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 16623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler public void resetState() { 1674e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek super.resetState(); 16823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mStateMachine.reset(); 169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 1727d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller protected boolean shouldLockout(long deadline) { 1737d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller // SIM PUK doesn't have a timed lockout 1747d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller return false; 1757d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller } 1767d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 1777d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller @Override 17823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler protected int getPasswordTextViewId() { 179fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi return R.id.pukEntry; 180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 18323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler protected void onFinishInflate() { 18423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler super.onFinishInflate(); 185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 18623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default 18740a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi if (mEcaView instanceof EmergencyCarrierArea) { 18840a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true); 18940a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi } 190d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi mSimImageView = (ImageView) findViewById(R.id.keyguard_sim); 191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1936fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 19452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onAttachedToWindow() { 19552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onAttachedToWindow(); 19652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); 19752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 19852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 19952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 20052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onDetachedFromWindow() { 20152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onDetachedFromWindow(); 20252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback); 20352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 20452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 20552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 2066fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 2076fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 2086fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 20923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler @Override 21023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler public void onPause() { 211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // dismiss the dialog. 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog != null) { 213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.dismiss(); 214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = null; 215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 219dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Since the IPC can block, we want to run the request in a separate thread 220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * with a callback. 221dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private abstract class CheckSimPuk extends Thread { 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final String mPin, mPuk; 22552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private final int mSubId; 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 22752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected CheckSimPuk(String puk, String pin, int subId) { 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPuk = puk; 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPin = pin; 23052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSubId = subId; 231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 233b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville abstract void onSimLockChangedResponse(final int result, final int attemptsRemaining); 234dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 235dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 236dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 237dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 23852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) Log.v(TAG, "call supplyPukReportResult()"); 239b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville final int[] result = ITelephony.Stub.asInterface(ServiceManager 24052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .checkService("phone")).supplyPukReportResultForSubscriber(mSubId, mPuk, mPin); 24152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) { 24252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Log.v(TAG, "supplyPukReportResult returned: " + result[0] + " " + result[1]); 24352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 244dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 246b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimLockChangedResponse(result[0], result[1]); 247dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 248dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 249dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (RemoteException e) { 2504fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller Log.e(TAG, "RemoteException for supplyPukReportResult:", e); 251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 253b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); 254dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 255dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 256dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 257dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 258dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 259dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Dialog getSimUnlockProgressDialog() { 261dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog == null) { 262dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = new ProgressDialog(mContext); 26323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mSimUnlockProgressDialog.setMessage( 26423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); 265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setIndeterminate(true); 266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setCancelable(false); 267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (!(mContext instanceof Activity)) { 268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.getWindow().setType( 269dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 270dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 271dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 272dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mSimUnlockProgressDialog; 273dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 274dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 275b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private Dialog getPukRemainingAttemptsDialog(int remaining) { 276b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String msg = getPukPasswordErrorMessage(remaining); 277b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (mRemainingAttemptsDialog == null) { 278b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 279b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setMessage(msg); 280b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setCancelable(false); 281b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setNeutralButton(R.string.ok, null); 282b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog = builder.create(); 283b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.getWindow().setType( 284b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 285b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 286b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.setMessage(msg); 287b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 288b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return mRemainingAttemptsDialog; 289b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 290b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 2913efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private boolean checkPuk() { 292dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // make sure the puk is at least 8 digits long. 293b8b7bd3185d5cf6c266ee40e74b515f526e18761Rakesh Pallerla if (mPasswordEntry.getText().length() == 8) { 2944e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek mPukText = mPasswordEntry.getText(); 2953efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return true; 296dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2973efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return false; 2983efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 299dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3003efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private boolean checkPin() { 301dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // make sure the PIN is between 4 and 8 digits 30223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler int length = mPasswordEntry.getText().length(); 3033efe106264262924a9218268d3c7d19d272fb7a2Jim Miller if (length >= 4 && length <= 8) { 3044e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek mPinText = mPasswordEntry.getText(); 3053efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return true; 306dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 3073efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return false; 3083efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3103efe106264262924a9218268d3c7d19d272fb7a2Jim Miller public boolean confirmPin() { 3114e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek return mPinText.equals(mPasswordEntry.getText()); 3123efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 3133efe106264262924a9218268d3c7d19d272fb7a2Jim Miller 3143efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private void updateSim() { 315dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller getSimUnlockProgressDialog().show(); 316dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3174fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller if (mCheckSimPukThread == null) { 31852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mCheckSimPukThread = new CheckSimPuk(mPukText, mPinText, mSubId) { 319b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville void onSimLockChangedResponse(final int result, final int attemptsRemaining) { 3203efe106264262924a9218268d3c7d19d272fb7a2Jim Miller post(new Runnable() { 3214b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller public void run() { 3224b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (mSimUnlockProgressDialog != null) { 3234b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimUnlockProgressDialog.hide(); 3244b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 32552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller resetPasswordText(true /* animate */); 326b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_RESULT_SUCCESS) { 32752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(getContext()) 32852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .reportSimUnlocked(mSubId); 3294b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.dismiss(true); 3304b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 331b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { 332b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining <= 2) { 333b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // this is getting critical - show dialog 334b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getPukRemainingAttemptsDialog(attemptsRemaining).show(); 335b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 336b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // show message 337b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage( 338b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getPukPasswordErrorMessage(attemptsRemaining), true); 339b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 340b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 341b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage(getContext().getString( 342b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville R.string.kg_password_puk_failed), true); 343b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 344b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock " 345b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " UpdateSim.onSimCheckResponse: " 346b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining); 3473efe106264262924a9218268d3c7d19d272fb7a2Jim Miller mStateMachine.reset(); 3484b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 3494fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPukThread = null; 350dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 3514b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }); 3524b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 3534fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller }; 3544fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPukThread.start(); 3554b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 356dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 357dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 358dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 35923d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler protected void verifyPasswordAndUnlock() { 36023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mStateMachine.next(); 3619cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller } 362c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi 363c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi @Override 364c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi public void startAppearAnimation() { 365c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi // noop. 366c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi } 36776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 36876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi @Override 36976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi public boolean startDisappearAnimation(Runnable finishRunnable) { 37076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return false; 37176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 37223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler} 3739cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller 3749cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller 375