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

Commit 1c5515d2 authored by Ahmed Mehfooz's avatar Ahmed Mehfooz Committed by amehfooz
Browse files

[SB][ComposableIcons] Use composable status icons in ShadeHeader

Adds composable system status icons in the shade header.
Also, this change hoists the isDark handling out of the
SystemStatusIcons composable so that we can directly set the
tint color.
Bug: 408001821
Test: manual
Flag: com.android.systemui.status_bar_system_status_icons_in_compose
Change-Id: Idc3a2abaaf85460350a6bc358a46352f235d269a

Change-Id: I093c53cb9101831bc2b3d38b674dbb0eb93cdf3c
parent dc413466
Loading
Loading
Loading
Loading
+16 −1
Original line number Original line Diff line number Diff line
@@ -101,6 +101,8 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierG
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModelKairos
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModelKairos
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.composeWrapper
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.composeWrapper
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.systemstatusicons.SystemStatusIconsInCompose
import com.android.systemui.statusbar.systemstatusicons.ui.compose.SystemStatusIcons
import com.android.systemui.util.composable.kairos.ActivatedKairosSpec
import com.android.systemui.util.composable.kairos.ActivatedKairosSpec
import kotlin.math.max
import kotlin.math.max
import kotlin.math.roundToInt
import kotlin.math.roundToInt
@@ -730,7 +732,20 @@ private fun ContentScope.StatusIcons(
    val iconContainer = statusIconContext.iconContainer(contentKey)
    val iconContainer = statusIconContext.iconContainer(contentKey)
    val iconManager = statusIconContext.iconManager(contentKey)
    val iconManager = statusIconContext.iconManager(contentKey)


    // TODO(408001821): Use composable system status icons here instead.
    // TODO(408001821): Add support for background color like [TintedIconManager.setTint].
    if (SystemStatusIconsInCompose.isEnabled) {
        SystemStatusIcons(
            viewModelFactory = viewModel.systemStatusIconsViewModelFactory,
            tint =
                if (isHighlighted) {
                    Color(inverseColor)
                } else {
                    Color(primaryColor)
                },
        )
        return
    }

    AndroidView(
    AndroidView(
        factory = {
        factory = {
            iconManager.setTint(primaryColor, inverseColor)
            iconManager.setTint(primaryColor, inverseColor)
+2 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,7 @@ import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewM
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModelKairos
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModelKairos
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatusIconsViewModel
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedInject
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -77,6 +78,7 @@ constructor(
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    val statusBarIconController: StatusBarIconController,
    val statusBarIconController: StatusBarIconController,
    val batteryViewModelFactory: BatteryViewModel.AlwaysShowPercent.Factory,
    val batteryViewModelFactory: BatteryViewModel.AlwaysShowPercent.Factory,
    val systemStatusIconsViewModelFactory: SystemStatusIconsViewModel.Factory,
    val kairosNetwork: KairosNetwork,
    val kairosNetwork: KairosNetwork,
    val mobileIconsViewModelKairos: dagger.Lazy<MobileIconsViewModelKairos>,
    val mobileIconsViewModelKairos: dagger.Lazy<MobileIconsViewModelKairos>,
    private val dualShadeEducationInteractor: DualShadeEducationInteractor,
    private val dualShadeEducationInteractor: DualShadeEducationInteractor,
+27 −1
Original line number Original line Diff line number Diff line
@@ -31,11 +31,16 @@ import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.boundsInWindow
import androidx.compose.ui.layout.boundsInWindow
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.onLayoutRectChanged
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalDensity
@@ -81,6 +86,7 @@ import com.android.systemui.statusbar.phone.NotificationIconContainer
import com.android.systemui.statusbar.phone.PhoneStatusBarView
import com.android.systemui.statusbar.phone.PhoneStatusBarView
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ui.DarkIconManager
import com.android.systemui.statusbar.phone.ui.DarkIconManager
@@ -98,6 +104,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBar
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.systemstatusicons.SystemStatusIconsInCompose
import com.android.systemui.statusbar.systemstatusicons.SystemStatusIconsInCompose
import com.android.systemui.statusbar.systemstatusicons.ui.compose.SystemStatusIcons
import com.android.systemui.statusbar.systemstatusicons.ui.compose.SystemStatusIcons
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatusIconsViewModel
import com.android.systemui.statusbar.ui.viewmodel.StatusBarRegionSamplingViewModel
import com.android.systemui.statusbar.ui.viewmodel.StatusBarRegionSamplingViewModel
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Named
import javax.inject.Named
@@ -551,7 +558,7 @@ private fun addSystemStatusIconsComposable(
                    verticalAlignment = Alignment.CenterVertically,
                    verticalAlignment = Alignment.CenterVertically,
                    horizontalArrangement = Arrangement.spacedBy(6.dp),
                    horizontalArrangement = Arrangement.spacedBy(6.dp),
                ) {
                ) {
                    SystemStatusIcons(
                    SystemStatusIconsContainer(
                        viewModelFactory = statusBarViewModel.systemStatusIconsViewModelFactory,
                        viewModelFactory = statusBarViewModel.systemStatusIconsViewModelFactory,
                        isDark = statusBarViewModel.areaDark,
                        isDark = statusBarViewModel.areaDark,
                    )
                    )
@@ -589,6 +596,25 @@ private fun addSystemStatusIconsComposable(
    }
    }
}
}


@Composable
private fun SystemStatusIconsContainer(
    viewModelFactory: SystemStatusIconsViewModel.Factory,
    isDark: IsAreaDark,
    modifier: Modifier = Modifier,
) {
    var bounds by remember { mutableStateOf(Rect()) }
    val tint = if (isDark.isDarkTheme(bounds)) Color.White else Color.Black
    SystemStatusIcons(
        viewModelFactory = viewModelFactory,
        tint = tint,
        modifier =
            modifier.onLayoutRectChanged { relativeLayoutBounds ->
                bounds =
                    with(relativeLayoutBounds.boundsInScreen) { Rect(left, top, right, bottom) }
            },
    )
}

private fun bindRegionSamplingViewModel(
private fun bindRegionSamplingViewModel(
    displayId: Int,
    displayId: Int,
    phoneStatusBarView: PhoneStatusBarView,
    phoneStatusBarView: PhoneStatusBarView,
+25 −40
Original line number Original line Diff line number Diff line
@@ -16,27 +16,20 @@


package com.android.systemui.statusbar.systemstatusicons.ui.compose
package com.android.systemui.statusbar.systemstatusicons.ui.compose


import android.graphics.Rect
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.size
import androidx.compose.material3.LocalContentColor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.onLayoutRectChanged
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
import com.android.systemui.common.ui.compose.Icon
import com.android.systemui.common.ui.compose.Icon
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
import com.android.systemui.statusbar.pipeline.mobile.ui.compose.MobileIcons
import com.android.systemui.statusbar.pipeline.mobile.ui.compose.MobileIcons
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatusIconViewModel
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatusIconViewModel
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatusIconsViewModel
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatusIconsViewModel
@@ -48,24 +41,17 @@ import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatu
@Composable
@Composable
fun SystemStatusIcons(
fun SystemStatusIcons(
    viewModelFactory: SystemStatusIconsViewModel.Factory,
    viewModelFactory: SystemStatusIconsViewModel.Factory,
    isDark: IsAreaDark,
    tint: Color,
    modifier: Modifier = Modifier,
    modifier: Modifier = Modifier,
) {
) {
    val context = LocalContext.current
    val context = LocalContext.current
    var bounds by remember { mutableStateOf(Rect()) }
    val color = if (isDark.isDarkTheme(bounds)) Color.White else Color.Black
    CompositionLocalProvider(LocalContentColor provides color) {
    val viewModel =
    val viewModel =
        rememberViewModel(traceName = "SystemStatusIcons") { viewModelFactory.create(context) }
        rememberViewModel(traceName = "SystemStatusIcons") { viewModelFactory.create(context) }


    Row(
    Row(
        verticalAlignment = Alignment.CenterVertically,
        verticalAlignment = Alignment.CenterVertically,
        horizontalArrangement = Arrangement.spacedBy(6.dp),
        horizontalArrangement = Arrangement.spacedBy(6.dp),
            modifier =
        modifier = modifier,
                modifier.onLayoutRectChanged { relativeLayoutBounds ->
                    bounds =
                        with(relativeLayoutBounds.boundsInScreen) { Rect(left, top, right, bottom) }
                },
    ) {
    ) {
        viewModel.iconViewModels
        viewModel.iconViewModels
            .filter { it.visible }
            .filter { it.visible }
@@ -77,7 +63,7 @@ fun SystemStatusIcons(
                            Icon(
                            Icon(
                                icon = it,
                                icon = it,
                                modifier = Modifier.size(20.dp).padding(1.dp),
                                modifier = Modifier.size(20.dp).padding(1.dp),
                                    tint = LocalContentColor.current,
                                tint = tint,
                            )
                            )
                        }
                        }
                    is SystemStatusIconViewModel.MobileIcons -> {
                    is SystemStatusIconViewModel.MobileIcons -> {
@@ -90,4 +76,3 @@ fun SystemStatusIcons(
            }
            }
    }
    }
}
}
}
+2 −0
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewM
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.mobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.mobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.mobileIconsViewModel
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.mobileIconsViewModel
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.mobileIconsViewModelKairos
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.mobileIconsViewModelKairos
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.systemStatusIconsViewModelFactory
import org.mockito.kotlin.mock
import org.mockito.kotlin.mock


val Kosmos.shadeHeaderViewModel: ShadeHeaderViewModel by
val Kosmos.shadeHeaderViewModel: ShadeHeaderViewModel by
@@ -57,6 +58,7 @@ val Kosmos.shadeHeaderViewModel: ShadeHeaderViewModel by
            mobileIconsViewModelKairos = { mobileIconsViewModelKairos },
            mobileIconsViewModelKairos = { mobileIconsViewModelKairos },
            dualShadeEducationInteractor = dualShadeEducationInteractor,
            dualShadeEducationInteractor = dualShadeEducationInteractor,
            desktopInteractor = desktopInteractor,
            desktopInteractor = desktopInteractor,
            systemStatusIconsViewModelFactory = systemStatusIconsViewModelFactory,
        )
        )
    }
    }