Merge "Support SIM permanently disabled state." into honeycomb-LTE

This commit is contained in:
John Wang
2011-06-16 11:22:53 -07:00
committed by Android (Google) Code Review
10 changed files with 118 additions and 16 deletions

View File

@ -1728,6 +1728,9 @@
<string name="lockscreen_missing_sim_instructions">Please insert a SIM card.</string>
<!-- Shown in the lock screen to ask the user to insert a SIM card when sim is missing or not readable. -->
<string name="lockscreen_missing_sim_instructions_long">The SIM card is missing or not readable. Please insert a SIM card.</string>
<!-- Shown in the lock screen to inform the user to SIM card is permanently disabled. -->
<string name="lockscreen_permanent_disabled_sim_instructions">Your SIM card is permanently disabled.\n
Please contact your wireless service provider to obtain another SIM card.</string>
<!-- Shown in the lock screen when there is emergency calls only mode. -->
<string name="emergency_calls_only" msgid="2485604591272668370">Emergency calls only</string>

View File

@ -114,7 +114,15 @@ public class KeyguardUpdateMonitor {
}
String stateExtra = intent.getStringExtra(IccCard.INTENT_KEY_ICC_STATE);
if (IccCard.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
this.simState = IccCard.State.ABSENT;
final String absentReason = intent
.getStringExtra(IccCard.INTENT_KEY_LOCKED_REASON);
if (IccCard.INTENT_VALUE_ABSENT_ON_PERM_DISABLED.equals(
absentReason)) {
this.simState = IccCard.State.PERM_DISABLED;
} else {
this.simState = IccCard.State.ABSENT;
}
} else if (IccCard.INTENT_VALUE_ICC_READY.equals(stateExtra)) {
this.simState = IccCard.State.READY;
} else if (IccCard.INTENT_VALUE_ICC_LOCKED.equals(stateExtra)) {

View File

@ -581,7 +581,9 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
final boolean provisioned = mUpdateMonitor.isDeviceProvisioned();
final IccCard.State state = mUpdateMonitor.getSimState();
final boolean lockedOrMissing = state.isPinLocked()
|| ((state == IccCard.State.ABSENT) && requireSim);
|| ((state == IccCard.State.ABSENT
|| state == IccCard.State.PERM_DISABLED)
&& requireSim);
if (!lockedOrMissing && !provisioned) {
if (DEBUG) Log.d(TAG, "doKeyguard: not showing because device isn't provisioned"
@ -688,12 +690,15 @@ public class KeyguardViewMediator implements KeyguardViewCallback,
switch (simState) {
case ABSENT:
case PERM_DISABLED:
// only force lock screen in case of missing sim if user hasn't
// gone through setup wizard
if (!mUpdateMonitor.isDeviceProvisioned()) {
if (!isShowing()) {
if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_ABSENT and keygaurd isn't showing, we need "
+ "to show the keyguard since the device isn't provisioned yet.");
if (DEBUG) Log.d(TAG, "INTENT_VALUE_ICC_ABSENT "
+ "or PERM_DISABLED and keygaurd isn't showing,"
+ " we need to show the keyguard since the "
+ "device isn't provisioned yet.");
doKeyguard();
} else {
resetStateLocked();

View File

@ -181,7 +181,8 @@ public class LockPatternKeyguardView extends KeyguardViewBase {
private boolean stuckOnLockScreenBecauseSimMissing() {
return mRequiresSim
&& (!mUpdateMonitor.isDeviceProvisioned())
&& (mUpdateMonitor.getSimState() == IccCard.State.ABSENT);
&& (mUpdateMonitor.getSimState() == IccCard.State.ABSENT ||
mUpdateMonitor.getSimState() == IccCard.State.PERM_DISABLED);
}
/**

View File

@ -55,8 +55,10 @@ public class LockPatternKeyguardViewProperties implements KeyguardViewProperties
private boolean isSimPinSecure() {
final IccCard.State simState = mUpdateMonitor.getSimState();
return (simState == IccCard.State.PIN_REQUIRED || simState == IccCard.State.PUK_REQUIRED
|| simState == IccCard.State.ABSENT);
return (simState == IccCard.State.PIN_REQUIRED
|| simState == IccCard.State.PUK_REQUIRED
|| simState == IccCard.State.ABSENT
|| simState == IccCard.State.PERM_DISABLED);
}
}

View File

@ -126,7 +126,12 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
/**
* The sim card is locked.
*/
SimLocked(true);
SimLocked(true),
/**
* The sim card is permanently disabled due to puk unlock failure
*/
SimPermDisabled(false);
private final boolean mShowStatusLines;
@ -450,7 +455,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
*/
private Status getCurrentStatus(IccCard.State simState) {
boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned()
&& simState == IccCard.State.ABSENT);
&& (simState == IccCard.State.ABSENT
|| simState == IccCard.State.PERM_DISABLED));
if (missingAndNotProvisioned) {
return Status.SimMissingLocked;
}
@ -468,6 +475,8 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
return Status.SimPukLocked;
case READY:
return Status.Normal;
case PERM_DISABLED:
return Status.SimPermDisabled;
case UNKNOWN:
return Status.SimMissing;
}
@ -542,6 +551,18 @@ class LockScreen extends LinearLayout implements KeyguardScreen,
enableUnlock(); // do not need to show the e-call button; user may unlock
break;
case SimPermDisabled:
// text
mStatusView.setCarrierText(R.string.lockscreen_missing_sim_message_short);
mScreenLocked.setText(
R.string.lockscreen_permanent_disabled_sim_instructions);
// layout
mScreenLocked.setVisibility(View.VISIBLE);
mLockPatternUtils.updateEmergencyCallText(mEmergencyCallText);
enableUnlock(); // do not need to show the e-call button; user may unlock
break;
case SimMissingLocked:
// text
mStatusView.setCarrierText(

View File

@ -84,6 +84,9 @@ public abstract class IccCard {
static public final String INTENT_VALUE_LOCKED_ON_PUK = "PUK";
/* NETWORK means ICC is locked on NETWORK PERSONALIZATION */
static public final String INTENT_VALUE_LOCKED_NETWORK = "NETWORK";
/* PERM_DISABLED means ICC is permanently disabled due to puk fails */
static public final String INTENT_VALUE_ABSENT_ON_PERM_DISABLED = "PERM_DISABLED";
protected static final int EVENT_ICC_LOCKED_OR_ABSENT = 1;
private static final int EVENT_GET_ICC_STATUS_DONE = 2;
@ -112,7 +115,8 @@ public abstract class IccCard {
PUK_REQUIRED,
NETWORK_LOCKED,
READY,
NOT_READY;
NOT_READY,
PERM_DISABLED;
public boolean isPinLocked() {
return ((this == PIN_REQUIRED) || (this == PUK_REQUIRED));
@ -120,7 +124,8 @@ public abstract class IccCard {
public boolean iccCardExist() {
return ((this == PIN_REQUIRED) || (this == PUK_REQUIRED)
|| (this == NETWORK_LOCKED) || (this == READY));
|| (this == NETWORK_LOCKED) || (this == READY)
|| (this == PERM_DISABLED));
}
}
@ -416,6 +421,7 @@ public abstract class IccCard {
boolean transitionedIntoPinLocked;
boolean transitionedIntoAbsent;
boolean transitionedIntoNetworkLocked;
boolean transitionedIntoPermBlocked;
boolean isIccCardRemoved;
boolean isIccCardAdded;
@ -434,6 +440,8 @@ public abstract class IccCard {
transitionedIntoAbsent = (oldState != State.ABSENT && newState == State.ABSENT);
transitionedIntoNetworkLocked = (oldState != State.NETWORK_LOCKED
&& newState == State.NETWORK_LOCKED);
transitionedIntoPermBlocked = (oldState != State.PERM_DISABLED
&& newState == State.PERM_DISABLED);
isIccCardRemoved = (oldState != null &&
oldState.iccCardExist() && newState == State.ABSENT);
isIccCardAdded = (oldState == State.ABSENT &&
@ -454,6 +462,10 @@ public abstract class IccCard {
mNetworkLockedRegistrants.notifyRegistrants();
broadcastIccStateChangedIntent(INTENT_VALUE_ICC_LOCKED,
INTENT_VALUE_LOCKED_NETWORK);
} else if (transitionedIntoPermBlocked) {
if (mDbg) log("Notify SIM permanently disabled.");
broadcastIccStateChangedIntent(INTENT_VALUE_ICC_ABSENT,
INTENT_VALUE_ABSENT_ON_PERM_DISABLED);
}
if (isIccCardRemoved) {
@ -762,6 +774,9 @@ public abstract class IccCard {
}
// check if PIN required
if (app.pin1.isPermBlocked()) {
return IccCard.State.PERM_DISABLED;
}
if (app.app_state.isPinRequired()) {
return IccCard.State.PIN_REQUIRED;
}

View File

@ -16,6 +16,8 @@
package com.android.internal.telephony;
import com.android.internal.telephony.IccCardStatus.PinState;
/**
* See also RIL_AppStatus in include/telephony/ril.h
@ -104,8 +106,8 @@ public class IccCardApplication {
public String app_label;
// applicable to USIM and CSIM
public int pin1_replaced;
public int pin1;
public int pin2;
public PinState pin1;
public PinState pin2;
AppType AppTypeFromRILInt(int type) {
AppType newType;
@ -177,6 +179,33 @@ public class IccCardApplication {
return newSubState;
}
PinState PinStateFromRILInt(int state) {
PinState newPinState;
switch(state) {
case 0:
newPinState = PinState.PINSTATE_UNKNOWN;
break;
case 1:
newPinState = PinState.PINSTATE_ENABLED_NOT_VERIFIED;
break;
case 2:
newPinState = PinState.PINSTATE_ENABLED_VERIFIED;
break;
case 3:
newPinState = PinState.PINSTATE_DISABLED;
break;
case 4:
newPinState = PinState.PINSTATE_ENABLED_BLOCKED;
break;
case 5:
newPinState = PinState.PINSTATE_ENABLED_PERM_BLOCKED;
break;
default:
throw new RuntimeException("Unrecognized RIL_PinState: " + state);
}
return newPinState;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
@ -185,6 +214,12 @@ public class IccCardApplication {
if (app_state == AppState.APPSTATE_SUBSCRIPTION_PERSO) {
sb.append(",").append(perso_substate);
}
if (app_type == AppType.APPTYPE_CSIM ||
app_type == AppType.APPTYPE_USIM ||
app_type == AppType.APPTYPE_ISIM) {
sb.append(",pin1=").append(pin1);
sb.append(",pin2=").append(pin2);
}
sb.append("}");
return sb.toString();
}

View File

@ -42,7 +42,19 @@ public class IccCardStatus {
PINSTATE_ENABLED_VERIFIED,
PINSTATE_DISABLED,
PINSTATE_ENABLED_BLOCKED,
PINSTATE_ENABLED_PERM_BLOCKED
PINSTATE_ENABLED_PERM_BLOCKED;
boolean isPermBlocked() {
return this == PINSTATE_ENABLED_PERM_BLOCKED;
}
boolean isPinRequired() {
return this == PINSTATE_ENABLED_NOT_VERIFIED;
}
boolean isPukRequired() {
return this == PINSTATE_ENABLED_BLOCKED;
}
}
private CardState mCardState;

View File

@ -2925,8 +2925,8 @@ public final class RIL extends BaseCommands implements CommandsInterface {
ca.aid = p.readString();
ca.app_label = p.readString();
ca.pin1_replaced = p.readInt();
ca.pin1 = p.readInt();
ca.pin2 = p.readInt();
ca.pin1 = ca.PinStateFromRILInt(p.readInt());
ca.pin2 = ca.PinStateFromRILInt(p.readInt());
status.addApplication(ca);
}
return status;