Enhance pin/puk support
Add supplyPinReportResult & supplyPukReportResult that
returns the result code and attempts remaining.
Display "Attempts remaining" in Keyguard
Bug: 9928717
Change-Id: Ibad0635dd1375fabce11ba2b7b9f95f8868489e6
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java
index 2ae4cc7..31518a1 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java
@@ -16,10 +16,10 @@
package com.android.keyguard;
-import com.android.internal.telephony.ITelephony;
-
import android.content.Context;
+import android.animation.AnimatorSet.Builder;
import android.app.Activity;
+import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.RemoteException;
@@ -29,21 +29,29 @@
import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView.OnEditorActionListener;
+import com.android.internal.telephony.ITelephony;
+import com.android.internal.telephony.PhoneConstants;
+
+
/**
* Displays a PIN pad for entering a PUK (Pin Unlock Kode) provided by a carrier.
*/
public class KeyguardSimPukView extends KeyguardAbsKeyInputView
implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {
+ private static final String LOG_TAG = "KeyguardSimPukView";
+ private static final boolean DEBUG = KeyguardViewMediator.DEBUG;
private ProgressDialog mSimUnlockProgressDialog = null;
private volatile boolean mCheckInProgress;
private String mPukText;
private String mPinText;
private StateMachine mStateMachine = new StateMachine();
+ private AlertDialog mRemainingAttemptsDialog;
private class StateMachine {
final int ENTER_PUK = 0;
@@ -93,6 +101,23 @@
}
}
+ private String getPukPasswordErrorMessage(int attemptsRemaining) {
+ String displayMessage;
+
+ if (attemptsRemaining == 0) {
+ displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead);
+ } else if (attemptsRemaining > 0) {
+ displayMessage = getContext().getResources()
+ .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining,
+ attemptsRemaining);
+ } else {
+ displayMessage = getContext().getString(R.string.kg_password_puk_failed);
+ }
+ if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:"
+ + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
+ return displayMessage;
+ }
+
public KeyguardSimPukView(Context context) {
this(context, null);
}
@@ -190,23 +215,23 @@
mPin = pin;
}
- abstract void onSimLockChangedResponse(boolean success);
+ abstract void onSimLockChangedResponse(final int result, final int attemptsRemaining);
@Override
public void run() {
try {
- final boolean result = ITelephony.Stub.asInterface(ServiceManager
- .checkService("phone")).supplyPuk(mPuk, mPin);
+ final int[] result = ITelephony.Stub.asInterface(ServiceManager
+ .checkService("phone")).supplyPukReportResult(mPuk, mPin);
post(new Runnable() {
public void run() {
- onSimLockChangedResponse(result);
+ onSimLockChangedResponse(result[0], result[1]);
}
});
} catch (RemoteException e) {
post(new Runnable() {
public void run() {
- onSimLockChangedResponse(false);
+ onSimLockChangedResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
}
});
}
@@ -228,6 +253,22 @@
return mSimUnlockProgressDialog;
}
+ private Dialog getPukRemainingAttemptsDialog(int remaining) {
+ String msg = getPukPasswordErrorMessage(remaining);
+ if (mRemainingAttemptsDialog == null) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setMessage(msg);
+ builder.setCancelable(false);
+ builder.setNeutralButton(R.string.ok, null);
+ mRemainingAttemptsDialog = builder.create();
+ mRemainingAttemptsDialog.getWindow().setType(
+ WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
+ } else {
+ mRemainingAttemptsDialog.setMessage(msg);
+ }
+ return mRemainingAttemptsDialog;
+ }
+
private boolean checkPuk() {
// make sure the puk is at least 8 digits long.
if (mPasswordEntry.getText().length() >= 8) {
@@ -257,17 +298,33 @@
if (!mCheckInProgress) {
mCheckInProgress = true;
new CheckSimPuk(mPukText, mPinText) {
- void onSimLockChangedResponse(final boolean success) {
+ void onSimLockChangedResponse(final int result, final int attemptsRemaining) {
post(new Runnable() {
public void run() {
if (mSimUnlockProgressDialog != null) {
mSimUnlockProgressDialog.hide();
}
- if (success) {
+ if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
+ KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked();
mCallback.dismiss(true);
} else {
+ if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
+ if (attemptsRemaining <= 2) {
+ // this is getting critical - show dialog
+ getPukRemainingAttemptsDialog(attemptsRemaining).show();
+ } else {
+ // show message
+ mSecurityMessageDisplay.setMessage(
+ getPukPasswordErrorMessage(attemptsRemaining), true);
+ }
+ } else {
+ mSecurityMessageDisplay.setMessage(getContext().getString(
+ R.string.kg_password_puk_failed), true);
+ }
+ if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
+ + " UpdateSim.onSimCheckResponse: "
+ + " attemptsRemaining=" + attemptsRemaining);
mStateMachine.reset();
- mSecurityMessageDisplay.setMessage(R.string.kg_invalid_puk, true);
}
mCheckInProgress = false;
}