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

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

[sb] Add new battery icon to ShadeHeaderController

This adds the composable battery to the legacy shade header. Adding it
to the compose header is left as homework for the reader.

Test: manual
Bug: 391605373
Flag: com.android.settingslib.flags.new_status_bar_icons
Flag: com.android.systemui.status_bar_root_modernization
Change-Id: I4ffbdf7fcbca61576c460e0c78691881b0fbae96
parent 7609b334
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ frame when animating QS <-> QQS transition
                android:id="@+id/batteryRemainingIcon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="gone"
                app:textAppearance="@style/TextAppearance.QS.Status" />
        </LinearLayout>
    </FrameLayout>
+52 −10
Original line number Diff line number Diff line
@@ -31,16 +31,26 @@ import android.os.Trace.TRACE_TAG_APP
import android.provider.AlarmClock
import android.view.DisplayCutout
import android.view.View
import android.view.ViewGroup
import android.view.WindowInsets
import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.view.doOnLayout
import androidx.core.view.isVisible
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.app.animation.Interpolators
import com.android.settingslib.Utils
import com.android.systemui.Dumpable
import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.battery.BatteryMeterView
import com.android.systemui.battery.BatteryMeterView.MODE_ESTIMATE
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.demomode.DemoMode
@@ -60,12 +70,15 @@ import com.android.systemui.shade.carrier.ShadeCarrierGroup
import com.android.systemui.shade.carrier.ShadeCarrierGroupController
import com.android.systemui.shade.data.repository.ShadeDisplaysRepository
import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
import com.android.systemui.statusbar.core.NewStatusBarIcons
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryWithEstimate
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -76,6 +89,7 @@ import dagger.Lazy
import java.io.PrintWriter
import javax.inject.Inject
import javax.inject.Named
import kotlinx.coroutines.flow.MutableStateFlow

/**
 * Controller for QS header.
@@ -100,6 +114,7 @@ constructor(
    private val shadeDisplaysRepositoryLazy: Lazy<ShadeDisplaysRepository>,
    private val variableDateViewControllerFactory: VariableDateViewController.Factory,
    @Named(SHADE_HEADER) private val batteryMeterViewController: BatteryMeterViewController,
    private val batteryViewModelFactory: BatteryViewModel.Factory,
    private val dumpManager: DumpManager,
    private val shadeCarrierGroupControllerBuilder: ShadeCarrierGroupController.Builder,
    private val combinedShadeHeadersConstraintManager: CombinedShadeHeadersConstraintManager,
@@ -162,6 +177,8 @@ constructor(
    private var lastInsets: WindowInsets? = null
    private var nextAlarmIntent: PendingIntent? = null

    private val showBatteryEstimate = MutableStateFlow(false)

    private var qsDisabled = false
    private var visible = false
        set(value) {
@@ -323,10 +340,6 @@ constructor(

    override fun onInit() {
        variableDateViewControllerFactory.create(date as VariableDateView).init()
        batteryMeterViewController.init()

        // battery settings same as in QS icons
        batteryMeterViewController.ignoreTunerUpdates()

        val fgColor =
            Utils.getColorAttrDefaultColor(header.context, android.R.attr.textColorPrimary)
@@ -336,11 +349,36 @@ constructor(
        iconManager = tintedIconManagerFactory.create(iconContainer, StatusBarLocation.QS)
        iconManager.setTint(fgColor, bgColor)

        if (!NewStatusBarIcons.isEnabled) {
            batteryMeterViewController.init()

            // battery settings same as in QS icons
            batteryMeterViewController.ignoreTunerUpdates()

            batteryIcon.isVisible = true
            batteryIcon.updateColors(
                fgColor /* foreground */,
                bgColor /* background */,
                fgColor, /* single tone (current default) */
            )
        } else {
            // Configure the compose battery view
            val batteryComposeView =
                ComposeView(mView.context).apply {
                    setContent {
                        val showBatteryEstimate by showBatteryEstimate.collectAsStateWithLifecycle()
                        BatteryWithEstimate(
                            modifier = Modifier.height(17.dp).wrapContentWidth(),
                            viewModelFactory = batteryViewModelFactory,
                            isDark = { true },
                            showEstimate = showBatteryEstimate,
                        )
                    }
                }
            mView.requireViewById<ViewGroup>(R.id.hover_system_icons_container).apply {
                addView(batteryComposeView, -1)
            }
        }

        carrierIconSlots =
            listOf(header.context.getString(com.android.internal.R.string.status_bar_mobile))
@@ -474,9 +512,13 @@ constructor(

    private fun updateBatteryMode() {
        qsBatteryModeController.getBatteryMode(cutout, qsExpandedFraction)?.let {
            if (NewStatusBarIcons.isEnabled) {
                showBatteryEstimate.value = it == MODE_ESTIMATE
            } else {
                batteryIcon.setPercentShowMode(it)
            }
        }
    }

    private fun updateScrollY() {
        if (!largeScreenActive) {
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ fun BatteryWithEstimate(
        )
        if (showEstimate) {
            viewModel.batteryTimeRemainingEstimate?.let {
                Spacer(modifier.width(2.dp))
                Spacer(modifier.width(4.dp))
                Text(text = it, color = Color.White)
            }
        }
+2 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.batteryViewModelFactory
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.NextAlarmController
@@ -202,6 +203,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
                Lazy { kosmos.shadeDisplaysRepository },
                variableDateViewControllerFactory,
                batteryMeterViewController,
                kosmos.batteryViewModelFactory,
                dumpManager,
                mShadeCarrierGroupControllerBuilder,
                combinedShadeHeadersConstraintManager,