summaryrefslogtreecommitdiff
path: root/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt
diff options
context:
space:
mode:
Diffstat (limited to 'packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt')
-rw-r--r--packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt48
1 files changed, 42 insertions, 6 deletions
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt
index af940e4fa687..f19e19113b30 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt
@@ -18,6 +18,7 @@ package com.android.systemui.broadcast
import android.content.BroadcastReceiver
import android.content.Context
+import android.content.Intent
import android.content.IntentFilter
import android.os.Handler
import android.os.Looper
@@ -31,6 +32,14 @@ import java.lang.IllegalStateException
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.Executor
+/**
+ * A fake instance of [BroadcastDispatcher] for tests.
+ *
+ * Important: The *real* broadcast dispatcher will only send intents to receivers if the intent
+ * matches the [IntentFilter] that the [BroadcastReceiver] was registered with. This fake class does
+ * *not* do that matching by default. Use [sendIntentToMatchingReceiversOnly] to get the same
+ * matching behavior as the real broadcast dispatcher.
+ */
class FakeBroadcastDispatcher(
context: SysuiTestableContext,
mainExecutor: Executor,
@@ -52,7 +61,10 @@ class FakeBroadcastDispatcher(
PendingRemovalStore(logger)
) {
- val registeredReceivers: MutableSet<BroadcastReceiver> = ConcurrentHashMap.newKeySet()
+ private val receivers: MutableSet<InternalReceiver> = ConcurrentHashMap.newKeySet()
+
+ val registeredReceivers: Set<BroadcastReceiver>
+ get() = receivers.map { it.receiver }.toSet()
override fun registerReceiverWithHandler(
receiver: BroadcastReceiver,
@@ -62,7 +74,7 @@ class FakeBroadcastDispatcher(
@Context.RegisterReceiverFlags flags: Int,
permission: String?
) {
- registeredReceivers.add(receiver)
+ receivers.add(InternalReceiver(receiver, filter))
}
override fun registerReceiver(
@@ -73,15 +85,34 @@ class FakeBroadcastDispatcher(
@Context.RegisterReceiverFlags flags: Int,
permission: String?
) {
- registeredReceivers.add(receiver)
+ receivers.add(InternalReceiver(receiver, filter))
}
override fun unregisterReceiver(receiver: BroadcastReceiver) {
- registeredReceivers.remove(receiver)
+ receivers.removeIf { it.receiver == receiver }
}
override fun unregisterReceiverForUser(receiver: BroadcastReceiver, user: UserHandle) {
- registeredReceivers.remove(receiver)
+ receivers.removeIf { it.receiver == receiver }
+ }
+
+ /**
+ * Sends the given [intent] to *only* the receivers that were registered with an [IntentFilter]
+ * that matches the intent.
+ */
+ fun sendIntentToMatchingReceiversOnly(context: Context, intent: Intent) {
+ receivers.forEach {
+ if (
+ it.filter.match(
+ context.contentResolver,
+ intent,
+ /* resolve= */ false,
+ /* logTag= */ "FakeBroadcastDispatcher",
+ ) > 0
+ ) {
+ it.receiver.onReceive(context, intent)
+ }
+ }
}
fun cleanUpReceivers(testName: String) {
@@ -91,6 +122,11 @@ class FakeBroadcastDispatcher(
throw IllegalStateException("Receiver not unregistered from dispatcher: $it")
}
}
- registeredReceivers.clear()
+ receivers.clear()
}
+
+ private data class InternalReceiver(
+ val receiver: BroadcastReceiver,
+ val filter: IntentFilter,
+ )
}