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

Commit 40230d60 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[kairos] Keep view-model looked up via subId up-to-date" into main

parents 97a4dc45 684e08dc
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import com.android.settingslib.graph.SignalDrawable
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.log.table.Diffable
import com.android.systemui.log.table.TableRowLogger
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS

sealed interface SignalIconModel : Diffable<SignalIconModel> {
    val level: Int
@@ -81,10 +82,7 @@ sealed interface SignalIconModel : Diffable<SignalIconModel> {
     * For non-terrestrial networks, we can use a resource-backed icon instead of the
     * [SignalDrawable]-backed version above
     */
    data class Satellite(
        override val level: Int,
        val icon: Icon.Resource,
    ) : SignalIconModel {
    data class Satellite(override val level: Int, val icon: Icon.Resource) : SignalIconModel {
        override fun logPartial(prevVal: SignalIconModel, row: TableRowLogger) {
            if (prevVal !is Satellite) {
                logFull(row)
@@ -102,6 +100,13 @@ sealed interface SignalIconModel : Diffable<SignalIconModel> {
    }

    companion object {
        val DEFAULT =
            Cellular(
                level = 0,
                numberOfLevels = DEFAULT_NUM_LEVELS,
                showExclamationMark = true,
                carrierNetworkChange = false,
            )
        private const val COL_LEVEL = "level"
        private const val COL_NUM_LEVELS = "numLevels"
        private const val COL_SHOW_EXCLAMATION = "showExclamation"
+89 −7
Original line number Diff line number Diff line
@@ -16,12 +16,15 @@

package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel

import android.content.Context
import androidx.compose.runtime.State as ComposeState
import androidx.compose.runtime.getValue
import com.android.settingslib.mobile.TelephonyIcons
import com.android.systemui.Flags
import com.android.systemui.KairosActivatable
import com.android.systemui.KairosBuilder
import com.android.systemui.activated
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.kairos.BuildScope
@@ -32,19 +35,29 @@ import com.android.systemui.kairos.State as KairosState
import com.android.systemui.kairos.State
import com.android.systemui.kairos.buildSpec
import com.android.systemui.kairos.combine
import com.android.systemui.kairos.flatMap
import com.android.systemui.kairos.flatten
import com.android.systemui.kairos.map
import com.android.systemui.kairos.mapValues
import com.android.systemui.kairos.stateOf
import com.android.systemui.kairosBuilder
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.TableLogBufferFactory
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Factory.Companion.MOBILE_CONNECTION_BUFFER_SIZE
import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Factory.Companion.tableBufferLogName
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconInteractorKairos
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorKairos
import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel
import com.android.systemui.statusbar.pipeline.mobile.domain.model.SignalIconModel
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger
import com.android.systemui.statusbar.pipeline.mobile.ui.VerboseMobileViewLogger
import com.android.systemui.statusbar.pipeline.mobile.ui.model.MobileContentDescription
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.util.composable.kairos.toComposeState
import dagger.Provides
import dagger.multibindings.ElementsIntoSet
@@ -67,6 +80,8 @@ constructor(
    private val airplaneModeInteractor: AirplaneModeInteractor,
    private val constants: ConnectivityConstants,
    private val flags: FeatureFlagsClassic,
    private val logFactory: TableLogBufferFactory,
    private val context: Context,
) : KairosBuilder by kairosBuilder() {

    val activeSubscriptionId: State<Int?>
@@ -94,14 +109,83 @@ constructor(
    val isStackable: KairosState<Boolean>
        get() = interactor.isStackable

    @Deprecated("Access view-models directly from \"icons\" property instead.")
    fun viewModelForSub(
        subId: Int,
        location: StatusBarLocation,
    ): BuildSpec<LocationBasedMobileViewModelKairos> = buildSpec {
        val iconInteractorState: State<MobileIconInteractorKairos?> =
            interactor.icons.map { it[subId] }
        val iconInteractor =
            interactor.icons.sample().getOrElse(subId) { error("Unknown subscription id: $subId") }
            object : MobileIconInteractorKairos {
                fun <T> latest(
                    default: T,
                    block: MobileIconInteractorKairos.() -> State<T>,
                ): State<T> = iconInteractorState.flatMap { it?.block() ?: stateOf(default) }

                override val tableLogBuffer: TableLogBuffer =
                    logFactory.getOrCreate(tableBufferLogName(subId), MOBILE_CONNECTION_BUFFER_SIZE)
                override val subscriptionId: Int = subId
                override val activity: State<DataActivityModel> =
                    latest(DataActivityModel(hasActivityIn = false, hasActivityOut = false)) {
                        activity
                    }
                override val mobileIsDefault: State<Boolean> = latest(false) { mobileIsDefault }
                override val isDataConnected: State<Boolean> = latest(false) { isDataConnected }
                override val isInService: State<Boolean> = latest(false) { isInService }
                override val isEmergencyOnly: State<Boolean> = latest(false) { isEmergencyOnly }
                override val isDataEnabled: State<Boolean> = latest(false) { isDataEnabled }
                override val alwaysShowDataRatIcon: State<Boolean> =
                    latest(false) { alwaysShowDataRatIcon }
                override val signalLevelIcon: State<SignalIconModel> =
                    latest(SignalIconModel.DEFAULT) { signalLevelIcon }
                override val networkTypeIconGroup: State<NetworkTypeIconModel> =
                    latest(NetworkTypeIconModel.DefaultIcon(TelephonyIcons.G)) {
                        networkTypeIconGroup
                    }
                override val showSliceAttribution: State<Boolean> =
                    latest(false) { showSliceAttribution }
                override val isNonTerrestrial: State<Boolean> = latest(false) { isNonTerrestrial }
                val defaultName =
                    context.getString(com.android.internal.R.string.lockscreen_carrier_default)
                override val networkName: State<NetworkNameModel> =
                    latest(NetworkNameModel.Default(defaultName)) { networkName }
                override val carrierName: State<String> = latest(defaultName) { carrierName }
                override val isSingleCarrier: State<Boolean> = latest(true) { isSingleCarrier }
                override val isRoaming: State<Boolean> = latest(false) { isRoaming }
                override val isForceHidden: State<Boolean> = latest(false) { isForceHidden }
                override val isAllowedDuringAirplaneMode: State<Boolean> =
                    latest(false) { isAllowedDuringAirplaneMode }
                override val carrierNetworkChangeActive: State<Boolean> =
                    latest(false) { carrierNetworkChangeActive }
            }

        val commonViewModelState: State<MobileIconViewModelKairos?> = icons.map { it[subId] }
        val commonViewModel =
            icons.sample().getOrElse(subId) { error("Unknown subscription id: $subId") }
            object : MobileIconViewModelKairosCommon {
                fun <T> latest(
                    default: T,
                    block: MobileIconViewModelKairosCommon.() -> State<T>,
                ): State<T> = commonViewModelState.flatMap { it?.block() ?: stateOf(default) }

                override val subscriptionId: Int = subId
                override val iconInteractor: MobileIconInteractorKairos = iconInteractor
                override val isVisible: State<Boolean> = latest(false) { isVisible }
                override val icon: State<SignalIconModel> = latest(SignalIconModel.DEFAULT) { icon }
                override val contentDescription: State<MobileContentDescription?> =
                    latest(null) { contentDescription }
                override val roaming: State<Boolean> = latest(false) { roaming }
                override val networkTypeIcon: State<Icon.Resource?> =
                    latest(null) { networkTypeIcon }
                override val networkTypeBackground: State<Icon.Resource?> =
                    latest(null) { networkTypeBackground }
                override val activityInVisible: State<Boolean> = latest(false) { activityInVisible }
                override val activityOutVisible: State<Boolean> =
                    latest(false) { activityOutVisible }
                override val activityContainerVisible: State<Boolean> =
                    latest(false) { activityContainerVisible }
            }

        LocationBasedMobileViewModelKairos.viewModelForLocation(
            commonViewModel,
            iconInteractor,
@@ -152,9 +236,7 @@ class MobileIconsViewModelKairosComposeWrapper(
}

@ExperimentalKairosApi
fun MobileIconsViewModelKairos.composeWrapper(): BuildSpec<MobileIconsViewModelKairosComposeWrapper> = buildSpec {
    MobileIconsViewModelKairosComposeWrapper(
        icons = toComposeState(icons),
        logger = logger,
    )
fun MobileIconsViewModelKairos.composeWrapper():
    BuildSpec<MobileIconsViewModelKairosComposeWrapper> = buildSpec {
    MobileIconsViewModelKairosComposeWrapper(icons = toComposeState(icons), logger = logger)
}
+4 −0
Original line number Diff line number Diff line
@@ -16,10 +16,12 @@

package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel

import android.content.applicationContext
import com.android.systemui.flags.featureFlagsClassic
import com.android.systemui.kairos.ActivatedKairosFixture
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.log.table.tableLogBufferFactory
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.airplaneModeInteractor
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.mobileIconsInteractorKairos
import com.android.systemui.statusbar.pipeline.mobile.ui.mobileViewLogger
@@ -34,5 +36,7 @@ val Kosmos.mobileIconsViewModelKairos by ActivatedKairosFixture {
        airplaneModeInteractor = airplaneModeInteractor,
        constants = mock(),
        flags = featureFlagsClassic,
        logFactory = tableLogBufferFactory,
        context = applicationContext,
    )
}