summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Malcolm Chen <refuhoo@google.com> 2018-09-24 20:01:32 -0700
committer Malcolm Chen <refuhoo@google.com> 2018-10-22 13:51:09 -0700
commitc1873af9c56e7840b6ec9b85b919aa65b11c6e15 (patch)
treef8f692f25842024a67ab6ef94b58c7511abea838
parent7fff7e5eff2640fac3729ff4f955f8e37cebf75f (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
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java36
-rw-r--r--telephony/java/android/telephony/PhoneStateListener.java28
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java7
-rw-r--r--telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl1
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl1
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);
}