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

Commit 2f3405d2 authored by Steve Elliott's avatar Steve Elliott
Browse files

[kairos] keep shadecarriergroup view-model lookup up-to-date

Flag: com.android.systemui.status_bar_mobile_icon_kairos
Bug: 383172066
Test: atest
Change-Id: I851332f2e19676b615b21d5c7e362c819c6b3114
parent adf12121
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -608,12 +608,10 @@ private fun ShadeCarrierGroupKairos(
                                logger = iconsViewModel.logger,
                                slot = "mobile_carrier_shade_group",
                                viewModel =
                                    buildSpec {
                                    ShadeCarrierGroupMobileIconViewModelKairos(
                                        icon,
                                        icon.iconInteractor,
                                        )
                                    },
                                    ),
                                scope = scope,
                                subscriptionId = subId,
                                location = StatusBarLocation.SHADE_CARRIER_GROUP,
+10 −4
Original line number Diff line number Diff line
@@ -20,9 +20,9 @@ import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.LinearLayout
import com.android.systemui.kairos.BuildSpec
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.KairosNetwork
import com.android.systemui.kairos.buildSpec
import com.android.systemui.res.R
import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
import com.android.systemui.statusbar.phone.StatusBarLocation
@@ -92,7 +92,7 @@ class ModernShadeCarrierGroupMobileView(context: Context, attrs: AttributeSet?)
            context: Context,
            logger: MobileViewLogger,
            slot: String,
            viewModel: BuildSpec<ShadeCarrierGroupMobileIconViewModelKairos>,
            viewModel: ShadeCarrierGroupMobileIconViewModelKairos,
            scope: CoroutineScope,
            subscriptionId: Int,
            location: StatusBarLocation,
@@ -110,7 +110,7 @@ class ModernShadeCarrierGroupMobileView(context: Context, attrs: AttributeSet?)
                        val (binding, _) =
                            MobileIconBinderKairos.bind(
                                view = iconView,
                                viewModel = viewModel,
                                viewModel = buildSpec { viewModel },
                                initialVisibilityState = STATE_ICON,
                                logger = logger,
                                scope = this,
@@ -122,7 +122,13 @@ class ModernShadeCarrierGroupMobileView(context: Context, attrs: AttributeSet?)

                    val textView =
                        view.requireViewById<AutoMarqueeTextView>(R.id.mobile_carrier_text)
                    launch { ShadeCarrierBinderKairos.bind(textView, viewModel, kairosNetwork) }
                    launch {
                        ShadeCarrierBinderKairos.bind(
                            textView,
                            buildSpec { viewModel },
                            kairosNetwork,
                        )
                    }
                }
        }
    }
+3 −3
Original line number Diff line number Diff line
@@ -22,9 +22,9 @@ import android.view.LayoutInflater
import android.widget.FrameLayout
import android.widget.ImageView
import com.android.keyguard.AlphaOptimizedLinearLayout
import com.android.systemui.kairos.BuildSpec
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.KairosNetwork
import com.android.systemui.kairos.buildSpec
import com.android.systemui.res.R
import com.android.systemui.statusbar.StatusBarIconView.getVisibleStateString
import com.android.systemui.statusbar.core.NewStatusBarIcons
@@ -139,7 +139,7 @@ class ModernStatusBarMobileView(context: Context, attrs: AttributeSet?) :
            context: Context,
            logger: MobileViewLogger,
            slot: String,
            viewModel: BuildSpec<LocationBasedMobileViewModelKairos>,
            viewModel: LocationBasedMobileViewModelKairos,
            scope: CoroutineScope,
            subscriptionId: Int,
            location: StatusBarLocation,
@@ -163,7 +163,7 @@ class ModernStatusBarMobileView(context: Context, attrs: AttributeSet?) :
                val (binding, job) =
                    MobileIconBinderKairos.bind(
                        view = view,
                        viewModel = viewModel,
                        viewModel = buildSpec { viewModel },
                        logger = logger,
                        scope = scope,
                        kairosNetwork = kairosNetwork,
+76 −84
Original line number Diff line number Diff line
@@ -113,15 +113,29 @@ constructor(
    fun viewModelForSub(
        subId: Int,
        location: StatusBarLocation,
    ): BuildSpec<LocationBasedMobileViewModelKairos> = buildSpec {
    ): LocationBasedMobileViewModelKairos {
        val commonImpl = trackedCommonViewModel(subId)
        return LocationBasedMobileViewModelKairos.viewModelForLocation(
            commonImpl,
            commonImpl.iconInteractor,
            verboseLogger,
            location,
        )
    }

    @Deprecated("Access view-models directly from \"icons\" property instead.")
    fun shadeCarrierGroupIcon(subId: Int): ShadeCarrierGroupMobileIconViewModelKairos {
        val commonImpl = trackedCommonViewModel(subId)
        return ShadeCarrierGroupMobileIconViewModelKairos(commonImpl, commonImpl.iconInteractor)
    }

    private fun trackedInteractor(subId: Int): MobileIconInteractorKairos =
        object : MobileIconInteractorKairos {
            val iconInteractorState: State<MobileIconInteractorKairos?> =
                interactor.icons.map { it[subId] }
        val iconInteractor =
            object : MobileIconInteractorKairos {
                fun <T> latest(
                    default: T,
                    block: MobileIconInteractorKairos.() -> State<T>,
                ): State<T> = iconInteractorState.flatMap { it?.block() ?: stateOf(default) }

            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)
@@ -140,9 +154,7 @@ constructor(
            override val signalLevelIcon: State<SignalIconModel> =
                latest(SignalIconModel.DEFAULT) { signalLevelIcon }
            override val networkTypeIconGroup: State<NetworkTypeIconModel> =
                    latest(NetworkTypeIconModel.DefaultIcon(TelephonyIcons.G)) {
                        networkTypeIconGroup
                    }
                latest(NetworkTypeIconModel.DefaultIcon(TelephonyIcons.G)) { networkTypeIconGroup }
            override val showSliceAttribution: State<Boolean> =
                latest(false) { showSliceAttribution }
            override val isNonTerrestrial: State<Boolean> = latest(false) { isNonTerrestrial }
@@ -160,51 +172,31 @@ constructor(
                latest(false) { carrierNetworkChangeActive }
        }

        val commonViewModelState: State<MobileIconViewModelKairos?> = icons.map { it[subId] }
        val commonViewModel =
    private fun trackedCommonViewModel(subId: Int) =
        object : MobileIconViewModelKairosCommon {
            override val iconInteractor: MobileIconInteractorKairos = trackedInteractor(subId)
            val commonViewModelState: State<MobileIconViewModelKairos?> = icons.map { it[subId] }

            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 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 activityOutVisible: State<Boolean> = latest(false) { activityOutVisible }
            override val activityContainerVisible: State<Boolean> =
                latest(false) { activityContainerVisible }
        }

        LocationBasedMobileViewModelKairos.viewModelForLocation(
            commonViewModel,
            iconInteractor,
            verboseLogger,
            location,
        )
    }

    fun shadeCarrierGroupIcon(subId: Int): BuildSpec<ShadeCarrierGroupMobileIconViewModelKairos> =
        buildSpec {
            val iconInteractor =
                interactor.icons.sample().getOrElse(subId) {
                    error("Unknown subscription id: $subId")
                }
            val commonViewModel =
                icons.sample().getOrElse(subId) { error("Unknown subscription id: $subId") }
            ShadeCarrierGroupMobileIconViewModelKairos(commonViewModel, iconInteractor)
        }

    private fun BuildScope.commonViewModel(subId: Int, iconInteractor: MobileIconInteractorKairos) =
        activated {
            MobileIconViewModelKairos(