From e9f1640b6bb3f10d6c94f05774bcfaa788bea55c Mon Sep 17 00:00:00 2001 From: xinhe Date: Thu, 25 Sep 2014 16:39:28 -0700 Subject: [PATCH] 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 --- .../com/android/server/TelephonyRegistry.java | 179 ++++++++++++++++-- .../android/telephony/PhoneStateListener.java | 2 +- 2 files changed, 160 insertions(+), 21 deletions(-) diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 164a4f7cc8d06..b46b6149ab538 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -154,6 +154,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { 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); + } + + if(validatePhoneId(newDefaultPhoneId) && (newDefaultSubIdObj.equals(mDefaultSubId) + || (newDefaultPhoneId != mDefaultPhoneId))) { + mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_DEFAULT_SUB, + newDefaultPhoneId, 0, newDefaultSubIdObj)); } - mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_DEFAULT_SUB, 0, 0)); } } }; @@ -560,8 +594,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { + " 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { + " 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { 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 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { 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 b1b63df7f1f14..bb3e058f24360 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -229,7 +229,7 @@ public class PhoneStateListener { * own non-null looper use PhoneStateListener(Looper looper) below. */ public PhoneStateListener() { - this(SubscriptionManager.getDefaultSubId(), Looper.myLooper()); + this(SubscriptionManager.DEFAULT_SUB_ID, Looper.myLooper()); } /**