Support CarrierConfigChangeListener in CarrierConfigLoader
Bug: 244087782
Test: atest CarrierConfigLoaderTest
Merged-In: Ic383135b3cc09f282f99b21839703d6b80032f3c
Change-Id: Ic383135b3cc09f282f99b21839703d6b80032f3c
(cherry picked from commit d63ba34af214f54242bc5fd08b7d09fb63c1fa68)
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 69f29bd..8409ff8 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -52,6 +52,7 @@
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyRegistryManager;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.LocalLog;
@@ -808,33 +809,39 @@
}
private void broadcastConfigChangedIntent(int phoneId, boolean addSubIdExtra) {
+ int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ int carrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
+ int specificCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
+
Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
Intent.FLAG_RECEIVER_FOREGROUND);
if (addSubIdExtra) {
- int simApplicationState = TelephonyManager.SIM_STATE_UNKNOWN;
- int subId = SubscriptionManager.getSubscriptionId(phoneId);
- if (SubscriptionManager.isValidSubscriptionId(subId)) {
- TelephonyManager telMgr = TelephonyManager.from(mContext)
- .createForSubscriptionId(subId);
- simApplicationState = telMgr.getSimApplicationState();
- }
- logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId
- + " simApplicationState " + simApplicationState);
+ int simApplicationState = getSimApplicationStateForPhone(phoneId);
// Include subId/carrier id extra only if SIM records are loaded
if (simApplicationState != TelephonyManager.SIM_STATE_UNKNOWN
&& simApplicationState != TelephonyManager.SIM_STATE_NOT_READY) {
+ subId = SubscriptionManager.getSubscriptionId(phoneId);
+ carrierId = getCarrierIdForPhoneId(phoneId);
+ specificCarrierId = getSpecificCarrierIdForPhoneId(phoneId);
+ intent.putExtra(TelephonyManager.EXTRA_SPECIFIC_CARRIER_ID, specificCarrierId);
SubscriptionManager.putPhoneIdAndSubIdExtra(intent, phoneId);
- intent.putExtra(TelephonyManager.EXTRA_SPECIFIC_CARRIER_ID,
- getSpecificCarrierIdForPhoneId(phoneId));
- intent.putExtra(TelephonyManager.EXTRA_CARRIER_ID, getCarrierIdForPhoneId(phoneId));
+ intent.putExtra(TelephonyManager.EXTRA_CARRIER_ID, carrierId);
}
}
intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, phoneId);
intent.putExtra(CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK,
mFromSystemUnlocked[phoneId]);
+
+ TelephonyRegistryManager trm = mContext.getSystemService(TelephonyRegistryManager.class);
+ // Unlike broadcast, we wouldn't notify registrants on carrier config change when device is
+ // unlocked. Only real carrier config change will send the notification to registrants.
+ if (trm != null && !mFromSystemUnlocked[phoneId]) {
+ trm.notifyCarrierConfigChanged(phoneId, subId, carrierId, specificCarrierId);
+ }
+
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
- int subId = SubscriptionManager.getSubscriptionId(phoneId);
+
if (SubscriptionManager.isValidSubscriptionId(subId)) {
logd("Broadcast CARRIER_CONFIG_CHANGED for phone " + phoneId + ", subId=" + subId);
} else {
@@ -844,6 +851,17 @@
mFromSystemUnlocked[phoneId] = false;
}
+ private int getSimApplicationStateForPhone(int phoneId) {
+ int simApplicationState = TelephonyManager.SIM_STATE_UNKNOWN;
+ int subId = SubscriptionManager.getSubscriptionId(phoneId);
+ if (SubscriptionManager.isValidSubscriptionId(subId)) {
+ TelephonyManager telMgr = TelephonyManager.from(mContext)
+ .createForSubscriptionId(subId);
+ simApplicationState = telMgr.getSimApplicationState();
+ }
+ return simApplicationState;
+ }
+
/** Binds to the default or carrier config app. */
private boolean bindToConfigPackage(@NonNull String pkgName, int phoneId, int eventId) {
logdWithLocalLog("Binding to " + pkgName + " for phone " + phoneId);
diff --git a/tests/src/com/android/phone/CarrierConfigLoaderTest.java b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
index 60c3a84..5473c94 100644
--- a/tests/src/com/android/phone/CarrierConfigLoaderTest.java
+++ b/tests/src/com/android/phone/CarrierConfigLoaderTest.java
@@ -28,7 +28,9 @@
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
@@ -44,6 +46,7 @@
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyRegistryManager;
import android.testing.TestableLooper;
import androidx.test.InstrumentationRegistry;
@@ -85,6 +88,7 @@
@Mock PackageInfo mPackageInfo;
@Mock SubscriptionInfoUpdater mSubscriptionInfoUpdater;
@Mock SharedPreferences mSharedPreferences;
+ @Mock TelephonyRegistryManager mTelephonyRegistryManager;
private TelephonyManager mTelephonyManager;
private CarrierConfigLoader mCarrierConfigLoader;
@@ -96,6 +100,7 @@
public void setUp() throws Exception {
super.setUp();
+ // TODO: replace doReturn/when with when/thenReturn which is more readable
doReturn(mSharedPreferences).when(mContext).getSharedPreferences(anyString(), anyInt());
doReturn(Build.FINGERPRINT).when(mSharedPreferences).getString(eq("build_fingerprint"),
any());
@@ -114,6 +119,10 @@
eq(PLATFORM_CARRIER_CONFIG_PACKAGE), eq(0) /*flags*/);
doReturn(PLATFORM_CARRIER_CONFIG_PACKAGE_VERSION_CODE).when(
mPackageInfo).getLongVersionCode();
+ when(mContext.getSystemServiceName(TelephonyRegistryManager.class)).thenReturn(
+ Context.TELEPHONY_REGISTRY_SERVICE);
+ when(mContext.getSystemService(TelephonyRegistryManager.class)).thenReturn(
+ mTelephonyRegistryManager);
mHandlerThread = new HandlerThread("CarrierConfigLoaderTest");
mHandlerThread.start();
@@ -185,6 +194,11 @@
assertThat(mCarrierConfigLoader.getNoSimConfig().getInt(CARRIER_CONFIG_EXAMPLE_KEY))
.isEqualTo(CARRIER_CONFIG_EXAMPLE_VALUE);
verify(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
+ verify(mTelephonyRegistryManager).notifyCarrierConfigChanged(
+ eq(DEFAULT_PHONE_ID),
+ eq(SubscriptionManager.INVALID_SUBSCRIPTION_ID),
+ eq(TelephonyManager.UNKNOWN_CARRIER_ID),
+ eq(TelephonyManager.UNKNOWN_CARRIER_ID));
}
/**