Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt +1 −6 Original line number Diff line number Diff line Loading @@ -57,7 +57,6 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.asExecutor import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine Loading Loading @@ -205,9 +204,6 @@ constructor( } .stateIn(scope, SharingStarted.WhileSubscribed(), null) private val defaultDataSubIdChangeEvent: MutableSharedFlow<Unit> = MutableSharedFlow(extraBufferCapacity = 1) override val defaultDataSubId: StateFlow<Int> = broadcastDispatcher .broadcastFlow( Loading @@ -223,7 +219,6 @@ constructor( initialValue = INVALID_SUBSCRIPTION_ID, ) .onStart { emit(subscriptionManagerProxy.getDefaultDataSubscriptionId()) } .onEach { defaultDataSubIdChangeEvent.tryEmit(Unit) } .stateIn(scope, SharingStarted.WhileSubscribed(), INVALID_SUBSCRIPTION_ID) private val carrierConfigChangedEvent = Loading @@ -232,7 +227,7 @@ constructor( .onEach { logger.logActionCarrierConfigChanged() } override val defaultDataSubRatConfig: StateFlow<Config> = merge(defaultDataSubIdChangeEvent, carrierConfigChangedEvent) merge(defaultDataSubId, carrierConfigChangedEvent) .onStart { emit(Unit) } .mapLatest { Config.readConfig(context) } .distinctUntilChanged() Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt +4 −7 Original line number Diff line number Diff line Loading @@ -1074,13 +1074,10 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { assertThat(configFromContext.showAtLeast3G).isTrue() // WHEN the change event is fired fakeBroadcastDispatcher.registeredReceivers.forEach { receiver -> receiver.onReceive( context, val intent = Intent(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED) .putExtra(PhoneConstants.SUBSCRIPTION_KEY, SUB_1_ID) ) } fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(context, intent) // THEN the config is updated assertTrue(latest!!.areEqual(configFromContext)) Loading packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt +42 −6 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading @@ -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, Loading @@ -62,7 +74,7 @@ class FakeBroadcastDispatcher( @Context.RegisterReceiverFlags flags: Int, permission: String? ) { registeredReceivers.add(receiver) receivers.add(InternalReceiver(receiver, filter)) } override fun registerReceiver( Loading @@ -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) { Loading @@ -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, ) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt +1 −6 Original line number Diff line number Diff line Loading @@ -57,7 +57,6 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.asExecutor import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine Loading Loading @@ -205,9 +204,6 @@ constructor( } .stateIn(scope, SharingStarted.WhileSubscribed(), null) private val defaultDataSubIdChangeEvent: MutableSharedFlow<Unit> = MutableSharedFlow(extraBufferCapacity = 1) override val defaultDataSubId: StateFlow<Int> = broadcastDispatcher .broadcastFlow( Loading @@ -223,7 +219,6 @@ constructor( initialValue = INVALID_SUBSCRIPTION_ID, ) .onStart { emit(subscriptionManagerProxy.getDefaultDataSubscriptionId()) } .onEach { defaultDataSubIdChangeEvent.tryEmit(Unit) } .stateIn(scope, SharingStarted.WhileSubscribed(), INVALID_SUBSCRIPTION_ID) private val carrierConfigChangedEvent = Loading @@ -232,7 +227,7 @@ constructor( .onEach { logger.logActionCarrierConfigChanged() } override val defaultDataSubRatConfig: StateFlow<Config> = merge(defaultDataSubIdChangeEvent, carrierConfigChangedEvent) merge(defaultDataSubId, carrierConfigChangedEvent) .onStart { emit(Unit) } .mapLatest { Config.readConfig(context) } .distinctUntilChanged() Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt +4 −7 Original line number Diff line number Diff line Loading @@ -1074,13 +1074,10 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { assertThat(configFromContext.showAtLeast3G).isTrue() // WHEN the change event is fired fakeBroadcastDispatcher.registeredReceivers.forEach { receiver -> receiver.onReceive( context, val intent = Intent(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED) .putExtra(PhoneConstants.SUBSCRIPTION_KEY, SUB_1_ID) ) } fakeBroadcastDispatcher.sendIntentToMatchingReceiversOnly(context, intent) // THEN the config is updated assertTrue(latest!!.areEqual(configFromContext)) Loading
packages/SystemUI/tests/utils/src/com/android/systemui/broadcast/FakeBroadcastDispatcher.kt +42 −6 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading @@ -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, Loading @@ -62,7 +74,7 @@ class FakeBroadcastDispatcher( @Context.RegisterReceiverFlags flags: Int, permission: String? ) { registeredReceivers.add(receiver) receivers.add(InternalReceiver(receiver, filter)) } override fun registerReceiver( Loading @@ -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) { Loading @@ -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, ) }