diff options
| author | 2018-09-24 20:01:32 -0700 | |
|---|---|---|
| committer | 2018-10-22 13:51:09 -0700 | |
| commit | c1873af9c56e7840b6ec9b85b919aa65b11c6e15 (patch) | |
| tree | f8f692f25842024a67ab6ef94b58c7511abea838 | |
| parent | 7fff7e5eff2640fac3729ff4f955f8e37cebf75f (diff) | |
Add PhoneStateListener#onPreferredDataSubIdChanged
When SubscriptionManager#SetPreferredData changes preferredDataSub,
SubscriptionController notifies TelephonyRegistry and then notifies
all PhoneStateListeners that listen to the event.
Bug: 115550764
Test: unittest
Change-Id: Icb0b349b9f07a52d7d9c5e8512f731986f1a1fa3
Merged-In: Icb0b349b9f07a52d7d9c5e8512f731986f1a1fa3
5 files changed, 70 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index ca74adc2f0c8..e410302457a8 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -217,6 +217,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { @TelephonyManager.RadioPowerState private int mRadioPowerState = TelephonyManager.RADIO_POWER_UNAVAILABLE; + private int mPreferredDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + private final LocalLog mLocalLog = new LocalLog(100); private PreciseDataConnectionState mPreciseDataConnectionState = @@ -756,6 +758,13 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } + if ((events & PhoneStateListener.LISTEN_PREFERRED_DATA_SUBID_CHANGE) != 0) { + try { + r.callback.onPreferredDataSubIdChanged(mPreferredDataSubId); + } catch (RemoteException ex) { + remove(r.binder); + } + } if ((events & PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED) != 0) { try { r.callback.onRadioPowerStateChanged(mRadioPowerState); @@ -1584,6 +1593,32 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + public void notifyPreferredDataSubIdChanged(int preferredSubId) { + if (!checkNotifyPermission("notifyPreferredDataSubIdChanged()")) { + return; + } + + if (VDBG) { + log("notifyPreferredDataSubIdChanged: preferredSubId=" + preferredSubId); + } + + synchronized (mRecords) { + mPreferredDataSubId = preferredSubId; + + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_PREFERRED_DATA_SUBID_CHANGE)) { + try { + r.callback.onPreferredDataSubIdChanged(preferredSubId); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + handleRemoveListLocked(); + } + } + public void notifyRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) { if (!checkNotifyPermission("notifyRadioPowerStateChanged()")) { return; @@ -1647,6 +1682,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { pw.println("mBackgroundCallState=" + mBackgroundCallState); pw.println("mVoLteServiceState=" + mVoLteServiceState); pw.println("mPhoneCapability=" + mPhoneCapability); + pw.println("mPreferredDataSubId=" + mPreferredDataSubId); pw.println("mRadioPowerState=" + mRadioPowerState); pw.decreaseIndent(); diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 3476db456bb1..0ec85360908b 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -283,6 +283,16 @@ public class PhoneStateListener { public static final int LISTEN_PHONE_CAPABILITY_CHANGE = 0x00200000; /** + * Listen for changes to preferred data subId. + * See {@link SubscriptionManager#setPreferredData(int)} + * for more details. + * + * @see #onPreferredDataSubIdChanged + * @hide + */ + public static final int LISTEN_PREFERRED_DATA_SUBID_CHANGE = 0x00400000; + + /** * Listen for changes to the radio power state. * * @see #onRadioPowerStateChanged @@ -420,6 +430,9 @@ public class PhoneStateListener { case LISTEN_RADIO_POWER_STATE_CHANGED: PhoneStateListener.this.onRadioPowerStateChanged((int) msg.obj); break; + case LISTEN_PREFERRED_DATA_SUBID_CHANGE: + PhoneStateListener.this.onPreferredDataSubIdChanged((int) msg.obj); + break; } } }; @@ -670,6 +683,17 @@ public class PhoneStateListener { // default implementation empty } + /** + * Callback invoked when preferred data subId changes. Requires + * the READ_PRIVILEGED_PHONE_STATE permission. + * @param subId the new preferred data subId. If it's INVALID_SUBSCRIPTION_ID, + * it means it's unset and defaultDataSub is used to determine which + * modem is preferred. + * @hide + */ + public void onPreferredDataSubIdChanged(int subId) { + // default implementation empty + } /** * Callback invoked when telephony has received notice from a carrier @@ -806,6 +830,10 @@ public class PhoneStateListener { public void onRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) { send(LISTEN_RADIO_POWER_STATE_CHANGED, 0, 0, state); } + + public void onPreferredDataSubIdChanged(int subId) { + send(LISTEN_PREFERRED_DATA_SUBID_CHANGE, 0, 0, subId); + } } /** diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 97b7414750c9..dc475375cfbc 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2210,10 +2210,11 @@ public class SubscriptionManager { * It's also usually what we set up internet connection on. * * PreferredData overwrites user setting of default data subscription. And it's used - * by ANAS or carrier apps to switch primary and CBRS subscription dynamically in multi-SIM - * devices. + * by AlternativeNetworkAccessService or carrier apps to switch primary and CBRS + * subscription dynamically in multi-SIM devices. * - * @param slotId which slot is preferred to for cellular data. + * @param slotId which slot is preferred to for cellular data. If it's INVALID, it means + * it's unset and defaultDataSubId is used to determine which modem is preferred. * @hide * */ diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl index 86818593a32b..64ea6083d63d 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -53,5 +53,6 @@ oneway interface IPhoneStateListener { void onUserMobileDataStateChanged(in boolean enabled); void onPhoneCapabilityChanged(in PhoneCapability capability); void onRadioPowerStateChanged(in int state); + void onPreferredDataSubIdChanged(in int subId); } diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 2f40fcc844f3..0bbfa9a83b8b 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -80,4 +80,5 @@ interface ITelephonyRegistry { void notifyUserMobileDataStateChangedForPhoneId(in int phoneId, in int subId, in boolean state); void notifyPhoneCapabilityChanged(in PhoneCapability capability); void notifyRadioPowerStateChanged(in int state); + void notifyPreferredDataSubIdChanged(int preferredSubId); } |