blob: c5d940c9950f0c14fd0614c801b4d705aab2bb79 [file] [log] [blame]
Jim Millerdcb3d842012-08-23 19:18:12 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Jim Millerdcb3d842012-08-23 19:18:12 -070016
Jim Miller5ecd8112013-01-09 18:50:26 -080017package com.android.keyguard;
18
Jim Miller5ecd8112013-01-09 18:50:26 -080019import android.content.Context;
Jim Miller52a61332014-11-12 19:29:51 -080020import android.content.res.Resources;
Jim Millerdcb3d842012-08-23 19:18:12 -070021import android.app.Activity;
Wink Savilleb896b9f2013-10-23 15:44:26 -070022import android.app.AlertDialog;
Jim Millerdcb3d842012-08-23 19:18:12 -070023import android.app.Dialog;
24import android.app.ProgressDialog;
Jim Millerdcb3d842012-08-23 19:18:12 -070025import android.os.RemoteException;
26import android.os.ServiceManager;
Jim Miller52a61332014-11-12 19:29:51 -080027import android.telephony.SubscriptionInfo;
28import android.telephony.SubscriptionManager;
29import android.telephony.TelephonyManager;
Jim Millerdcb3d842012-08-23 19:18:12 -070030import android.util.AttributeSet;
Wink Savilleb896b9f2013-10-23 15:44:26 -070031import android.util.Log;
Jim Millerdcb3d842012-08-23 19:18:12 -070032import android.view.WindowManager;
Jim Millerdcb3d842012-08-23 19:18:12 -070033
Wink Savilleb896b9f2013-10-23 15:44:26 -070034import com.android.internal.telephony.ITelephony;
Jim Miller52a61332014-11-12 19:29:51 -080035import com.android.internal.telephony.IccCardConstants;
Wink Savilleb896b9f2013-10-23 15:44:26 -070036import com.android.internal.telephony.PhoneConstants;
Jim Miller52a61332014-11-12 19:29:51 -080037import com.android.internal.telephony.IccCardConstants.State;
Wink Savilleb896b9f2013-10-23 15:44:26 -070038
39
Daniel Sandler23d7a6e2012-11-02 00:21:07 -040040/**
41 * Displays a PIN pad for entering a PUK (Pin Unlock Kode) provided by a carrier.
42 */
Selim Cinek4e8b9ed2014-06-20 16:37:04 -070043public class KeyguardSimPukView extends KeyguardPinBasedInputView {
Wink Savilleb896b9f2013-10-23 15:44:26 -070044 private static final String LOG_TAG = "KeyguardSimPukView";
Jorim Jaggi5cf17872014-03-26 18:31:48 +010045 private static final boolean DEBUG = KeyguardConstants.DEBUG;
Jim Miller4fc2b012013-11-04 16:47:48 -080046 public static final String TAG = "KeyguardSimPukView";
Jim Millerdcb3d842012-08-23 19:18:12 -070047
48 private ProgressDialog mSimUnlockProgressDialog = null;
Jim Miller4fc2b012013-11-04 16:47:48 -080049 private CheckSimPuk mCheckSimPukThread;
Jim Miller3efe1062012-09-28 16:59:31 -070050 private String mPukText;
Jim Miller3efe1062012-09-28 16:59:31 -070051 private String mPinText;
52 private StateMachine mStateMachine = new StateMachine();
Wink Savilleb896b9f2013-10-23 15:44:26 -070053 private AlertDialog mRemainingAttemptsDialog;
Jim Miller52a61332014-11-12 19:29:51 -080054 private int mSubId;
55
56 KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() {
57 @Override
58 public void onSimStateChanged(int subId, int slotId, State simState) {
59 if (DEBUG) Log.v(TAG, "onSimStateChanged(subId=" + subId + ",state=" + simState + ")");
60 resetState();
61 };
62 };
63
64 public KeyguardSimPukView(Context context) {
65 this(context, null);
66 }
67
68 public KeyguardSimPukView(Context context, AttributeSet attrs) {
69 super(context, attrs);
70 }
Jim Miller3efe1062012-09-28 16:59:31 -070071
72 private class StateMachine {
73 final int ENTER_PUK = 0;
74 final int ENTER_PIN = 1;
75 final int CONFIRM_PIN = 2;
76 final int DONE = 3;
77 private int state = ENTER_PUK;
78
79 public void next() {
80 int msg = 0;
81 if (state == ENTER_PUK) {
82 if (checkPuk()) {
83 state = ENTER_PIN;
84 msg = R.string.kg_puk_enter_pin_hint;
85 } else {
86 msg = R.string.kg_invalid_sim_puk_hint;
87 }
88 } else if (state == ENTER_PIN) {
89 if (checkPin()) {
90 state = CONFIRM_PIN;
91 msg = R.string.kg_enter_confirm_pin_hint;
92 } else {
93 msg = R.string.kg_invalid_sim_pin_hint;
94 }
95 } else if (state == CONFIRM_PIN) {
96 if (confirmPin()) {
97 state = DONE;
Jim Miller5ecd8112013-01-09 18:50:26 -080098 msg = R.string.keyguard_sim_unlock_progress_dialog_message;
Jim Miller3efe1062012-09-28 16:59:31 -070099 updateSim();
100 } else {
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400101 state = ENTER_PIN; // try again?
Jim Miller3efe1062012-09-28 16:59:31 -0700102 msg = R.string.kg_invalid_confirm_pin_hint;
103 }
104 }
Selim Cinek4e8b9ed2014-06-20 16:37:04 -0700105 resetPasswordText(true);
Jim Miller3efe1062012-09-28 16:59:31 -0700106 if (msg != 0) {
Adam Cohen0a4f9002012-10-12 19:57:16 -0700107 mSecurityMessageDisplay.setMessage(msg, true);
Jim Miller3efe1062012-09-28 16:59:31 -0700108 }
109 }
110
111 void reset() {
112 mPinText="";
113 mPukText="";
114 state = ENTER_PUK;
Jim Miller52a61332014-11-12 19:29:51 -0800115 KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
116 mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED);
117 if (mSubId != SubscriptionManager.INVALID_SUB_ID) {
118 int count = TelephonyManager.getDefault().getSimCount();
119 Resources rez = getResources();
120 final String msg;
121 if (count < 2) {
122 msg = rez.getString(R.string.kg_puk_enter_puk_hint);
123 } else {
124 SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId);
125 CharSequence displayName = info != null ? info.getDisplayName() : "";
126 msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName);
127 }
128 mSecurityMessageDisplay.setMessage(msg, true);
129 }
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400130 mPasswordEntry.requestFocus();
Jim Miller3efe1062012-09-28 16:59:31 -0700131 }
132 }
133
Wink Savilleb896b9f2013-10-23 15:44:26 -0700134 private String getPukPasswordErrorMessage(int attemptsRemaining) {
135 String displayMessage;
136
137 if (attemptsRemaining == 0) {
138 displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead);
139 } else if (attemptsRemaining > 0) {
140 displayMessage = getContext().getResources()
141 .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining,
142 attemptsRemaining);
143 } else {
144 displayMessage = getContext().getString(R.string.kg_password_puk_failed);
145 }
146 if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:"
147 + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
148 return displayMessage;
149 }
150
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400151 public void resetState() {
Selim Cinek4e8b9ed2014-06-20 16:37:04 -0700152 super.resetState();
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400153 mStateMachine.reset();
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400154 }
155
156 @Override
Jim Miller7d5e00a2013-10-11 22:45:57 -0700157 protected boolean shouldLockout(long deadline) {
158 // SIM PUK doesn't have a timed lockout
159 return false;
160 }
161
162 @Override
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400163 protected int getPasswordTextViewId() {
Jorim Jaggifa9189f2014-04-17 20:17:30 +0200164 return R.id.pukEntry;
Jim Millerdcb3d842012-08-23 19:18:12 -0700165 }
166
167 @Override
168 protected void onFinishInflate() {
169 super.onFinishInflate();
Jim Miller0b728242012-10-28 19:42:30 -0700170
Jim Miller0b728242012-10-28 19:42:30 -0700171 mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default
Jorim Jaggi40a0b382014-05-27 21:12:27 +0200172 if (mEcaView instanceof EmergencyCarrierArea) {
173 ((EmergencyCarrierArea) mEcaView).setCarrierTextVisible(true);
174 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700175 }
176
Adam Cohen6fb841f2012-10-24 13:15:38 -0700177 @Override
Jim Miller52a61332014-11-12 19:29:51 -0800178 protected void onAttachedToWindow() {
179 super.onAttachedToWindow();
180 KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
181 }
182
183 @Override
184 protected void onDetachedFromWindow() {
185 super.onDetachedFromWindow();
186 KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
187 }
188
189 @Override
Adam Cohen6fb841f2012-10-24 13:15:38 -0700190 public void showUsabilityHint() {
191 }
192
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400193 @Override
194 public void onPause() {
Jim Millerdcb3d842012-08-23 19:18:12 -0700195 // dismiss the dialog.
196 if (mSimUnlockProgressDialog != null) {
197 mSimUnlockProgressDialog.dismiss();
198 mSimUnlockProgressDialog = null;
199 }
200 }
201
202 /**
203 * Since the IPC can block, we want to run the request in a separate thread
204 * with a callback.
205 */
206 private abstract class CheckSimPuk extends Thread {
207
208 private final String mPin, mPuk;
Jim Miller52a61332014-11-12 19:29:51 -0800209 private final int mSubId;
Jim Millerdcb3d842012-08-23 19:18:12 -0700210
Jim Miller52a61332014-11-12 19:29:51 -0800211 protected CheckSimPuk(String puk, String pin, int subId) {
Jim Millerdcb3d842012-08-23 19:18:12 -0700212 mPuk = puk;
213 mPin = pin;
Jim Miller52a61332014-11-12 19:29:51 -0800214 mSubId = subId;
Jim Millerdcb3d842012-08-23 19:18:12 -0700215 }
216
Wink Savilleb896b9f2013-10-23 15:44:26 -0700217 abstract void onSimLockChangedResponse(final int result, final int attemptsRemaining);
Jim Millerdcb3d842012-08-23 19:18:12 -0700218
219 @Override
220 public void run() {
221 try {
Jim Miller52a61332014-11-12 19:29:51 -0800222 if (DEBUG) Log.v(TAG, "call supplyPukReportResult()");
Wink Savilleb896b9f2013-10-23 15:44:26 -0700223 final int[] result = ITelephony.Stub.asInterface(ServiceManager
Jim Miller52a61332014-11-12 19:29:51 -0800224 .checkService("phone")).supplyPukReportResultForSubscriber(mSubId, mPuk, mPin);
225 if (DEBUG) {
226 Log.v(TAG, "supplyPukReportResult returned: " + result[0] + " " + result[1]);
227 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700228 post(new Runnable() {
229 public void run() {
Wink Savilleb896b9f2013-10-23 15:44:26 -0700230 onSimLockChangedResponse(result[0], result[1]);
Jim Millerdcb3d842012-08-23 19:18:12 -0700231 }
232 });
233 } catch (RemoteException e) {
Jim Miller4fc2b012013-11-04 16:47:48 -0800234 Log.e(TAG, "RemoteException for supplyPukReportResult:", e);
Jim Millerdcb3d842012-08-23 19:18:12 -0700235 post(new Runnable() {
236 public void run() {
Wink Savilleb896b9f2013-10-23 15:44:26 -0700237 onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
Jim Millerdcb3d842012-08-23 19:18:12 -0700238 }
239 });
240 }
241 }
242 }
243
Jim Millerdcb3d842012-08-23 19:18:12 -0700244 private Dialog getSimUnlockProgressDialog() {
245 if (mSimUnlockProgressDialog == null) {
246 mSimUnlockProgressDialog = new ProgressDialog(mContext);
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400247 mSimUnlockProgressDialog.setMessage(
248 mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
Jim Millerdcb3d842012-08-23 19:18:12 -0700249 mSimUnlockProgressDialog.setIndeterminate(true);
250 mSimUnlockProgressDialog.setCancelable(false);
251 if (!(mContext instanceof Activity)) {
252 mSimUnlockProgressDialog.getWindow().setType(
253 WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
254 }
255 }
256 return mSimUnlockProgressDialog;
257 }
258
Wink Savilleb896b9f2013-10-23 15:44:26 -0700259 private Dialog getPukRemainingAttemptsDialog(int remaining) {
260 String msg = getPukPasswordErrorMessage(remaining);
261 if (mRemainingAttemptsDialog == null) {
262 AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
263 builder.setMessage(msg);
264 builder.setCancelable(false);
265 builder.setNeutralButton(R.string.ok, null);
266 mRemainingAttemptsDialog = builder.create();
267 mRemainingAttemptsDialog.getWindow().setType(
268 WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
269 } else {
270 mRemainingAttemptsDialog.setMessage(msg);
271 }
272 return mRemainingAttemptsDialog;
273 }
274
Jim Miller3efe1062012-09-28 16:59:31 -0700275 private boolean checkPuk() {
Jim Millerdcb3d842012-08-23 19:18:12 -0700276 // make sure the puk is at least 8 digits long.
Rakesh Pallerlab8b7bd32014-01-08 15:49:34 +0530277 if (mPasswordEntry.getText().length() == 8) {
Selim Cinek4e8b9ed2014-06-20 16:37:04 -0700278 mPukText = mPasswordEntry.getText();
Jim Miller3efe1062012-09-28 16:59:31 -0700279 return true;
Jim Millerdcb3d842012-08-23 19:18:12 -0700280 }
Jim Miller3efe1062012-09-28 16:59:31 -0700281 return false;
282 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700283
Jim Miller3efe1062012-09-28 16:59:31 -0700284 private boolean checkPin() {
Jim Millerdcb3d842012-08-23 19:18:12 -0700285 // make sure the PIN is between 4 and 8 digits
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400286 int length = mPasswordEntry.getText().length();
Jim Miller3efe1062012-09-28 16:59:31 -0700287 if (length >= 4 && length <= 8) {
Selim Cinek4e8b9ed2014-06-20 16:37:04 -0700288 mPinText = mPasswordEntry.getText();
Jim Miller3efe1062012-09-28 16:59:31 -0700289 return true;
Jim Millerdcb3d842012-08-23 19:18:12 -0700290 }
Jim Miller3efe1062012-09-28 16:59:31 -0700291 return false;
292 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700293
Jim Miller3efe1062012-09-28 16:59:31 -0700294 public boolean confirmPin() {
Selim Cinek4e8b9ed2014-06-20 16:37:04 -0700295 return mPinText.equals(mPasswordEntry.getText());
Jim Miller3efe1062012-09-28 16:59:31 -0700296 }
297
298 private void updateSim() {
Jim Millerdcb3d842012-08-23 19:18:12 -0700299 getSimUnlockProgressDialog().show();
300
Jim Miller4fc2b012013-11-04 16:47:48 -0800301 if (mCheckSimPukThread == null) {
Jim Miller52a61332014-11-12 19:29:51 -0800302 mCheckSimPukThread = new CheckSimPuk(mPukText, mPinText, mSubId) {
Wink Savilleb896b9f2013-10-23 15:44:26 -0700303 void onSimLockChangedResponse(final int result, final int attemptsRemaining) {
Jim Miller3efe1062012-09-28 16:59:31 -0700304 post(new Runnable() {
Jim Miller4b09dd32012-09-04 14:27:25 -0700305 public void run() {
306 if (mSimUnlockProgressDialog != null) {
307 mSimUnlockProgressDialog.hide();
308 }
Jim Miller52a61332014-11-12 19:29:51 -0800309 resetPasswordText(true /* animate */);
Wink Savilleb896b9f2013-10-23 15:44:26 -0700310 if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
Jim Miller52a61332014-11-12 19:29:51 -0800311 KeyguardUpdateMonitor.getInstance(getContext())
312 .reportSimUnlocked(mSubId);
Jim Miller4b09dd32012-09-04 14:27:25 -0700313 mCallback.dismiss(true);
314 } else {
Wink Savilleb896b9f2013-10-23 15:44:26 -0700315 if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
316 if (attemptsRemaining <= 2) {
317 // this is getting critical - show dialog
318 getPukRemainingAttemptsDialog(attemptsRemaining).show();
319 } else {
320 // show message
321 mSecurityMessageDisplay.setMessage(
322 getPukPasswordErrorMessage(attemptsRemaining), true);
323 }
324 } else {
325 mSecurityMessageDisplay.setMessage(getContext().getString(
326 R.string.kg_password_puk_failed), true);
327 }
328 if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
329 + " UpdateSim.onSimCheckResponse: "
330 + " attemptsRemaining=" + attemptsRemaining);
Jim Miller3efe1062012-09-28 16:59:31 -0700331 mStateMachine.reset();
Jim Miller4b09dd32012-09-04 14:27:25 -0700332 }
Jim Miller4fc2b012013-11-04 16:47:48 -0800333 mCheckSimPukThread = null;
Jim Millerdcb3d842012-08-23 19:18:12 -0700334 }
Jim Miller4b09dd32012-09-04 14:27:25 -0700335 });
336 }
Jim Miller4fc2b012013-11-04 16:47:48 -0800337 };
338 mCheckSimPukThread.start();
Jim Miller4b09dd32012-09-04 14:27:25 -0700339 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700340 }
341
342 @Override
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400343 protected void verifyPasswordAndUnlock() {
344 mStateMachine.next();
Jim Miller9cf2c522012-10-04 22:02:29 -0700345 }
Jorim Jaggic14f8292014-05-27 02:25:45 +0200346
347 @Override
348 public void startAppearAnimation() {
349 // noop.
350 }
Jorim Jaggi76a16232014-08-08 17:00:47 +0200351
352 @Override
353 public boolean startDisappearAnimation(Runnable finishRunnable) {
354 return false;
355 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700356}
Daniel Sandler23d7a6e2012-11-02 00:21:07 -0400357
358