From 8cfb8af91a5865a2eeb77ce513eceec3a1370de5 Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Thu, 15 Sep 2022 22:11:51 +0000 Subject: [PATCH] [SB Refactor] Expose the wifi repository flows as StateFlows. From Evan's comment on ag/19745297, we should expose our flows as StateFlows so that it's clear to callers that it is a hot flow, not a cold flow. Bug: 238425913 Test: statusbar.pipeline tests Test: manual: Verified wifi icon via new pipeline still works Change-Id: Icec5c30f203bd11ade72f11b8fbb2b296394a693 --- .../wifi/data/repository/WifiRepository.kt | 30 ++++++++----------- .../data/repository/FakeWifiRepository.kt | 6 ++-- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt index 103f3fc21f918..f41264fc570ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/WifiRepository.kt @@ -43,24 +43,18 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.stateIn -/** - * Provides data related to the wifi state. - */ +/** Provides data related to the wifi state. */ interface WifiRepository { - /** - * Observable for the current wifi network. - */ - val wifiNetwork: Flow + /** Observable for the current wifi network. */ + val wifiNetwork: StateFlow - /** - * Observable for the current wifi network activity. - */ - val wifiActivity: Flow + /** Observable for the current wifi network activity. */ + val wifiActivity: StateFlow } /** Real implementation of [WifiRepository]. */ @@ -74,7 +68,7 @@ class WifiRepositoryImpl @Inject constructor( @Application scope: CoroutineScope, wifiManager: WifiManager?, ) : WifiRepository { - override val wifiNetwork: Flow = conflatedCallbackFlow { + override val wifiNetwork: StateFlow = conflatedCallbackFlow { var currentWifi: WifiNetworkModel = WIFI_NETWORK_DEFAULT val callback = object : ConnectivityManager.NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) { @@ -132,7 +126,7 @@ class WifiRepositoryImpl @Inject constructor( initialValue = WIFI_NETWORK_DEFAULT ) - override val wifiActivity: Flow = + override val wifiActivity: StateFlow = if (wifiManager == null) { Log.w(SB_LOGGING_TAG, "Null WifiManager; skipping activity callback") flowOf(ACTIVITY_DEFAULT) @@ -142,13 +136,15 @@ class WifiRepositoryImpl @Inject constructor( logger.logInputChange("onTrafficStateChange", prettyPrintActivity(state)) trySend(trafficStateToWifiActivityModel(state)) } - - trySend(ACTIVITY_DEFAULT) wifiManager.registerTrafficStateCallback(mainExecutor, callback) - awaitClose { wifiManager.unregisterTrafficStateCallback(callback) } } } + .stateIn( + scope, + started = SharingStarted.WhileSubscribed(), + initialValue = ACTIVITY_DEFAULT + ) companion object { val ACTIVITY_DEFAULT = WifiActivityModel(hasActivityIn = false, hasActivityOut = false) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt index 6b8d4aa7c51f4..d59a25b8c5a9a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/FakeWifiRepository.kt @@ -19,17 +19,17 @@ package com.android.systemui.statusbar.pipeline.wifi.data.repository import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiActivityModel import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryImpl.Companion.ACTIVITY_DEFAULT -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow /** Fake implementation of [WifiRepository] exposing set methods for all the flows. */ class FakeWifiRepository : WifiRepository { private val _wifiNetwork: MutableStateFlow = MutableStateFlow(WifiNetworkModel.Inactive) - override val wifiNetwork: Flow = _wifiNetwork + override val wifiNetwork: StateFlow = _wifiNetwork private val _wifiActivity = MutableStateFlow(ACTIVITY_DEFAULT) - override val wifiActivity: Flow = _wifiActivity + override val wifiActivity: StateFlow = _wifiActivity fun setWifiNetwork(wifiNetworkModel: WifiNetworkModel) { _wifiNetwork.value = wifiNetworkModel