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
This commit is contained in:
@@ -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<SubscriptionInfo> 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<SubscriptionInfo> changedSubscriptions = new ArrayList<>();
|
||||
Set<Integer> 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<Map.Entry<Integer, SimData>> iter = mSimDatas.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Map.Entry<Integer, SimData> 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++) {
|
||||
|
||||
@@ -753,6 +753,28 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase {
|
||||
assertThat(listToVerify.get(0)).isEqualTo(TEST_SUBSCRIPTION_2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testActiveSubscriptionBecomesInactive() {
|
||||
List<SubscriptionInfo> 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
|
||||
|
||||
Reference in New Issue
Block a user