diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6871f0daef0..40d20603037 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1948,6 +1948,19 @@
Cancel
+
+ Incorrect SIM PIN code you must now contact your carrier to unlock your device.
+
+
+ - Incorrect SIM PIN code, you have %d remaining attempt before you must contact your carrier to unlock your device.
+ - Incorrect SIM PIN code, you have %d remaining attempts.
+
+
+ SIM PIN operation failed!
+
Tablet status
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index ab125875d52..b988572b7b7 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -29,6 +29,7 @@ import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
+import android.util.Log;
import android.widget.Toast;
import com.android.internal.telephony.Phone;
@@ -46,6 +47,8 @@ import com.android.internal.telephony.TelephonyIntents;
*/
public class IccLockSettings extends PreferenceActivity
implements EditPinPreference.OnPinEnteredListener {
+ private static final String TAG = "IccLockSettings";
+ private static final boolean DBG = true;
private static final int OFF_MODE = 0;
// State when enabling/disabling ICC lock
@@ -101,10 +104,10 @@ public class IccLockSettings extends PreferenceActivity
AsyncResult ar = (AsyncResult) msg.obj;
switch (msg.what) {
case MSG_ENABLE_ICC_PIN_COMPLETE:
- iccLockChanged(ar.exception == null);
+ iccLockChanged(ar.exception == null, msg.arg1);
break;
case MSG_CHANGE_ICC_PIN_COMPLETE:
- iccPinChanged(ar.exception == null);
+ iccPinChanged(ar.exception == null, msg.arg1);
break;
case MSG_SIM_STATE_CHANGED:
updatePreferences();
@@ -352,21 +355,21 @@ public class IccLockSettings extends PreferenceActivity
mPinToggle.setEnabled(false);
}
- private void iccLockChanged(boolean success) {
+ private void iccLockChanged(boolean success, int attemptsRemaining) {
if (success) {
mPinToggle.setChecked(mToState);
} else {
- Toast.makeText(this, mRes.getString(R.string.sim_lock_failed), Toast.LENGTH_SHORT)
+ Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining), Toast.LENGTH_LONG)
.show();
}
mPinToggle.setEnabled(true);
resetDialogState();
}
- private void iccPinChanged(boolean success) {
+ private void iccPinChanged(boolean success, int attemptsRemaining) {
if (!success) {
- Toast.makeText(this, mRes.getString(R.string.sim_change_failed),
- Toast.LENGTH_SHORT)
+ Toast.makeText(this, getPinPasswordErrorMessage(attemptsRemaining),
+ Toast.LENGTH_LONG)
.show();
} else {
Toast.makeText(this, mRes.getString(R.string.sim_change_succeeded),
@@ -383,6 +386,23 @@ public class IccLockSettings extends PreferenceActivity
mNewPin, callback);
}
+ private String getPinPasswordErrorMessage(int attemptsRemaining) {
+ String displayMessage;
+
+ if (attemptsRemaining == 0) {
+ displayMessage = mRes.getString(R.string.wrong_pin_code_pukked);
+ } else if (attemptsRemaining > 0) {
+ displayMessage = mRes
+ .getQuantityString(R.plurals.wrong_pin_code, attemptsRemaining,
+ attemptsRemaining);
+ } else {
+ displayMessage = mRes.getString(R.string.pin_failed);
+ }
+ if (DBG) Log.d(TAG, "getPinPasswordErrorMessage:"
+ + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);
+ return displayMessage;
+ }
+
private boolean reasonablePin(String pin) {
if (pin == null || pin.length() < MIN_PIN_LENGTH || pin.length() > MAX_PIN_LENGTH) {
return false;