Loading services/core/java/com/android/server/TelephonyRegistry.java +159 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } } Loading @@ -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)); } } }; Loading Loading @@ -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 Loading Loading @@ -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 Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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); } } } } telephony/java/android/telephony/PhoneStateListener.java +1 −1 Original line number Diff line number Diff line Loading @@ -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()); } /** Loading Loading
services/core/java/com/android/server/TelephonyRegistry.java +159 −20 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } } Loading @@ -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)); } } }; Loading Loading @@ -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 Loading Loading @@ -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 Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading @@ -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); } } } }
telephony/java/android/telephony/PhoneStateListener.java +1 −1 Original line number Diff line number Diff line Loading @@ -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()); } /** Loading