Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cfb8af9 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[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
parent fa0dc28b
Loading
Loading
Loading
Loading
+14 −18
Original line number Diff line number Diff line
@@ -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)
+3 −3
Original line number Diff line number Diff line
@@ -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