diff options
| author | 2020-06-09 12:09:45 -0700 | |
|---|---|---|
| committer | 2020-06-11 18:39:55 -0700 | |
| commit | d2598d767fd16eb2b496959f801e5ad4de1eb720 (patch) | |
| tree | 2398baf7d8e350a62462aabfaafe36830c49a6fd | |
| parent | 85cf423804e34536dc2c36e3043d78a0e829f47d (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.java | 20 |
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) { |