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

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

Merge "[flexiglass] Flattens composition locals around SceneContainer" into main

parents a749bdc8 d8675d7d
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.android.internal.policy.ScreenDecorationsUtils

@@ -48,21 +49,28 @@ val LocalScreenCornerRadius = staticCompositionLocalOf { 0.dp }

@Composable
fun ScreenDecorProvider(windowInsets: () -> WindowInsets?, content: @Composable () -> Unit) {
    CompositionLocalProvider(
        LocalScreenCornerRadius provides rememberScreenCornerRadius(),
        LocalDisplayCutout provides rememberDisplayCutout(windowInsets),
    ) {
        content()
    }
}

@Composable
fun rememberScreenCornerRadius(): Dp {
    val context = LocalContext.current
    val screenCornerRadiusPx =
        remember(context.display.uniqueId) { ScreenDecorationsUtils.getWindowCornerRadius(context) }
    val screenCornerRadiusDp = with(LocalDensity.current) { screenCornerRadiusPx.toDp() }
    val cutout =
        remember(windowInsets, context) {
            val cutoutState = derivedStateOf { windowInsets().toCutout(context) }
            ({ cutoutState.value })
    return with(LocalDensity.current) { screenCornerRadiusPx.toDp() }
}

    CompositionLocalProvider(
        LocalScreenCornerRadius provides screenCornerRadiusDp,
        LocalDisplayCutout provides cutout,
    ) {
        content()
@Composable
fun rememberDisplayCutout(windowInsets: () -> WindowInsets?): () -> DisplayCutout {
    val context = LocalContext.current
    return remember(windowInsets, context) {
        val cutoutState = derivedStateOf { windowInsets().toCutout(context) }
        ({ cutoutState.value })
    }
}

+34 −34
Original line number Diff line number Diff line
@@ -64,13 +64,21 @@ fun WithStatusIconContext(
    tintedIconManagerFactory: TintedIconManager.Factory,
    block: @Composable () -> Unit,
) {
    val localContext = LocalContext.current
    CompositionLocalProvider(
        LocalStatusIconContext provides rememberStatusIconContext(tintedIconManagerFactory),
        content = block,
    )
}

@Composable
fun rememberStatusIconContext(
    tintedIconManagerFactory: TintedIconManager.Factory
): StatusIconContext {
    val context = LocalContext.current

    val statusIconContext =
        remember(localContext, tintedIconManagerFactory) {
    return remember(context, tintedIconManagerFactory) {
        object : StatusIconContext {
                private val iconContainerByContentKey =
                    mutableMapOf<ContentKey, StatusIconContainer>()
            private val iconContainerByContentKey = mutableMapOf<ContentKey, StatusIconContainer>()
            private val iconManagerByContentKey = mutableMapOf<ContentKey, TintedIconManager>()
            private val movableContentByIconManager =
                mutableMapOf<TintedIconManager, MovableSystemStatusIconLegacy>()
@@ -78,10 +86,7 @@ fun WithStatusIconContext(
            override fun iconContainer(contentKey: ContentKey): StatusIconContainer {
                return iconContainerByContentKey.getOrPut(contentKey) {
                    StatusIconContainer(
                            ContextThemeWrapper(
                                localContext,
                                R.style.Theme_SystemUI_QuickSettings_Header,
                            ),
                        ContextThemeWrapper(context, R.style.Theme_SystemUI_QuickSettings_Header),
                        null,
                    )
                }
@@ -89,10 +94,7 @@ fun WithStatusIconContext(

            override fun iconManager(contentKey: ContentKey): TintedIconManager {
                return iconManagerByContentKey.getOrPut(contentKey) {
                        tintedIconManagerFactory.create(
                            iconContainer(contentKey),
                            StatusBarLocation.QS,
                        )
                    tintedIconManagerFactory.create(iconContainer(contentKey), StatusBarLocation.QS)
                }
            }

@@ -105,6 +107,4 @@ fun WithStatusIconContext(
            }
        }
    }

    CompositionLocalProvider(LocalStatusIconContext provides statusIconContext, content = block)
}
+9 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.keyboard.shortcut.ui.composable

import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Indication
import androidx.compose.foundation.IndicationNodeFactory
import androidx.compose.foundation.LocalIndication
import androidx.compose.foundation.background
@@ -445,8 +446,12 @@ fun ProvideShortcutHelperIndication(
    content: @Composable () -> Unit,
) {
    CompositionLocalProvider(
        LocalIndication provides ShortcutHelperIndication(interactionsConfig)
    ) {
        content()
        LocalIndication provides rememberShortcutHelperIndication(interactionsConfig),
        content = content,
    )
}

@Composable
fun rememberShortcutHelperIndication(interactionsConfig: InteractionsConfig): Indication {
    return remember(interactionsConfig) { ShortcutHelperIndication(interactionsConfig) }
}
+36 −29
Original line number Diff line number Diff line
@@ -21,7 +21,9 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowInsets
import android.widget.FrameLayout
import androidx.compose.foundation.LocalIndication
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.State
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
@@ -30,11 +32,15 @@ import androidx.core.view.isVisible
import com.android.compose.animation.scene.OverlayKey
import com.android.compose.animation.scene.SceneKey
import com.android.compose.theme.PlatformTheme
import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius
import com.android.systemui.common.ui.compose.windowinsets.ScreenDecorProvider
import com.android.systemui.common.ui.compose.windowinsets.rememberDisplayCutout
import com.android.systemui.common.ui.compose.windowinsets.rememberScreenCornerRadius
import com.android.systemui.compose.modifiers.sysUiResTagContainer
import com.android.systemui.initOnBackPressedDispatcherOwner
import com.android.systemui.keyboard.shortcut.ui.composable.InteractionsConfig
import com.android.systemui.keyboard.shortcut.ui.composable.ProvideShortcutHelperIndication
import com.android.systemui.keyboard.shortcut.ui.composable.rememberShortcutHelperIndication
import com.android.systemui.lifecycle.WindowLifecycleState
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.lifecycle.setSnapshotBinding
@@ -48,7 +54,8 @@ import com.android.systemui.scene.ui.composable.Scene
import com.android.systemui.scene.ui.composable.SceneContainer
import com.android.systemui.scene.ui.viewmodel.DualShadeEducationalTooltipsViewModel
import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel
import com.android.systemui.shade.ui.composable.WithStatusIconContext
import com.android.systemui.shade.ui.composable.LocalStatusIconContext
import com.android.systemui.shade.ui.composable.rememberStatusIconContext
import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import kotlinx.coroutines.awaitCancellation
@@ -170,12 +177,13 @@ object SceneWindowRootViewBinder {
        return ComposeView(context).apply {
            setContent {
                PlatformTheme {
                    ScreenDecorProvider(windowInsets = { windowInsets.value }) {
                        WithStatusIconContext(tintedIconManagerFactory = tintedIconManagerFactory) {
                            // Avoid using default Compose indication as it causes jank
                            // (b/437075590)
                            ProvideShortcutHelperIndication(
                                interactionsConfig =
                    CompositionLocalProvider(
                        LocalScreenCornerRadius provides rememberScreenCornerRadius(),
                        LocalDisplayCutout provides rememberDisplayCutout { windowInsets.value },
                        LocalStatusIconContext provides
                            rememberStatusIconContext(tintedIconManagerFactory),
                        LocalIndication provides
                            rememberShortcutHelperIndication(
                                InteractionsConfig(
                                    hoverOverlayColor = MaterialTheme.colorScheme.onSurface,
                                    hoverOverlayAlpha = 0.11f,
@@ -185,6 +193,7 @@ object SceneWindowRootViewBinder {
                                    // corner radius are larger than this
                                    surfaceCornerRadius = 16.dp,
                                )
                            ),
                    ) {
                        SceneContainer(
                            viewModel = viewModel,
@@ -201,8 +210,6 @@ object SceneWindowRootViewBinder {
            }
        }
    }
        }
    }

    private fun createDualShadeEducationalTooltipsView(
        context: Context,