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());