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 143b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private String getPukPasswordErrorMessage(int attemptsRemaining) { 144b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String displayMessage; 145b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 146b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining == 0) { 147b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); 148b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else if (attemptsRemaining > 0) { 149b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getResources() 150b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining, 151b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville attemptsRemaining); 152b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 153b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville displayMessage = getContext().getString(R.string.kg_password_puk_failed); 154b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 155b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:" 156b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); 157b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return displayMessage; 158b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 159b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 16023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler public void resetState() { 1614e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek super.resetState(); 16223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mStateMachine.reset(); 163dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 1667d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller protected boolean shouldLockout(long deadline) { 1677d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller // SIM PUK doesn't have a timed lockout 1687d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller return false; 1697d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller } 1707d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller 1717d5e00ab2b5134d11e40b5a84fa363f8e8b24d68Jim Miller @Override 17223d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler protected int getPasswordTextViewId() { 173fa9189fd7425e7a097e46d54e545fbec631f9cacJorim Jaggi return R.id.pukEntry; 174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 175dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 176dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 17723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler protected void onFinishInflate() { 17823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler super.onFinishInflate(); 179dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 18023d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default 18140a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi if (mEcaView instanceof EmergencyCarrierArea) { 18240a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true); 18340a0b38160b1b80a48aa6a0d87b3fab888fd55f0Jorim Jaggi } 184d05064b8503465f9e3d6ad278cbc51deec827c69Jorim Jaggi mSimImageView = (ImageView) findViewById(R.id.keyguard_sim); 185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 186dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1876fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 18852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onAttachedToWindow() { 18952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onAttachedToWindow(); 19052a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); 19152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 19252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 19352a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 19452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected void onDetachedFromWindow() { 19552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller super.onDetachedFromWindow(); 19652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback); 19752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 19852a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller 19952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller @Override 2006fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 2016fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 2026fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 20323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler @Override 20423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler public void onPause() { 205dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // dismiss the dialog. 206dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog != null) { 207dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.dismiss(); 208dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = null; 209dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Since the IPC can block, we want to run the request in a separate thread 214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * with a callback. 215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private abstract class CheckSimPuk extends Thread { 217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private final String mPin, mPuk; 21952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller private final int mSubId; 220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 22152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller protected CheckSimPuk(String puk, String pin, int subId) { 222dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPuk = puk; 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mPin = pin; 22452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mSubId = subId; 225dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 227b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville abstract void onSimLockChangedResponse(final int result, final int attemptsRemaining); 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 229dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 231dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller try { 23252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) Log.v(TAG, "call supplyPukReportResult()"); 233b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville final int[] result = ITelephony.Stub.asInterface(ServiceManager 23452a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .checkService("phone")).supplyPukReportResultForSubscriber(mSubId, mPuk, mPin); 23552a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller if (DEBUG) { 23652a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller Log.v(TAG, "supplyPukReportResult returned: " + result[0] + " " + result[1]); 23752a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller } 238dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 239dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 240b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimLockChangedResponse(result[0], result[1]); 241dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 242dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 243dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } catch (RemoteException e) { 2444fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller Log.e(TAG, "RemoteException for supplyPukReportResult:", e); 245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller post(new Runnable() { 246dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 247b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1); 248dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 249dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }); 250dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 251dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 252dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 253dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 254dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Dialog getSimUnlockProgressDialog() { 255dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mSimUnlockProgressDialog == null) { 256dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog = new ProgressDialog(mContext); 25723d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mSimUnlockProgressDialog.setMessage( 25823d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mContext.getString(R.string.kg_sim_unlock_progress_dialog_message)); 259dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setIndeterminate(true); 260dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.setCancelable(false); 261dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (!(mContext instanceof Activity)) { 262dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mSimUnlockProgressDialog.getWindow().setType( 263dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 264dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 265dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 266dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mSimUnlockProgressDialog; 267dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 268dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 269b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville private Dialog getPukRemainingAttemptsDialog(int remaining) { 270b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville String msg = getPukPasswordErrorMessage(remaining); 271b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (mRemainingAttemptsDialog == null) { 272b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 273b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setMessage(msg); 274b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setCancelable(false); 275b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville builder.setNeutralButton(R.string.ok, null); 276b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog = builder.create(); 277b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.getWindow().setType( 278b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 279b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 280b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mRemainingAttemptsDialog.setMessage(msg); 281b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 282b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville return mRemainingAttemptsDialog; 283b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 284b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville 2853efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private boolean checkPuk() { 286dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // make sure the puk is at least 8 digits long. 287b8b7bd3185d5cf6c266ee40e74b515f526e18761Rakesh Pallerla if (mPasswordEntry.getText().length() == 8) { 2884e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek mPukText = mPasswordEntry.getText(); 2893efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return true; 290dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 2913efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return false; 2923efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 293dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 2943efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private boolean checkPin() { 295dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // make sure the PIN is between 4 and 8 digits 29623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler int length = mPasswordEntry.getText().length(); 2973efe106264262924a9218268d3c7d19d272fb7a2Jim Miller if (length >= 4 && length <= 8) { 2984e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek mPinText = mPasswordEntry.getText(); 2993efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return true; 300dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 3013efe106264262924a9218268d3c7d19d272fb7a2Jim Miller return false; 3023efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 303dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3043efe106264262924a9218268d3c7d19d272fb7a2Jim Miller public boolean confirmPin() { 3054e8b9ed30b67e5449d987e674b2966dc7f3ac224Selim Cinek return mPinText.equals(mPasswordEntry.getText()); 3063efe106264262924a9218268d3c7d19d272fb7a2Jim Miller } 3073efe106264262924a9218268d3c7d19d272fb7a2Jim Miller 3083efe106264262924a9218268d3c7d19d272fb7a2Jim Miller private void updateSim() { 309dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller getSimUnlockProgressDialog().show(); 310dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 3114fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller if (mCheckSimPukThread == null) { 31252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller mCheckSimPukThread = new CheckSimPuk(mPukText, mPinText, mSubId) { 313b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville void onSimLockChangedResponse(final int result, final int attemptsRemaining) { 3143efe106264262924a9218268d3c7d19d272fb7a2Jim Miller post(new Runnable() { 3154b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller public void run() { 3164b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller if (mSimUnlockProgressDialog != null) { 3174b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mSimUnlockProgressDialog.hide(); 3184b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 31952a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller resetPasswordText(true /* animate */); 320b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_RESULT_SUCCESS) { 32152a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller KeyguardUpdateMonitor.getInstance(getContext()) 32252a6133f4ba8b1d08f5158d802790d6a1b16568dJim Miller .reportSimUnlocked(mSubId); 3234b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller mCallback.dismiss(true); 3244b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } else { 325b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { 326b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (attemptsRemaining <= 2) { 327b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // this is getting critical - show dialog 328b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getPukRemainingAttemptsDialog(attemptsRemaining).show(); 329b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 330b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville // show message 331b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage( 332b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville getPukPasswordErrorMessage(attemptsRemaining), true); 333b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 334b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } else { 335b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville mSecurityMessageDisplay.setMessage(getContext().getString( 336b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville R.string.kg_password_puk_failed), true); 337b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville } 338b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock " 339b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " UpdateSim.onSimCheckResponse: " 340b896b9f74225d61af67c2661f44eceadb9e22013Wink Saville + " attemptsRemaining=" + attemptsRemaining); 3413efe106264262924a9218268d3c7d19d272fb7a2Jim Miller mStateMachine.reset(); 3424b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 3434fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPukThread = null; 344dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 3454b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller }); 3464b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 3474fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller }; 3484fc2b01fd0c8b6e0d4f82657d1ab2ff642a32696Jim Miller mCheckSimPukThread.start(); 3494b09dd31fb1cefcaee87e7a206f22ba31527e250Jim Miller } 350dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 351dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 352dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 35323d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler protected void verifyPasswordAndUnlock() { 35423d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler mStateMachine.next(); 3559cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller } 356c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi 357c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi @Override 358c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi public void startAppearAnimation() { 359c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi // noop. 360c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi } 36176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 36276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi @Override 36376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi public boolean startDisappearAnimation(Runnable finishRunnable) { 36476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return false; 36576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 36623d7a6e605f9c6c1c57550e1053d9e6ddd22741eDaniel Sandler} 3679cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller 3689cf2c523d82ec14632fd0db920dcc8909c0f44a5Jim Miller 369