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:
Jim Miller
2011-11-17 16:57:01 -08:00
parent 34a62348be
commit 90d5d46b9e
3 changed files with 58 additions and 42 deletions

View File

@@ -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() {

View File

@@ -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();
}

View File

@@ -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();
}