summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Malcolm Chen <refuhoo@google.com> 2020-06-09 12:09:45 -0700
committer Malcolm Chen <refuhoo@google.com> 2020-06-11 18:39:55 -0700
commitd2598d767fd16eb2b496959f801e5ad4de1eb720 (patch)
tree2398baf7d8e350a62462aabfaafe36830c49a6fd
parent85cf423804e34536dc2c36e3043d78a0e829f47d (diff)
Fix bug that notifyDisplayInfoChanged is notified on wrong record
In dual SIM mode, if a SIM is unplugged, there's a chance that notifyDisplayInfoChanged is notified to registered client incorrectly. Bug: 157039855 Test: manual - in dual SIM mode, when data is on eSIM, pull off pSIM. Verify the rat icon of eSIM does NOT disappear. Change-Id: I305ff855f0d5595be13b6ee4e4480abd89ed258f Merged-In: I305ff855f0d5595be13b6ee4e4480abd89ed258f
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java20
1 files changed, 19 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index d012bd7c91ad..82ce7b1002e3 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -1605,7 +1605,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
for (Record r : mRecords) {
if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)
- && idMatch(r.subId, subId, phoneId)) {
+ && idMatchWithoutDefaultPhoneCheck(r.subId, subId)) {
try {
r.callback.onDisplayInfoChanged(telephonyDisplayInfo);
} catch (RemoteException ex) {
@@ -2703,6 +2703,24 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
Rlog.e(TAG, s);
}
+ /**
+ * If the registrant specified a subId, then we should only notify it if subIds match.
+ * If the registrant registered with DEFAULT subId, we should notify only when the related subId
+ * is default subId (which could be INVALID if there's no default subId).
+ *
+ * This should be the correct way to check record ID match. in idMatch the record's phoneId is
+ * speculated based on subId passed by the registrant so it's not a good reference.
+ * But to avoid triggering potential regression only replace idMatch with it when an issue with
+ * idMatch is reported. Eventually this should replace all instances of idMatch.
+ */
+ private boolean idMatchWithoutDefaultPhoneCheck(int subIdInRecord, int subIdToNotify) {
+ if (subIdInRecord == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) {
+ return (subIdToNotify == mDefaultSubId);
+ } else {
+ return (subIdInRecord == subIdToNotify);
+ }
+ }
+
boolean idMatch(int rSubId, int subId, int phoneId) {
if(subId < 0) {