diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java | 118 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java | 17 |
2 files changed, 83 insertions, 52 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 8b2cf7a735de..8b593701540b 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -585,62 +585,68 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } private void handleSimSubscriptionInfoChanged() { - Assert.isMainThread(); mSimLogger.v("onSubscriptionInfoChanged()"); - List<SubscriptionInfo> subscriptionInfos = getSubscriptionInfo(true /* forceReload */); - if (!subscriptionInfos.isEmpty()) { - for (SubscriptionInfo subInfo : subscriptionInfos) { - mSimLogger.logSubInfo(subInfo); - } - } else { - mSimLogger.v("onSubscriptionInfoChanged: list is null"); - } - - // 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 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); - } - } + mBackgroundExecutor.execute(() -> { + final List<SubscriptionInfo> subscriptionInfos = + getSubscriptionInfo(true /* forceReload */); + mMainExecutor.execute(() -> { + if (!subscriptionInfos.isEmpty()) { + for (SubscriptionInfo subInfo : subscriptionInfos) { + mSimLogger.logSubInfo(subInfo); + } + } else { + mSimLogger.v("onSubscriptionInfoChanged: list is null"); + } - // It is possible for active subscriptions to become invalid (-1), and these will not be - // present in the subscriptionInfo list - synchronized (mSimDataLockObject) { - Iterator<Map.Entry<Integer, SimData>> iter = mSimDatas.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry<Integer, SimData> simData = iter.next(); - if (!activeSubIds.contains(simData.getKey())) { - mSimLogger.logInvalidSubId(simData.getKey()); - iter.remove(); + // 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 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); + } + } - 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); + // It is possible for active subscriptions to become invalid (-1), and these will + // not be present in the subscriptionInfo list + synchronized (mSimDataLockObject) { + Iterator<Map.Entry<Integer, SimData>> iter = mSimDatas.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry<Integer, SimData> simData = iter.next(); + if (!activeSubIds.contains(simData.getKey())) { + mSimLogger.logInvalidSubId(simData.getKey()); + 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++) { - 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++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get(); + if (cb != null) { + cb.onSimStateChanged(data.subId, data.slotId, data.simState); + } + } } + callbacksRefreshCarrierInfo(); } - } - callbacksRefreshCarrierInfo(); - } + }); + }); } private void handleAirplaneModeChanged() { @@ -2523,6 +2529,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab if (mUserTracker.isUserSwitching()) { handleUserSwitching(mUserTracker.getUserId(), () -> {}); } + + // Force the cache to be initialized + mBackgroundExecutor.execute(() -> { + getSubscriptionInfo(/* forceReload= */ true); + }); } @VisibleForTesting @@ -3851,11 +3862,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab * @see #isSimPinSecure(int) */ public boolean isSimPinSecure() { - // True if any SIM is pin secure - for (SubscriptionInfo info : getSubscriptionInfo(false /* forceReload */)) { - if (isSimPinSecure(getSimState(info.getSubscriptionId()))) return true; + synchronized (mSimDataLockObject) { + for (SimData data : mSimDatas.values()) { + if (isSimPinSecure(data.simState)) { + return true; + } + } + return false; } - return false; } public int getSimState(int subId) { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index b941fdef76b4..3d9eb53d436a 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -2267,6 +2267,23 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } @Test + public void isSimPinSecureReturnsFalseWhenEmpty() { + assertThat(mKeyguardUpdateMonitor.isSimPinSecure()).isFalse(); + } + + @Test + public void isSimPinSecureReturnsTrueWhenOneSlotIsLocked() { + // Slot 0 is locked + mKeyguardUpdateMonitor.handleSimStateChange(10, 0, + TelephonyManager.SIM_STATE_PIN_REQUIRED); + // Slot 1 is not ready + mKeyguardUpdateMonitor.handleSimStateChange(11, 1, + TelephonyManager.SIM_STATE_NOT_READY); + + assertThat(mKeyguardUpdateMonitor.isSimPinSecure()).isTrue(); + } + + @Test public void onAuthEnrollmentChangesCallbacksAreNotified() { KeyguardUpdateMonitorCallback callback = mock(KeyguardUpdateMonitorCallback.class); ArgumentCaptor<AuthController.Callback> authCallback = ArgumentCaptor.forClass( |