Support multiple SIM/Subscription on telephony registration

During calling telephony registry call back API, we force the call back will be
triggered if the registered subId is Default Sub ID. This is due to some risk
condition. Please refer to Issue 17472622 and its fix. This fix is ok for single
SIM/Subscription. However, on multiple SIM/subscription, there is potential problem
on wrong notifications.

Bug:17613629
Change-Id: I3f41e03f37424bcc82a71090d4f4142b4c5ba922
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 164a4f7..b46b614 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -154,6 +154,10 @@
 
     private VoLteServiceState mVoLteServiceState = new VoLteServiceState();
 
+    private long mDefaultSubId = SubscriptionManager.INVALID_SUB_ID;
+
+    private int mDefaultPhoneId = SubscriptionManager.INVALID_PHONE_ID;
+
     private DataConnectionRealTimeInfo mDcRtInfo = new DataConnectionRealTimeInfo();
 
     private int mRingingCallState = PreciseCallState.PRECISE_CALL_STATE_IDLE;
@@ -195,8 +199,27 @@
                     }
                     break;
                 }
-                case MSG_UPDATE_DEFAULT_SUB: {// do nothing
-                    if (VDBG) log(TAG + "MSG_UPDATE_DEFAULT_SUB");
+                case MSG_UPDATE_DEFAULT_SUB: {
+                    int newDefaultPhoneId = msg.arg1;
+                    long newDefaultSubId = (Long)(msg.obj);
+                    if (VDBG) {
+                        log("MSG_UPDATE_DEFAULT_SUB:current mDefaultSubId=" + mDefaultSubId
+                            + " current mDefaultPhoneId=" + mDefaultPhoneId + " newDefaultSubId= "
+                            + newDefaultSubId + " newDefaultPhoneId=" + newDefaultPhoneId);
+                    }
+
+                    //Due to possible risk condition,(notify call back using the new
+                    //defaultSubId comes before new defaultSubId update) we need to recall all
+                    //possible missed notify callback
+                    synchronized (mRecords) {
+                      for (Record r : mRecords) {
+                          if(r.subId == SubscriptionManager.DEFAULT_SUB_ID) {
+                              checkPossibleMissNotify(r, newDefaultPhoneId);
+                          }
+                      }
+                    }
+                    mDefaultSubId = newDefaultSubId;
+                    mDefaultPhoneId = newDefaultPhoneId;
                 }
             }
         }
@@ -212,10 +235,21 @@
                 if (DBG) log("onReceive: userHandle=" + userHandle);
                 mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHED, userHandle, 0));
             } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_SUBSCRIPTION_CHANGED)) {
+                Long newDefaultSubIdObj = new Long(intent.getLongExtra(
+                        PhoneConstants.SUBSCRIPTION_KEY, SubscriptionManager.getDefaultSubId()));
+                int newDefaultPhoneId = intent.getIntExtra(PhoneConstants.SLOT_KEY,
+                    SubscriptionManager.getPhoneId(mDefaultSubId));
                 if (DBG) {
-                    log(TAG + "onReceive: ACTION_DEFAULT_SUBSCRIPTION_CHANGED");
+                    log("onReceive:current mDefaultSubId=" + mDefaultSubId
+                        + " current mDefaultPhoneId=" + mDefaultPhoneId + " newDefaultSubId= "
+                        + newDefaultSubIdObj + " newDefaultPhoneId=" + newDefaultPhoneId);
                 }
-                mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_DEFAULT_SUB, 0, 0));
+
+                if(validatePhoneId(newDefaultPhoneId) && (newDefaultSubIdObj.equals(mDefaultSubId)
+                        || (newDefaultPhoneId != mDefaultPhoneId))) {
+                    mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_DEFAULT_SUB,
+                            newDefaultPhoneId, 0, newDefaultSubIdObj));
+                }
             }
         }
     };
@@ -560,8 +594,7 @@
                                 + " phoneId=" + phoneId + " state=" + state);
                     }
                     if (((r.events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)) {
                         try {
                             if (DBG) {
                                 log("notifyServiceStateForSubscriber: callback.onSSC r=" + r
@@ -606,8 +639,7 @@
                                 + " phoneId=" + phoneId + " ss=" + signalStrength);
                     }
                     if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)) {
                         try {
                             if (DBG) {
                                 log("notifySignalStrengthForSubscriber: callback.onSsS r=" + r
@@ -620,8 +652,7 @@
                         }
                     }
                     if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)){
                         try {
                             int gsmSignalStrength = signalStrength.getGsmSignalStrength();
                             int ss = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
@@ -663,8 +694,7 @@
                 mCellInfo.set(phoneId, cellInfo);
                 for (Record r : mRecords) {
                     if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)) {
                         try {
                             if (DBG_LOC) {
                                 log("notifyCellInfo: mCellInfo=" + cellInfo + " r=" + r);
@@ -719,8 +749,7 @@
                 mMessageWaiting[phoneId] = mwi;
                 for (Record r : mRecords) {
                     if (((r.events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)) {
                         try {
                             r.callback.onMessageWaitingIndicatorChanged(mwi);
                         } catch (RemoteException ex) {
@@ -751,8 +780,7 @@
                 mCallForwarding[phoneId] = cfi;
                 for (Record r : mRecords) {
                     if (((r.events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)) {
                         try {
                             r.callback.onCallForwardingIndicatorChanged(cfi);
                         } catch (RemoteException ex) {
@@ -849,8 +877,7 @@
                 }
                 for (Record r : mRecords) {
                     if (((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)) {
                         try {
                             log("Notify data connection state changed on sub: " +
                                     subId);
@@ -936,8 +963,7 @@
                 mCellLocation[phoneId] = cellLocation;
                 for (Record r : mRecords) {
                     if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION) &&
-                            ((r.subId == subId) ||
-                            (r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
+                            subIdMatch(r.subId, subId)) {
                         try {
                             if (DBG_LOC) {
                                 log("notifyCellLocation: cellLocation=" + cellLocation
@@ -1371,4 +1397,117 @@
             log(prompt + ": ----------------");
         }
     }
+
+    boolean subIdMatch(long rSubId, long subId) {
+        if(rSubId == SubscriptionManager.DEFAULT_SUB_ID) {
+            return (subId == mDefaultSubId);
+        } else {
+            return (rSubId == subId);
+        }
+    }
+
+    private void checkPossibleMissNotify(Record r, int phoneId) {
+        int events = r.events;
+
+        if ((events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) {
+            try {
+                if (VDBG) log("checkPossibleMissNotify: onServiceStateChanged state=" +
+                        mServiceState[phoneId]);
+                r.callback.onServiceStateChanged(
+                        new ServiceState(mServiceState[phoneId]));
+            } catch (RemoteException ex) {
+                remove(r.binder);
+            }
+        }
+
+        if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) {
+            try {
+                SignalStrength signalStrength = mSignalStrength[phoneId];
+                if (DBG) {
+                    log("checkPossibleMissNotify: onSignalStrengthsChanged SS=" + signalStrength);
+                }
+                r.callback.onSignalStrengthsChanged(new SignalStrength(signalStrength));
+            } catch (RemoteException ex) {
+                mRemoveList.add(r.binder);
+            }
+        }
+
+        if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) {
+            try {
+                int gsmSignalStrength = mSignalStrength[phoneId]
+                        .getGsmSignalStrength();
+                if (DBG) {
+                    log("checkPossibleMissNotify: onSignalStrengthChanged SS=" +
+                            gsmSignalStrength);
+                }
+                r.callback.onSignalStrengthChanged((gsmSignalStrength == 99 ? -1
+                        : gsmSignalStrength));
+            } catch (RemoteException ex) {
+                remove(r.binder);
+            }
+        }
+
+        if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) {
+            try {
+                if (DBG_LOC) {
+                    log("checkPossibleMissNotify: onCellInfoChanged[" + phoneId + "] = "
+                            + mCellInfo.get(phoneId));
+                }
+                r.callback.onCellInfoChanged(mCellInfo.get(phoneId));
+            } catch (RemoteException ex) {
+                remove(r.binder);
+            }
+        }
+
+        if ((events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) {
+            try {
+                if (VDBG) {
+                    log("checkPossibleMissNotify: onMessageWaitingIndicatorChanged phoneId="
+                            + phoneId + " mwi=" + mMessageWaiting[phoneId]);
+                }
+                r.callback.onMessageWaitingIndicatorChanged(
+                        mMessageWaiting[phoneId]);
+            } catch (RemoteException ex) {
+                remove(r.binder);
+            }
+        }
+
+        if ((events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) {
+            try {
+                if (VDBG) {
+                    log("checkPossibleMissNotify: onCallForwardingIndicatorChanged phoneId="
+                        + phoneId + " cfi=" + mCallForwarding[phoneId]);
+                }
+                r.callback.onCallForwardingIndicatorChanged(
+                        mCallForwarding[phoneId]);
+            } catch (RemoteException ex) {
+                remove(r.binder);
+            }
+        }
+
+        if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION)) {
+            try {
+                if (DBG_LOC) log("checkPossibleMissNotify: onCellLocationChanged mCellLocation = "
+                        + mCellLocation[phoneId]);
+                r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId]));
+            } catch (RemoteException ex) {
+                mRemoveList.add(r.binder);
+            }
+        }
+
+        if ((events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) {
+            try {
+                if (DBG) {
+                    log("checkPossibleMissNotify: onDataConnectionStateChanged(mDataConnectionState"
+                            + "=" + mDataConnectionState[phoneId]
+                            + ", mDataConnectionNetworkType=" + mDataConnectionNetworkType[phoneId]
+                            + ")");
+                }
+                r.callback.onDataConnectionStateChanged(mDataConnectionState[phoneId],
+                        mDataConnectionNetworkType[phoneId]);
+            } catch (RemoteException ex) {
+                remove(r.binder);
+            }
+        }
+    }
 }
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index b1b63df..bb3e058 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -229,7 +229,7 @@
      * own non-null looper use PhoneStateListener(Looper looper) below.
      */
     public PhoneStateListener() {
-        this(SubscriptionManager.getDefaultSubId(), Looper.myLooper());
+        this(SubscriptionManager.DEFAULT_SUB_ID, Looper.myLooper());
     }
 
     /**