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

Commit fef3c333 authored by Evan Laird's avatar Evan Laird
Browse files

[Sb refactor] Add network scan results to wifi repo

Adds the `WifiManager.registerScanResultsCallback` information to
`WifiRepository`, and `areNetworksAvailable` to the `WifiInteractor`.
This allows us to fund the QS tile with information about any other
networks being available.

This logic should match exactly the information that comes from the old
data pipeline.

Test: tests in statusbar/pipeline
Bug: 291321279
Change-Id: Ic8a632ecb19b74d99896fd0aef038f3c147a0290
parent e2b3d6dc
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.wifi.data.repository
import com.android.systemui.CoreStartable
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiScanEntry
import kotlinx.coroutines.flow.StateFlow

/** Provides data related to the wifi state. */
@@ -44,6 +45,12 @@ interface WifiRepository {
    /** Observable for the current wifi network activity. */
    val wifiActivity: StateFlow<DataActivityModel>

    /**
     * The list of known wifi networks, per [WifiManager.scanResults]. This list is passively
     * updated and does not trigger a scan.
     */
    val wifiScanResults: StateFlow<List<WifiScanEntry>>

    /**
     * Returns true if the device is currently connected to a wifi network with a valid SSID and
     * false otherwise.
+6 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityMod
import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.DemoWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiScanEntry
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -124,4 +125,9 @@ constructor(
        activeRepo
            .flatMapLatest { it.wifiActivity }
            .stateIn(scope, SharingStarted.WhileSubscribed(), realImpl.wifiActivity.value)

    override val wifiScanResults: StateFlow<List<WifiScanEntry>> =
        activeRepo
            .flatMapLatest { it.wifiScanResults }
            .stateIn(scope, SharingStarted.WhileSubscribed(), realImpl.wifiScanResults.value)
}
+5 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import com.android.systemui.statusbar.pipeline.shared.data.model.toWifiDataActiv
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.model.FakeWifiEventModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiScanEntry
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
@@ -55,6 +56,10 @@ constructor(
        MutableStateFlow(DataActivityModel(hasActivityIn = false, hasActivityOut = false))
    override val wifiActivity: StateFlow<DataActivityModel> = _wifiActivity

    private val _wifiScanResults: MutableStateFlow<List<WifiScanEntry>> =
        MutableStateFlow(emptyList())
    override val wifiScanResults: StateFlow<List<WifiScanEntry>> = _wifiScanResults

    fun startProcessingCommands() {
        demoCommandJob =
            scope.launch {
+4 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityMod
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryDagger
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryViaTrackerLibDagger
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiScanEntry
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -49,6 +50,9 @@ class DisabledWifiRepository @Inject constructor() :
    override val wifiActivity: StateFlow<DataActivityModel> =
        MutableStateFlow(ACTIVITY).asStateFlow()

    override val wifiScanResults: StateFlow<List<WifiScanEntry>> =
        MutableStateFlow<List<WifiScanEntry>>(emptyList()).asStateFlow()

    companion object {
        private val NETWORK = WifiNetworkModel.Unavailable
        private val ACTIVITY = DataActivityModel(hasActivityIn = false, hasActivityOut = false)
+34 −0
Original line number Diff line number Diff line
@@ -16,15 +16,21 @@

package com.android.systemui.statusbar.pipeline.wifi.data.repository.prod

import android.annotation.SuppressLint
import android.net.wifi.ScanResult
import android.net.wifi.WifiManager
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.logDiffsForTable
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.shared.data.model.toWifiDataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiScanEntry
import java.util.concurrent.Executor
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asExecutor
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@@ -64,6 +70,34 @@ object WifiRepositoryHelper {
            )
    }

    /**
     * Creates a flow that listens for new [ScanResult]s from [WifiManager]. Does not request a scan
     */
    fun createNetworkScanFlow(
        wifiManager: WifiManager,
        scope: CoroutineScope,
        @Background dispatcher: CoroutineDispatcher,
        inputLogger: () -> Unit,
    ): StateFlow<List<WifiScanEntry>> {
        return conflatedCallbackFlow {
                val callback =
                    object : WifiManager.ScanResultsCallback() {
                        @SuppressLint("MissingPermission")
                        override fun onScanResultsAvailable() {
                            inputLogger.invoke()
                            trySend(wifiManager.scanResults.toModel())
                        }
                    }

                wifiManager.registerScanResultsCallback(dispatcher.asExecutor(), callback)

                awaitClose { wifiManager.unregisterScanResultsCallback(callback) }
            }
            .stateIn(scope, SharingStarted.Eagerly, emptyList())
    }

    private fun List<ScanResult>.toModel(): List<WifiScanEntry> = map { WifiScanEntry(it.SSID) }

    // TODO(b/292534484): This print should only be done in [MessagePrinter] part of the log buffer.
    private fun prettyPrintActivity(activity: Int): String {
        return when (activity) {
Loading