Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59dc7b11 authored by Richard Chou's avatar Richard Chou Committed by android-build-merger
Browse files

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

am: 4f3d29de

Change-Id: I69bdf0d2fd6fcfea2a2ae5b5d9056407e0a498e4
parents 23f16974 4f3d29de
Loading
Loading
Loading
Loading
+45 −30
Original line number Diff line number Diff line
@@ -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,15 +1839,21 @@ 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);
        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 {
@@ -1863,6 +1862,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                Log.w(TAG, "Unknown sim state: " + simState);
                state = State.UNKNOWN;
            }

            SimData data = mSimDatas.get(subId);
            final boolean changed;
            if (data == null) {
@@ -1873,7 +1873,22 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                changed = data.simState != state;
                data.simState = state;
            }
        return changed;
            if (changed) {
                changedSubscriptionIds.add(subId);
            }

            activeSubIds.add(subId);
        }

        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 changedSubscriptionIds;
    }

    public static boolean isSimPinSecure(IccCardConstants.State state) {