summaryrefslogtreecommitdiffstats
path: root/packages/Keyguard
diff options
context:
space:
mode:
authorWink Saville <wink@google.com>2013-10-25 09:43:00 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-10-25 09:43:00 -0700
commit4bc356506429cd85773ee0b36be2a99bffe71584 (patch)
treefcf13faf7f9c27b20bea6e4f30a0b6071a055555 /packages/Keyguard
parent625eb8bf9ed5c7d8ca09508f720c512af353b039 (diff)
parent604cfc2de963c17ed53fef745b93e3afcfd5a5f8 (diff)
downloadframeworks_base-4bc356506429cd85773ee0b36be2a99bffe71584.zip
frameworks_base-4bc356506429cd85773ee0b36be2a99bffe71584.tar.gz
frameworks_base-4bc356506429cd85773ee0b36be2a99bffe71584.tar.bz2
am 604cfc2d: Merge "Enhance pin/puk support" into klp-dev
* commit '604cfc2de963c17ed53fef745b93e3afcfd5a5f8': Enhance pin/puk support
Diffstat (limited to 'packages/Keyguard')
-rw-r--r--packages/Keyguard/res/values/strings.xml36
-rw-r--r--packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java87
-rw-r--r--packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java77
3 files changed, 170 insertions, 30 deletions
diff --git a/packages/Keyguard/res/values/strings.xml b/packages/Keyguard/res/values/strings.xml
index abc4483..4738049 100644
--- a/packages/Keyguard/res/values/strings.xml
+++ b/packages/Keyguard/res/values/strings.xml
@@ -24,12 +24,12 @@
<!-- Instructions telling the user to enter their SIM PUK to unlock the keyguard.
Displayed in one line in a large font. -->
- <string name="keyguard_password_enter_puk_code">Type PUK and new PIN code</string>
+ <string name="keyguard_password_enter_puk_code">Type SIM PUK and new PIN code</string>
<!-- Prompt to enter SIM PUK in Edit Text Box in unlock screen -->
- <string name="keyguard_password_enter_puk_prompt">PUK code</string>
+ <string name="keyguard_password_enter_puk_prompt">SIM PUK code</string>
<!-- Prompt to enter New SIM PIN in Edit Text Box in unlock screen -->
- <string name="keyguard_password_enter_pin_prompt">New PIN code</string>
+ <string name="keyguard_password_enter_pin_prompt">New SIM PIN code</string>
<!-- Displayed as hint in passwordEntry EditText on PasswordUnlockScreen [CHAR LIMIT=30]-->
<string name="keyguard_password_entry_touch_hint"><font size="17">Touch to type password</font></string>
@@ -249,8 +249,6 @@
<string name="kg_enter_confirm_pin_hint">Confirm desired PIN code</string>
<!-- Message shown in dialog while the device is unlocking the SIM card -->
<string name="kg_sim_unlock_progress_dialog_message">Unlocking SIM card\u2026</string>
- <!-- Message shown when the user enters the wrong PIN code -->
- <string name="kg_password_wrong_pin_code">Incorrect PIN code.</string>
<!-- Message shown when the user enters an invalid SIM pin password in PUK screen -->
<string name="kg_invalid_sim_pin_hint">Type a PIN that is 4 to 8 numbers.</string>
<!-- Message shown when the user enters an invalid PUK code in the PUK screen -->
@@ -333,6 +331,34 @@
<!-- The delete-widget drop target button text -->
<string name="kg_reordering_delete_drop_target_text">Remove</string>
+ <!-- Instructions telling the user that they entered the wrong SIM PIN for the last time.
+ Displayed in a dialog box. -->
+ <string name="kg_password_wrong_pin_code_pukked">Incorrect SIM PIN code you must now contact your carrier to unlock your device.</string>
+ <!-- Instructions telling the user that they entered the wrong SIM PIN while trying
+ to unlock the keyguard. Displayed in a dialog box. -->
+ <plurals name="kg_password_wrong_pin_code">
+ <item quantity="one">Incorrect SIM PIN code, you have <xliff:g id="number">%d</xliff:g> remaining attempt before you must contact your carrier to unlock your device.</item>
+ <item quantity="other">Incorrect SIM PIN code, you have <xliff:g id="number">%d</xliff:g> remaining attempts.</item>
+ </plurals>
+
+ <!-- Instructions telling the user that they have exhausted SIM PUK retries and the SIM is now unusable.
+ Displayed in a dialog box. -->
+ <string name="kg_password_wrong_puk_code_dead">SIM is unusable. Contact your carrier.</string>
+ <!-- Instructions telling the user that they entered the wrong puk while trying
+ to unlock the keyguard. Displayed in a dialog box. -->
+ <plurals name="kg_password_wrong_puk_code">
+ <item quantity="one">Incorrect SIM PUK code, you have <xliff:g id="number">%d</xliff:g> remaining attempt before SIM becomes permanently unusable.</item>
+ <item quantity="other">Incorrect SIM PUK code, you have <xliff:g id="number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
+ </plurals>
+ <!-- Instructions telling the user that the operation to unlock the keyguard
+ with SIM PIN failed. Displayed in one line in a large font. -->
+ <string name="kg_password_pin_failed">SIM PIN operation failed!</string>
+ <!-- Instructions telling the user that the operation to unlock the keyguard
+ with PUK failed. Displayed in one line in a large font. -->
+ <string name="kg_password_puk_failed">SIM PUK operation failed!</string>
+ <!-- Notification telling the user that the PIN1 they entered is valid -->
+ <string name="kg_pin_accepted">Code Accepted!</string>
+
<!-- Transport control strings -->
<!-- Shown on transport control of lockscreen. Pressing button goes to previous track. -->
<string name="keyguard_transport_prev_description">Previous track button</string>
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java
index 5059407..e39622a 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java
@@ -17,11 +17,16 @@
package com.android.keyguard;
import com.android.internal.telephony.ITelephony;
+import com.android.internal.telephony.PhoneConstants;
import android.content.Context;
+import android.content.DialogInterface;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.ProgressDialog;
+import android.os.Message;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.Editable;
@@ -30,6 +35,7 @@ import android.text.TextWatcher;
import android.text.method.DigitsKeyListener;
import android.util.AttributeSet;
import android.view.View;
+import android.util.Log;
import android.view.WindowManager;
import android.widget.TextView.OnEditorActionListener;
@@ -38,10 +44,14 @@ import android.widget.TextView.OnEditorActionListener;
*/
public class KeyguardSimPinView extends KeyguardAbsKeyInputView
implements KeyguardSecurityView, OnEditorActionListener, TextWatcher {
+ private static final String LOG_TAG = "KeyguardSimPinView";
+ private static final boolean DEBUG = KeyguardViewMediator.DEBUG;
private ProgressDialog mSimUnlockProgressDialog = null;
private volatile boolean mSimCheckInProgress;
+ private AlertDialog mRemainingAttemptsDialog;
+
public KeyguardSimPinView(Context context) {
this(context, null);
}
@@ -55,6 +65,23 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView
mPasswordEntry.setEnabled(true);
}
+ private String getPinPasswordErrorMessage(int attemptsRemaining) {
+ String displayMessage;
+
+ if (attemptsRemaining == 0) {
+ displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);
+ } else if (attemptsRemaining > 0) {
+ displayMessage = getContext().getResources()
+ .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining,
+ attemptsRemaining);
+ } else {
+ displayMessage = getContext().getString(R.string.kg_password_pin_failed);
+ }
+ if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"
+ + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
+ return displayMessage;
+ }
+
@Override
protected boolean shouldLockout(long deadline) {
// SIM PIN doesn't have a timed lockout
@@ -109,6 +136,8 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView
| InputType.TYPE_NUMBER_VARIATION_PASSWORD);
mPasswordEntry.requestFocus();
+
+ mSecurityMessageDisplay.setTimeout(0); // don't show ownerinfo/charging status by default
}
@Override
@@ -135,22 +164,22 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView
mPin = pin;
}
- abstract void onSimCheckResponse(boolean success);
+ abstract void onSimCheckResponse(final int result, final int attemptsRemaining);
@Override
public void run() {
try {
- final boolean result = ITelephony.Stub.asInterface(ServiceManager
- .checkService("phone")).supplyPin(mPin);
+ final int[] result = ITelephony.Stub.asInterface(ServiceManager
+ .checkService("phone")).supplyPinReportResult(mPin);
post(new Runnable() {
public void run() {
- onSimCheckResponse(result);
+ onSimCheckResponse(result[0], result[1]);
}
});
} catch (RemoteException e) {
post(new Runnable() {
public void run() {
- onSimCheckResponse(false);
+ onSimCheckResponse(PhoneConstants.PIN_GENERAL_FAILURE, -1);
}
});
}
@@ -164,14 +193,28 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView
mContext.getString(R.string.kg_sim_unlock_progress_dialog_message));
mSimUnlockProgressDialog.setIndeterminate(true);
mSimUnlockProgressDialog.setCancelable(false);
- if (!(mContext instanceof Activity)) {
- mSimUnlockProgressDialog.getWindow().setType(
- WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
- }
+ mSimUnlockProgressDialog.getWindow().setType(
+ WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
}
return mSimUnlockProgressDialog;
}
+ private Dialog getSimRemainingAttemptsDialog(int remaining) {
+ String msg = getPinPasswordErrorMessage(remaining);
+ if (mRemainingAttemptsDialog == null) {
+ 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;
+ }
+
@Override
protected void verifyPasswordAndUnlock() {
String entry = mPasswordEntry.getText().toString();
@@ -189,20 +232,34 @@ public class KeyguardSimPinView extends KeyguardAbsKeyInputView
if (!mSimCheckInProgress) {
mSimCheckInProgress = true; // there should be only one
new CheckSimPin(mPasswordEntry.getText().toString()) {
- void onSimCheckResponse(final boolean success) {
+ void onSimCheckResponse(final int result, final int attemptsRemaining) {
post(new Runnable() {
public void run() {
if (mSimUnlockProgressDialog != null) {
mSimUnlockProgressDialog.hide();
}
- if (success) {
- // before closing the keyguard, report back that the sim is unlocked
- // so it knows right away.
+ if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
KeyguardUpdateMonitor.getInstance(getContext()).reportSimUnlocked();
mCallback.dismiss(true);
} else {
- mSecurityMessageDisplay.setMessage
- (R.string.kg_password_wrong_pin_code, true);
+ if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) {
+ if (attemptsRemaining <= 2) {
+ // this is getting critical - show dialog
+ getSimRemainingAttemptsDialog(attemptsRemaining).show();
+ } else {
+ // show message
+ mSecurityMessageDisplay.setMessage(
+ getPinPasswordErrorMessage(attemptsRemaining), true);
+ }
+ } else {
+ // "PIN operation failed!" - no idea what this was and no way to
+ // find out. :/
+ mSecurityMessageDisplay.setMessage(getContext().getString(
+ R.string.kg_password_pin_failed), true);
+ }
+ if (DEBUG) Log.d(LOG_TAG, "verifyPasswordAndUnlock "
+ + " CheckSimPin.onSimCheckResponse: " + result
+ + " attemptsRemaining=" + attemptsRemaining);
mPasswordEntry.setText("");
}
mCallback.userActivity(0);
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.InputType;
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 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView
}
}
+ 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 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView
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 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView
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 @@ public class KeyguardSimPukView extends KeyguardAbsKeyInputView
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;
}