From ff3224a6611834a38a337088eb0bfb061752a273 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Wed, 21 Jul 2021 12:47:31 -0400 Subject: [PATCH] Dismiss SIM PIN screen when eSIM disabled eSIMs provide a mechanism for disabling directly from the SIM PIN unlock screen. When tapped, keyguard receives an event with a subscription id of -1, which an invalid subscription id and is mostly ignored. However, in the case where there was a previously valid id, keyguard should issue a callback to notify consumers of this state. Fixes: 191432304 Test: atest KeyguardUpdateMonitorTest Change-Id: I455d7a1fcde6cbfbf6914f4900eb58cf39bfd715 --- .../keyguard/KeyguardUpdateMonitor.java | 28 ++++++++++++++++++- .../keyguard/KeyguardUpdateMonitorTest.java | 22 +++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 8032839318e05..ada2483a2110d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -123,10 +123,13 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.TimeZone; import java.util.concurrent.Executor; import java.util.function.Consumer; @@ -469,16 +472,39 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab List subscriptionInfos = getSubscriptionInfo(true /* forceReload */); // 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 + // first update in handleSimStateChange, we need to force refresh all SIM states // so the subscription id for them is consistent. ArrayList changedSubscriptions = new ArrayList<>(); + Set activeSubIds = new HashSet<>(); for (int i = 0; i < subscriptionInfos.size(); i++) { SubscriptionInfo info = subscriptionInfos.get(i); + activeSubIds.add(info.getSubscriptionId()); boolean changed = refreshSimState(info.getSubscriptionId(), info.getSimSlotIndex()); if (changed) { changedSubscriptions.add(info); } } + + // It is possible for active subscriptions to become invalid (-1), and these will not be + // present in the subscriptionInfo list + Iterator> iter = mSimDatas.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry simData = iter.next(); + if (!activeSubIds.contains(simData.getKey())) { + Log.i(TAG, "Previously active sub id " + simData.getKey() + " is now invalid, " + + "will remove"); + iter.remove(); + + SimData data = simData.getValue(); + for (int j = 0; j < mCallbacks.size(); j++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get(); + if (cb != null) { + cb.onSimStateChanged(data.subId, data.slotId, data.simState); + } + } + } + } + for (int i = 0; i < changedSubscriptions.size(); i++) { SimData data = mSimDatas.get(changedSubscriptions.get(i).getSubscriptionId()); for (int j = 0; j < mCallbacks.size(); j++) { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index fc0214a565f21..e9061afb647dd 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -753,6 +753,28 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { assertThat(listToVerify.get(0)).isEqualTo(TEST_SUBSCRIPTION_2); } + @Test + public void testActiveSubscriptionBecomesInactive() { + List list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + when(mSubscriptionManager.getCompleteActiveSubscriptionInfoList()).thenReturn(list); + mKeyguardUpdateMonitor.mPhoneStateListener.onActiveDataSubscriptionIdChanged( + TEST_SUBSCRIPTION.getSubscriptionId()); + mTestableLooper.processAllMessages(); + assertThat(mKeyguardUpdateMonitor.mSimDatas.get(TEST_SUBSCRIPTION.getSubscriptionId())) + .isNotNull(); + + when(mSubscriptionManager.getCompleteActiveSubscriptionInfoList()).thenReturn(null); + mKeyguardUpdateMonitor.mPhoneStateListener.onActiveDataSubscriptionIdChanged( + SubscriptionManager.INVALID_SUBSCRIPTION_ID); + mTestableLooper.processAllMessages(); + + assertThat(mKeyguardUpdateMonitor.mSimDatas.get(TEST_SUBSCRIPTION.getSubscriptionId())) + .isNull(); + assertThat(mKeyguardUpdateMonitor.mSimDatas.get( + SubscriptionManager.INVALID_SUBSCRIPTION_ID)).isNull(); + } + @Test public void testIsUserUnlocked() { // mUserManager will report the user as unlocked on @Before