diff options
author | 2021-09-01 11:12:37 -0400 | |
---|---|---|
committer | 2021-09-09 09:21:27 -0400 | |
commit | def01e7485d3e99573a63b105342bd45025c98d0 (patch) | |
tree | 74d18baad9be73a781b4e9b26a47ed0682b3aac3 | |
parent | 8bd6b0d17821359c8c4b30dc366c0fed493cce27 (diff) |
Add flags to BroadcastDispatcher
Starting soon, one of Context#RECEIVER_NOT_EXPORTED or
Context#RECEIVER_EXPORTED is required when registering broadcasts. This
CL adds an optional argument to BroadcastDispatcher#registerReceiver to
add flags. The default is RECEIVER_EXPORTED, as it's the backwards
compatible behavior.
Note that many actions listened from SystemUI are platform actions and
as such require RECEIVER_EXPORTED.
This CL does not address receivers registered directly with Context.
Test: logs and dumps
Test: atest SystemUITests
Fixes: 198424247
Change-Id: I80d0cee9347c22c4246bd3da8abc9b040d35490a
12 files changed, 227 insertions, 59 deletions
diff --git a/packages/SystemUI/docs/broadcasts.md b/packages/SystemUI/docs/broadcasts.md index e709278db43a..e75ae29f407d 100644 --- a/packages/SystemUI/docs/broadcasts.md +++ b/packages/SystemUI/docs/broadcasts.md @@ -27,6 +27,7 @@ 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. +* Flags (see [`Context#RegisterReceiverFlags`](/core/java/android/content/Context.java)) can be passed for the registration. By default, this will be `Context#RECEIVER_EXPORTED`. If introducing a new `BroadcastReceiver` (not declared in `AndroidManifest`) that satisfies the constraints above, use the dispatcher to reduce the load on `system_server`. @@ -63,6 +64,8 @@ Acquire the dispatcher by using `@Inject` to obtain a `BroadcastDispatcher`. The * executor in the main thread (default). * @param user A user handle to determine which broadcast should be dispatched to this receiver. * Pass `null` to use the user of the context (system user in SystemUI). + * @param flags Flags to use when registering the receiver. [Context.RECEIVER_EXPORTED] by + * default. * @throws IllegalArgumentException if the filter has other constraints that are not actions or * categories or the filter has no actions. */ @@ -71,7 +74,8 @@ open fun registerReceiver( receiver: BroadcastReceiver, filter: IntentFilter, executor: Executor? = null, - user: UserHandle? = null + user: UserHandle? = null, + @Context.RegisterReceiverFlags flags: Int = Context.RECEIVER_EXPORTED ) ``` diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt index 39cbc90fba2d..bbb75c3521c1 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt @@ -87,8 +87,11 @@ open class BroadcastDispatcher constructor ( * @param handler A handler to dispatch [BroadcastReceiver.onReceive]. * @param user A user handle to determine which broadcast should be dispatched to this receiver. * By default, it is the user of the context (system user in SystemUI). + * @param flags Flags to use when registering the receiver. [Context.RECEIVER_EXPORTED] by + * default. * @throws IllegalArgumentException if the filter has other constraints that are not actions or * categories or the filter has no actions. + * */ @Deprecated(message = "Replacing Handler for Executor in SystemUI", replaceWith = ReplaceWith("registerReceiver(receiver, filter, executor, user)")) @@ -97,9 +100,10 @@ open class BroadcastDispatcher constructor ( receiver: BroadcastReceiver, filter: IntentFilter, handler: Handler, - user: UserHandle = context.user + user: UserHandle = context.user, + @Context.RegisterReceiverFlags flags: Int = Context.RECEIVER_EXPORTED ) { - registerReceiver(receiver, filter, HandlerExecutor(handler), user) + registerReceiver(receiver, filter, HandlerExecutor(handler), user, flags) } /** @@ -113,6 +117,8 @@ open class BroadcastDispatcher constructor ( * executor in the main thread (default). * @param user A user handle to determine which broadcast should be dispatched to this receiver. * Pass `null` to use the user of the context (system user in SystemUI). + * @param flags Flags to use when registering the receiver. [Context.RECEIVER_EXPORTED] by + * default. * @throws IllegalArgumentException if the filter has other constraints that are not actions or * categories or the filter has no actions. */ @@ -121,16 +127,18 @@ open class BroadcastDispatcher constructor ( receiver: BroadcastReceiver, filter: IntentFilter, executor: Executor? = null, - user: UserHandle? = null + user: UserHandle? = null, + @Context.RegisterReceiverFlags flags: Int = Context.RECEIVER_EXPORTED ) { checkFilter(filter) + val data = ReceiverData( + receiver, + filter, + executor ?: context.mainExecutor, + user ?: context.user + ) this.handler - .obtainMessage(MSG_ADD_RECEIVER, ReceiverData( - receiver, - filter, - executor ?: context.mainExecutor, - user ?: context.user - )) + .obtainMessage(MSG_ADD_RECEIVER, flags, 0, data) .sendToTarget() } @@ -188,6 +196,7 @@ open class BroadcastDispatcher constructor ( when (msg.what) { MSG_ADD_RECEIVER -> { val data = msg.obj as ReceiverData + val flags = msg.arg1 // If the receiver asked to be registered under the current user, we register // under the actual current user. val userId = if (data.user.identifier == UserHandle.USER_CURRENT) { @@ -201,7 +210,7 @@ open class BroadcastDispatcher constructor ( } val uBR = receiversByUser.get(userId, createUBRForUser(userId)) receiversByUser.put(userId, uBR) - uBR.registerReceiver(data) + uBR.registerReceiver(data, flags) } MSG_REMOVE_RECEIVER -> { diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt index 11da920d69ed..d4e9416c624b 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt @@ -64,7 +64,7 @@ open class UserBroadcastDispatcher( private val bgHandler = object : Handler(bgLooper) { override fun handleMessage(msg: Message) { when (msg.what) { - MSG_REGISTER_RECEIVER -> handleRegisterReceiver(msg.obj as ReceiverData) + MSG_REGISTER_RECEIVER -> handleRegisterReceiver(msg.obj as ReceiverData, msg.arg1) MSG_UNREGISTER_RECEIVER -> handleUnregisterReceiver(msg.obj as BroadcastReceiver) else -> Unit } @@ -73,7 +73,7 @@ open class UserBroadcastDispatcher( // Only modify in BG thread @VisibleForTesting - internal val actionsToActionsReceivers = ArrayMap<String, ActionReceiver>() + internal val actionsToActionsReceivers = ArrayMap<Pair<String, Int>, ActionReceiver>() private val receiverToActions = ArrayMap<BroadcastReceiver, MutableSet<String>>() @VisibleForTesting @@ -86,8 +86,8 @@ open class UserBroadcastDispatcher( /** * Register a [ReceiverData] for this user. */ - fun registerReceiver(receiverData: ReceiverData) { - bgHandler.obtainMessage(MSG_REGISTER_RECEIVER, receiverData).sendToTarget() + fun registerReceiver(receiverData: ReceiverData, flags: Int) { + bgHandler.obtainMessage(MSG_REGISTER_RECEIVER, flags, 0, receiverData).sendToTarget() } /** @@ -97,7 +97,7 @@ open class UserBroadcastDispatcher( bgHandler.obtainMessage(MSG_UNREGISTER_RECEIVER, receiver).sendToTarget() } - private fun handleRegisterReceiver(receiverData: ReceiverData) { + private fun handleRegisterReceiver(receiverData: ReceiverData, flags: Int) { Preconditions.checkState(bgHandler.looper.isCurrentThread, "This method should only be called from BG thread") if (DEBUG) Log.w(TAG, "Register receiver: ${receiverData.receiver}") @@ -106,20 +106,27 @@ open class UserBroadcastDispatcher( .addAll(receiverData.filter.actionsIterator()?.asSequence() ?: emptySequence()) receiverData.filter.actionsIterator().forEach { actionsToActionsReceivers - .getOrPut(it, { createActionReceiver(it) }) + .getOrPut(it to flags, { createActionReceiver(it, flags) }) .addReceiverData(receiverData) } - logger.logReceiverRegistered(userId, receiverData.receiver) + logger.logReceiverRegistered(userId, receiverData.receiver, flags) } @VisibleForTesting - internal open fun createActionReceiver(action: String): ActionReceiver { + internal open fun createActionReceiver(action: String, flags: Int): ActionReceiver { return ActionReceiver( action, userId, { - context.registerReceiverAsUser(this, UserHandle.of(userId), it, null, bgHandler) - logger.logContextReceiverRegistered(userId, it) + context.registerReceiverAsUser( + this, + UserHandle.of(userId), + it, + null, + bgHandler, + flags + ) + logger.logContextReceiverRegistered(userId, flags, it) }, { try { @@ -141,7 +148,11 @@ open class UserBroadcastDispatcher( "This method should only be called from BG thread") if (DEBUG) Log.w(TAG, "Unregister receiver: $receiver") receiverToActions.getOrDefault(receiver, mutableSetOf()).forEach { - actionsToActionsReceivers.get(it)?.removeReceiver(receiver) + actionsToActionsReceivers.forEach { (key, value) -> + if (key.first == it) { + value.removeReceiver(receiver) + } + } } receiverToActions.remove(receiver) logger.logReceiverUnregistered(userId, receiver) @@ -149,8 +160,9 @@ open class UserBroadcastDispatcher( override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { pw.indentIfPossible { - actionsToActionsReceivers.forEach { (action, actionReceiver) -> - println("$action:") + actionsToActionsReceivers.forEach { (actionAndFlags, actionReceiver) -> + println("(${actionAndFlags.first}: " + + "${BroadcastDispatcherLogger.flagToString(actionAndFlags.second)}):") actionReceiver.dump(fd, pw, args) } } diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt b/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt index 6ba88f4e69d7..8da651991072 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt @@ -17,6 +17,7 @@ package com.android.systemui.broadcast.logging import android.content.BroadcastReceiver +import android.content.Context import android.content.Intent import android.content.IntentFilter import com.android.systemui.log.LogBuffer @@ -33,6 +34,25 @@ class BroadcastDispatcherLogger @Inject constructor( @BroadcastDispatcherLog private val buffer: LogBuffer ) { + companion object { + fun flagToString(@Context.RegisterReceiverFlags flag: Int): String { + val b = StringBuilder("") + if (flag and Context.RECEIVER_VISIBLE_TO_INSTANT_APPS != 0) { + b.append("instant_apps,") + } + if (flag and Context.RECEIVER_NOT_EXPORTED != 0) { + b.append("not_exported,") + } + if (flag and Context.RECEIVER_EXPORTED != 0) { + b.append("exported") + } + if (b.isEmpty()) { + b.append(flag) + } + return b.toString() + } + } + fun logBroadcastReceived(broadcastId: Int, user: Int, intent: Intent) { val intentString = intent.toString() log(INFO, { @@ -55,13 +75,15 @@ class BroadcastDispatcherLogger @Inject constructor( }) } - fun logReceiverRegistered(user: Int, receiver: BroadcastReceiver) { + fun logReceiverRegistered(user: Int, receiver: BroadcastReceiver, flags: Int) { val receiverString = receiver.toString() + val flagsString = flagToString(flags) log(INFO, { int1 = user str1 = receiverString + str2 = flagsString }, { - "Receiver $str1 registered for user $int1" + "Receiver $str1 ($str2) registered for user $int1" }) } @@ -75,7 +97,7 @@ class BroadcastDispatcherLogger @Inject constructor( }) } - fun logContextReceiverRegistered(user: Int, filter: IntentFilter) { + fun logContextReceiverRegistered(user: Int, flags: Int, filter: IntentFilter) { val actions = filter.actionsIterator().asSequence() .joinToString(separator = ",", prefix = "Actions(", postfix = ")") val categories = if (filter.countCategories() != 0) { @@ -91,9 +113,10 @@ class BroadcastDispatcherLogger @Inject constructor( } else { actions } + str2 = flagToString(flags) }, { """ - Receiver registered with Context for user $int1. + Receiver registered with Context for user $int1. Flags=$str2 $str1 """.trimIndent() }) diff --git a/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastDispatcherTest.kt b/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastDispatcherTest.kt index 65301fe6fd3e..f514b5643553 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastDispatcherTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastDispatcherTest.kt @@ -31,6 +31,7 @@ import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger import com.android.systemui.dump.DumpManager import com.android.systemui.settings.UserTracker import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import junit.framework.Assert.assertSame import org.junit.Before @@ -54,6 +55,7 @@ class BroadcastDispatcherTest : SysuiTestCase() { companion object { val user0 = UserHandle.of(0) val user1 = UserHandle.of(1) + const val DEFAULT_FLAG = Context.RECEIVER_EXPORTED fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture() const val TEST_ACTION = "TEST_ACTION" @@ -96,6 +98,7 @@ class BroadcastDispatcherTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) testableLooper = TestableLooper.get(this) executor = FakeExecutor(FakeSystemClock()) + `when`(mockContext.mainExecutor).thenReturn(executor) broadcastDispatcher = TestBroadcastDispatcher( mockContext, @@ -121,12 +124,12 @@ class BroadcastDispatcherTest : SysuiTestCase() { testableLooper.processAllMessages() - verify(mockUBRUser0).registerReceiver(capture(argumentCaptor)) + verify(mockUBRUser0).registerReceiver(capture(argumentCaptor), eq(DEFAULT_FLAG)) assertSame(broadcastReceiver, argumentCaptor.value.receiver) assertSame(intentFilter, argumentCaptor.value.filter) - verify(mockUBRUser1).registerReceiver(capture(argumentCaptor)) + verify(mockUBRUser1).registerReceiver(capture(argumentCaptor), eq(DEFAULT_FLAG)) assertSame(broadcastReceiverOther, argumentCaptor.value.receiver) assertSame(intentFilterOther, argumentCaptor.value.filter) } @@ -139,17 +142,67 @@ class BroadcastDispatcherTest : SysuiTestCase() { testableLooper.processAllMessages() - verify(mockUBRUser0).registerReceiver(capture(argumentCaptor)) + verify(mockUBRUser0).registerReceiver(capture(argumentCaptor), eq(DEFAULT_FLAG)) assertSame(broadcastReceiver, argumentCaptor.value.receiver) assertSame(intentFilter, argumentCaptor.value.filter) - verify(mockUBRUser1).registerReceiver(capture(argumentCaptor)) + verify(mockUBRUser1).registerReceiver(capture(argumentCaptor), eq(DEFAULT_FLAG)) assertSame(broadcastReceiverOther, argumentCaptor.value.receiver) assertSame(intentFilterOther, argumentCaptor.value.filter) } @Test + fun testAddReceiverDefaultFlag_handler() { + broadcastDispatcher.registerReceiverWithHandler( + broadcastReceiver, intentFilter, mockHandler) + testableLooper.processAllMessages() + + verify(mockUBRUser0).registerReceiver(capture(argumentCaptor), eq(DEFAULT_FLAG)) + + assertSame(broadcastReceiver, argumentCaptor.value.receiver) + assertSame(intentFilter, argumentCaptor.value.filter) + } + + @Test + fun testAddReceiverCorrectFlag_handler() { + val flag = 3 + + broadcastDispatcher.registerReceiverWithHandler( + broadcastReceiver, intentFilter, mockHandler, flags = flag) + testableLooper.processAllMessages() + + verify(mockUBRUser0).registerReceiver(capture(argumentCaptor), eq(flag)) + + assertSame(broadcastReceiver, argumentCaptor.value.receiver) + assertSame(intentFilter, argumentCaptor.value.filter) + } + + @Test + fun testAddReceiverDefaultFlag_executor() { + broadcastDispatcher.registerReceiver(broadcastReceiver, intentFilter) + testableLooper.processAllMessages() + + verify(mockUBRUser0).registerReceiver(capture(argumentCaptor), eq(DEFAULT_FLAG)) + + assertSame(broadcastReceiver, argumentCaptor.value.receiver) + assertSame(intentFilter, argumentCaptor.value.filter) + } + + @Test + fun testAddReceiverCorrectFlag_executor() { + val flag = 3 + + broadcastDispatcher.registerReceiver(broadcastReceiver, intentFilter, flags = flag) + testableLooper.processAllMessages() + + verify(mockUBRUser0).registerReceiver(capture(argumentCaptor), eq(flag)) + + assertSame(broadcastReceiver, argumentCaptor.value.receiver) + assertSame(intentFilter, argumentCaptor.value.filter) + } + + @Test fun testRemovingReceiversRemovesFromAllUBR() { broadcastDispatcher.registerReceiverWithHandler(broadcastReceiver, intentFilter, mockHandler, user0) @@ -188,7 +241,8 @@ class BroadcastDispatcherTest : SysuiTestCase() { testableLooper.processAllMessages() - verify(mockUBRUser1).registerReceiver(capture(argumentCaptor)) + verify(mockUBRUser1).registerReceiver( + capture(argumentCaptor), eq(Context.RECEIVER_EXPORTED)) assertSame(broadcastReceiver, argumentCaptor.value.receiver) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt b/packages/SystemUI/tests/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt index 1a78ca407467..fd1c41ef25b8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt @@ -44,7 +44,8 @@ class FakeBroadcastDispatcher( receiver: BroadcastReceiver, filter: IntentFilter, handler: Handler, - user: UserHandle + user: UserHandle, + flags: Int ) { registeredReceivers.add(receiver) } @@ -53,7 +54,8 @@ class FakeBroadcastDispatcher( receiver: BroadcastReceiver, filter: IntentFilter, executor: Executor?, - user: UserHandle? + user: UserHandle?, + flags: Int ) { registeredReceivers.add(receiver) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/broadcast/UserBroadcastDispatcherTest.kt b/packages/SystemUI/tests/src/com/android/systemui/broadcast/UserBroadcastDispatcherTest.kt index dfe143254788..4e3345c7576d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/broadcast/UserBroadcastDispatcherTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/broadcast/UserBroadcastDispatcherTest.kt @@ -30,6 +30,7 @@ import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock import junit.framework.Assert.assertFalse import junit.framework.Assert.assertNotNull +import junit.framework.Assert.assertNotSame import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -37,6 +38,7 @@ import org.mockito.ArgumentCaptor import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.mock +import org.mockito.Mockito.nullable import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import java.util.concurrent.Executor @@ -50,6 +52,7 @@ class UserBroadcastDispatcherTest : SysuiTestCase() { private const val ACTION_1 = "com.android.systemui.tests.ACTION_1" private const val ACTION_2 = "com.android.systemui.tests.ACTION_2" private const val USER_ID = 0 + private const val FLAG = 3 private val USER_HANDLE = UserHandle.of(USER_ID) fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture() @@ -82,7 +85,7 @@ class UserBroadcastDispatcherTest : SysuiTestCase() { userBroadcastDispatcher = object : UserBroadcastDispatcher( mockContext, USER_ID, testableLooper.looper, mock(Executor::class.java), logger) { - override fun createActionReceiver(action: String): ActionReceiver { + override fun createActionReceiver(action: String, flags: Int): ActionReceiver { return mock(ActionReceiver::class.java) } } @@ -93,23 +96,41 @@ class UserBroadcastDispatcherTest : SysuiTestCase() { intentFilter = IntentFilter(ACTION_1) val receiverData = ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE) - userBroadcastDispatcher.registerReceiver(receiverData) + userBroadcastDispatcher.registerReceiver(receiverData, FLAG) testableLooper.processAllMessages() - val actionReceiver = userBroadcastDispatcher.getActionReceiver(ACTION_1) + val actionReceiver = userBroadcastDispatcher.getActionReceiver(ACTION_1, FLAG) assertNotNull(actionReceiver) verify(actionReceiver)?.addReceiverData(receiverData) } @Test + fun testDifferentActionReceiversForDifferentFlags() { + intentFilter = IntentFilter(ACTION_1) + val receiverData = ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE) + + val flag1 = 0 + val flag2 = 1 + + userBroadcastDispatcher.registerReceiver(receiverData, flag1) + userBroadcastDispatcher.registerReceiver(receiverData, flag2) + testableLooper.processAllMessages() + + assertNotSame( + userBroadcastDispatcher.getActionReceiver(ACTION_1, flag1), + userBroadcastDispatcher.getActionReceiver(ACTION_1, flag2) + ) + } + + @Test fun testSingleReceiverRegistered_logging() { intentFilter = IntentFilter(ACTION_1) userBroadcastDispatcher.registerReceiver( - ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE)) + ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE), FLAG) testableLooper.processAllMessages() - verify(logger).logReceiverRegistered(USER_HANDLE.identifier, broadcastReceiver) + verify(logger).logReceiverRegistered(USER_HANDLE.identifier, broadcastReceiver, FLAG) } @Test @@ -117,13 +138,13 @@ class UserBroadcastDispatcherTest : SysuiTestCase() { intentFilter = IntentFilter(ACTION_1) userBroadcastDispatcher.registerReceiver( - ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE)) + ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE), FLAG) testableLooper.processAllMessages() userBroadcastDispatcher.unregisterReceiver(broadcastReceiver) testableLooper.processAllMessages() - val actionReceiver = userBroadcastDispatcher.getActionReceiver(ACTION_1) + val actionReceiver = userBroadcastDispatcher.getActionReceiver(ACTION_1, FLAG) assertNotNull(actionReceiver) verify(actionReceiver)?.removeReceiver(broadcastReceiver) } @@ -133,7 +154,7 @@ class UserBroadcastDispatcherTest : SysuiTestCase() { intentFilter = IntentFilter(ACTION_1) userBroadcastDispatcher.registerReceiver( - ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE)) + ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE), FLAG) testableLooper.processAllMessages() userBroadcastDispatcher.unregisterReceiver(broadcastReceiver) @@ -146,12 +167,18 @@ class UserBroadcastDispatcherTest : SysuiTestCase() { fun testRemoveReceiverReferences() { intentFilter = IntentFilter(ACTION_1) userBroadcastDispatcher.registerReceiver( - ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE)) + ReceiverData(broadcastReceiver, intentFilter, fakeExecutor, USER_HANDLE), FLAG) intentFilterOther = IntentFilter(ACTION_1) intentFilterOther.addAction(ACTION_2) userBroadcastDispatcher.registerReceiver( - ReceiverData(broadcastReceiverOther, intentFilterOther, fakeExecutor, USER_HANDLE)) + ReceiverData( + broadcastReceiverOther, + intentFilterOther, + fakeExecutor, + USER_HANDLE + ), FLAG + ) userBroadcastDispatcher.unregisterReceiver(broadcastReceiver) testableLooper.processAllMessages() @@ -160,7 +187,34 @@ class UserBroadcastDispatcherTest : SysuiTestCase() { assertFalse(userBroadcastDispatcher.isReceiverReferenceHeld(broadcastReceiver)) } - private fun UserBroadcastDispatcher.getActionReceiver(action: String): ActionReceiver? { - return actionsToActionsReceivers.get(action) + @Test + fun testCreateActionReceiver_registerWithFlag() { + val uBR = UserBroadcastDispatcher( + mockContext, + USER_ID, + testableLooper.looper, + fakeExecutor, + logger + ) + uBR.registerReceiver( + ReceiverData( + broadcastReceiver, + IntentFilter(ACTION_1), + fakeExecutor, + USER_HANDLE + ), + FLAG + ) + + testableLooper.processAllMessages() + fakeExecutor.runAllReady() + + verify(mockContext).registerReceiverAsUser( + any(), any(), any(), nullable(String::class.java), any(), eq(FLAG)) + } + + private fun UserBroadcastDispatcher + .getActionReceiver(action: String, flags: Int): ActionReceiver? { + return actionsToActionsReceivers.get(action to flags) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt index a80fbbeb318d..cff6b9ab935b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt @@ -53,6 +53,7 @@ import org.mockito.ArgumentMatchers import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito +import org.mockito.Mockito.anyInt import org.mockito.Mockito.`when` import org.mockito.Mockito.inOrder import org.mockito.Mockito.mock @@ -167,7 +168,7 @@ class ControlsControllerImplTest : SysuiTestCase() { controller.auxiliaryPersistenceWrapper = auxiliaryPersistenceWrapper verify(broadcastDispatcher).registerReceiver( - capture(broadcastReceiverCaptor), any(), any(), eq(UserHandle.ALL)) + capture(broadcastReceiverCaptor), any(), any(), eq(UserHandle.ALL), anyInt()) verify(listingController).addCallback(capture(listingCallbackCaptor)) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferFreezerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferFreezerTest.kt index eb38073a85f7..5dea5a1a0a64 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferFreezerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferFreezerTest.kt @@ -32,6 +32,7 @@ import org.junit.Test import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito.anyInt import org.mockito.Mockito.never import org.mockito.Mockito.times import org.mockito.Mockito.verify @@ -66,7 +67,8 @@ class LogBufferFreezerTest : SysuiTestCase() { capture(receiverCaptor), any(IntentFilter::class.java), eq(executor), - any(UserHandle::class.java)) + any(UserHandle::class.java), + anyInt()) receiver = receiverCaptor.value } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt index 150f4545bd43..a382115422c9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt @@ -166,7 +166,7 @@ class MediaResumeListenerTest : SysuiTestCase() { resumeBrowserFactory, dumpManager) listener.setManager(mediaDataManager) verify(broadcastDispatcher, never()).registerReceiver(eq(listener.userChangeReceiver), - any(), any(), any()) + any(), any(), any(), anyInt()) // When data is loaded, we do NOT execute or update anything listener.onMediaDataLoaded(KEY, OLD_KEY, data) @@ -279,7 +279,7 @@ class MediaResumeListenerTest : SysuiTestCase() { // Make sure broadcast receiver is registered resumeListener.setManager(mediaDataManager) verify(broadcastDispatcher).registerReceiver(eq(resumeListener.userChangeReceiver), - any(), any(), any()) + any(), any(), any(), anyInt()) // When we get an unlock event val intent = Intent(Intent.ACTION_USER_UNLOCKED) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java index 922c6b648aab..3e92e90f2a77 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java @@ -21,6 +21,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -143,7 +144,8 @@ public class AutoAddTrackerTest extends SysuiTestCase { @Test public void testBroadcastReceiverRegistered() { verify(mBroadcastDispatcher).registerReceiver( - any(), mIntentFilterArgumentCaptor.capture(), any(), eq(UserHandle.of(USER))); + any(), mIntentFilterArgumentCaptor.capture(), any(), eq(UserHandle.of(USER)), + anyInt()); assertTrue( mIntentFilterArgumentCaptor.getValue().hasAction(Intent.ACTION_SETTING_RESTORED)); @@ -156,13 +158,13 @@ public class AutoAddTrackerTest extends SysuiTestCase { InOrder inOrder = Mockito.inOrder(mBroadcastDispatcher); inOrder.verify(mBroadcastDispatcher).unregisterReceiver(any()); inOrder.verify(mBroadcastDispatcher) - .registerReceiver(any(), any(), any(), eq(UserHandle.of(USER + 1))); + .registerReceiver(any(), any(), any(), eq(UserHandle.of(USER + 1)), anyInt()); } @Test public void testSettingRestoredWithTilesNotRemovedInSource_noAutoAddedInTarget() { verify(mBroadcastDispatcher).registerReceiver( - mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any()); + mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any(), anyInt()); // These tiles were present in the original device String restoredTiles = "saver,work,internet,cast"; @@ -185,7 +187,8 @@ public class AutoAddTrackerTest extends SysuiTestCase { @Test public void testSettingRestoredWithTilesRemovedInSource_noAutoAddedInTarget() { verify(mBroadcastDispatcher) - .registerReceiver(mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any()); + .registerReceiver(mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any(), + anyInt()); // These tiles were present in the original device String restoredTiles = "saver,internet,cast"; @@ -208,7 +211,8 @@ public class AutoAddTrackerTest extends SysuiTestCase { @Test public void testSettingRestoredWithTilesRemovedInSource_sameAutoAddedinTarget() { verify(mBroadcastDispatcher) - .registerReceiver(mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any()); + .registerReceiver(mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any(), + anyInt()); // These tiles were present in the original device String restoredTiles = "saver,internet,cast"; @@ -232,7 +236,8 @@ public class AutoAddTrackerTest extends SysuiTestCase { @Test public void testSettingRestoredWithTilesRemovedInSource_othersAutoAddedinTarget() { verify(mBroadcastDispatcher) - .registerReceiver(mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any()); + .registerReceiver(mBroadcastReceiverArgumentCaptor.capture(), any(), any(), any(), + anyInt()); // These tiles were present in the original device String restoredTiles = "saver,internet,cast"; diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/RingerModeLiveDataTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/RingerModeLiveDataTest.kt index 2489c301f6f5..1fb2aec6f06c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/util/RingerModeLiveDataTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/util/RingerModeLiveDataTest.kt @@ -34,6 +34,7 @@ import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito +import org.mockito.Mockito.anyInt import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations @@ -86,14 +87,15 @@ class RingerModeLiveDataTest : SysuiTestCase() { @Test fun testOnActive_broadcastRegistered() { liveData.observeForever(observer) - verify(broadcastDispatcher).registerReceiver(any(), any(), eq(executor), eq(UserHandle.ALL)) + verify(broadcastDispatcher) + .registerReceiver(any(), any(), eq(executor), eq(UserHandle.ALL), anyInt()) } @Test fun testOnActive_intentFilterHasIntent() { liveData.observeForever(observer) verify(broadcastDispatcher).registerReceiver(any(), capture(intentFilterCaptor), any(), - any()) + any(), anyInt()) assertTrue(intentFilterCaptor.value.hasAction(INTENT)) } |