Merge "Reset SIM state if the subscription is no longer active." into pi-dev am: 4f3d29de54

am: 59dc7b1139

Change-Id: Ib2b2ac2cd24aa0663fab5d46e67e198c6a6b548c
This commit is contained in:
Richard Chou
2018-03-27 08:27:26 +00:00
committed by android-build-merger

View File

@@ -68,7 +68,6 @@ import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
@@ -88,6 +87,7 @@ import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
@@ -400,16 +400,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
// Hack level over 9000: Because the subscription id is not yet valid when we see the
// first update in handleSimStateChange, we need to force refresh all all SIM states
// so the subscription id for them is consistent.
ArrayList<SubscriptionInfo> changedSubscriptions = new ArrayList<>();
for (int i = 0; i < subscriptionInfos.size(); i++) {
SubscriptionInfo info = subscriptionInfos.get(i);
boolean changed = refreshSimState(info.getSubscriptionId(), info.getSimSlotIndex());
if (changed) {
changedSubscriptions.add(info);
}
}
for (int i = 0; i < changedSubscriptions.size(); i++) {
SimData data = mSimDatas.get(changedSubscriptions.get(i).getSubscriptionId());
List<Integer> changedSubscriptionIds = refreshSimState(subscriptionInfos);
for (int i = 0; i < changedSubscriptionIds.size(); i++) {
SimData data = mSimDatas.get(changedSubscriptionIds.get(i));
for (int j = 0; j < mCallbacks.size(); j++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
if (cb != null) {
@@ -1846,34 +1839,56 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
};
/**
* @return true if and only if the state has changed for the specified {@code slotId}
* @return A list of changed subscriptions, maybe empty but never null
*/
private boolean refreshSimState(int subId, int slotId) {
private List<Integer> refreshSimState(final List<SubscriptionInfo> activeSubscriptionInfos) {
// This is awful. It exists because there are two APIs for getting the SIM status
// 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 TelephonyManager tele = TelephonyManager.from(mContext);
int simState = tele.getSimState(slotId);
State state;
try {
state = State.intToState(simState);
} catch(IllegalArgumentException ex) {
Log.w(TAG, "Unknown sim state: " + simState);
state = State.UNKNOWN;
ArrayList<Integer> changedSubscriptionIds = new ArrayList<>();
HashSet<Integer> activeSubIds = new HashSet<>();
for (SubscriptionInfo info : activeSubscriptionInfos) {
int subId = info.getSubscriptionId();
int slotId = info.getSimSlotIndex();
int simState = tele.getSimState(slotId);
State state;
try {
state = State.intToState(simState);
} catch(IllegalArgumentException ex) {
Log.w(TAG, "Unknown sim state: " + simState);
state = State.UNKNOWN;
}
SimData data = mSimDatas.get(subId);
final boolean changed;
if (data == null) {
data = new SimData(state, slotId, subId);
mSimDatas.put(subId, data);
changed = true; // no data yet; force update
} else {
changed = data.simState != state;
data.simState = state;
}
if (changed) {
changedSubscriptionIds.add(subId);
}
activeSubIds.add(subId);
}
SimData data = mSimDatas.get(subId);
final boolean changed;
if (data == null) {
data = new SimData(state, slotId, subId);
mSimDatas.put(subId, data);
changed = true; // no data yet; force update
} else {
changed = data.simState != state;
data.simState = state;
for (SimData data : mSimDatas.values()) {
if (!activeSubIds.contains(data.subId) && data.simState != State.ABSENT) {
// for the inactive subscriptions, reset state to ABSENT
data.simState = State.ABSENT;
changedSubscriptionIds.add(data.subId);
}
}
return changed;
return changedSubscriptionIds;
}
public static boolean isSimPinSecure(IccCardConstants.State state) {