[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
This commit is contained in:
Caitlin Shkuratov
2022-09-15 22:11:51 +00:00
parent fa0dc28b4c
commit 8cfb8af91a
2 changed files with 16 additions and 20 deletions

View File

@@ -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<WifiNetworkModel>
/** Observable for the current wifi network. */
val wifiNetwork: StateFlow<WifiNetworkModel>
/**
* Observable for the current wifi network activity.
*/
val wifiActivity: Flow<WifiActivityModel>
/** Observable for the current wifi network activity. */
val wifiActivity: StateFlow<WifiActivityModel>
}
/** Real implementation of [WifiRepository]. */
@@ -74,7 +68,7 @@ class WifiRepositoryImpl @Inject constructor(
@Application scope: CoroutineScope,
wifiManager: WifiManager?,
) : WifiRepository {
override val wifiNetwork: Flow<WifiNetworkModel> = conflatedCallbackFlow {
override val wifiNetwork: StateFlow<WifiNetworkModel> = 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<WifiActivityModel> =
override val wifiActivity: StateFlow<WifiActivityModel> =
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)

View File

@@ -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<WifiNetworkModel> =
MutableStateFlow(WifiNetworkModel.Inactive)
override val wifiNetwork: Flow<WifiNetworkModel> = _wifiNetwork
override val wifiNetwork: StateFlow<WifiNetworkModel> = _wifiNetwork
private val _wifiActivity = MutableStateFlow(ACTIVITY_DEFAULT)
override val wifiActivity: Flow<WifiActivityModel> = _wifiActivity
override val wifiActivity: StateFlow<WifiActivityModel> = _wifiActivity
fun setWifiNetwork(wifiNetworkModel: WifiNetworkModel) {
_wifiNetwork.value = wifiNetworkModel