From 18b9c3cb506ae99bed1e9e95757a22b234cf366b Mon Sep 17 00:00:00 2001 From: xinhe Date: Tue, 2 Dec 2014 15:03:20 -0800 Subject: Unable to unlock SIM with a PIN/PUK call TelephonyManager.getSimState instead of accessing systemProperty Bug:18489776 Change-Id: I45d2315a588f706c4815750963dcfec9f8409c5d --- .../com/android/keyguard/KeyguardUpdateMonitor.java | 11 +++++------ .../android/internal/telephony/IccCardConstants.java | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 7f1314d..ff07dd7 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1303,16 +1303,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { // that don't return the complete set of values and have different types. In Keyguard we // need IccCardConstants, but TelephonyManager would only give us // TelephonyManager.SIM_STATE*, so we retrieve it manually. - final int phoneId = SubscriptionManager.getPhoneId(subId); - final String stateString = TelephonyManager.getTelephonyProperty(phoneId, - TelephonyProperties.PROPERTY_SIM_STATE, ""); + final TelephonyManager tele = TelephonyManager.from(mContext); + int simState = tele.getSimState(slotId); State state; try { - state = State.valueOf(stateString); + state = State.intToState(simState); } catch(IllegalArgumentException ex) { - Log.w(TAG, "Unknown sim state: " + stateString); + Log.w(TAG, "Unknown sim state: " + simState); state = State.UNKNOWN; - } + } mSimDatas.put(subId, new SimData(state, slotId, subId)); } diff --git a/telephony/java/com/android/internal/telephony/IccCardConstants.java b/telephony/java/com/android/internal/telephony/IccCardConstants.java index 8029713..c0eb909 100644 --- a/telephony/java/com/android/internal/telephony/IccCardConstants.java +++ b/telephony/java/com/android/internal/telephony/IccCardConstants.java @@ -32,6 +32,10 @@ public class IccCardConstants { static public final String INTENT_VALUE_ICC_CARD_IO_ERROR = "CARD_IO_ERROR"; /* LOCKED means ICC is locked by pin or by network */ public static final String INTENT_VALUE_ICC_LOCKED = "LOCKED"; + //TODO: we can remove this state in the future if Bug 18489776 analysis + //#42's first race condition is resolved + /* INTERNAL LOCKED means ICC is locked by pin or by network */ + public static final String INTENT_VALUE_ICC_INTERNAL_LOCKED = "INTERNAL_LOCKED"; /* READY means ICC is ready to access */ public static final String INTENT_VALUE_ICC_READY = "READY"; /* IMSI means ICC IMSI is ready in property */ @@ -77,5 +81,21 @@ public class IccCardConstants { || (this == NETWORK_LOCKED) || (this == READY) || (this == PERM_DISABLED) || (this == CARD_IO_ERROR)); } + + public static State intToState(int state) throws IllegalArgumentException { + switch(state) { + case 0: return UNKNOWN; + case 1: return ABSENT; + case 2: return PIN_REQUIRED; + case 3: return PUK_REQUIRED; + case 4: return NETWORK_LOCKED; + case 5: return READY; + case 6: return NOT_READY; + case 7: return PERM_DISABLED; + case 8: return CARD_IO_ERROR; + default: + throw new IllegalArgumentException(); + } + } } } -- cgit v1.1