diff options
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.kt | 48 |
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, + ) } |