summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java118
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java17
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(