summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fabian Kozynski <kozynski@google.com> 2021-09-01 11:12:37 -0400
committer Fabian Kozynski <kozynski@google.com> 2021-09-09 09:21:27 -0400
commitdef01e7485d3e99573a63b105342bd45025c98d0 (patch)
tree74d18baad9be73a781b4e9b26a47ed0682b3aac3
parent8bd6b0d17821359c8c4b30dc366c0fed493cce27 (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
-rw-r--r--packages/SystemUI/docs/broadcasts.md6
-rw-r--r--packages/SystemUI/src/com/android/systemui/broadcast/BroadcastDispatcher.kt29
-rw-r--r--packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt38
-rw-r--r--packages/SystemUI/src/com/android/systemui/broadcast/logging/BroadcastDispatcherLogger.kt31
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/broadcast/BroadcastDispatcherTest.kt64
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt6
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/broadcast/UserBroadcastDispatcherTest.kt78
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/dump/LogBufferFreezerTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/MediaResumeListenerTest.kt4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/AutoAddTrackerTest.java17
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/util/RingerModeLiveDataTest.kt6
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))
}