Fix 5620754: don't show pattern screen after SIM PUK unlock
This fixes a bug where we would inadvertently show the pattern screen after PUK-unlocking the device. Could potentially happen after SIM unlock as well, but that path appears to be fast enough that it's rarely seen. The cause was not getting the SIM state change before deciding to show the Unlock screen. We now immediately invoke the callback if SIM/PUK unlock succeeds without waiting for the round-trip from the radio layer. Change-Id: I02dcb456da415b82f30f8e3abc43f788f3931b33
This commit is contained in:
@@ -110,10 +110,14 @@ public class KeyguardUpdateMonitor {
|
||||
* the intent and provide a {@link SimCard.State} result.
|
||||
*/
|
||||
private static class SimArgs {
|
||||
|
||||
public final IccCard.State simState;
|
||||
|
||||
private SimArgs(Intent intent) {
|
||||
SimArgs(IccCard.State state) {
|
||||
simState = state;
|
||||
}
|
||||
|
||||
static SimArgs fromIntent(Intent intent) {
|
||||
IccCard.State state;
|
||||
if (!TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())) {
|
||||
throw new IllegalArgumentException("only handles intent ACTION_SIM_STATE_CHANGED");
|
||||
}
|
||||
@@ -124,27 +128,28 @@ public class KeyguardUpdateMonitor {
|
||||
|
||||
if (IccCard.INTENT_VALUE_ABSENT_ON_PERM_DISABLED.equals(
|
||||
absentReason)) {
|
||||
this.simState = IccCard.State.PERM_DISABLED;
|
||||
state = IccCard.State.PERM_DISABLED;
|
||||
} else {
|
||||
this.simState = IccCard.State.ABSENT;
|
||||
state = IccCard.State.ABSENT;
|
||||
}
|
||||
} else if (IccCard.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
|
||||
this.simState = IccCard.State.READY;
|
||||
state = IccCard.State.READY;
|
||||
} else if (IccCard.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {
|
||||
final String lockedReason = intent
|
||||
.getStringExtra(IccCard.INTENT_KEY_LOCKED_REASON);
|
||||
if (IccCard.INTENT_VALUE_LOCKED_ON_PIN.equals(lockedReason)) {
|
||||
this.simState = IccCard.State.PIN_REQUIRED;
|
||||
state = IccCard.State.PIN_REQUIRED;
|
||||
} else if (IccCard.INTENT_VALUE_LOCKED_ON_PUK.equals(lockedReason)) {
|
||||
this.simState = IccCard.State.PUK_REQUIRED;
|
||||
state = IccCard.State.PUK_REQUIRED;
|
||||
} else {
|
||||
this.simState = IccCard.State.UNKNOWN;
|
||||
state = IccCard.State.UNKNOWN;
|
||||
}
|
||||
} else if (IccCard.INTENT_VALUE_LOCKED_NETWORK.equals(stateExtra)) {
|
||||
this.simState = IccCard.State.NETWORK_LOCKED;
|
||||
state = IccCard.State.NETWORK_LOCKED;
|
||||
} else {
|
||||
this.simState = IccCard.State.UNKNOWN;
|
||||
state = IccCard.State.UNKNOWN;
|
||||
}
|
||||
return new SimArgs(state);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
@@ -279,8 +284,7 @@ public class KeyguardUpdateMonitor {
|
||||
mHandler.sendMessage(msg);
|
||||
} else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) {
|
||||
mHandler.sendMessage(mHandler.obtainMessage(
|
||||
MSG_SIM_STATE_CHANGE,
|
||||
new SimArgs(intent)));
|
||||
MSG_SIM_STATE_CHANGE, SimArgs.fromIntent(intent)));
|
||||
} else if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) {
|
||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED,
|
||||
intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0));
|
||||
@@ -571,12 +575,16 @@ public class KeyguardUpdateMonitor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Report that the user succesfully entered the sim pin or puk so we
|
||||
* Report that the user successfully entered the SIM PIN or PUK/SIM PIN so we
|
||||
* have the information earlier than waiting for the intent
|
||||
* broadcast from the telephony code.
|
||||
*
|
||||
* NOTE: Because handleSimStateChange() invokes callbacks immediately without going
|
||||
* through mHandler, this *must* be called from the UI thread.
|
||||
*/
|
||||
public void reportSimUnlocked() {
|
||||
mSimState = IccCard.State.READY;
|
||||
handleSimStateChange(new SimArgs(mSimState));
|
||||
}
|
||||
|
||||
public boolean isKeyguardBypassEnabled() {
|
||||
|
||||
@@ -242,20 +242,24 @@ public class SimPukUnlockScreen extends LinearLayout implements KeyguardScreen,
|
||||
|
||||
new CheckSimPuk(mPukText.getText().toString(),
|
||||
mPinText.getText().toString()) {
|
||||
void onSimLockChangedResponse(boolean success) {
|
||||
if (mSimUnlockProgressDialog != null) {
|
||||
mSimUnlockProgressDialog.hide();
|
||||
}
|
||||
if (success) {
|
||||
// before closing the keyguard, report back that
|
||||
// the sim is unlocked so it knows right away
|
||||
mUpdateMonitor.reportSimUnlocked();
|
||||
mCallback.goToUnlockScreen();
|
||||
} else {
|
||||
mHeaderText.setText(R.string.badPuk);
|
||||
mPukText.setText("");
|
||||
mPinText.setText("");
|
||||
}
|
||||
void onSimLockChangedResponse(final boolean success) {
|
||||
mPinText.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
|
||||
mUpdateMonitor.reportSimUnlocked();
|
||||
mCallback.goToUnlockScreen();
|
||||
} else {
|
||||
mHeaderText.setText(R.string.badPuk);
|
||||
mPukText.setText("");
|
||||
mPinText.setText("");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
|
||||
@@ -214,21 +214,25 @@ public class SimUnlockScreen extends LinearLayout implements KeyguardScreen, Vie
|
||||
getSimUnlockProgressDialog().show();
|
||||
|
||||
new CheckSimPin(mPinText.getText().toString()) {
|
||||
void onSimLockChangedResponse(boolean success) {
|
||||
if (mSimUnlockProgressDialog != null) {
|
||||
mSimUnlockProgressDialog.hide();
|
||||
}
|
||||
if (success) {
|
||||
// before closing the keyguard, report back that
|
||||
// the sim is unlocked so it knows right away
|
||||
mUpdateMonitor.reportSimUnlocked();
|
||||
mCallback.goToUnlockScreen();
|
||||
} else {
|
||||
mHeaderText.setText(R.string.keyguard_password_wrong_pin_code);
|
||||
mPinText.setText("");
|
||||
mEnteredDigits = 0;
|
||||
}
|
||||
mCallback.pokeWakelock();
|
||||
void onSimLockChangedResponse(final boolean success) {
|
||||
mPinText.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
|
||||
mUpdateMonitor.reportSimUnlocked();
|
||||
mCallback.goToUnlockScreen();
|
||||
} else {
|
||||
mHeaderText.setText(R.string.keyguard_password_wrong_pin_code);
|
||||
mPinText.setText("");
|
||||
mEnteredDigits = 0;
|
||||
}
|
||||
mCallback.pokeWakelock();
|
||||
}
|
||||
});
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user