Replaced send broadcast with user aware version
When device is running in HSUM mode, clients might be running
as a different user than system user. The broadcast needs to send
to all users to ensure both system and current user can receive it.
Bug: 362554272
Test: Manually test in HSUM devices
Test: atest FrameworksTelephonyTests
Flag: com.android.internal.telephony.flags.hsum_broadcast
Change-Id: If75f63beb0bce5d76ad03675cb41768b38443c1f
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 8d6dc07..0433a33 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -600,7 +600,7 @@
}
}
}
- RcsProvisioningMonitor.make(this);
+ RcsProvisioningMonitor.make(this, mFeatureFlags);
}
// Start TelephonyDebugService After the default phone is created.
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
index 87a2869..eac8034 100644
--- a/src/com/android/phone/RcsProvisioningMonitor.java
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -21,6 +21,7 @@
import static com.android.internal.telephony.TelephonyStatsLog.RCS_CLIENT_PROVISIONING_STATS__EVENT__TRIGGER_RCS_RECONFIGURATION;
import android.Manifest;
+import android.annotation.NonNull;
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
import android.content.BroadcastReceiver;
@@ -51,6 +52,7 @@
import com.android.ims.FeatureUpdates;
import com.android.ims.RcsFeatureManager;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.telephony.metrics.RcsStats.RcsProvisioningCallback;
import com.android.internal.telephony.util.HandlerExecutor;
@@ -110,6 +112,9 @@
private static RcsProvisioningMonitor sInstance;
+ @NonNull
+ private final FeatureFlags mFeatureFlags;
+
private final SubscriptionManager.OnSubscriptionsChangedListener mSubChangedListener =
new SubscriptionManager.OnSubscriptionsChangedListener() {
@Override
@@ -481,8 +486,10 @@
@VisibleForTesting
public RcsProvisioningMonitor(PhoneGlobals app, Looper looper, RoleManagerAdapter roleManager,
- FeatureConnectorFactory<RcsFeatureManager> factory, RcsStats rcsStats) {
+ FeatureConnectorFactory<RcsFeatureManager> factory, RcsStats rcsStats,
+ @NonNull FeatureFlags flags) {
mPhone = app;
+ mFeatureFlags = flags;
mHandler = new MyHandler(looper);
mCarrierConfigManager = mPhone.getSystemService(CarrierConfigManager.class);
mSubscriptionManager = mPhone.getSystemService(SubscriptionManager.class);
@@ -499,14 +506,15 @@
/**
* create an instance
*/
- public static RcsProvisioningMonitor make(PhoneGlobals app) {
+ public static RcsProvisioningMonitor make(@NonNull PhoneGlobals app,
+ @NonNull FeatureFlags flags) {
if (sInstance == null) {
logd("RcsProvisioningMonitor created.");
HandlerThread handlerThread = new HandlerThread(TAG);
handlerThread.start();
sInstance = new RcsProvisioningMonitor(app, handlerThread.getLooper(),
new RoleManagerAdapterImpl(app), RcsFeatureManager::getConnector,
- RcsStats.getInstance());
+ RcsStats.getInstance(), flags);
}
return sInstance;
}
@@ -871,9 +879,18 @@
// Only send permission to the default sms app if it has the correct permissions
// except test mode enabled
if (!mTestModeEnabled) {
- mPhone.sendBroadcast(intent, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION);
+ if (mFeatureFlags.hsumBroadcast()) {
+ mPhone.sendBroadcastAsUser(intent, UserHandle.ALL,
+ Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION);
+ } else {
+ mPhone.sendBroadcast(intent, Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION);
+ }
} else {
- mPhone.sendBroadcast(intent);
+ if (mFeatureFlags.hsumBroadcast()) {
+ mPhone.sendBroadcastAsUser(intent, UserHandle.ALL);
+ } else {
+ mPhone.sendBroadcast(intent);
+ }
}
}
diff --git a/src/com/android/phone/slice/SlicePurchaseController.java b/src/com/android/phone/slice/SlicePurchaseController.java
index 9a42e16..51255dd 100644
--- a/src/com/android/phone/slice/SlicePurchaseController.java
+++ b/src/com/android/phone/slice/SlicePurchaseController.java
@@ -40,6 +40,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
+import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.sysprop.TelephonyProperties;
import android.telephony.AnomalyReporter;
@@ -832,7 +833,11 @@
intent.putExtra(EXTRA_INTENT_NOTIFICATION_SHOWN, createPendingIntent(
ACTION_SLICE_PURCHASE_APP_RESPONSE_NOTIFICATION_SHOWN, capability, false));
logd("Broadcasting start intent to SlicePurchaseBroadcastReceiver.");
- mPhone.getContext().sendBroadcast(intent);
+ if (mFeatureFlags.hsumBroadcast()) {
+ mPhone.getContext().sendBroadcastAsUser(intent, UserHandle.ALL);
+ } else {
+ mPhone.getContext().sendBroadcast(intent);
+ }
// Listen for responses from the slice purchase application
mSlicePurchaseControllerBroadcastReceivers.put(capability,
@@ -913,7 +918,11 @@
intent.putExtra(EXTRA_PHONE_ID, mPhone.getPhoneId());
intent.putExtra(EXTRA_PREMIUM_CAPABILITY, capability);
logd("Broadcasting timeout intent to SlicePurchaseBroadcastReceiver.");
- mPhone.getContext().sendBroadcast(intent);
+ if (mFeatureFlags.hsumBroadcast()) {
+ mPhone.getContext().sendBroadcastAsUser(intent, UserHandle.ALL);
+ } else {
+ mPhone.getContext().sendBroadcast(intent);
+ }
handlePurchaseResult(
capability, TelephonyManager.PURCHASE_PREMIUM_CAPABILITY_RESULT_TIMEOUT, true);
diff --git a/src/com/android/phone/vvm/CarrierVvmPackageInstalledReceiver.java b/src/com/android/phone/vvm/CarrierVvmPackageInstalledReceiver.java
index 7ade1ab..e866ce0 100644
--- a/src/com/android/phone/vvm/CarrierVvmPackageInstalledReceiver.java
+++ b/src/com/android/phone/vvm/CarrierVvmPackageInstalledReceiver.java
@@ -21,6 +21,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.os.PersistableBundle;
+import android.os.UserHandle;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
@@ -29,6 +30,8 @@
import android.text.TextUtils;
import android.util.ArraySet;
+import com.android.internal.telephony.flags.Flags;
+
import java.util.Collections;
import java.util.Set;
@@ -106,7 +109,11 @@
Intent broadcast = new Intent(ACTION_CARRIER_VVM_PACKAGE_INSTALLED);
broadcast.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName);
broadcast.setPackage(vvmPackage);
- context.sendBroadcast(broadcast);
+ if (Flags.hsumBroadcast()) {
+ context.sendBroadcastAsUser(broadcast, UserHandle.ALL);
+ } else {
+ context.sendBroadcast(broadcast);
+ }
}
}
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
index fe13d56..2614460 100644
--- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -69,6 +69,7 @@
import com.android.ims.FeatureConnector;
import com.android.ims.RcsFeatureManager;
import com.android.internal.telephony.ITelephony;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.RcsStats;
import org.junit.After;
@@ -191,6 +192,9 @@
@Mock
private RcsStats.RcsProvisioningCallback mRcsProvisioningCallback;
+ @Mock
+ private FeatureFlags mFeatureFlags;
+
private Executor mExecutor = new Executor() {
@Override
public void execute(Runnable r) {
@@ -251,6 +255,7 @@
.thenReturn(mSubscriptionManager);
when(mPhone.getSystemService(eq(Context.TELEPHONY_REGISTRY_SERVICE)))
.thenReturn(mTelephonyRegistryManager);
+ when(mFeatureFlags.hsumBroadcast()).thenReturn(true);
mBundle = new PersistableBundle();
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
@@ -398,7 +403,7 @@
public void testCarrierConfigChanged() throws Exception {
createMonitor(1);
// should not broadcast message if carrier config is not ready
- verify(mPhone, never()).sendBroadcast(any(), any());
+ verify(mPhone, never()).sendBroadcastAsUser(any(), eq(UserHandle.ALL), any());
when(mPackageManager.hasSystemFeature(
eq(PackageManager.FEATURE_TELEPHONY_IMS_SINGLE_REGISTRATION))).thenReturn(true);
@@ -410,7 +415,8 @@
broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
processAllMessages();
- verify(mPhone, times(1)).sendBroadcast(captorIntent.capture(), any());
+ verify(mPhone, times(1)).sendBroadcastAsUser(captorIntent.capture(),
+ eq(UserHandle.ALL), any());
Intent capturedIntent = captorIntent.getValue();
assertEquals(capturedIntent.getAction(),
ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
@@ -424,7 +430,8 @@
broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
processAllMessages();
- verify(mPhone, times(2)).sendBroadcast(captorIntent.capture(), any());
+ verify(mPhone, times(2)).sendBroadcastAsUser(captorIntent.capture(),
+ eq(UserHandle.ALL), any());
capturedIntent = captorIntent.getValue();
assertEquals(capturedIntent.getAction(),
ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
@@ -439,7 +446,8 @@
broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
processAllMessages();
- verify(mPhone, times(3)).sendBroadcast(captorIntent.capture(), any());
+ verify(mPhone, times(3)).sendBroadcastAsUser(captorIntent.capture(),
+ eq(UserHandle.ALL), any());
capturedIntent = captorIntent.getValue();
assertEquals(capturedIntent.getAction(),
ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
@@ -592,7 +600,7 @@
processAllMessages();
// should not broadcast message as no carrier config change happens
- verify(mPhone, never()).sendBroadcast(any(), any());
+ verify(mPhone, never()).sendBroadcastAsUser(any(), eq(UserHandle.ALL), any());
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
when(mPackageManager.hasSystemFeature(
@@ -604,7 +612,8 @@
broadcastCarrierConfigChange(FAKE_SUB_ID_BASE);
processAllMessages();
- verify(mPhone, times(1)).sendBroadcast(captorIntent.capture(), any());
+ verify(mPhone, times(1)).sendBroadcastAsUser(captorIntent.capture(),
+ eq(UserHandle.ALL), any());
Intent capturedIntent = captorIntent.getValue();
assertEquals(capturedIntent.getAction(),
ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
@@ -614,7 +623,8 @@
// should broadcast message when default messaging application changed if carrier config
// has been loaded
- verify(mPhone, times(2)).sendBroadcast(captorIntent.capture(), any());
+ verify(mPhone, times(2)).sendBroadcastAsUser(captorIntent.capture(),
+ eq(UserHandle.ALL), any());
capturedIntent = captorIntent.getValue();
assertEquals(capturedIntent.getAction(),
ProvisioningManager.ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE);
@@ -848,7 +858,7 @@
.thenReturn(mFeatureConnector);
when(mFeatureManager.getConfig()).thenReturn(mIImsConfig);
mRcsProvisioningMonitor = new RcsProvisioningMonitor(mPhone, mHandlerThread.getLooper(),
- mRoleManager, mFeatureFactory, mRcsStats);
+ mRoleManager, mFeatureFactory, mRcsStats, mFeatureFlags);
mHandler = mRcsProvisioningMonitor.getHandler();
try {
mLooper = new TestableLooper(mHandler.getLooper());