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

Commit 4342a725 authored by 0's avatar 0
Browse files

[flexiglass] Inflate QS when SceneContainer is composed

Avoids the problem of QS height not populating fast enough during initial shade expansion after reboot. We now inflate before shade scene ever composes, and use the measuredHeight of qqs, so that the notification scrim is placed correctly.

Bug: 369644622
Test: Verified with logging that QS height is correct during first shade expansion
Flag: com.android.systemui.scene_container
Change-Id: I527619c1d4d96b06cd286369ae64f0faf0ae7bea
parent 04d09206
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -199,7 +199,7 @@ private fun QuickSettingsContent(
    QuickSettingsTheme {
        val context = LocalContext.current

        LaunchedEffect(key1 = context) {
        LaunchedEffect(context) {
            if (qsView == null) {
                qsSceneAdapter.inflate(context)
            }
+26 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@@ -31,6 +32,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.ContentKey
import com.android.compose.animation.scene.MutableSceneTransitionLayoutState
import com.android.compose.animation.scene.OverlayKey
@@ -39,9 +42,13 @@ import com.android.compose.animation.scene.SceneTransitionLayout
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.compose.animation.scene.observableTransitionState
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.composable.QuickSettingsTheme
import com.android.systemui.ribbon.ui.composable.BottomRightCornerRibbon
import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
import javax.inject.Provider
import kotlinx.coroutines.flow.collectLatest

/**
@@ -73,6 +80,7 @@ fun SceneContainer(
    overlayByKey: Map<OverlayKey, Overlay>,
    initialSceneKey: SceneKey,
    dataSourceDelegator: SceneDataSourceDelegator,
    qsSceneAdapter: Provider<QSSceneAdapter>,
    modifier: Modifier = Modifier,
) {
    val coroutineScope = rememberCoroutineScope()
@@ -119,6 +127,24 @@ fun SceneContainer(
        }
    }

    // Inflate qsView here so that shade has the correct qqs height in the first measure pass after
    // rebooting
    if (
        viewModel.allContentKeys.contains(Scenes.QuickSettings) ||
            viewModel.allContentKeys.contains(Scenes.Shade)
    ) {
        val qsAdapter = qsSceneAdapter.get()
        QuickSettingsTheme {
            val context = LocalContext.current
            val qsView by qsAdapter.qsView.collectAsStateWithLifecycle()
            LaunchedEffect(context) {
                if (qsView == null) {
                    qsAdapter.inflate(context)
                }
            }
        }
    }

    Box(
        modifier =
            Modifier.fillMaxSize().pointerInput(Unit) {
+2 −1
Original line number Diff line number Diff line
@@ -255,7 +255,8 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
     * @return size in pixels of QQS
     */
    public int getQqsHeight() {
        return mHeader.getHeight();
        SceneContainerFlag.assertInNewMode();
        return mHeader.getMeasuredHeight();
    }

    /**
+5 −8
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import android.view.MotionEvent
import android.view.View
import android.view.WindowInsets
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.scene.shared.model.SceneContainerConfig
import com.android.systemui.scene.shared.model.SceneDataSourceDelegator
import com.android.systemui.scene.ui.composable.Overlay
@@ -13,19 +14,13 @@ import com.android.systemui.scene.ui.composable.Scene
import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
import com.android.systemui.shade.TouchLogger
import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
import javax.inject.Provider
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow

/** A root view of the main SysUI window that supports scenes. */
@ExperimentalCoroutinesApi
class SceneWindowRootView(
    context: Context,
    attrs: AttributeSet?,
) :
    WindowRootView(
        context,
        attrs,
    ) {
class SceneWindowRootView(context: Context, attrs: AttributeSet?) : WindowRootView(context, attrs) {

    private var motionEventHandler: SceneContainerViewModel.MotionEventHandler? = null
    // TODO(b/298525212): remove once Compose exposes window inset bounds.
@@ -39,6 +34,7 @@ class SceneWindowRootView(
        overlays: Set<Overlay>,
        layoutInsetController: LayoutInsetsController,
        sceneDataSourceDelegator: SceneDataSourceDelegator,
        qsSceneAdapter: Provider<QSSceneAdapter>,
        alternateBouncerDependencies: AlternateBouncerDependencies,
    ) {
        setLayoutInsetsController(layoutInsetController)
@@ -57,6 +53,7 @@ class SceneWindowRootView(
                super.setVisibility(if (isVisible) View.VISIBLE else View.INVISIBLE)
            },
            dataSourceDelegator = sceneDataSourceDelegator,
            qsSceneAdapter = qsSceneAdapter,
            alternateBouncerDependencies = alternateBouncerDependencies,
        )
    }
+6 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import com.android.systemui.lifecycle.WindowLifecycleState
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.lifecycle.setSnapshotBinding
import com.android.systemui.lifecycle.viewModel
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.res.R
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.SceneContainerConfig
@@ -51,6 +52,7 @@ import com.android.systemui.scene.ui.composable.Scene
import com.android.systemui.scene.ui.composable.SceneContainer
import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
import javax.inject.Provider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.awaitCancellation
@@ -74,6 +76,7 @@ object SceneWindowRootViewBinder {
        overlays: Set<Overlay>,
        onVisibilityChangedInternal: (isVisible: Boolean) -> Unit,
        dataSourceDelegator: SceneDataSourceDelegator,
        qsSceneAdapter: Provider<QSSceneAdapter>,
        alternateBouncerDependencies: AlternateBouncerDependencies,
    ) {
        val unsortedSceneByKey: Map<SceneKey, Scene> = scenes.associateBy { scene -> scene.key }
@@ -138,6 +141,7 @@ object SceneWindowRootViewBinder {
                                sceneByKey = sortedSceneByKey,
                                overlayByKey = sortedOverlayByKey,
                                dataSourceDelegator = dataSourceDelegator,
                                qsSceneAdapter = qsSceneAdapter,
                                containerConfig = containerConfig,
                            )
                            .also { it.id = R.id.scene_container_root_composable }
@@ -183,6 +187,7 @@ object SceneWindowRootViewBinder {
        sceneByKey: Map<SceneKey, Scene>,
        overlayByKey: Map<OverlayKey, Overlay>,
        dataSourceDelegator: SceneDataSourceDelegator,
        qsSceneAdapter: Provider<QSSceneAdapter>,
        containerConfig: SceneContainerConfig,
    ): View {
        return ComposeView(context).apply {
@@ -198,6 +203,7 @@ object SceneWindowRootViewBinder {
                            overlayByKey = overlayByKey,
                            initialSceneKey = containerConfig.initialSceneKey,
                            dataSourceDelegator = dataSourceDelegator,
                            qsSceneAdapter = qsSceneAdapter,
                        )
                    }
                }
Loading