diff options
| author | 2017-12-07 23:17:11 +0000 | |
|---|---|---|
| committer | 2017-12-07 23:17:11 +0000 | |
| commit | e3ab43eefe7221683c9e83b4f9af6f30e313d61a (patch) | |
| tree | 3b55b23d7cde991e828ceee0253733a0d50993fe | |
| parent | 0d3990b2355be95af95b8f96eec812b8fa8bc81d (diff) | |
| parent | 118e574ea448d6414f98b06efb6946ffebe3fc99 (diff) | |
Merge "Fix available/remaining PIN/PUK attempts."
3 files changed, 182 insertions, 62 deletions
diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index cb23cf35c66b..cbcbf2d64adc 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -364,4 +364,20 @@ <!-- Fingerprint hint message when finger was not recognized.--> <string name="fingerprint_not_recognized">Not recognized</string> + <!-- Instructions telling the user remaining times when enter SIM PIN view. --> + <plurals name="kg_password_default_pin_message"> + <item quantity="one">Enter SIM PIN, 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">Enter SIM PIN, you have <xliff:g id="number">%d</xliff:g> remaining +attempts.</item> + </plurals> + + <!-- Instructions telling the user remaining times when enter SIM PUK view. --> + <plurals name="kg_password_default_puk_message"> + <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id=" +number">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact carrier for details.</item> + <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id=" +number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact carrier for details.</item> + </plurals> + </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index 432b4061b5d0..6e0b56e25a3f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -53,8 +53,13 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPin mCheckSimPinThread; + // Below flag is set to true during power-up or when a new SIM card inserted on device. + // When this is true and when SIM card is PIN locked state, on PIN lock screen, message would + // be displayed to inform user about the number of remaining PIN attempts left. + private boolean mShowDefaultMessage = true; + private int mRemainingAttempts = -1; private AlertDialog mRemainingAttemptsDialog; - private int mSubId; + private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImageView mSimImageView; KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @@ -91,32 +96,69 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { public void resetState() { super.resetState(); if (DEBUG) Log.v(TAG, "Resetting state"); - KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); - mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); + handleSubInfoChangeIfNeeded(); + if (mShowDefaultMessage) { + showDefaultMessage(); + } boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); - if (SubscriptionManager.isValidSubscriptionId(mSubId)) { - int count = TelephonyManager.getDefault().getSimCount(); - Resources rez = getResources(); - String msg; - int color = Color.WHITE; - if (count < 2) { - msg = rez.getString(R.string.kg_sim_pin_instructions); - } else { - SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); - CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash - msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); - if (info != null) { - color = info.getIconTint(); - } + + KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area); + esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE); + } + + private void showDefaultMessage() { + if (mRemainingAttempts >= 0) { + mSecurityMessageDisplay.setMessage(getPinPasswordErrorMessage( + mRemainingAttempts, true)); + return; + } + + boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); + int count = TelephonyManager.getDefault().getSimCount(); + Resources rez = getResources(); + String msg; + int color = Color.WHITE; + if (count < 2) { + msg = rez.getString(R.string.kg_sim_pin_instructions); + } else { + SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext). + getSubscriptionInfoForSubId(mSubId); + CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash + msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); + if (info != null) { + color = info.getIconTint(); } - if (isEsimLocked) { - msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); + } + + if (isEsimLocked) { + msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); + } + + mSecurityMessageDisplay.setMessage(msg); + mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + + // Sending empty PIN here to query the number of remaining PIN attempts + new CheckSimPin("", mSubId) { + void onSimCheckResponse(final int result, final int attemptsRemaining) { + Log.d(LOG_TAG, "onSimCheckResponse " + " dummy One result" + result + + " attemptsRemaining=" + attemptsRemaining); + if (attemptsRemaining >= 0) { + mRemainingAttempts = attemptsRemaining; + mSecurityMessageDisplay.setMessage( + getPinPasswordErrorMessage(attemptsRemaining, true)); + } } - mSecurityMessageDisplay.setMessage(msg); - mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + }.start(); + } + + private void handleSubInfoChangeIfNeeded() { + KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); + int subId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); + if (subId != mSubId && SubscriptionManager.isValidSubscriptionId(subId)) { + mSubId = subId; + mShowDefaultMessage = true; + mRemainingAttempts = -1; } - KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area); - esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE); } @Override @@ -131,17 +173,19 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { return 0; } - private String getPinPasswordErrorMessage(int attemptsRemaining) { + private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; - + int msgId; if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); } else if (attemptsRemaining > 0) { + msgId = isDefault ? R.plurals.kg_password_default_pin_message : + R.plurals.kg_password_wrong_pin_code; displayMessage = getContext().getResources() - .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, - attemptsRemaining); + .getQuantityString(msgId, attemptsRemaining, attemptsRemaining); } else { - displayMessage = getContext().getString(R.string.kg_password_pin_failed); + msgId = isDefault ? R.string.kg_sim_pin_instructions : R.string.kg_password_pin_failed; + displayMessage = getContext().getString(msgId); } if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); @@ -252,7 +296,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } private Dialog getSimRemainingAttemptsDialog(int remaining) { - String msg = getPinPasswordErrorMessage(remaining); + String msg = getPinPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); @@ -288,6 +332,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { post(new Runnable() { @Override public void run() { + mRemainingAttempts = attemptsRemaining; if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); } @@ -296,8 +341,13 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); - mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + mRemainingAttempts = -1; + mShowDefaultMessage = true; + if (mCallback != null) { + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + } } else { + mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (attemptsRemaining <= 2) { // this is getting critical - show dialog @@ -305,7 +355,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } else { // show message mSecurityMessageDisplay.setMessage( - getPinPasswordErrorMessage(attemptsRemaining)); + getPinPasswordErrorMessage(attemptsRemaining, false)); } } else { // "PIN operation failed!" - no idea what this was and no way to diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java index 7f79008b7c91..876d170e08cd 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java @@ -52,11 +52,17 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPuk mCheckSimPukThread; + + // Below flag is set to true during power-up or when a new SIM card inserted on device. + // When this is true and when SIM card is PUK locked state, on PIN lock screen, message would + // be displayed to inform user about the number of remaining PUK attempts left. + private boolean mShowDefaultMessage = true; + private int mRemainingAttempts = -1; private String mPukText; private String mPinText; private StateMachine mStateMachine = new StateMachine(); private AlertDialog mRemainingAttemptsDialog; - private int mSubId; + private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImageView mSimImageView; KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @@ -132,34 +138,17 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } + void reset() { mPinText=""; mPukText=""; state = ENTER_PUK; - KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); - mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED); - boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); - if (SubscriptionManager.isValidSubscriptionId(mSubId)) { - int count = TelephonyManager.getDefault().getSimCount(); - Resources rez = getResources(); - String msg; - int color = Color.WHITE; - if (count < 2) { - msg = rez.getString(R.string.kg_puk_enter_puk_hint); - } else { - SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); - CharSequence displayName = info != null ? info.getDisplayName() : ""; - msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); - if (info != null) { - color = info.getIconTint(); - } - } - if (isEsimLocked) { - msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); - } - mSecurityMessageDisplay.setMessage(msg); - mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + handleSubInfoChangeIfNeeded(); + if (mShowDefaultMessage) { + showDefaultMessage(); } + boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); + KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area); esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE); mPasswordEntry.requestFocus(); @@ -168,23 +157,79 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } + private void showDefaultMessage() { + if (mRemainingAttempts >= 0) { + mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( + mRemainingAttempts, true)); + return; + } + + boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); + int count = TelephonyManager.getDefault().getSimCount(); + Resources rez = getResources(); + String msg; + int color = Color.WHITE; + if (count < 2) { + msg = rez.getString(R.string.kg_puk_enter_puk_hint); + } else { + SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext). + getSubscriptionInfoForSubId(mSubId); + CharSequence displayName = info != null ? info.getDisplayName() : ""; + msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); + if (info != null) { + color = info.getIconTint(); + } + } + if (isEsimLocked) { + msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); + } + mSecurityMessageDisplay.setMessage(msg); + mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + + // Sending empty PUK here to query the number of remaining PIN attempts + new CheckSimPuk("", "", mSubId) { + void onSimLockChangedResponse(final int result, final int attemptsRemaining) { + Log.d(LOG_TAG, "onSimCheckResponse " + " dummy One result" + result + + " attemptsRemaining=" + attemptsRemaining); + if (attemptsRemaining >= 0) { + mRemainingAttempts = attemptsRemaining; + mSecurityMessageDisplay.setMessage( + getPukPasswordErrorMessage(attemptsRemaining, true)); + } + } + }.start(); + } + + private void handleSubInfoChangeIfNeeded() { + KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); + int subId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED); + if (subId != mSubId && SubscriptionManager.isValidSubscriptionId(subId)) { + mSubId = subId; + mShowDefaultMessage = true; + mRemainingAttempts = -1; + } + } + @Override protected int getPromtReasonStringRes(int reason) { // No message on SIM Puk return 0; } - private String getPukPasswordErrorMessage(int attemptsRemaining) { + private String getPukPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); } else if (attemptsRemaining > 0) { + int msgId = isDefault ? R.plurals.kg_password_default_puk_message : + R.plurals.kg_password_wrong_puk_code; displayMessage = getContext().getResources() - .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining, - attemptsRemaining); + .getQuantityString(msgId, attemptsRemaining, attemptsRemaining); } else { - displayMessage = getContext().getString(R.string.kg_password_puk_failed); + int msgId = isDefault ? R.string.kg_puk_enter_puk_hint : + R.string.kg_password_puk_failed; + displayMessage = getContext().getString(msgId); } if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); @@ -303,7 +348,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } private Dialog getPukRemainingAttemptsDialog(int remaining) { - String msg = getPukPasswordErrorMessage(remaining); + String msg = getPukPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); @@ -359,16 +404,25 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); - mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + mRemainingAttempts = -1; + mShowDefaultMessage = true; + if (mCallback != null) { + mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); + } } else { + mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { + // show message + mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( + attemptsRemaining, false)); if (attemptsRemaining <= 2) { // this is getting critical - show dialog getPukRemainingAttemptsDialog(attemptsRemaining).show(); } else { // show message mSecurityMessageDisplay.setMessage( - getPukPasswordErrorMessage(attemptsRemaining)); + getPukPasswordErrorMessage( + attemptsRemaining, false)); } } else { mSecurityMessageDisplay.setMessage(getContext().getString( |