summaryrefslogtreecommitdiffstats
path: root/packages/Keyguard/src/com/android
diff options
context:
space:
mode:
authorJorim Jaggi <jjaggi@google.com>2015-01-13 21:33:45 +0100
committerJorim Jaggi <jjaggi@google.com>2015-01-13 21:46:43 +0100
commit01ba98b856a018c735a911d7b2c1604ea2ff2f95 (patch)
tree7139b19de8348c259cab6da215fad73eb6edcdad /packages/Keyguard/src/com/android
parent71922de6c8e407ff24bb1a500cb53bb1a647c758 (diff)
downloadframeworks_base-01ba98b856a018c735a911d7b2c1604ea2ff2f95.zip
frameworks_base-01ba98b856a018c735a911d7b2c1604ea2ff2f95.tar.gz
frameworks_base-01ba98b856a018c735a911d7b2c1604ea2ff2f95.tar.bz2
Only notify SIM state changes when it has actually changed
onSubscriptionInfoChanged gets called quite frequently whenever something about the connectivity changes, which could lead that the whole state of the Keyguard was reset. This change actually checks whether the state has really changed and thus only resets Keyguard when necessary. Bug: 18821582 Change-Id: Ia70804d0337b11914c7d57aa4cdc47d585786f1d
Diffstat (limited to 'packages/Keyguard/src/com/android')
-rw-r--r--packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java29
1 files changed, 23 insertions, 6 deletions
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 84bacc3..795a206 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -274,12 +274,16 @@ 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);
- refreshSimState(info.getSubscriptionId(), info.getSimSlotIndex());
+ boolean changed = refreshSimState(info.getSubscriptionId(), info.getSimSlotIndex());
+ if (changed) {
+ changedSubscriptions.add(info);
+ }
}
- for (int i = 0; i < subscriptionInfos.size(); i++) {
- SimData data = mSimDatas.get(mSubscriptionInfo.get(i).getSubscriptionId());
+ 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) {
@@ -1242,7 +1246,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
}
- private void refreshSimState(int subId, int slotId) {
+ /**
+ * @return true if and only if the state has changed for the specified {@code slotId}
+ */
+ private boolean refreshSimState(int subId, int slotId) {
// 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
@@ -1256,8 +1263,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
} catch(IllegalArgumentException ex) {
Log.w(TAG, "Unknown sim state: " + simState);
state = State.UNKNOWN;
- }
- mSimDatas.put(subId, new SimData(state, slotId, subId));
+ }
+ SimData data = mSimDatas.get(subId);
+ final boolean changed;
+ if (data == null) {
+ data = new SimData(state, slotId, subId);
+ mSimDatas.put(subId, data);
+ changed = true; // no data yet; force update
+ } else {
+ changed = data.simState != state;
+ data.simState = state;
+ }
+ return changed;
}
public static boolean isSimPinSecure(IccCardConstants.State state) {