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
This commit is contained in:
Malcolm Chen
2020-06-09 12:09:45 -07:00
parent 85cf423804
commit d2598d767f

View File

@@ -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) {