diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java index b2859f6e719e1..3acbc3a00d579 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java @@ -92,6 +92,7 @@ import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.tv.TvStatusBar; +import com.android.systemui.theme.ThemeOverlayController; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.volume.VolumeUI; @@ -182,6 +183,18 @@ public abstract class CarSystemUIBinder { public abstract SystemUI bindsSizeCompatModeActivityController( SizeCompatModeActivityController sysui); + /** Inject into SliceBroadcastRelayHandler. */ + @Binds + @IntoMap + @ClassKey(SliceBroadcastRelayHandler.class) + public abstract SystemUI bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui); + + /** Inject into ThemeOverlayController. */ + @Binds + @IntoMap + @ClassKey(ThemeOverlayController.class) + public abstract SystemUI bindThemeOverlayController(ThemeOverlayController sysui); + /** Inject into StatusBar. */ @Binds @IntoMap diff --git a/packages/SystemUI/docs/broadcasts.md b/packages/SystemUI/docs/broadcasts.md new file mode 100644 index 0000000000000..56a637fe588c1 --- /dev/null +++ b/packages/SystemUI/docs/broadcasts.md @@ -0,0 +1,89 @@ +# Using SystemUI's BroadcastDispatcher + +## What is this dispatcher? + +This is an internal dispatcher class for global broadcasts that SystemUI components want to receive. The dispatcher consolidates most `BroadcastReceiver` that exist in SystemUI by merging the `IntentFilter` and subscribing a single `BroadcastReceiver` per user with the system. + +## Why use the dispatcher? + +Having a single `BroadcastReceiver` in SystemUI improves the multi dispatch situation that occurs whenever many classes are filtering for the same intent action. In particular: +* All supported `BroadcastReceiver` will be aggregated into one single receiver per user. +* Whenever there is a broadcast, the number of IPC calls from `system_server` into SystemUI will be reduced to one per user (plus one for `USER_ALL`). This is meaninful for actions that are filtered by `BroadcastReceiver` in multiple classes. +*There could be more than one per user in the case of unsupported filters.* +* The dispatcher immediately moves out of the main thread upon broadcast, giving back control to `system_server`. This improves the total dispatch time for broadcasts and prevents from timing out. +* The dispatcher significantly reduces time spent in main thread by handling most operations in a background thread and only using the main thread for subscribing/unsubscribind and dispatching where appropriate. + +## Should I use the dispatcher? + +The dispatcher supports `BroadcastReceiver` dynamic subscriptions in the following cases: + +* The `IntentFilter` contains at least one action. +* The `IntentFilter` may or may not contain categories. +* The `IntentFilter` **does not** contain data types, data schemes, data authorities or data paths. +* The broadcast **is not** gated behind a permission. + +Additionally, the dispatcher supports the following: + +* Subscriptions can be done in any thread. +* Broadcasts will be dispatched on the main thread (same as `system_server`) by default but a `Handler` can be specified for dispatching +* A `UserHandle` can be provided to filter the broadcasts by user. + +If introducing a new `BroadcastReceiver` (not declared in `AndroidManifest`) that satisfies the constraints above, use the dispatcher to reduce the load on `system_server`. + +Do not use the dispatcher to obtain the last broadcast (by passing a null `BroadcastReceiver`). `BroadcastDispatcher#registerReceiver` **does not** return the last sticky Intent. + +Additionally, if listening to some broadcast is latency critical (beyond 100ms of latency), consider registering with Context instead. + +## How do I use the dispatcher? + +Acquire the dispatcher by using `@Inject` to obtain a `BroadcastDispatcher`. Then, use the following methods in that instance. + +### Subscribe + +```kotlin +/** + * Register a receiver for broadcast with the dispatcher + * + * @param receiver A receiver to dispatch the [Intent] + * @param filter A filter to determine what broadcasts should be dispatched to this receiver. + * It will only take into account actions and categories for filtering. It must + * have at least one action. + * @param handler A handler to dispatch [BroadcastReceiver.onReceive]. By default, it is the + * main handler. Pass `null` to use the default. + * @param user A user handle to determine which broadcast should be dispatched to this receiver. + * By default, it is the current user. + * @throws IllegalArgumentException if the filter has other constraints that are not actions or + * categories or the filter has no actions. + */ +@JvmOverloads +fun registerReceiver(BroadcastReceiver, IntentFilter, Handler? = mainHandler, UserHandle = context.user) +``` + +All subscriptions are done with the same overloaded method. As specified in the doc, in order to pass a `UserHandle` with the default `Handler`, pass `null` for the `Handler`. + +In the same way as with `Context`, subscribing the same `BroadcastReceiver` for the same user using different filters will result on two subscriptions, not in replacing the filter. + +### Unsubscribe + +There are two methods to unsubscribe a given `BroadcastReceiver`. One that will remove it for all users and another where the user can be specified. This allows using separate subscriptions of the same receiver for different users and manipulating them separately. + +```kotlin +/** + * Unregister receiver for all users. + *
+ * This will remove every registration of [receiver], not those done just with [UserHandle.ALL]. + * + * @param receiver The receiver to unregister. It will be unregistered for all users. + */ +fun unregisterReceiver(BroadcastReceiver) + +/** + * Unregister receiver for a particular user. + * + * @param receiver The receiver to unregister. It will be unregistered for all users. + * @param user The user associated to the registered [receiver]. It can be [UserHandle.ALL]. + */ +fun unregisterReceiverForUser(BroadcastReceiver, UserHandle) +``` + +Unregistering can be done even if the `BroadcastReceiver` has never been registered with `BroadcastDispatcher`. In that case, it is a No-Op. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 8373fb24ee4fc..6685db130d4ae 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -102,6 +102,7 @@ import com.android.systemui.DejankUtils; import com.android.systemui.DumpController; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainLooper; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; @@ -1502,6 +1503,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab @VisibleForTesting @Inject protected KeyguardUpdateMonitor(Context context, @MainLooper Looper mainLooper, + BroadcastDispatcher broadcastDispatcher, DumpController dumpController) { mContext = context; mSubscriptionManager = SubscriptionManager.from(context); @@ -1645,12 +1647,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); - context.registerReceiver(mBroadcastReceiver, filter, null, mHandler); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, mHandler); final IntentFilter bootCompleteFilter = new IntentFilter(); bootCompleteFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); bootCompleteFilter.addAction(Intent.ACTION_BOOT_COMPLETED); - context.registerReceiver(mBroadcastReceiver, bootCompleteFilter, null, mHandler); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, bootCompleteFilter, mHandler); final IntentFilter allUserFilter = new IntentFilter(); allUserFilter.addAction(Intent.ACTION_USER_INFO_CHANGED); @@ -1661,8 +1663,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab allUserFilter.addAction(ACTION_USER_UNLOCKED); allUserFilter.addAction(ACTION_USER_STOPPED); allUserFilter.addAction(ACTION_USER_REMOVED); - context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, allUserFilter, - null, mHandler); + broadcastDispatcher.registerReceiver(mBroadcastAllReceiver, allUserFilter, mHandler, + UserHandle.ALL); mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionListener); try { diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 9e2464ea4fbb7..dfabe696cf71e 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -32,6 +32,7 @@ import android.view.LayoutInflater; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Observer; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManager.DockEventListener; @@ -125,9 +126,9 @@ public final class ClockManager { @Inject public ClockManager(Context context, InjectionInflationController injectionInflater, PluginManager pluginManager, SysuiColorExtractor colorExtractor, - @Nullable DockManager dockManager) { + @Nullable DockManager dockManager, BroadcastDispatcher broadcastDispatcher) { this(context, injectionInflater, pluginManager, colorExtractor, - context.getContentResolver(), new CurrentUserObservable(context), + context.getContentResolver(), new CurrentUserObservable(broadcastDispatcher), new SettingsWrapper(context.getContentResolver()), dockManager); } diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index fef9198d670a3..2afcb12da730b 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -51,6 +51,7 @@ import androidx.annotation.StyleRes; import com.android.settingslib.Utils; import com.android.settingslib.graph.ThemedBatteryDrawable; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.settings.CurrentUserTracker; @@ -112,16 +113,13 @@ public class BatteryMeterView extends LinearLayout implements private int mNonAdaptedForegroundColor; private int mNonAdaptedBackgroundColor; - public BatteryMeterView(Context context) { - this(context, null, 0); - } - public BatteryMeterView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BatteryMeterView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + BroadcastDispatcher broadcastDispatcher = Dependency.get(BroadcastDispatcher.class); setOrientation(LinearLayout.HORIZONTAL); setGravity(Gravity.CENTER_VERTICAL | Gravity.START); @@ -161,7 +159,7 @@ public class BatteryMeterView extends LinearLayout implements // Init to not dark at all. onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mUser = newUserId; diff --git a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java index 3a8536b8127e0..4afa969874994 100644 --- a/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java +++ b/packages/SystemUI/src/com/android/systemui/GuestResumeSessionReceiver.java @@ -32,6 +32,7 @@ import android.provider.Settings; import android.util.Log; import android.view.WindowManagerGlobal; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.phone.SystemUIDialog; /** @@ -45,10 +46,14 @@ public class GuestResumeSessionReceiver extends BroadcastReceiver { private Dialog mNewSessionDialog; - public void register(Context context) { + /** + * Register this receiver with the {@link BroadcastDispatcher} + * + * @param broadcastDispatcher to register the receiver. + */ + public void register(BroadcastDispatcher broadcastDispatcher) { IntentFilter f = new IntentFilter(Intent.ACTION_USER_SWITCHED); - context.registerReceiverAsUser(this, UserHandle.SYSTEM, - f, null /* permission */, null /* scheduler */); + broadcastDispatcher.registerReceiver(this, f, null /* handler */, UserHandle.SYSTEM); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/LatencyTester.java b/packages/SystemUI/src/com/android/systemui/LatencyTester.java index 30a60abfcd869..1a47daceafcce 100644 --- a/packages/SystemUI/src/com/android/systemui/LatencyTester.java +++ b/packages/SystemUI/src/com/android/systemui/LatencyTester.java @@ -29,6 +29,7 @@ import android.os.SystemClock; import com.android.internal.util.LatencyTracker; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.phone.BiometricUnlockController; import javax.inject.Inject; @@ -49,13 +50,16 @@ public class LatencyTester extends SystemUI { "com.android.systemui.latency.ACTION_TURN_ON_SCREEN"; private final BiometricUnlockController mBiometricUnlockController; private final PowerManager mPowerManager; + private final BroadcastDispatcher mBroadcastDispatcher; @Inject public LatencyTester(Context context, BiometricUnlockController biometricUnlockController, - PowerManager powerManager) { + PowerManager powerManager, BroadcastDispatcher broadcastDispatcher) { super(context); + mBiometricUnlockController = biometricUnlockController; mPowerManager = powerManager; + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -67,7 +71,7 @@ public class LatencyTester extends SystemUI { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_FINGERPRINT_WAKE); filter.addAction(ACTION_TURN_ON_SCREEN); - mContext.registerReceiver(new BroadcastReceiver() { + mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 8a99e451934e2..ab7eec52a959b 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -67,6 +67,8 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.systemui.RegionInterceptingFrameLayout.RegionInterceptableView; +import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.plugins.qs.QS; @@ -103,6 +105,9 @@ public class ScreenDecorations extends SystemUI implements Tunable { private final Lazy mStatusBarLazy; private DisplayManager mDisplayManager; + private final BroadcastDispatcher mBroadcastDispatcher; + private final Handler mMainHandler; + private final TunerService mTunerService; private DisplayManager.DisplayListener mDisplayListener; @VisibleForTesting @@ -140,9 +145,16 @@ public class ScreenDecorations extends SystemUI implements Tunable { } @Inject - public ScreenDecorations(Context context, Lazy statusBarLazy) { + public ScreenDecorations(Context context, + Lazy statusBarLazy, + @MainHandler Handler handler, + BroadcastDispatcher broadcastDispatcher, + TunerService tunerService) { super(context); mStatusBarLazy = statusBarLazy; + mMainHandler = handler; + mBroadcastDispatcher = broadcastDispatcher; + mTunerService = tunerService; } @Override @@ -239,8 +251,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mWindowManager.getDefaultDisplay().getMetrics(metrics); mDensity = metrics.density; - Dependency.get(Dependency.MAIN_HANDLER).post( - () -> Dependency.get(TunerService.class).addTunable(this, SIZE)); + mMainHandler.post(() -> mTunerService.addTunable(this, SIZE)); // Watch color inversion and invert the overlay as needed. mColorInversionSetting = new SecureSetting(mContext, mHandler, @@ -255,7 +266,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); - mContext.registerReceiver(mIntentReceiver, filter, null /* permission */, mHandler); + mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter, mHandler); mOverlay.addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java b/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java index 92fbd259b4718..7a4ef2b7bbf22 100644 --- a/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java +++ b/packages/SystemUI/src/com/android/systemui/SliceBroadcastRelayHandler.java @@ -28,19 +28,27 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.SliceBroadcastRelay; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; +import javax.inject.Singleton; /** * Allows settings to register certain broadcasts to launch the settings app for pinned slices. * @see SliceBroadcastRelay */ +@Singleton public class SliceBroadcastRelayHandler extends SystemUI { private static final String TAG = "SliceBroadcastRelay"; private static final boolean DEBUG = false; private final ArrayMap mRelays = new ArrayMap<>(); + private final BroadcastDispatcher mBroadcastDispatcher; - public SliceBroadcastRelayHandler(Context context) { + @Inject + public SliceBroadcastRelayHandler(Context context, BroadcastDispatcher broadcastDispatcher) { super(context); + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -48,9 +56,10 @@ public class SliceBroadcastRelayHandler extends SystemUI { if (DEBUG) Log.d(TAG, "Start"); IntentFilter filter = new IntentFilter(SliceBroadcastRelay.ACTION_REGISTER); filter.addAction(SliceBroadcastRelay.ACTION_UNREGISTER); - mContext.registerReceiver(mReceiver, filter); + mBroadcastDispatcher.registerReceiver(mReceiver, filter); } + // This does not use BroadcastDispatcher as the filter may have schemas or mime types. @VisibleForTesting void handleIntent(Intent intent) { if (SliceBroadcastRelay.ACTION_REGISTER.equals(intent.getAction())) { diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java index 3ff1b97c37538..9a277e8fa77cc 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java @@ -34,6 +34,7 @@ import androidx.slice.Clock; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.model.SysUiState; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -161,6 +162,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { private final Lazy mSysUiFlagContainer; private final Lazy mWakefulnessLifecycle; private final Lazy mPackageManagerWrapper; + private final Lazy mBroadcastDispatcher; private boolean mOnLockscreen; private boolean mIsDozing; @@ -193,7 +195,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { Lazy overviewProxyService, Lazy sysUiFlagContainer, Lazy wakefulnessLifecycle, - Lazy packageManagerWrapper) { + Lazy packageManagerWrapper, + Lazy broadcastDispatcher) { mClock = clock; mHandler = handler; mPhenotypeHelper = phenotypeHelper; @@ -207,6 +210,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { mDefaultHomeIntentFilter.addAction(action); } + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -215,7 +219,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController { mAssistHandleCallbacks = callbacks; mConsecutiveTaskSwitches = 0; mDefaultHome = getCurrentDefaultHome(); - context.registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter); + mBroadcastDispatcher.get() + .registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter); mOnLockscreen = onLockscreen(mStatusBarStateController.get().getState()); mIsDozing = mStatusBarStateController.get().isDozing(); mStatusBarStateController.get().addCallback(mStatusBarStateListener); diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index b7a6167df6bca..398826c552bdd 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -45,6 +45,7 @@ import com.android.systemui.ConfigurationChangedReceiver; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.assist.ui.DefaultUiController; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -161,14 +162,15 @@ public class AssistManager implements ConfigurationChangedReceiver { Context context, AssistUtils assistUtils, AssistHandleBehaviorController handleController, - CommandQueue commandQueue) { + CommandQueue commandQueue, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mDeviceProvisionedController = controller; mCommandQueue = commandQueue; mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mAssistUtils = assistUtils; mAssistDisclosure = new AssistDisclosure(context, new Handler()); - mPhoneStateMonitor = new PhoneStateMonitor(context); + mPhoneStateMonitor = new PhoneStateMonitor(context, broadcastDispatcher); mHandleController = handleController; registerVoiceInteractionSessionListener(); diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java index e73dc4a57bd79..95d611a605d2a 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/assist/PhoneStateMonitor.java @@ -29,6 +29,7 @@ import androidx.annotation.Nullable; import com.android.systemui.Dependency; import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; @@ -67,7 +68,7 @@ final class PhoneStateMonitor { private boolean mLauncherShowing; @Nullable private ComponentName mDefaultHome; - PhoneStateMonitor(Context context) { + PhoneStateMonitor(Context context, BroadcastDispatcher broadcastDispatcher) { mContext = context; mStatusBarStateController = Dependency.get(StatusBarStateController.class); @@ -77,7 +78,7 @@ final class PhoneStateMonitor { for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { intentFilter.addAction(action); } - mContext.registerReceiver(new BroadcastReceiver() { + broadcastDispatcher.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mDefaultHome = getCurrentDefaultHome(); diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt index ddda95ad8fda5..24357a740331e 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt @@ -31,6 +31,7 @@ import com.android.systemui.Dumpable import java.io.FileDescriptor import java.io.PrintWriter import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger private const val MSG_REGISTER_RECEIVER = 0 private const val MSG_UNREGISTER_RECEIVER = 1 @@ -50,6 +51,13 @@ class UserBroadcastDispatcher( private val bgLooper: Looper ) : BroadcastReceiver(), Dumpable { + companion object { + // Used only for debugging. If not debugging, this variable will not be accessed and all + // received broadcasts will be tagged with 0. However, as DEBUG is false, nothing will be + // logged + val index = AtomicInteger(0) + } + private val bgHandler = object : Handler(bgLooper) { override fun handleMessage(msg: Message) { when (msg.what) { @@ -97,7 +105,10 @@ class UserBroadcastDispatcher( private val receiverToReceiverData = ArrayMap>() override fun onReceive(context: Context, intent: Intent) { - bgHandler.post(HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult)) + val id = if (DEBUG) index.getAndIncrement() else 0 + if (DEBUG) Log.w(TAG, "[$id] Received $intent") + bgHandler.post( + HandleBroadcastRunnable(actionsToReceivers, context, intent, pendingResult, id)) } /** @@ -161,17 +172,19 @@ class UserBroadcastDispatcher( val actionsToReceivers: Map>, val context: Context, val intent: Intent, - val pendingResult: PendingResult + val pendingResult: PendingResult, + val index: Int ) : Runnable { override fun run() { - if (DEBUG) Log.w(TAG, "Dispatching $intent") + if (DEBUG) Log.w(TAG, "[$index] Dispatching $intent") actionsToReceivers.get(intent.action) ?.filter { it.filter.hasAction(intent.action) && it.filter.matchCategories(intent.categories) == null } ?.forEach { it.handler.post { - if (DEBUG) Log.w(TAG, "Dispatching to ${it.receiver}") + if (DEBUG) Log.w(TAG, + "[$index] Dispatching ${intent.action} to ${it.receiver}") it.receiver.pendingResult = pendingResult it.receiver.onReceive(context, intent) } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java index 61ded138134cf..4593164869fd0 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultActivityBinder.java @@ -19,7 +19,11 @@ package com.android.systemui.dagger; import android.app.Activity; import com.android.systemui.ForegroundServicesDialog; +import com.android.systemui.keyguard.WorkLockActivity; +import com.android.systemui.settings.BrightnessDialog; import com.android.systemui.tuner.TunerActivity; +import com.android.systemui.usb.UsbDebuggingActivity; +import com.android.systemui.usb.UsbDebuggingSecondaryUserActivity; import dagger.Binds; import dagger.Module; @@ -42,4 +46,29 @@ public abstract class DefaultActivityBinder { @IntoMap @ClassKey(ForegroundServicesDialog.class) public abstract Activity bindForegroundServicesDialog(ForegroundServicesDialog activity); + + /** Inject into WorkLockActivity. */ + @Binds + @IntoMap + @ClassKey(WorkLockActivity.class) + public abstract Activity bindWorkLockActivity(WorkLockActivity activity); + + /** Inject into BrightnessDialog. */ + @Binds + @IntoMap + @ClassKey(BrightnessDialog.class) + public abstract Activity bindBrightnessDialog(BrightnessDialog activity); + + /** Inject into UsbDebuggingActivity. */ + @Binds + @IntoMap + @ClassKey(UsbDebuggingActivity.class) + public abstract Activity bindUsbDebuggingActivity(UsbDebuggingActivity activity); + + /** Inject into UsbDebuggingSecondaryUserActivity. */ + @Binds + @IntoMap + @ClassKey(UsbDebuggingSecondaryUserActivity.class) + public abstract Activity bindUsbDebuggingSecondaryUserActivity( + UsbDebuggingSecondaryUserActivity activity); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 248bf62230dd4..6d61b2fb99906 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -35,6 +35,7 @@ import android.view.LayoutInflater; import com.android.internal.logging.MetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.widget.LockPatternUtils; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgHandler; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.dagger.qualifiers.MainHandler; @@ -226,8 +227,8 @@ public class DependencyProvider { @Singleton @Provides public DeviceProvisionedController provideDeviceProvisionedController(Context context, - @MainHandler Handler mainHandler) { - return new DeviceProvisionedControllerImpl(context, mainHandler); + @MainHandler Handler mainHandler, BroadcastDispatcher broadcastDispatcher) { + return new DeviceProvisionedControllerImpl(context, mainHandler, broadcastDispatcher); } /** */ diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java index 88ec76c7706b8..4f429d3fd9c25 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java @@ -30,6 +30,7 @@ import com.android.systemui.ForegroundServiceController; import com.android.systemui.LatencyTester; import com.android.systemui.ScreenDecorations; import com.android.systemui.SizeCompatModeActivityController; +import com.android.systemui.SliceBroadcastRelayHandler; import com.android.systemui.SystemUI; import com.android.systemui.UiOffloadThread; import com.android.systemui.appops.AppOpsController; @@ -98,6 +99,7 @@ import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.tv.TvStatusBar; +import com.android.systemui.theme.ThemeOverlayController; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.volume.VolumeUI; @@ -184,12 +186,24 @@ public abstract class SystemUIBinder { public abstract SystemUI bindsSizeCompatModeActivityController( SizeCompatModeActivityController sysui); + /** Inject into SliceBroadcastRelayHandler. */ + @Binds + @IntoMap + @ClassKey(SliceBroadcastRelayHandler.class) + public abstract SystemUI bindSliceBroadcastRelayHandler(SliceBroadcastRelayHandler sysui); + /** Inject into StatusBar. */ @Binds @IntoMap @ClassKey(StatusBar.class) public abstract SystemUI bindsStatusBar(StatusBar sysui); + /** Inject into ThemeOverlayController. */ + @Binds + @IntoMap + @ClassKey(ThemeOverlayController.class) + public abstract SystemUI bindThemeOverlayController(ThemeOverlayController sysui); + /** Inject into TvStatusBar. */ @Binds @IntoMap diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index 33f68cfc1492b..eaa72dc4fb8cc 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -29,6 +29,7 @@ import android.os.Handler; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; import com.android.systemui.SystemUIApplication; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.FalsingManager; @@ -58,6 +59,7 @@ public class DozeFactory { private final DelayedWakeLock.Builder mDelayedWakeLockBuilder; private final Handler mHandler; private final BiometricUnlockController mBiometricUnlockController; + private final BroadcastDispatcher mBroadcastDispatcher; @Inject public DozeFactory(FalsingManager falsingManager, DozeLog dozeLog, @@ -67,7 +69,8 @@ public class DozeFactory { DockManager dockManager, @Nullable IWallpaperManager wallpaperManager, ProximitySensor proximitySensor, DelayedWakeLock.Builder delayedWakeLockBuilder, Handler handler, - BiometricUnlockController biometricUnlockController) { + BiometricUnlockController biometricUnlockController, + BroadcastDispatcher broadcastDispatcher) { mFalsingManager = falsingManager; mDozeLog = dozeLog; mDozeParameters = dozeParameters; @@ -82,6 +85,7 @@ public class DozeFactory { mDelayedWakeLockBuilder = delayedWakeLockBuilder; mHandler = handler; mBiometricUnlockController = biometricUnlockController; + mBroadcastDispatcher = broadcastDispatcher; } /** Creates a DozeMachine with its parts for {@code dozeService}. */ @@ -123,8 +127,8 @@ public class DozeFactory { DozeParameters params, Handler handler) { Sensor sensor = DozeSensors.findSensorWithType(sensorManager, context.getString(R.string.doze_brightness_sensor_type)); - return new DozeScreenBrightness(context, service, sensorManager, sensor, host, handler, - params.getPolicy()); + return new DozeScreenBrightness(context, service, sensorManager, sensor, + mBroadcastDispatcher, host, handler, params.getPolicy()); } private DozeTriggers createDozeTriggers(Context context, AsyncSensorManager sensorManager, @@ -134,7 +138,7 @@ public class DozeFactory { boolean allowPulseTriggers = true; return new DozeTriggers(context, machine, host, alarmManager, config, params, sensorManager, handler, wakeLock, allowPulseTriggers, dockManager, - mProximitySensor, dozeLog); + mProximitySensor, dozeLog, mBroadcastDispatcher); } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java index bd6882c01bbd0..39a256248aaee 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java @@ -31,6 +31,7 @@ import android.os.UserHandle; import android.provider.Settings; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; /** * Controls the screen brightness when dozing. @@ -49,6 +50,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi private final Handler mHandler; private final SensorManager mSensorManager; private final Sensor mLightSensor; + private final BroadcastDispatcher mBroadcastDispatcher; private final int[] mSensorToBrightness; private final int[] mSensorToScrimOpacity; private final boolean mDebuggable; @@ -69,13 +71,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi @VisibleForTesting public DozeScreenBrightness(Context context, DozeMachine.Service service, - SensorManager sensorManager, Sensor lightSensor, DozeHost host, + SensorManager sensorManager, Sensor lightSensor, + BroadcastDispatcher broadcastDispatcher, DozeHost host, Handler handler, int defaultDozeBrightness, int[] sensorToBrightness, int[] sensorToScrimOpacity, boolean debuggable) { mContext = context; mDozeService = service; mSensorManager = sensorManager; mLightSensor = lightSensor; + mBroadcastDispatcher = broadcastDispatcher; mDozeHost = host; mHandler = handler; mDebuggable = debuggable; @@ -87,14 +91,15 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi if (mDebuggable) { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_AOD_BRIGHTNESS); - mContext.registerReceiverAsUser(this, UserHandle.ALL, filter, null, handler); + mBroadcastDispatcher.registerReceiver(this, filter, handler, UserHandle.ALL); } } public DozeScreenBrightness(Context context, DozeMachine.Service service, - SensorManager sensorManager, Sensor lightSensor, DozeHost host, - Handler handler, AlwaysOnDisplayPolicy policy) { - this(context, service, sensorManager, lightSensor, host, handler, + SensorManager sensorManager, Sensor lightSensor, + BroadcastDispatcher broadcastDispatcher, DozeHost host, Handler handler, + AlwaysOnDisplayPolicy policy) { + this(context, service, sensorManager, lightSensor, broadcastDispatcher, host, handler, context.getResources().getInteger( com.android.internal.R.integer.config_screenBrightnessDoze), policy.screenBrightnessArray, policy.dimmingScrimArray, DEBUG_AOD_BRIGHTNESS); @@ -127,7 +132,7 @@ public class DozeScreenBrightness extends BroadcastReceiver implements DozeMachi private void onDestroy() { setLightSensorEnabled(false); if (mDebuggable) { - mContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index b212884ebb988..1134268aa5c6c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -36,6 +36,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.Assert; @@ -80,6 +81,7 @@ public class DozeTriggers implements DozeMachine.Part { private final DockEventListener mDockEventListener = new DockEventListener(); private final DockManager mDockManager; private final ProximitySensor.ProximityCheck mProxCheck; + private final BroadcastDispatcher mBroadcastDispatcher; private long mNotificationPulseTime; private boolean mPulsePending; @@ -91,7 +93,7 @@ public class DozeTriggers implements DozeMachine.Part { DozeParameters dozeParameters, AsyncSensorManager sensorManager, Handler handler, WakeLock wakeLock, boolean allowPulseTriggers, DockManager dockManager, ProximitySensor proximitySensor, - DozeLog dozeLog) { + DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher) { mContext = context; mMachine = machine; mDozeHost = dozeHost; @@ -107,6 +109,7 @@ public class DozeTriggers implements DozeMachine.Part { mDockManager = dockManager; mProxCheck = new ProximitySensor.ProximityCheck(proximitySensor, handler); mDozeLog = dozeLog; + mBroadcastDispatcher = broadcastDispatcher; } private void onNotification(Runnable onPulseSuppressedListener) { @@ -299,7 +302,7 @@ public class DozeTriggers implements DozeMachine.Part { public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { switch (newState) { case INITIALIZED: - mBroadcastReceiver.register(mContext); + mBroadcastReceiver.register(mBroadcastDispatcher); mDozeHost.addCallback(mHostCallback); if (mDockManager != null) { mDockManager.addListener(mDockEventListener); @@ -334,7 +337,7 @@ public class DozeTriggers implements DozeMachine.Part { mDozeSensors.updateListening(); break; case FINISH: - mBroadcastReceiver.unregister(mContext); + mBroadcastReceiver.unregister(mBroadcastDispatcher); mDozeHost.removeCallback(mHostCallback); if (mDockManager != null) { mDockManager.removeListener(mDockEventListener); @@ -437,22 +440,22 @@ public class DozeTriggers implements DozeMachine.Part { } } - public void register(Context context) { + public void register(BroadcastDispatcher broadcastDispatcher) { if (mRegistered) { return; } IntentFilter filter = new IntentFilter(PULSE_ACTION); filter.addAction(UiModeManager.ACTION_ENTER_CAR_MODE); filter.addAction(Intent.ACTION_USER_SWITCHED); - context.registerReceiver(this, filter); + broadcastDispatcher.registerReceiver(this, filter); mRegistered = true; } - public void unregister(Context context) { + public void unregister(BroadcastDispatcher broadcastDispatcher) { if (!mRegistered) { return; } - context.unregisterReceiver(this); + broadcastDispatcher.unregisterReceiver(this); mRegistered = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 1bef56179479e..bb2d142c11a1b 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -146,6 +146,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private final DevicePolicyManager mDevicePolicyManager; private final LockPatternUtils mLockPatternUtils; private final KeyguardManager mKeyguardManager; + private final BroadcastDispatcher mBroadcastDispatcher; private ArrayList mItems; private ActionsDialog mDialog; @@ -183,13 +184,14 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, Context.DEVICE_POLICY_SERVICE); mLockPatternUtils = new LockPatternUtils(mContext); mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); + mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); // receive broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); - Dependency.get(BroadcastDispatcher.class).registerReceiver(mBroadcastReceiver, filter); + mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter); ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); @@ -901,7 +903,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mAdapter.notifyDataSetChanged(); if (mShowSilentToggle) { IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION); - mContext.registerReceiver(mRingerModeReceiver, filter); + mBroadcastDispatcher.registerReceiver(mRingerModeReceiver, filter); } } @@ -919,7 +921,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mWindowManagerFuncs.onGlobalActionsHidden(); if (mShowSilentToggle) { try { - mContext.unregisterReceiver(mRingerModeReceiver); + mBroadcastDispatcher.unregisterReceiver(mRingerModeReceiver); } catch (IllegalArgumentException ie) { // ignore this Log.w(TAG, ie); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 411bf9a80dca9..3b1edcca5b743 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -87,6 +87,7 @@ import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.SystemUIFactory; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -319,6 +320,7 @@ public class KeyguardViewMediator extends SystemUI { */ private boolean mWaitingUntilKeyguardVisible = false; private final LockPatternUtils mLockPatternUtils; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mKeyguardDonePending = false; private boolean mHideAnimationRun = false; private boolean mHideAnimationRunning = false; @@ -685,8 +687,10 @@ public class KeyguardViewMediator extends SystemUI { public KeyguardViewMediator( Context context, FalsingManager falsingManager, - LockPatternUtils lockPatternUtils) { - this(context, falsingManager, lockPatternUtils, SystemUIFactory.getInstance()); + LockPatternUtils lockPatternUtils, + BroadcastDispatcher broadcastDispatcher) { + this(context, falsingManager, lockPatternUtils, broadcastDispatcher, + SystemUIFactory.getInstance()); } @VisibleForTesting @@ -694,10 +698,12 @@ public class KeyguardViewMediator extends SystemUI { Context context, FalsingManager falsingManager, LockPatternUtils lockPatternUtils, + BroadcastDispatcher broadcastDispatcher, SystemUIFactory systemUIFactory) { super(context); mFalsingManager = falsingManager; mLockPatternUtils = lockPatternUtils; + mBroadcastDispatcher = broadcastDispatcher; mStatusBarKeyguardViewManager = systemUIFactory.createStatusBarKeyguardViewManager( mContext, mViewMediatorCallback, @@ -722,7 +728,7 @@ public class KeyguardViewMediator extends SystemUI { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SHUTDOWN); - mContext.registerReceiver(mBroadcastReceiver, filter); + mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter); final IntentFilter delayedActionFilter = new IntentFilter(); delayedActionFilter.addAction(DELAYED_KEYGUARD_ACTION); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java index 4d061e18ebbaf..86c532cdb7737 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/WorkLockActivity.java @@ -36,6 +36,9 @@ import android.view.View; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; /** * Bouncer between work activities and the activity used to confirm credentials before unlocking @@ -67,14 +70,21 @@ public class WorkLockActivity extends Activity { * @see KeyguardManager */ private KeyguardManager mKgm; + private final BroadcastDispatcher mBroadcastDispatcher; + + @Inject + public WorkLockActivity(BroadcastDispatcher broadcastDispatcher) { + super(); + mBroadcastDispatcher = broadcastDispatcher; + } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - registerReceiverAsUser(mLockEventReceiver, UserHandle.ALL, - new IntentFilter(Intent.ACTION_DEVICE_LOCKED_CHANGED), /* permission */ null, - /* scheduler */ null); + mBroadcastDispatcher.registerReceiver(mLockEventReceiver, + new IntentFilter(Intent.ACTION_DEVICE_LOCKED_CHANGED), null /* handler */, + UserHandle.ALL); // Once the receiver is registered, check whether anything happened between now and the time // when this activity was launched. If it did and the user is unlocked now, just quit. diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java index 05be4259dd3bb..75e260e7fa702 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java @@ -19,10 +19,12 @@ package com.android.systemui.pip; import android.content.Context; import android.content.res.Configuration; +import com.android.systemui.broadcast.BroadcastDispatcher; + import java.io.PrintWriter; public interface BasePipManager { - void initialize(Context context); + void initialize(Context context, BroadcastDispatcher broadcastDispatcher); void showPictureInPictureMenu(); default void expandPip() {} default void hidePipMenu(Runnable onStartCallback, Runnable onEndCallback) {} diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java index feb5d1917384f..583ce67e26d4e 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java @@ -26,6 +26,7 @@ import android.os.UserHandle; import android.os.UserManager; import com.android.systemui.SystemUI; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.CommandQueue; import java.io.FileDescriptor; @@ -42,12 +43,15 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { private final CommandQueue mCommandQueue; private BasePipManager mPipManager; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mSupportsPip; @Inject - public PipUI(Context context, CommandQueue commandQueue) { + public PipUI(Context context, CommandQueue commandQueue, + BroadcastDispatcher broadcastDispatcher) { super(context); + mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; } @@ -68,7 +72,7 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { mPipManager = pm.hasSystemFeature(FEATURE_LEANBACK_ONLY) ? com.android.systemui.pip.tv.PipManager.getInstance() : com.android.systemui.pip.phone.PipManager.getInstance(); - mPipManager.initialize(mContext); + mPipManager.initialize(mContext, mBroadcastDispatcher); mCommandQueue.addCallback(this); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index 369073c6564dc..c33b8d9fbd904 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -37,6 +37,7 @@ import android.view.IPinnedStackController; import com.android.systemui.Dependency; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.pip.BasePipManager; import com.android.systemui.pip.PipBoundsHandler; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -200,7 +201,7 @@ public class PipManager implements BasePipManager { /** * Initializes {@link PipManager}. */ - public void initialize(Context context) { + public void initialize(Context context, BroadcastDispatcher broadcastDispatcher) { mContext = context; mActivityManager = ActivityManager.getService(); mActivityTaskManager = ActivityTaskManager.getService(); @@ -214,7 +215,7 @@ public class PipManager implements BasePipManager { mPipBoundsHandler = new PipBoundsHandler(context); mInputConsumerController = InputConsumerController.getPipInputConsumer(); - mMediaController = new PipMediaController(context, mActivityManager); + mMediaController = new PipMediaController(context, mActivityManager, broadcastDispatcher); mMenuController = new PipMenuActivityController(context, mActivityManager, mMediaController, mInputConsumerController); mTouchHandler = new PipTouchHandler(context, mActivityManager, mActivityTaskManager, diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java index 174a7ef19cbdc..e57b4166937f2 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMediaController.java @@ -37,6 +37,7 @@ import android.os.UserHandle; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.UserInfoController; import java.util.ArrayList; @@ -109,7 +110,8 @@ public class PipMediaController { private ArrayList mListeners = new ArrayList<>(); - public PipMediaController(Context context, IActivityManager activityManager) { + public PipMediaController(Context context, IActivityManager activityManager, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mActivityManager = activityManager; IntentFilter mediaControlFilter = new IntentFilter(); @@ -117,7 +119,7 @@ public class PipMediaController { mediaControlFilter.addAction(ACTION_PAUSE); mediaControlFilter.addAction(ACTION_NEXT); mediaControlFilter.addAction(ACTION_PREV); - mContext.registerReceiver(mPlayPauseActionReceiver, mediaControlFilter); + broadcastDispatcher.registerReceiver(mPlayPauseActionReceiver, mediaControlFilter); createMediaActions(); mMediaSessionManager = diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java index 81d6973efb2a9..195fca85a3143 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java @@ -48,6 +48,7 @@ import android.view.DisplayInfo; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.pip.BasePipManager; import com.android.systemui.pip.PipBoundsHandler; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -227,7 +228,7 @@ public class PipManager implements BasePipManager { /** * Initializes {@link PipManager}. */ - public void initialize(Context context) { + public void initialize(Context context, BroadcastDispatcher broadcastDispatcher) { if (mInitialized) { return; } @@ -238,8 +239,8 @@ public class PipManager implements BasePipManager { ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED); - mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, intentFilter, - null, null); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, intentFilter, + null /* handler */, UserHandle.ALL); if (sSettingsPackageAndClassNamePairList == null) { String[] settings = mContext.getResources().getStringArray( @@ -286,7 +287,7 @@ public class PipManager implements BasePipManager { Log.e(TAG, "Failed to register pinned stack listener", e); } - mPipNotification = new PipNotification(context); + mPipNotification = new PipNotification(context, broadcastDispatcher); } private void loadConfigurationsAndApply(Configuration newConfig) { diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java index d50f294e4999c..ca1513128e56e 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java @@ -34,6 +34,7 @@ import android.util.Log; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.util.NotificationChannels; /** @@ -143,7 +144,7 @@ public class PipNotification { } }; - public PipNotification(Context context) { + public PipNotification(Context context, BroadcastDispatcher broadcastDispatcher) { mNotificationManager = (NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); @@ -161,7 +162,7 @@ public class PipNotification { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ACTION_MENU); intentFilter.addAction(ACTION_CLOSE); - context.registerReceiver(mEventReceiver, intentFilter); + broadcastDispatcher.registerReceiver(mEventReceiver, intentFilter); onConfigurationChanged(context); } diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt index ca16e84fbe0d5..d592492820c19 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt @@ -34,6 +34,7 @@ import com.android.systemui.Dumpable import com.android.systemui.R import com.android.systemui.appops.AppOpItem import com.android.systemui.appops.AppOpsController +import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.qualifiers.BgHandler import com.android.systemui.dagger.qualifiers.MainHandler import java.io.FileDescriptor @@ -47,10 +48,11 @@ fun isPermissionsHubEnabled() = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_P @Singleton class PrivacyItemController @Inject constructor( - val context: Context, + private val context: Context, private val appOpsController: AppOpsController, @MainHandler private val uiHandler: Handler, - @BgHandler private val bgHandler: Handler + @BgHandler private val bgHandler: Handler, + private val broadcastDispatcher: BroadcastDispatcher ) : Dumpable { @VisibleForTesting @@ -138,15 +140,15 @@ class PrivacyItemController @Inject constructor( } private fun unregisterReceiver() { - context.unregisterReceiver(userSwitcherReceiver) + broadcastDispatcher.unregisterReceiver(userSwitcherReceiver) } private fun registerReceiver() { - context.registerReceiverAsUser(userSwitcherReceiver, UserHandle.ALL, IntentFilter().apply { + broadcastDispatcher.registerReceiver(userSwitcherReceiver, IntentFilter().apply { intents.forEach { addAction(it) } - }, null, null) + }, null /* handler */, UserHandle.ALL) } private fun update(updateUsers: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 39f08650bf2c9..cac90257cd433 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -50,6 +50,7 @@ import com.android.systemui.Dependency; import com.android.systemui.DumpController; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTileView; @@ -125,12 +126,13 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } public QSPanel(Context context, AttributeSet attrs, DumpController dumpController) { - this(context, attrs, dumpController, null); + this(context, attrs, dumpController, null, Dependency.get(BroadcastDispatcher.class)); } @Inject public QSPanel(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - DumpController dumpController, PluginManager pluginManager) { + DumpController dumpController, PluginManager pluginManager, + BroadcastDispatcher broadcastDispatcher) { super(context, attrs); mContext = context; @@ -177,7 +179,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne updateResources(); mBrightnessController = new BrightnessController(getContext(), - findViewById(R.id.brightness_slider)); + findViewById(R.id.brightness_slider), broadcastDispatcher); mDumpController = dumpController; mPluginManager = pluginManager; if (mPluginManager != null && Settings.System.getInt( diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index b395c3c336d3a..6d434b19d3a38 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -34,6 +34,7 @@ import com.android.systemui.DumpController; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.plugins.PluginListener; @@ -80,6 +81,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D private final TunerService mTunerService; private final PluginManager mPluginManager; private final DumpController mDumpController; + private final BroadcastDispatcher mBroadcastDispatcher; private final List mCallbacks = new ArrayList<>(); private AutoTileManager mAutoTiles; @@ -99,14 +101,16 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D PluginManager pluginManager, TunerService tunerService, Provider autoTiles, - DumpController dumpController) { + DumpController dumpController, + BroadcastDispatcher broadcastDispatcher) { mIconController = iconController; mContext = context; mTunerService = tunerService; mPluginManager = pluginManager; mDumpController = dumpController; + mBroadcastDispatcher = broadcastDispatcher; - mServices = new TileServices(this, bgLooper); + mServices = new TileServices(this, bgLooper, mBroadcastDispatcher); defaultFactory.setHost(this); mQsFactories.add(defaultFactory); @@ -334,7 +338,8 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D Intent intent = new Intent().setComponent(component); TileLifecycleManager lifecycleManager = new TileLifecycleManager(new Handler(), mContext, mServices, new Tile(), intent, - new UserHandle(ActivityManager.getCurrentUser())); + new UserHandle(ActivityManager.getCurrentUser()), + mBroadcastDispatcher); lifecycleManager.onStopListening(); lifecycleManager.onTileRemoved(); TileLifecycleManager.setTileAdded(mContext, component, false); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 24ac27e2e77bf..19af235b4f687 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -61,6 +61,7 @@ import com.android.settingslib.Utils; import com.android.systemui.BatteryMeterView; import com.android.systemui.DualToneHandler; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; @@ -150,6 +151,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements private boolean mPermissionsHubEnabled; private PrivacyItemController mPrivacyItemController; + private BroadcastDispatcher mBroadcastDispatcher; private final BroadcastReceiver mRingerReceiver = new BroadcastReceiver() { @Override @@ -189,7 +191,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements NextAlarmController nextAlarmController, ZenModeController zenModeController, StatusBarIconController statusBarIconController, ActivityStarter activityStarter, PrivacyItemController privacyItemController, - CommandQueue commandQueue) { + CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher) { super(context, attrs); mAlarmController = nextAlarmController; mZenController = zenModeController; @@ -198,6 +200,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mPrivacyItemController = privacyItemController; mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); + mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; } @@ -551,14 +554,14 @@ public class QuickStatusBarHeader extends RelativeLayout implements if (listening) { mZenController.addCallback(this); mAlarmController.addCallback(this); - mContext.registerReceiver(mRingerReceiver, + mBroadcastDispatcher.registerReceiver(mRingerReceiver, new IntentFilter(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)); mPrivacyItemController.addCallback(mPICCallback); } else { mZenController.removeCallback(this); mAlarmController.removeCallback(this); mPrivacyItemController.removeCallback(mPICCallback); - mContext.unregisterReceiver(mRingerReceiver); + mBroadcastDispatcher.unregisterReceiver(mRingerReceiver); mPrivacyChipLogged = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index f59e0c2d9bc23..926141297adde 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -38,6 +38,8 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; + import java.util.Objects; import java.util.Set; @@ -72,6 +74,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements private final UserHandle mUser; private final IBinder mToken = new Binder(); private final PackageManagerAdapter mPackageManagerAdapter; + private final BroadcastDispatcher mBroadcastDispatcher; private Set mQueuedMessages = new ArraySet<>(); private QSTileServiceWrapper mWrapper; @@ -88,13 +91,15 @@ public class TileLifecycleManager extends BroadcastReceiver implements private boolean mIsBound; public TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile, - Intent intent, UserHandle user) { - this(handler, context, service, tile, intent, user, new PackageManagerAdapter(context)); + Intent intent, UserHandle user, BroadcastDispatcher broadcastDispatcher) { + this(handler, context, service, tile, intent, user, new PackageManagerAdapter(context), + broadcastDispatcher); } @VisibleForTesting TileLifecycleManager(Handler handler, Context context, IQSService service, Tile tile, - Intent intent, UserHandle user, PackageManagerAdapter packageManagerAdapter) { + Intent intent, UserHandle user, PackageManagerAdapter packageManagerAdapter, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mHandler = handler; mIntent = intent; @@ -102,6 +107,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements mIntent.putExtra(TileService.EXTRA_TOKEN, mToken); mUser = user; mPackageManagerAdapter = packageManagerAdapter; + mBroadcastDispatcher = broadcastDispatcher; if (DEBUG) Log.d(TAG, "Creating " + mIntent + " " + mUser); } @@ -306,13 +312,14 @@ public class TileLifecycleManager extends BroadcastReceiver implements filter.addDataScheme("package"); mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler); filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED); - mContext.registerReceiverAsUser(this, mUser, filter, null, mHandler); + mBroadcastDispatcher.registerReceiver(this, filter, mHandler, mUser); mReceiverRegistered = true; } private void stopPackageListening() { if (DEBUG) Log.d(TAG, "stopPackageListening"); mContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); mReceiverRegistered = false; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java index 0b4e6485551c3..1902d655abc3a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java @@ -34,6 +34,7 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener; import java.util.List; @@ -72,10 +73,10 @@ public class TileServiceManager { private boolean mStarted = false; TileServiceManager(TileServices tileServices, Handler handler, ComponentName component, - Tile tile) { + Tile tile, BroadcastDispatcher broadcastDispatcher) { this(tileServices, handler, new TileLifecycleManager(handler, tileServices.getContext(), tileServices, tile, new Intent().setComponent(component), - new UserHandle(ActivityManager.getCurrentUser()))); + new UserHandle(ActivityManager.getCurrentUser()), broadcastDispatcher)); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index 13cfa78b7c1e5..db7c6ad69d233 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -37,6 +37,7 @@ import android.util.Log; import com.android.internal.statusbar.StatusBarIcon; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.qs.QSTileHost; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -60,13 +61,15 @@ public class TileServices extends IQSService.Stub { private final Handler mHandler; private final Handler mMainHandler; private final QSTileHost mHost; + private final BroadcastDispatcher mBroadcastDispatcher; private int mMaxBound = DEFAULT_MAX_BOUND; - public TileServices(QSTileHost host, Looper looper) { + public TileServices(QSTileHost host, Looper looper, BroadcastDispatcher broadcastDispatcher) { mHost = host; mContext = mHost.getContext(); - mContext.registerReceiver(mRequestListeningReceiver, + mBroadcastDispatcher = broadcastDispatcher; + mBroadcastDispatcher.registerReceiver(mRequestListeningReceiver, new IntentFilter(TileService.ACTION_REQUEST_LISTENING)); mHandler = new Handler(looper); mMainHandler = new Handler(Looper.getMainLooper()); @@ -82,7 +85,8 @@ public class TileServices extends IQSService.Stub { public TileServiceManager getTileWrapper(CustomTile tile) { ComponentName component = tile.getComponent(); - TileServiceManager service = onCreateTileService(component, tile.getQsTile()); + TileServiceManager service = onCreateTileService(component, tile.getQsTile(), + mBroadcastDispatcher); synchronized (mServices) { mServices.put(tile, service); mTiles.put(component, tile); @@ -93,8 +97,10 @@ public class TileServices extends IQSService.Stub { return service; } - protected TileServiceManager onCreateTileService(ComponentName component, Tile tile) { - return new TileServiceManager(this, mHandler, component, tile); + protected TileServiceManager onCreateTileService(ComponentName component, Tile tile, + BroadcastDispatcher broadcastDispatcher) { + return new TileServiceManager(this, mHandler, component, tile, + broadcastDispatcher); } public void freeService(CustomTile tile, TileServiceManager service) { @@ -323,7 +329,7 @@ public class TileServices extends IQSService.Stub { public void destroy() { synchronized (mServices) { mServices.values().forEach(service -> service.handleDestroy()); - mContext.unregisterReceiver(mRequestListeningReceiver); + mBroadcastDispatcher.unregisterReceiver(mRequestListeningReceiver); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index 19e20a93ce66d..da74663191f2f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -33,6 +33,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyProperties; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile.BooleanState; import com.android.systemui.qs.GlobalSetting; @@ -46,13 +47,16 @@ public class AirplaneModeTile extends QSTileImpl { private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_airplane); private final GlobalSetting mSetting; private final ActivityStarter mActivityStarter; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mListening; @Inject - public AirplaneModeTile(QSHost host, ActivityStarter activityStarter) { + public AirplaneModeTile(QSHost host, ActivityStarter activityStarter, + BroadcastDispatcher broadcastDispatcher) { super(host); mActivityStarter = activityStarter; + mBroadcastDispatcher = broadcastDispatcher; mSetting = new GlobalSetting(mContext, mHandler, Global.AIRPLANE_MODE_ON) { @Override @@ -133,9 +137,9 @@ public class AirplaneModeTile extends QSTileImpl { if (listening) { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); - mContext.registerReceiver(mReceiver, filter); + mBroadcastDispatcher.registerReceiver(mReceiver, filter); } else { - mContext.unregisterReceiver(mReceiver); + mBroadcastDispatcher.unregisterReceiver(mReceiver); } mSetting.setListening(listening); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 869fa6b182451..52d1a5b3b9910 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -52,6 +52,7 @@ import com.android.settingslib.notification.EnableZenModeDialog; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.SysUIToast; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile.BooleanState; @@ -78,6 +79,7 @@ public class DndTile extends QSTileImpl { private final ZenModeController mController; private final DndDetailAdapter mDetailAdapter; private final ActivityStarter mActivityStarter; + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mListening; private boolean mShowingDetail; @@ -85,12 +87,13 @@ public class DndTile extends QSTileImpl { @Inject public DndTile(QSHost host, ZenModeController zenModeController, - ActivityStarter activityStarter) { + ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher) { super(host); mController = zenModeController; mActivityStarter = activityStarter; mDetailAdapter = new DndDetailAdapter(); - mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE)); + mBroadcastDispatcher = broadcastDispatcher; + broadcastDispatcher.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE)); mReceiverRegistered = true; mController.observe(getLifecycle(), mZenCallback); } @@ -99,7 +102,7 @@ public class DndTile extends QSTileImpl { protected void handleDestroy() { super.handleDestroy(); if (mReceiverRegistered) { - mContext.unregisterReceiver(mReceiver); + mBroadcastDispatcher.unregisterReceiver(mReceiver); mReceiverRegistered = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java index 476a239de7211..8bbfd243bd42b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java @@ -29,6 +29,7 @@ import android.widget.Switch; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.qs.QSTile.BooleanState; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.tileimpl.QSTileImpl; @@ -39,12 +40,14 @@ import javax.inject.Inject; public class NfcTile extends QSTileImpl { private NfcAdapter mAdapter; + private BroadcastDispatcher mBroadcastDispatcher; private boolean mListening; @Inject - public NfcTile(QSHost host) { + public NfcTile(QSHost host, BroadcastDispatcher broadcastDispatcher) { super(host); + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -56,10 +59,10 @@ public class NfcTile extends QSTileImpl { public void handleSetListening(boolean listening) { mListening = listening; if (mListening) { - mContext.registerReceiver(mNfcReceiver, + mBroadcastDispatcher.registerReceiver(mNfcReceiver, new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED)); } else { - mContext.unregisterReceiver(mNfcReceiver); + mBroadcastDispatcher.unregisterReceiver(mNfcReceiver); } } diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java index 176676fcb9b3d..b1f1f3844cac5 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java @@ -44,6 +44,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import java.util.ArrayList; @@ -281,12 +282,13 @@ public class BrightnessController implements ToggleSlider.Listener { } }; - public BrightnessController(Context context, ToggleSlider control) { + public BrightnessController(Context context, ToggleSlider control, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mControl = control; mControl.setMax(GAMMA_SPACE_MAX); mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER)); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mBackgroundHandler.post(mUpdateModeRunnable); diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java index d8b4df5e94d8d..70c2531ca6d41 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessDialog.java @@ -28,11 +28,21 @@ import android.view.WindowManager; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; /** A dialog that provides controls for adjusting the screen brightness. */ public class BrightnessDialog extends Activity { private BrightnessController mBrightnessController; + private final BroadcastDispatcher mBroadcastDispatcher; + + @Inject + public BrightnessDialog(BroadcastDispatcher broadcastDispatcher) { + mBroadcastDispatcher = broadcastDispatcher; + } + @Override protected void onCreate(Bundle savedInstanceState) { @@ -49,7 +59,7 @@ public class BrightnessDialog extends Activity { setContentView(v); final ToggleSliderView slider = findViewById(R.id.brightness_slider); - mBrightnessController = new BrightnessController(this, slider); + mBrightnessController = new BrightnessController(this, slider, mBroadcastDispatcher); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java index 3cf08b4b866e2..3cdc01d95f582 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java +++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserObservable.java @@ -16,11 +16,11 @@ package com.android.systemui.settings; -import android.content.Context; - import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import com.android.systemui.broadcast.BroadcastDispatcher; + /** * A class that has an observable for the current user. */ @@ -42,8 +42,8 @@ public class CurrentUserObservable { } }; - public CurrentUserObservable(Context context) { - mTracker = new CurrentUserTracker(context) { + public CurrentUserObservable(BroadcastDispatcher broadcastDispatcher) { + mTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mCurrentUser.setValue(newUserId); diff --git a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java index 0b89dc1070e12..9f79785be56e6 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java +++ b/packages/SystemUI/src/com/android/systemui/settings/CurrentUserTracker.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.content.IntentFilter; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; import java.util.ArrayList; import java.util.List; @@ -33,8 +34,8 @@ public abstract class CurrentUserTracker { private Consumer mCallback = this::onUserSwitched; - public CurrentUserTracker(Context context) { - this(UserReceiver.getInstance(context)); + public CurrentUserTracker(BroadcastDispatcher broadcastDispatcher) { + this(UserReceiver.getInstance(broadcastDispatcher)); } @VisibleForTesting @@ -60,20 +61,20 @@ public abstract class CurrentUserTracker { static class UserReceiver extends BroadcastReceiver { private static UserReceiver sInstance; - private Context mAppContext; private boolean mReceiverRegistered; private int mCurrentUserId; + private final BroadcastDispatcher mBroadcastDispatcher; private List> mCallbacks = new ArrayList<>(); @VisibleForTesting - UserReceiver(Context context) { - mAppContext = context.getApplicationContext(); + UserReceiver(BroadcastDispatcher broadcastDispatcher) { + mBroadcastDispatcher = broadcastDispatcher; } - static UserReceiver getInstance(Context context) { + static UserReceiver getInstance(BroadcastDispatcher broadcastDispatcher) { if (sInstance == null) { - sInstance = new UserReceiver(context); + sInstance = new UserReceiver(broadcastDispatcher); } return sInstance; } @@ -96,7 +97,7 @@ public abstract class CurrentUserTracker { if (!mReceiverRegistered) { mCurrentUserId = ActivityManager.getCurrentUser(); IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED); - mAppContext.registerReceiver(this, filter); + mBroadcastDispatcher.registerReceiver(this, filter); mReceiverRegistered = true; } } @@ -105,7 +106,7 @@ public abstract class CurrentUserTracker { if (mCallbacks.contains(callback)) { mCallbacks.remove(callback); if (mCallbacks.size() == 0 && mReceiverRegistered) { - mAppContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); mReceiverRegistered = false; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java index 7adf7af89f0db..571d3d7a11be6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java @@ -46,6 +46,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dependency; import com.android.systemui.Dumpable; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.recents.OverviewProxyService; @@ -90,6 +91,7 @@ public class NotificationLockscreenUserManagerImpl implements private final UserManager mUserManager; private final IStatusBarService mBarService; private final List mListeners = new ArrayList<>(); + private final BroadcastDispatcher mBroadcastDispatcher; private boolean mShowLockscreenNotifications; private boolean mAllowLockscreenRemoteInput; @@ -180,7 +182,8 @@ public class NotificationLockscreenUserManagerImpl implements } @Inject - public NotificationLockscreenUserManagerImpl(Context context) { + public NotificationLockscreenUserManagerImpl(Context context, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService( Context.DEVICE_POLICY_SERVICE); @@ -191,6 +194,7 @@ public class NotificationLockscreenUserManagerImpl implements Dependency.get(StatusBarStateController.class).addCallback(this); mLockPatternUtils = new LockPatternUtils(context); mKeyguardManager = context.getSystemService(KeyguardManager.class); + mBroadcastDispatcher = broadcastDispatcher; } public void setUpWithPresenter(NotificationPresenter presenter) { @@ -244,15 +248,15 @@ public class NotificationLockscreenUserManagerImpl implements UserHandle.USER_ALL); } - mContext.registerReceiverAsUser(mAllUsersReceiver, UserHandle.ALL, + mBroadcastDispatcher.registerReceiver(mAllUsersReceiver, new IntentFilter(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - null, null); + null /* handler */, UserHandle.ALL); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_ADDED); filter.addAction(Intent.ACTION_USER_UNLOCKED); - mContext.registerReceiver(mBaseBroadcastReceiver, filter); + mBroadcastDispatcher.registerReceiver(mBaseBroadcastReceiver, filter); IntentFilter internalFilter = new IntentFilter(); internalFilter.addAction(NOTIFICATION_UNLOCKED_BY_WORK_CHALLENGE_ACTION); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java index fbd8d8a76d265..07e9f944b8027 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ManagedProfileControllerImpl.java @@ -24,6 +24,8 @@ import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; +import com.android.systemui.broadcast.BroadcastDispatcher; + import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -40,6 +42,7 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { private final Context mContext; private final UserManager mUserManager; + private final BroadcastDispatcher mBroadcastDispatcher; private final LinkedList mProfiles; private boolean mListening; private int mCurrentUser; @@ -47,9 +50,10 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { /** */ @Inject - public ManagedProfileControllerImpl(Context context) { + public ManagedProfileControllerImpl(Context context, BroadcastDispatcher broadcastDispatcher) { mContext = context; mUserManager = UserManager.get(mContext); + mBroadcastDispatcher = broadcastDispatcher; mProfiles = new LinkedList(); } @@ -129,9 +133,10 @@ public class ManagedProfileControllerImpl implements ManagedProfileController { filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); - mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null); + mBroadcastDispatcher.registerReceiver( + mReceiver, filter, null /* handler */, UserHandle.ALL); } else { - mContext.unregisterReceiver(mReceiver); + mBroadcastDispatcher.unregisterReceiver(mReceiver); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 0645423f531b1..01cd2b49d0599 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -41,6 +41,7 @@ import com.android.internal.telephony.TelephonyIntents; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.UiOffloadThread; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.privacy.PrivacyItemControllerKt; @@ -138,7 +139,7 @@ public class PhoneStatusBarPolicy private AlarmManager.AlarmClockInfo mNextAlarm; public PhoneStatusBarPolicy(Context context, StatusBarIconController iconController, - CommandQueue commandQueue) { + CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher) { mContext = context; mIconController = iconController; mCast = Dependency.get(CastController.class); @@ -184,7 +185,7 @@ public class PhoneStatusBarPolicy filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); - mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); + broadcastDispatcher.registerReceiver(mIntentReceiver, filter, mHandler); // listen for user / profile change. try { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 2125d126752a5..8f13741f9fc85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -847,8 +847,8 @@ public class StatusBar extends SystemUI implements DemoMode, if (mWallpaperSupported) { // Make sure we always have the most current wallpaper info. IntentFilter wallpaperChangedFilter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED); - mContext.registerReceiverAsUser(mWallpaperChangedReceiver, UserHandle.ALL, - wallpaperChangedFilter, null /* broadcastPermission */, null /* scheduler */); + mBroadcastDispatcher.registerReceiver(mWallpaperChangedReceiver, wallpaperChangedFilter, + null /* handler */, UserHandle.ALL); mWallpaperChangedReceiver.onReceive(mContext, null); } else if (DEBUG) { Log.v(TAG, "start(): no wallpaper service "); @@ -912,7 +912,8 @@ public class StatusBar extends SystemUI implements DemoMode, // end old BaseStatusBar.start(). // Lastly, call to the icon policy to install/update all the icons. - mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController, mCommandQueue); + mIconPolicy = new PhoneStatusBarPolicy(mContext, mIconController, mCommandQueue, + mBroadcastDispatcher); mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController); mKeyguardStateController.addCallback(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index 3fc9b44f38508..f0f94201f3af3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -34,6 +34,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.settingslib.fuelgauge.Estimate; import com.android.settingslib.utils.PowerUtil; import com.android.systemui.Dependency; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.power.EnhancedEstimates; import java.io.FileDescriptor; @@ -58,6 +59,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private static final int UPDATE_GRANULARITY_MSEC = 1000 * 60; private final EnhancedEstimates mEstimates; + private final BroadcastDispatcher mBroadcastDispatcher; private final ArrayList mChangeCallbacks = new ArrayList<>(); private final ArrayList mFetchCallbacks = new ArrayList<>(); private final PowerManager mPowerManager; @@ -76,17 +78,20 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private boolean mFetchingEstimate = false; @Inject - public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates) { - this(context, enhancedEstimates, context.getSystemService(PowerManager.class)); + public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates, + BroadcastDispatcher broadcastDispatcher) { + this(context, enhancedEstimates, context.getSystemService(PowerManager.class), + broadcastDispatcher); } @VisibleForTesting BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates, - PowerManager powerManager) { + PowerManager powerManager, BroadcastDispatcher broadcastDispatcher) { mContext = context; mHandler = new Handler(); mPowerManager = powerManager; mEstimates = enhancedEstimates; + mBroadcastDispatcher = broadcastDispatcher; registerReceiver(); updatePowerSave(); @@ -99,7 +104,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED); filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING); filter.addAction(ACTION_LEVEL_TEST); - mContext.registerReceiver(this, filter); + mBroadcastDispatcher.registerReceiver(this, filter); } @Override @@ -306,7 +311,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC public void dispatchDemoCommand(String command, Bundle args) { if (!mDemoMode && command.equals(COMMAND_ENTER)) { mDemoMode = true; - mContext.unregisterReceiver(this); + mBroadcastDispatcher.unregisterReceiver(this); } else if (mDemoMode && command.equals(COMMAND_EXIT)) { mDemoMode = false; registerReceiver(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java index 568f5906c11ce..dba3b923db4f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -16,8 +16,6 @@ package com.android.systemui.statusbar.policy; -import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; - import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -62,9 +60,6 @@ import java.util.Calendar; import java.util.Locale; import java.util.TimeZone; -import javax.inject.Inject; -import javax.inject.Named; - /** * Digital clock for the status bar. */ @@ -116,19 +111,12 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C private final BroadcastDispatcher mBroadcastDispatcher; public Clock(Context context, AttributeSet attrs) { - this(context, attrs, null, Dependency.get(CommandQueue.class)); + this(context, attrs, 0); } - @Inject - public Clock(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue) { - this(context, attrs, 0, broadcastDispatcher, commandQueue); - } - - public Clock(Context context, AttributeSet attrs, int defStyle, - BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue) { + public Clock(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - mCommandQueue = commandQueue; + mCommandQueue = Dependency.get(CommandQueue.class); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.Clock, @@ -140,13 +128,13 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C } finally { a.recycle(); } - mCurrentUserTracker = new CurrentUserTracker(context) { + mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); + mCurrentUserTracker = new CurrentUserTracker(mBroadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mCurrentUserId = newUserId; } }; - mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -197,8 +185,8 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); filter.addAction(Intent.ACTION_USER_SWITCHED); - getContext().registerReceiverAsUser(mIntentReceiver, UserHandle.ALL, filter, - null, Dependency.get(Dependency.TIME_TICK_HANDLER)); + mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter, + Dependency.get(Dependency.TIME_TICK_HANDLER), UserHandle.ALL); Dependency.get(TunerService.class).addTunable(this, CLOCK_SECONDS, StatusBarIconController.ICON_BLACKLIST); mCommandQueue.addCallback(this); @@ -225,7 +213,7 @@ public class Clock extends TextView implements DemoMode, Tunable, CommandQueue.C protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mAttached) { - getContext().unregisterReceiver(mIntentReceiver); + mBroadcastDispatcher.unregisterReceiver(mIntentReceiver); mAttached = false; Dependency.get(TunerService.class).removeTunable(this); mCommandQueue.removeCallback(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java index 74a30fa8094f6..d488767785906 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java @@ -29,6 +29,7 @@ import android.widget.TextView; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import java.util.Date; import java.util.Locale; @@ -41,6 +42,7 @@ public class DateView extends TextView { private DateFormat mDateFormat; private String mLastText; private String mDatePattern; + private final BroadcastDispatcher mBroadcastDispatcher; private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override @@ -75,6 +77,7 @@ public class DateView extends TextView { if (mDatePattern == null) { mDatePattern = getContext().getString(R.string.system_ui_date_pattern); } + mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class); } @Override @@ -86,7 +89,7 @@ public class DateView extends TextView { filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_LOCALE_CHANGED); - getContext().registerReceiver(mIntentReceiver, filter, null, + mBroadcastDispatcher.registerReceiver(mIntentReceiver, filter, Dependency.get(Dependency.TIME_TICK_HANDLER)); updateClock(); @@ -97,7 +100,7 @@ public class DateView extends TextView { super.onDetachedFromWindow(); mDateFormat = null; // reload the locale next time - getContext().unregisterReceiver(mIntentReceiver); + mBroadcastDispatcher.unregisterReceiver(mIntentReceiver); } protected void updateClock() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java index 0a40b3c4831c2..b6ffd58be8167 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceProvisionedControllerImpl.java @@ -24,6 +24,7 @@ import android.provider.Settings.Global; import android.provider.Settings.Secure; import android.util.Log; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.settings.CurrentUserTracker; @@ -49,8 +50,9 @@ public class DeviceProvisionedControllerImpl extends CurrentUserTracker implemen /** */ @Inject - public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler) { - super(context); + public DeviceProvisionedControllerImpl(Context context, @MainHandler Handler mainHandler, + BroadcastDispatcher broadcastDispatcher) { + super(broadcastDispatcher); mContext = context; mContentResolver = context.getContentResolver(); mDeviceProvisionedUri = Global.getUriFor(Global.DEVICE_PROVISIONED); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java index 5a97eedd9b2cb..3d51be7c02f43 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java @@ -35,6 +35,7 @@ import android.provider.Settings; import androidx.annotation.VisibleForTesting; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.util.Utils; @@ -57,6 +58,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private AppOpsManager mAppOpsManager; private StatusBarManager mStatusBarManager; + private BroadcastDispatcher mBroadcastDispatcher; private boolean mAreActiveLocationRequests; @@ -65,14 +67,16 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private final H mHandler = new H(); @Inject - public LocationControllerImpl(Context context, @BgLooper Looper bgLooper) { + public LocationControllerImpl(Context context, @BgLooper Looper bgLooper, + BroadcastDispatcher broadcastDispatcher) { mContext = context; + mBroadcastDispatcher = broadcastDispatcher; // Register to listen for changes in location settings. IntentFilter filter = new IntentFilter(); filter.addAction(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION); filter.addAction(LocationManager.MODE_CHANGED_ACTION); - context.registerReceiverAsUser(this, UserHandle.ALL, filter, null, new Handler(bgLooper)); + mBroadcastDispatcher.registerReceiver(this, filter, new Handler(bgLooper), UserHandle.ALL); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mStatusBarManager diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 60784c91ee622..e5898eded11e4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -64,6 +64,7 @@ import com.android.systemui.ConfigurationChangedReceiver; import com.android.systemui.DemoMode; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgLooper; import com.android.systemui.settings.CurrentUserTracker; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; @@ -109,6 +110,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private final SubscriptionDefaults mSubDefaults; private final DataSaverController mDataSaverController; private final CurrentUserTracker mUserTracker; + private final BroadcastDispatcher mBroadcastDispatcher; private final Object mLock = new Object(); private Config mConfig; @@ -170,7 +172,8 @@ public class NetworkControllerImpl extends BroadcastReceiver */ @Inject public NetworkControllerImpl(Context context, @BgLooper Looper bgLooper, - DeviceProvisionedController deviceProvisionedController) { + DeviceProvisionedController deviceProvisionedController, + BroadcastDispatcher broadcastDispatcher) { this(context, (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE), (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE), (WifiManager) context.getSystemService(Context.WIFI_SERVICE), @@ -179,7 +182,8 @@ public class NetworkControllerImpl extends BroadcastReceiver new AccessPointControllerImpl(context), new DataUsageController(context), new SubscriptionDefaults(), - deviceProvisionedController); + deviceProvisionedController, + broadcastDispatcher); mReceiverHandler.post(mRegisterListeners); } @@ -191,12 +195,14 @@ public class NetworkControllerImpl extends BroadcastReceiver AccessPointControllerImpl accessPointController, DataUsageController dataUsageController, SubscriptionDefaults defaultsHandler, - DeviceProvisionedController deviceProvisionedController) { + DeviceProvisionedController deviceProvisionedController, + BroadcastDispatcher broadcastDispatcher) { mContext = context; mConfig = config; mReceiverHandler = new Handler(bgLooper); mCallbackHandler = callbackHandler; mDataSaverController = new DataSaverControllerImpl(context); + mBroadcastDispatcher = broadcastDispatcher; mSubscriptionManager = subManager; mSubDefaults = defaultsHandler; @@ -229,7 +235,7 @@ public class NetworkControllerImpl extends BroadcastReceiver // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it updateAirplaneMode(true /* force callback */); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { NetworkControllerImpl.this.onUserSwitched(newUserId); @@ -315,7 +321,7 @@ public class NetworkControllerImpl extends BroadcastReceiver filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); filter.addAction(Intent.ACTION_BOOT_COMPLETED); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); - mContext.registerReceiver(this, filter, null, mReceiverHandler); + mBroadcastDispatcher.registerReceiver(this, filter, mReceiverHandler); mListening = true; updateMobileControllers(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java index 0c68383649ab7..c1614587ea351 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java @@ -48,6 +48,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.BgHandler; import com.android.systemui.settings.CurrentUserTracker; @@ -100,13 +101,14 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi /** */ @Inject - public SecurityControllerImpl(Context context, @BgHandler Handler bgHandler) { - this(context, bgHandler, null); + public SecurityControllerImpl(Context context, @BgHandler Handler bgHandler, + BroadcastDispatcher broadcastDispatcher) { + this(context, bgHandler, broadcastDispatcher, null); } public SecurityControllerImpl(Context context, Handler bgHandler, - SecurityControllerCallback callback) { - super(context); + BroadcastDispatcher broadcastDispatcher, SecurityControllerCallback callback) { + super(broadcastDispatcher); mContext = context; mBgHandler = bgHandler; mDevicePolicyManager = (DevicePolicyManager) @@ -124,8 +126,7 @@ public class SecurityControllerImpl extends CurrentUserTracker implements Securi IntentFilter filter = new IntentFilter(); filter.addAction(KeyChain.ACTION_TRUST_STORE_CHANGED); filter.addAction(Intent.ACTION_USER_UNLOCKED); - context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, - bgHandler); + broadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, bgHandler, UserHandle.ALL); // TODO: re-register network callback on user change. mConnectivityManager.registerNetworkCallback(REQUEST, mNetworkCallback); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 2c996684f437c..075c6d40ca31f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -59,6 +59,7 @@ import com.android.systemui.Prefs; import com.android.systemui.Prefs.Key; import com.android.systemui.R; import com.android.systemui.SystemUISecondaryUserService; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; @@ -96,6 +97,7 @@ public class UserSwitcherController implements Dumpable { private final KeyguardStateController mKeyguardStateController; protected final Handler mHandler; private final ActivityStarter mActivityStarter; + private final BroadcastDispatcher mBroadcastDispatcher; private ArrayList mUsers = new ArrayList<>(); private Dialog mExitGuestDialog; @@ -111,10 +113,12 @@ public class UserSwitcherController implements Dumpable { @Inject public UserSwitcherController(Context context, KeyguardStateController keyguardStateController, - @MainHandler Handler handler, ActivityStarter activityStarter) { + @MainHandler Handler handler, ActivityStarter activityStarter, + BroadcastDispatcher broadcastDispatcher) { mContext = context; + mBroadcastDispatcher = broadcastDispatcher; if (!UserManager.isGuestUserEphemeral()) { - mGuestResumeSessionReceiver.register(context); + mGuestResumeSessionReceiver.register(mBroadcastDispatcher); } mKeyguardStateController = keyguardStateController; mHandler = handler; @@ -127,8 +131,8 @@ public class UserSwitcherController implements Dumpable { filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_STOPPED); filter.addAction(Intent.ACTION_USER_UNLOCKED); - mContext.registerReceiverAsUser(mReceiver, UserHandle.SYSTEM, filter, - null /* permission */, null /* scheduler */); + mBroadcastDispatcher.registerReceiver( + mReceiver, filter, null /* handler */, UserHandle.SYSTEM); mSecondaryUserServiceIntent = new Intent(context, SystemUISecondaryUserService.class); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java index 1c7a1951b27de..a2028e6c0c33a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java @@ -39,6 +39,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dumpable; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.qs.GlobalSetting; import com.android.systemui.settings.CurrentUserTracker; @@ -77,8 +78,9 @@ public class ZenModeControllerImpl extends CurrentUserTracker private NotificationManager.Policy mConsolidatedNotificationPolicy; @Inject - public ZenModeControllerImpl(Context context, @MainHandler Handler handler) { - super(context); + public ZenModeControllerImpl(Context context, @MainHandler Handler handler, + BroadcastDispatcher broadcastDispatcher) { + super(broadcastDispatcher); mContext = context; mModeSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE) { @Override diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index 9a58a355c586f..128bb213c9d1b 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -36,6 +36,7 @@ import android.util.Log; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.SystemUI; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.google.android.collect.Sets; @@ -45,6 +46,9 @@ import org.json.JSONObject; import java.util.Map; import java.util.Set; +import javax.inject.Inject; +import javax.inject.Singleton; + /** * Controls the application of theme overlays across the system for all users. * This service is responsible for: @@ -54,15 +58,19 @@ import java.util.Set; * - Observing work profile changes and applying overlays from the primary user to their * associated work profiles */ +@Singleton public class ThemeOverlayController extends SystemUI { private static final String TAG = "ThemeOverlayController"; private static final boolean DEBUG = false; private ThemeOverlayManager mThemeManager; private UserManager mUserManager; + private BroadcastDispatcher mBroadcastDispatcher; - public ThemeOverlayController(Context context) { + @Inject + public ThemeOverlayController(Context context, BroadcastDispatcher broadcastDispatcher) { super(context); + mBroadcastDispatcher = broadcastDispatcher; } @Override @@ -78,13 +86,13 @@ public class ThemeOverlayController extends SystemUI { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED); - mContext.registerReceiverAsUser(new BroadcastReceiver() { + mBroadcastDispatcher.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Log.d(TAG, "Updating overlays for user switch / profile added."); updateThemeOverlays(); } - }, UserHandle.ALL, filter, null, bgHandler); + }, filter, bgHandler, UserHandle.ALL); mContext.getContentResolver().registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), false, diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java index 2d6027cb324db..ce0032e619e72 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java @@ -34,6 +34,7 @@ import android.util.ArraySet; import com.android.internal.util.ArrayUtils; import com.android.systemui.DejankUtils; import com.android.systemui.DemoMode; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.MainHandler; import com.android.systemui.qs.QSTileHost; import com.android.systemui.settings.CurrentUserTracker; @@ -82,7 +83,7 @@ public class TunerServiceImpl extends TunerService { */ @Inject public TunerServiceImpl(Context context, @MainHandler Handler mainHandler, - LeakDetector leakDetector) { + LeakDetector leakDetector, BroadcastDispatcher broadcastDispatcher) { mContext = context; mContentResolver = mContext.getContentResolver(); mLeakDetector = leakDetector; @@ -95,7 +96,7 @@ public class TunerServiceImpl extends TunerService { } mCurrentUser = ActivityManager.getCurrentUser(); - mUserTracker = new CurrentUserTracker(mContext) { + mUserTracker = new CurrentUserTracker(broadcastDispatcher) { @Override public void onUserSwitched(int newUserId) { mCurrentUser = newUserId; diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java index 4d12cc9ebcff5..2f13f395d0570 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java @@ -42,6 +42,9 @@ import android.widget.Toast; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; public class UsbDebuggingActivity extends AlertActivity implements DialogInterface.OnClickListener { @@ -49,12 +52,20 @@ public class UsbDebuggingActivity extends AlertActivity private CheckBox mAlwaysAllow; private UsbDisconnectedReceiver mDisconnectedReceiver; + private final BroadcastDispatcher mBroadcastDispatcher; private String mKey; + @Inject + public UsbDebuggingActivity(BroadcastDispatcher broadcastDispatcher) { + super(); + mBroadcastDispatcher = broadcastDispatcher; + } + @Override public void onCreate(Bundle icicle) { Window window = getWindow(); - window.addSystemFlags(WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + window.addSystemFlags( + WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); super.onCreate(icicle); @@ -138,13 +149,13 @@ public class UsbDebuggingActivity extends AlertActivity public void onStart() { super.onStart(); IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE); - registerReceiver(mDisconnectedReceiver, filter); + mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter); } @Override protected void onStop() { if (mDisconnectedReceiver != null) { - unregisterReceiver(mDisconnectedReceiver); + mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver); } super.onStop(); } diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java index bafd1f1c25a42..032b72ebff7dd 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingSecondaryUserActivity.java @@ -29,10 +29,19 @@ import android.os.SystemProperties; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; + +import javax.inject.Inject; public class UsbDebuggingSecondaryUserActivity extends AlertActivity implements DialogInterface.OnClickListener { private UsbDisconnectedReceiver mDisconnectedReceiver; + private final BroadcastDispatcher mBroadcastDispatcher; + + @Inject + public UsbDebuggingSecondaryUserActivity(BroadcastDispatcher broadcastDispatcher) { + mBroadcastDispatcher = broadcastDispatcher; + } @Override public void onCreate(Bundle icicle) { @@ -74,13 +83,13 @@ public class UsbDebuggingSecondaryUserActivity extends AlertActivity super.onStart(); IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE); - registerReceiver(mDisconnectedReceiver, filter); + mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter); } @Override protected void onStop() { if (mDisconnectedReceiver != null) { - unregisterReceiver(mDisconnectedReceiver); + mBroadcastDispatcher.unregisterReceiver(mDisconnectedReceiver); } super.onStop(); } diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java index 5ed027d37defc..60d76789ff63b 100644 --- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java +++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java @@ -37,7 +37,6 @@ import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.NotificationPanelView; -import com.android.systemui.statusbar.policy.Clock; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -179,11 +178,6 @@ public class InjectionInflationController { * Creates the QSCustomizer. */ QSCustomizer createQSCustomizer(); - - /** - * Creates a Clock. - */ - Clock createClock(); } /** diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 7d283924a0cae..c1da53b09cfc0 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; @@ -37,6 +38,7 @@ import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.BiometricSourceType; @@ -44,6 +46,8 @@ import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; +import android.os.Handler; +import android.os.UserHandle; import android.os.UserManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; @@ -58,6 +62,7 @@ import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.systemui.DumpController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.phone.KeyguardBypassController; import org.junit.Assert; @@ -109,6 +114,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private KeyguardBypassController mKeyguardBypassController; @Mock private SubscriptionManager mSubscriptionManager; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; private TestableLooper mTestableLooper; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -142,6 +149,16 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(context); } + @Test + public void testReceiversRegistered() { + verify(mBroadcastDispatcher, atLeastOnce()).registerReceiver( + eq(mKeyguardUpdateMonitor.mBroadcastReceiver), + any(IntentFilter.class), any(Handler.class)); + verify(mBroadcastDispatcher, atLeastOnce()).registerReceiver( + eq(mKeyguardUpdateMonitor.mBroadcastAllReceiver), + any(IntentFilter.class), any(Handler.class), eq(UserHandle.ALL)); + } + @Test public void testIgnoresSimStateCallback_rebroadcast() { Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); @@ -518,10 +535,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { AtomicBoolean mSimStateChanged = new AtomicBoolean(false); protected TestableKeyguardUpdateMonitor(Context context) { - super(context, TestableLooper.get(KeyguardUpdateMonitorTest.this) - .getLooper(), mDumpController); - context.unregisterReceiver(mBroadcastReceiver); - context.unregisterReceiver(mBroadcastAllReceiver); + super(context, + TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper(), + mBroadcastDispatcher, mDumpController); mStrongAuthTracker = KeyguardUpdateMonitorTest.this.mStrongAuthTracker; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index 7359fdce462d5..1e9000b76c3fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -50,6 +50,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R.dimen; import com.android.systemui.ScreenDecorations.TunablePaddingTagListener; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentService; import com.android.systemui.statusbar.phone.StatusBar; @@ -79,9 +80,13 @@ public class ScreenDecorationsTest extends SysuiTestCase { private WindowManager mWindowManager; private FragmentService mFragmentService; private FragmentHostManager mFragmentHostManager; - private TunerService mTunerService; private StatusBarWindowView mView; private TunablePaddingService mTunablePaddingService; + private Handler mMainHandler; + @Mock + private TunerService mTunerService; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; @Mock private Lazy mStatusBarLazy; @Before @@ -89,10 +94,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mTestableLooper = TestableLooper.get(this); - mDependency.injectTestDependency(Dependency.MAIN_HANDLER, - new Handler(mTestableLooper.getLooper())); + mMainHandler = new Handler(mTestableLooper.getLooper()); mTunablePaddingService = mDependency.injectMockDependency(TunablePaddingService.class); - mTunerService = mDependency.injectMockDependency(TunerService.class); mFragmentService = mDependency.injectMockDependency(FragmentService.class); mWindowManager = mock(WindowManager.class); @@ -108,7 +111,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { when(mFragmentService.getFragmentHostManager(any())).thenReturn(mFragmentHostManager); - mScreenDecorations = new ScreenDecorations(mContext, mStatusBarLazy) { + mScreenDecorations = new ScreenDecorations(mContext, mStatusBarLazy, mMainHandler, + mBroadcastDispatcher, mTunerService) { @Override public void start() { super.start(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java index a766885297faf..7d556236b518a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/SliceBroadcastRelayHandlerTest.java @@ -17,6 +17,7 @@ package com.android.systemui; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; @@ -34,11 +35,14 @@ import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; import com.android.settingslib.SliceBroadcastRelay; +import com.android.systemui.broadcast.BroadcastDispatcher; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; @RunWith(AndroidTestingRunner.class) @SmallTest @@ -47,11 +51,15 @@ public class SliceBroadcastRelayHandlerTest extends SysuiTestCase { private static final String TEST_ACTION = "com.android.systemui.action.TEST_ACTION"; private SliceBroadcastRelayHandler mRelayHandler; private Context mSpyContext; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; + @Before public void setup() { + MockitoAnnotations.initMocks(this); mSpyContext = spy(mContext); - mRelayHandler = new SliceBroadcastRelayHandler(mSpyContext); + mRelayHandler = new SliceBroadcastRelayHandler(mSpyContext, mBroadcastDispatcher); } @Test @@ -136,6 +144,16 @@ public class SliceBroadcastRelayHandlerTest extends SysuiTestCase { verify(Receiver.sReceiver, timeout(2000)).onReceive(any(), any()); } + @Test + public void testRegisteredWithDispatcher() { + mRelayHandler.start(); + + verify(mBroadcastDispatcher) + .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); + verify(mSpyContext, never()) + .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); + } + public static class Receiver extends BroadcastReceiver { private static BroadcastReceiver sReceiver; diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java index 316b891080ce6..2ed0b4ffa0f4b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java @@ -45,6 +45,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.util.sensors.FakeSensorManager; import org.junit.Before; @@ -66,6 +67,8 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { FakeSensorManager mSensorManager; @Mock DozeHost mDozeHost; + @Mock + BroadcastDispatcher mBroadcastDispatcher; DozeScreenBrightness mScreen; @Before @@ -82,7 +85,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { mSensorManager = new FakeSensorManager(mContext); mSensor = mSensorManager.getFakeLightSensor(); mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, - mSensor.getSensor(), mDozeHost, null /* handler */, + mSensor.getSensor(), mBroadcastDispatcher, mDozeHost, null /* handler */, DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY, true /* debuggable */); } @@ -185,7 +188,7 @@ public class DozeScreenBrightnessTest extends SysuiTestCase { @Test public void testNullSensor() throws Exception { mScreen = new DozeScreenBrightness(mContext, mServiceFake, mSensorManager, - null /* sensor */, mDozeHost, null /* handler */, + null /* sensor */, mBroadcastDispatcher, mDozeHost, null /* handler */, DEFAULT_BRIGHTNESS, SENSOR_TO_BRIGHTNESS, SENSOR_TO_OPACITY, true /* debuggable */); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 756227e58ec29..226bf6b3abce4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -39,6 +39,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.sensors.AsyncSensorManager; @@ -66,6 +67,8 @@ public class DozeTriggersTest extends SysuiTestCase { private DozeHost mHost; @Mock private AlarmManager mAlarmManager; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; private DozeTriggers mTriggers; private FakeSensorManager mSensors; private Sensor mTapSensor; @@ -87,7 +90,7 @@ public class DozeTriggersTest extends SysuiTestCase { mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, config, parameters, asyncSensorManager, Handler.createAsync(Looper.myLooper()), wakeLock, true, - mDockManagerFake, mProximitySensor, mock(DozeLog.class)); + mDockManagerFake, mProximitySensor, mock(DozeLog.class), mBroadcastDispatcher); waitForSensorManager(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index 9312ed26c2178..c8152792be914 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -37,6 +37,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -60,6 +61,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private @Mock StatusBarWindowController mStatusBarWindowController; private @Mock SystemUIFactory mSystemUIFactory; + private @Mock BroadcastDispatcher mBroadcastDispatcher; private FalsingManagerFake mFalsingManager; @@ -81,7 +83,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { TestableLooper.get(this).runWithLooper(() -> { mViewMediator = new KeyguardViewMediator( - mContext, mFalsingManager, mLockPatternUtils, mSystemUIFactory); + mContext, mFalsingManager, mLockPatternUtils, mBroadcastDispatcher, + mSystemUIFactory); }); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java index 6e726cf6bf8d2..187c72a065a79 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java @@ -35,6 +35,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.keyguard.WorkLockActivity; import org.junit.Before; @@ -55,12 +56,13 @@ public class WorkLockActivityTest extends SysuiTestCase { private @Mock DevicePolicyManager mDevicePolicyManager; private @Mock KeyguardManager mKeyguardManager; private @Mock Context mContext; + private @Mock BroadcastDispatcher mBroadcastDispatcher; private WorkLockActivity mActivity; private static class WorkLockActivityTestable extends WorkLockActivity { - WorkLockActivityTestable(Context baseContext) { - super(); + WorkLockActivityTestable(Context baseContext, BroadcastDispatcher broadcastDispatcher) { + super(broadcastDispatcher); attachBaseContext(baseContext); } } @@ -77,7 +79,7 @@ public class WorkLockActivityTest extends SysuiTestCase { if (Looper.myLooper() == null) { Looper.prepare(); } - mActivity = new WorkLockActivityTestable(mContext); + mActivity = new WorkLockActivityTestable(mContext, mBroadcastDispatcher); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt index 462c82ee0b36e..098521fbda516 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyItemControllerTest.kt @@ -36,6 +36,7 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.appops.AppOpItem import com.android.systemui.appops.AppOpsController +import com.android.systemui.broadcast.BroadcastDispatcher import org.hamcrest.Matchers.hasItem import org.hamcrest.Matchers.not import org.hamcrest.Matchers.nullValue @@ -62,7 +63,6 @@ import org.mockito.Mockito.doReturn import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.reset -import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations @@ -89,6 +89,8 @@ class PrivacyItemControllerTest : SysuiTestCase() { private lateinit var callback: PrivacyItemController.Callback @Mock private lateinit var userManager: UserManager + @Mock + private lateinit var broadcastDispatcher: BroadcastDispatcher @Captor private lateinit var argCaptor: ArgumentCaptor> @Captor @@ -99,7 +101,7 @@ class PrivacyItemControllerTest : SysuiTestCase() { private lateinit var handler: Handler fun PrivacyItemController(context: Context) = - PrivacyItemController(context, appOpsController, handler, handler) + PrivacyItemController(context, appOpsController, handler, handler, broadcastDispatcher) @Before fun setup() { @@ -180,14 +182,12 @@ class PrivacyItemControllerTest : SysuiTestCase() { @Test fun testRegisterReceiver_allUsers() { - val spiedContext = spy(mContext) - val itemController = PrivacyItemController(spiedContext) - itemController.addCallback(callback) + privacyItemController.addCallback(callback) testableLooper.processAllMessages() - verify(spiedContext, atLeastOnce()).registerReceiverAsUser( - eq(itemController.userSwitcherReceiver), eq(UserHandle.ALL), any(), eq(null), - eq(null)) - verify(spiedContext, never()).unregisterReceiver(eq(itemController.userSwitcherReceiver)) + verify(broadcastDispatcher, atLeastOnce()).registerReceiver( + eq(privacyItemController.userSwitcherReceiver), any(), eq(null), eq(UserHandle.ALL)) + verify(broadcastDispatcher, never()) + .unregisterReceiver(eq(privacyItemController.userSwitcherReceiver)) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index ca30bed3892c1..a31fc3a611cf4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -39,6 +39,7 @@ import com.android.systemui.DumpController; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiBaseFragmentTest; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.shared.plugins.PluginManager; @@ -98,7 +99,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { QSTileHost host = new QSTileHost(mContext, mock(StatusBarIconController.class), mock(QSFactoryImpl.class), new Handler(), Looper.myLooper(), mock(PluginManager.class), mock(TunerService.class), - () -> mock(AutoTileManager.class), mock(DumpController.class)); + () -> mock(AutoTileManager.class), mock(DumpController.class), + mock(BroadcastDispatcher.class)); qs.setHost(host); qs.setListening(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index 77520140b1a3b..0247c2f79ee7a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -41,6 +41,7 @@ import com.android.internal.util.CollectionUtils; import com.android.systemui.DumpController; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.tileimpl.QSFactoryImpl; @@ -84,6 +85,8 @@ public class QSTileHostTest extends SysuiTestCase { @Mock private DumpController mDumpController; @Mock + private BroadcastDispatcher mBroadcastDispatcher; + @Mock private QSTile.State mMockState; private Handler mHandler; private TestableLooper mLooper; @@ -96,7 +99,7 @@ public class QSTileHostTest extends SysuiTestCase { mHandler = new Handler(mLooper.getLooper()); mQSTileHost = new TestQSTileHost(mContext, mIconController, mDefaultFactory, mHandler, mLooper.getLooper(), - mPluginManager, mTunerService, mAutoTiles, mDumpController); + mPluginManager, mTunerService, mAutoTiles, mDumpController, mBroadcastDispatcher); setUpTileFactory(); Settings.Secure.putStringForUser(mContext.getContentResolver(), QSTileHost.TILES_SETTING, "", ActivityManager.getCurrentUser()); @@ -168,9 +171,10 @@ public class QSTileHostTest extends SysuiTestCase { TestQSTileHost(Context context, StatusBarIconController iconController, QSFactoryImpl defaultFactory, Handler mainHandler, Looper bgLooper, PluginManager pluginManager, TunerService tunerService, - Provider autoTiles, DumpController dumpController) { + Provider autoTiles, DumpController dumpController, + BroadcastDispatcher broadcastDispatcher) { super(context, iconController, defaultFactory, mainHandler, bgLooper, pluginManager, - tunerService, autoTiles, dumpController); + tunerService, autoTiles, dumpController, broadcastDispatcher); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java index 11b0c69e8a416..9e5e582bf5e73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileLifecycleManagerTest.java @@ -45,6 +45,7 @@ import android.test.suitebuilder.annotation.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import org.junit.After; import org.junit.Before; @@ -59,6 +60,8 @@ public class TileLifecycleManagerTest extends SysuiTestCase { private final PackageManagerAdapter mMockPackageManagerAdapter = Mockito.mock(PackageManagerAdapter.class); + private final BroadcastDispatcher mMockBroadcastDispatcher = + Mockito.mock(BroadcastDispatcher.class); private final IQSTileService.Stub mMockTileService = Mockito.mock(IQSTileService.Stub.class); private ComponentName mTileServiceComponentName; private Intent mTileServiceIntent; @@ -87,7 +90,8 @@ public class TileLifecycleManagerTest extends SysuiTestCase { Mockito.mock(IQSService.class), new Tile(), mTileServiceIntent, mUser, - mMockPackageManagerAdapter); + mMockPackageManagerAdapter, + mMockBroadcastDispatcher); } @After diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java index d18cebba62b4e..824c50dc82bb4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java @@ -32,6 +32,7 @@ import android.testing.TestableLooper.RunWithLooper; import com.android.systemui.DumpController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.shared.plugins.PluginManager; @@ -45,7 +46,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; @@ -57,21 +60,37 @@ public class TileServicesTest extends SysuiTestCase { private TileServices mTileService; private ArrayList mManagers; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; + @Mock + private StatusBarIconController mStatusBarIconController; + @Mock + private QSFactoryImpl mQSFactory; + @Mock + private PluginManager mPluginManager; + @Mock + private TunerService mTunerService; + @Mock + private AutoTileManager mAutoTileManager; + @Mock + private DumpController mDumpController; @Before public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); mDependency.injectMockDependency(BluetoothController.class); mManagers = new ArrayList<>(); QSTileHost host = new QSTileHost(mContext, - mock(StatusBarIconController.class), - mock(QSFactoryImpl.class), + mStatusBarIconController, + mQSFactory, new Handler(), Looper.myLooper(), - mock(PluginManager.class), - mock(TunerService.class), - () -> mock(AutoTileManager.class), - mock(DumpController.class)); - mTileService = new TestTileServices(host, Looper.getMainLooper()); + mPluginManager, + mTunerService, + () -> mAutoTileManager, + mDumpController, + mBroadcastDispatcher); + mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher); } @After @@ -138,12 +157,14 @@ public class TileServicesTest extends SysuiTestCase { } private class TestTileServices extends TileServices { - public TestTileServices(QSTileHost host, Looper looper) { - super(host, looper); + TestTileServices(QSTileHost host, Looper looper, + BroadcastDispatcher broadcastDispatcher) { + super(host, looper, broadcastDispatcher); } @Override - protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile) { + protected TileServiceManager onCreateTileService(ComponentName component, Tile qsTile, + BroadcastDispatcher broadcastDispatcher) { TileServiceManager manager = mock(TileServiceManager.class); mManagers.add(manager); when(manager.isLifecycleStarted()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java index 4162bc1da479d..1b515c6bbdbd5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java @@ -21,9 +21,12 @@ import android.content.Intent; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; /** * Testing functionality of the current user tracker @@ -33,10 +36,13 @@ public class CurrentUserTrackerTest extends SysuiTestCase { private CurrentUserTracker mTracker; private CurrentUserTracker.UserReceiver mReceiver; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; @Before public void setUp() { - mReceiver = new CurrentUserTracker.UserReceiver(getContext()); + MockitoAnnotations.initMocks(this); + mReceiver = new CurrentUserTracker.UserReceiver(mBroadcastDispatcher); mTracker = new CurrentUserTracker(mReceiver) { @Override public void onUserSwitched(int newUserId) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java index 85a0fbd74550c..548f7a86adf31 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerTest.java @@ -47,6 +47,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -74,6 +75,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { @Mock private NotificationData mNotificationData; @Mock private DeviceProvisionedController mDeviceProvisionedController; @Mock private StatusBarKeyguardViewManager mKeyguardViewManager; + @Mock private BroadcastDispatcher mBroadcastDispatcher; private int mCurrentUserId; private TestNotificationLockscreenUserManager mLockscreenUserManager; @@ -194,7 +196,7 @@ public class NotificationLockscreenUserManagerTest extends SysuiTestCase { private class TestNotificationLockscreenUserManager extends NotificationLockscreenUserManagerImpl { public TestNotificationLockscreenUserManager(Context context) { - super(context); + super(context, mBroadcastDispatcher); } public BroadcastReceiver getBaseBroadcastReceiverForTest() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index e626d083d3663..48ed4ba2224cc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -27,6 +27,7 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.power.EnhancedEstimates; import org.junit.Assert; @@ -44,13 +45,15 @@ public class BatteryControllerTest extends SysuiTestCase { @Mock private PowerManager mPowerManager; + @Mock + private BroadcastDispatcher mBroadcastDispatcher; private BatteryControllerImpl mBatteryController; @Before public void setUp() { MockitoAnnotations.initMocks(this); mBatteryController = new BatteryControllerImpl(getContext(), mock(EnhancedEstimates.class), - mPowerManager); + mPowerManager, mBroadcastDispatcher); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java index 3dcb34aac8143..5f772b2548ff8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/LocationControllerImplTest.java @@ -27,6 +27,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; import org.junit.Before; @@ -44,7 +45,8 @@ public class LocationControllerImplTest extends SysuiTestCase { @Before public void setup() { mLocationController = spy(new LocationControllerImpl(mContext, - TestableLooper.get(this).getLooper())); + TestableLooper.get(this).getLooper(), + mock(BroadcastDispatcher.class))); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index c03f07e59129c..4d866136c915d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -56,6 +56,7 @@ import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.net.DataUsageController; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; @@ -93,6 +94,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected WifiManager mMockWm; protected SubscriptionManager mMockSm; protected TelephonyManager mMockTm; + protected BroadcastDispatcher mMockBd; protected Config mConfig; protected CallbackHandler mCallbackHandler; protected SubscriptionDefaults mMockSubDefaults; @@ -130,6 +132,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockTm = mock(TelephonyManager.class); mMockSm = mock(SubscriptionManager.class); mMockCm = mock(ConnectivityManager.class); + mMockBd = mock(BroadcastDispatcher.class); mMockSubDefaults = mock(SubscriptionDefaults.class); mNetCapabilities = new NetworkCapabilities(); when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true); @@ -157,7 +160,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, mConfig, TestableLooper.get(this).getLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), - mMockSubDefaults, mMockProvisionController); + mMockSubDefaults, mMockProvisionController, mMockBd); setupNetworkController(); // Trigger blank callbacks to always get the current state (some tests don't trigger @@ -208,7 +211,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mConfig, TestableLooper.get(this).getLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, - mock(DeviceProvisionedController.class)); + mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index aa4723acba62c..ab74caa95e61b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -108,7 +108,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { mConfig, Looper.getMainLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, - mock(DeviceProvisionedController.class)); + mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); setupDefaultSignal(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index 0b53c486356fa..57dcbf21e1473 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -61,7 +61,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, mConfig, Looper.getMainLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), - mMockSubDefaults, mock(DeviceProvisionedController.class)); + mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); verifyLastMobileDataIndicators(false, -1, 0); @@ -123,7 +123,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, mConfig, Looper.getMainLooper(), mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), - mMockSubDefaults, mock(DeviceProvisionedController.class)); + mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd); setupNetworkController(); // No Subscriptions. diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java index 97542a9e59661..0c9130d08d6da 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java @@ -45,6 +45,7 @@ import android.test.suitebuilder.annotation.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.SecurityController.SecurityControllerCallback; import org.junit.After; @@ -99,7 +100,7 @@ public class SecurityControllerTest extends SysuiTestCase implements SecurityCon // TODO: Migrate this test to TestableLooper and use a handler attached // to that. mSecurityController = new SecurityControllerImpl(mContext, - new Handler(Looper.getMainLooper()), this); + new Handler(Looper.getMainLooper()), mock(BroadcastDispatcher.class), this); } @After diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java index 47e449212fa5f..dcf0ef781b079 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java @@ -33,6 +33,7 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.statusbar.policy.ZenModeController.Callback; import org.junit.Before; @@ -51,6 +52,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase { NotificationManager mNm; @Mock ZenModeConfig mConfig; + @Mock + BroadcastDispatcher mBroadcastDispatcher; private ZenModeControllerImpl mController; @@ -60,7 +63,8 @@ public class ZenModeControllerImplTest extends SysuiTestCase { mContext.addMockSystemService(NotificationManager.class, mNm); when(mNm.getZenModeConfig()).thenReturn(mConfig); - mController = new ZenModeControllerImpl(mContext, Handler.createAsync(Looper.myLooper())); + mController = new ZenModeControllerImpl(mContext, Handler.createAsync(Looper.myLooper()), + mBroadcastDispatcher); } @Test