Loading packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/windowinsets/ScreenDecorProvider.kt +19 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 }) } } Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/LocalStatusIconContext.kt +34 −34 Original line number Diff line number Diff line Loading @@ -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>() Loading @@ -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, ) } Loading @@ -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) } } Loading @@ -105,6 +107,4 @@ fun WithStatusIconContext( } } } CompositionLocalProvider(LocalStatusIconContext provides statusIconContext, content = block) } packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt +9 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } } packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt +36 −29 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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, Loading @@ -185,6 +193,7 @@ object SceneWindowRootViewBinder { // corner radius are larger than this surfaceCornerRadius = 16.dp, ) ), ) { SceneContainer( viewModel = viewModel, Loading @@ -201,8 +210,6 @@ object SceneWindowRootViewBinder { } } } } } private fun createDualShadeEducationalTooltipsView( context: Context, Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/windowinsets/ScreenDecorProvider.kt +19 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 }) } } Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/LocalStatusIconContext.kt +34 −34 Original line number Diff line number Diff line Loading @@ -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>() Loading @@ -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, ) } Loading @@ -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) } } Loading @@ -105,6 +107,4 @@ fun WithStatusIconContext( } } } CompositionLocalProvider(LocalStatusIconContext provides statusIconContext, content = block) }
packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt +9 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } }
packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt +36 −29 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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, Loading @@ -185,6 +193,7 @@ object SceneWindowRootViewBinder { // corner radius are larger than this surfaceCornerRadius = 16.dp, ) ), ) { SceneContainer( viewModel = viewModel, Loading @@ -201,8 +210,6 @@ object SceneWindowRootViewBinder { } } } } } private fun createDualShadeEducationalTooltipsView( context: Context, Loading