Loading packages/SystemUI/res-keyguard/values/strings.xml +16 −0 Original line number Original line Diff line number Diff line Loading @@ -367,4 +367,20 @@ <!-- Fingerprint hint message when finger was not recognized.--> <!-- Fingerprint hint message when finger was not recognized.--> <string name="fingerprint_not_recognized">Not recognized</string> <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> </resources> packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +81 −31 Original line number Original line Diff line number Diff line Loading @@ -53,8 +53,13 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPin mCheckSimPinThread; 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 AlertDialog mRemainingAttemptsDialog; private int mSubId; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImageView mSimImageView; private ImageView mSimImageView; KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { Loading Loading @@ -91,10 +96,24 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { public void resetState() { public void resetState() { super.resetState(); super.resetState(); if (DEBUG) Log.v(TAG, "Resetting state"); if (DEBUG) Log.v(TAG, "Resetting state"); KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); handleSubInfoChangeIfNeeded(); mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); if (mShowDefaultMessage) { showDefaultMessage(); } boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); 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); boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); if (SubscriptionManager.isValidSubscriptionId(mSubId)) { int count = TelephonyManager.getDefault().getSimCount(); int count = TelephonyManager.getDefault().getSimCount(); Resources rez = getResources(); Resources rez = getResources(); String msg; String msg; Loading @@ -102,21 +121,44 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (count < 2) { if (count < 2) { msg = rez.getString(R.string.kg_sim_pin_instructions); msg = rez.getString(R.string.kg_sim_pin_instructions); } else { } else { SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext). getSubscriptionInfoForSubId(mSubId); CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); if (info != null) { if (info != null) { color = info.getIconTint(); color = info.getIconTint(); } } } } if (isEsimLocked) { if (isEsimLocked) { msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); } } mSecurityMessageDisplay.setMessage(msg); mSecurityMessageDisplay.setMessage(msg); mSimImageView.setImageTintList(ColorStateList.valueOf(color)); 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)); } } }.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 @Override Loading @@ -131,17 +173,19 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { return 0; return 0; } } private String getPinPasswordErrorMessage(int attemptsRemaining) { private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; String displayMessage; int msgId; if (attemptsRemaining == 0) { if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); } else if (attemptsRemaining > 0) { } else if (attemptsRemaining > 0) { msgId = isDefault ? R.plurals.kg_password_default_pin_message : R.plurals.kg_password_wrong_pin_code; displayMessage = getContext().getResources() displayMessage = getContext().getResources() .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, .getQuantityString(msgId, attemptsRemaining, attemptsRemaining); attemptsRemaining); } else { } 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:" if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); Loading Loading @@ -252,7 +296,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } } private Dialog getSimRemainingAttemptsDialog(int remaining) { private Dialog getSimRemainingAttemptsDialog(int remaining) { String msg = getPinPasswordErrorMessage(remaining); String msg = getPinPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { if (mRemainingAttemptsDialog == null) { Builder builder = new AlertDialog.Builder(mContext); Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); builder.setMessage(msg); Loading Loading @@ -288,6 +332,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { post(new Runnable() { post(new Runnable() { @Override @Override public void run() { public void run() { mRemainingAttempts = attemptsRemaining; if (mSimUnlockProgressDialog != null) { if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); mSimUnlockProgressDialog.hide(); } } Loading @@ -296,8 +341,13 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); .reportSimUnlocked(mSubId); mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); } } else { } else { mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (attemptsRemaining <= 2) { if (attemptsRemaining <= 2) { // this is getting critical - show dialog // this is getting critical - show dialog Loading @@ -305,7 +355,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } else { } else { // show message // show message mSecurityMessageDisplay.setMessage( mSecurityMessageDisplay.setMessage( getPinPasswordErrorMessage(attemptsRemaining)); getPinPasswordErrorMessage(attemptsRemaining, false)); } } } else { } else { // "PIN operation failed!" - no idea what this was and no way to // "PIN operation failed!" - no idea what this was and no way to Loading packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +85 −31 Original line number Original line Diff line number Diff line Loading @@ -52,11 +52,17 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPuk mCheckSimPukThread; 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 mPukText; private String mPinText; private String mPinText; private StateMachine mStateMachine = new StateMachine(); private StateMachine mStateMachine = new StateMachine(); private AlertDialog mRemainingAttemptsDialog; private AlertDialog mRemainingAttemptsDialog; private int mSubId; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImageView mSimImageView; private ImageView mSimImageView; KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { Loading Loading @@ -132,14 +138,33 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } } } void reset() { void reset() { mPinText=""; mPinText=""; mPukText=""; mPukText=""; state = ENTER_PUK; state = ENTER_PUK; KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); handleSubInfoChangeIfNeeded(); mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED); 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(); } } private void showDefaultMessage() { if (mRemainingAttempts >= 0) { mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( mRemainingAttempts, true)); return; } boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); if (SubscriptionManager.isValidSubscriptionId(mSubId)) { int count = TelephonyManager.getDefault().getSimCount(); int count = TelephonyManager.getDefault().getSimCount(); Resources rez = getResources(); Resources rez = getResources(); String msg; String msg; Loading @@ -147,7 +172,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (count < 2) { if (count < 2) { msg = rez.getString(R.string.kg_puk_enter_puk_hint); msg = rez.getString(R.string.kg_puk_enter_puk_hint); } else { } else { SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext). getSubscriptionInfoForSubId(mSubId); CharSequence displayName = info != null ? info.getDisplayName() : ""; CharSequence displayName = info != null ? info.getDisplayName() : ""; msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); if (info != null) { if (info != null) { Loading @@ -159,13 +185,29 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } mSecurityMessageDisplay.setMessage(msg); mSecurityMessageDisplay.setMessage(msg); mSimImageView.setImageTintList(ColorStateList.valueOf(color)); 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)); } } KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area); } esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE); }.start(); mPasswordEntry.requestFocus(); } } 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 @Override Loading @@ -174,17 +216,20 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { return 0; return 0; } } private String getPukPasswordErrorMessage(int attemptsRemaining) { private String getPukPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; String displayMessage; if (attemptsRemaining == 0) { if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); } else if (attemptsRemaining > 0) { } else if (attemptsRemaining > 0) { int msgId = isDefault ? R.plurals.kg_password_default_puk_message : R.plurals.kg_password_wrong_puk_code; displayMessage = getContext().getResources() displayMessage = getContext().getResources() .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining, .getQuantityString(msgId, attemptsRemaining, attemptsRemaining); attemptsRemaining); } else { } 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:" if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); Loading Loading @@ -303,7 +348,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } private Dialog getPukRemainingAttemptsDialog(int remaining) { private Dialog getPukRemainingAttemptsDialog(int remaining) { String msg = getPukPasswordErrorMessage(remaining); String msg = getPukPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { if (mRemainingAttemptsDialog == null) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); builder.setMessage(msg); Loading Loading @@ -359,16 +404,25 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); .reportSimUnlocked(mSubId); mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); } } else { } else { mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { // show message mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( attemptsRemaining, false)); if (attemptsRemaining <= 2) { if (attemptsRemaining <= 2) { // this is getting critical - show dialog // this is getting critical - show dialog getPukRemainingAttemptsDialog(attemptsRemaining).show(); getPukRemainingAttemptsDialog(attemptsRemaining).show(); } else { } else { // show message // show message mSecurityMessageDisplay.setMessage( mSecurityMessageDisplay.setMessage( getPukPasswordErrorMessage(attemptsRemaining)); getPukPasswordErrorMessage( attemptsRemaining, false)); } } } else { } else { mSecurityMessageDisplay.setMessage(getContext().getString( mSecurityMessageDisplay.setMessage(getContext().getString( Loading Loading
packages/SystemUI/res-keyguard/values/strings.xml +16 −0 Original line number Original line Diff line number Diff line Loading @@ -367,4 +367,20 @@ <!-- Fingerprint hint message when finger was not recognized.--> <!-- Fingerprint hint message when finger was not recognized.--> <string name="fingerprint_not_recognized">Not recognized</string> <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> </resources>
packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +81 −31 Original line number Original line Diff line number Diff line Loading @@ -53,8 +53,13 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPin mCheckSimPinThread; 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 AlertDialog mRemainingAttemptsDialog; private int mSubId; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImageView mSimImageView; private ImageView mSimImageView; KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { Loading Loading @@ -91,10 +96,24 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { public void resetState() { public void resetState() { super.resetState(); super.resetState(); if (DEBUG) Log.v(TAG, "Resetting state"); if (DEBUG) Log.v(TAG, "Resetting state"); KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); handleSubInfoChangeIfNeeded(); mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); if (mShowDefaultMessage) { showDefaultMessage(); } boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); 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); boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); if (SubscriptionManager.isValidSubscriptionId(mSubId)) { int count = TelephonyManager.getDefault().getSimCount(); int count = TelephonyManager.getDefault().getSimCount(); Resources rez = getResources(); Resources rez = getResources(); String msg; String msg; Loading @@ -102,21 +121,44 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (count < 2) { if (count < 2) { msg = rez.getString(R.string.kg_sim_pin_instructions); msg = rez.getString(R.string.kg_sim_pin_instructions); } else { } else { SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext). getSubscriptionInfoForSubId(mSubId); CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); if (info != null) { if (info != null) { color = info.getIconTint(); color = info.getIconTint(); } } } } if (isEsimLocked) { if (isEsimLocked) { msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); msg = msg + " " + rez.getString(R.string.kg_sim_lock_instructions_esim); } } mSecurityMessageDisplay.setMessage(msg); mSecurityMessageDisplay.setMessage(msg); mSimImageView.setImageTintList(ColorStateList.valueOf(color)); 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)); } } }.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 @Override Loading @@ -131,17 +173,19 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { return 0; return 0; } } private String getPinPasswordErrorMessage(int attemptsRemaining) { private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; String displayMessage; int msgId; if (attemptsRemaining == 0) { if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); } else if (attemptsRemaining > 0) { } else if (attemptsRemaining > 0) { msgId = isDefault ? R.plurals.kg_password_default_pin_message : R.plurals.kg_password_wrong_pin_code; displayMessage = getContext().getResources() displayMessage = getContext().getResources() .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, .getQuantityString(msgId, attemptsRemaining, attemptsRemaining); attemptsRemaining); } else { } 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:" if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); Loading Loading @@ -252,7 +296,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } } private Dialog getSimRemainingAttemptsDialog(int remaining) { private Dialog getSimRemainingAttemptsDialog(int remaining) { String msg = getPinPasswordErrorMessage(remaining); String msg = getPinPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { if (mRemainingAttemptsDialog == null) { Builder builder = new AlertDialog.Builder(mContext); Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); builder.setMessage(msg); Loading Loading @@ -288,6 +332,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { post(new Runnable() { post(new Runnable() { @Override @Override public void run() { public void run() { mRemainingAttempts = attemptsRemaining; if (mSimUnlockProgressDialog != null) { if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); mSimUnlockProgressDialog.hide(); } } Loading @@ -296,8 +341,13 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); .reportSimUnlocked(mSubId); mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); } } else { } else { mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (attemptsRemaining <= 2) { if (attemptsRemaining <= 2) { // this is getting critical - show dialog // this is getting critical - show dialog Loading @@ -305,7 +355,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } else { } else { // show message // show message mSecurityMessageDisplay.setMessage( mSecurityMessageDisplay.setMessage( getPinPasswordErrorMessage(attemptsRemaining)); getPinPasswordErrorMessage(attemptsRemaining, false)); } } } else { } else { // "PIN operation failed!" - no idea what this was and no way to // "PIN operation failed!" - no idea what this was and no way to Loading
packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +85 −31 Original line number Original line Diff line number Diff line Loading @@ -52,11 +52,17 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPuk mCheckSimPukThread; 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 mPukText; private String mPinText; private String mPinText; private StateMachine mStateMachine = new StateMachine(); private StateMachine mStateMachine = new StateMachine(); private AlertDialog mRemainingAttemptsDialog; private AlertDialog mRemainingAttemptsDialog; private int mSubId; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private ImageView mSimImageView; private ImageView mSimImageView; KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { Loading Loading @@ -132,14 +138,33 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } } } void reset() { void reset() { mPinText=""; mPinText=""; mPukText=""; mPukText=""; state = ENTER_PUK; state = ENTER_PUK; KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); handleSubInfoChangeIfNeeded(); mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED); 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(); } } private void showDefaultMessage() { if (mRemainingAttempts >= 0) { mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( mRemainingAttempts, true)); return; } boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); boolean isEsimLocked = KeyguardEsimArea.isEsimLocked(mContext, mSubId); if (SubscriptionManager.isValidSubscriptionId(mSubId)) { int count = TelephonyManager.getDefault().getSimCount(); int count = TelephonyManager.getDefault().getSimCount(); Resources rez = getResources(); Resources rez = getResources(); String msg; String msg; Loading @@ -147,7 +172,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (count < 2) { if (count < 2) { msg = rez.getString(R.string.kg_puk_enter_puk_hint); msg = rez.getString(R.string.kg_puk_enter_puk_hint); } else { } else { SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext). getSubscriptionInfoForSubId(mSubId); CharSequence displayName = info != null ? info.getDisplayName() : ""; CharSequence displayName = info != null ? info.getDisplayName() : ""; msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); if (info != null) { if (info != null) { Loading @@ -159,13 +185,29 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } mSecurityMessageDisplay.setMessage(msg); mSecurityMessageDisplay.setMessage(msg); mSimImageView.setImageTintList(ColorStateList.valueOf(color)); 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)); } } KeyguardEsimArea esimButton = findViewById(R.id.keyguard_esim_area); } esimButton.setVisibility(isEsimLocked ? View.VISIBLE : View.GONE); }.start(); mPasswordEntry.requestFocus(); } } 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 @Override Loading @@ -174,17 +216,20 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { return 0; return 0; } } private String getPukPasswordErrorMessage(int attemptsRemaining) { private String getPukPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; String displayMessage; if (attemptsRemaining == 0) { if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); } else if (attemptsRemaining > 0) { } else if (attemptsRemaining > 0) { int msgId = isDefault ? R.plurals.kg_password_default_puk_message : R.plurals.kg_password_wrong_puk_code; displayMessage = getContext().getResources() displayMessage = getContext().getResources() .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining, .getQuantityString(msgId, attemptsRemaining, attemptsRemaining); attemptsRemaining); } else { } 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:" if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); Loading Loading @@ -303,7 +348,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } } private Dialog getPukRemainingAttemptsDialog(int remaining) { private Dialog getPukRemainingAttemptsDialog(int remaining) { String msg = getPukPasswordErrorMessage(remaining); String msg = getPukPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { if (mRemainingAttemptsDialog == null) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); builder.setMessage(msg); Loading Loading @@ -359,16 +404,25 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); .reportSimUnlocked(mSubId); mRemainingAttempts = -1; mShowDefaultMessage = true; if (mCallback != null) { mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); mCallback.dismiss(true, KeyguardUpdateMonitor.getCurrentUser()); } } else { } else { mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { // show message mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( attemptsRemaining, false)); if (attemptsRemaining <= 2) { if (attemptsRemaining <= 2) { // this is getting critical - show dialog // this is getting critical - show dialog getPukRemainingAttemptsDialog(attemptsRemaining).show(); getPukRemainingAttemptsDialog(attemptsRemaining).show(); } else { } else { // show message // show message mSecurityMessageDisplay.setMessage( mSecurityMessageDisplay.setMessage( getPukPasswordErrorMessage(attemptsRemaining)); getPukPasswordErrorMessage( attemptsRemaining, false)); } } } else { } else { mSecurityMessageDisplay.setMessage(getContext().getString( mSecurityMessageDisplay.setMessage(getContext().getString( Loading