Loading packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/windowinsets/ScreenDecorProvider.kt +4 −2 Original line number Diff line number Diff line Loading @@ -34,11 +34,13 @@ val LocalScreenCornerRadius = staticCompositionLocalOf { 0.dp } @Composable fun ScreenDecorProvider( displayCutout: StateFlow<DisplayCutout>, screenCornerRadius: Float, screenCornerRadius: StateFlow<Float>, content: @Composable () -> Unit, ) { val cutout by displayCutout.collectAsStateWithLifecycle() val screenCornerRadiusDp = with(LocalDensity.current) { screenCornerRadius.toDp() } val screenCornerRadiusPx by screenCornerRadius.collectAsStateWithLifecycle() val screenCornerRadiusDp = with(LocalDensity.current) { screenCornerRadiusPx.toDp() } CompositionLocalProvider( LocalScreenCornerRadius provides screenCornerRadiusDp, Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +7 −4 Original line number Diff line number Diff line Loading @@ -61,7 +61,6 @@ import androidx.compose.ui.layout.positionInWindow import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.Dp Loading @@ -80,6 +79,7 @@ import com.android.compose.animation.scene.animateElementFloatAsState import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.modifiers.thenIf import com.android.compose.theme.colorAttr import com.android.internal.policy.SystemBarUtils import com.android.settingslib.Utils import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController Loading Loading @@ -137,9 +137,12 @@ object ShadeHeader { val ChipPaddingVertical = 4.dp val StatusBarHeight: Dp // TODO(b/414737230): This is a temporary workaround, until we fix the zero padding // issue given by WindowInsets.statusBars.asPaddingValues().calculateTopPadding(). @Composable get() = dimensionResource(R.dimen.status_bar_height) @Composable get() { return with(LocalDensity.current) { SystemBarUtils.getStatusBarHeight(LocalContext.current).toDp() } } } object TestTags { Loading packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt +3 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.MotionEvent import android.view.View import android.view.WindowInsets import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.SceneDataSourceDelegator Loading @@ -31,6 +32,7 @@ class SceneWindowRootView(context: Context, attrs: AttributeSet?) : WindowRootVi scenes: Set<Scene>, overlays: Set<Overlay>, layoutInsetController: LayoutInsetsController, configurationRepository: ConfigurationRepository, sceneDataSourceDelegator: SceneDataSourceDelegator, qsSceneAdapter: Provider<QSSceneAdapter>, sceneJankMonitorFactory: SceneJankMonitor.Factory, Loading @@ -53,6 +55,7 @@ class SceneWindowRootView(context: Context, attrs: AttributeSet?) : WindowRootVi super.setVisibility(if (isVisible) View.VISIBLE else View.INVISIBLE) }, dataSourceDelegator = sceneDataSourceDelegator, configurationRepository = configurationRepository, qsSceneAdapter = qsSceneAdapter, sceneJankMonitorFactory = sceneJankMonitorFactory, tintedIconManagerFactory = tintedIconManagerFactory, Loading packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt +54 −21 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.internal.policy.ScreenDecorationsUtils import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation import com.android.systemui.common.ui.compose.windowinsets.DisplayCutout import com.android.systemui.common.ui.compose.windowinsets.ScreenDecorProvider import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.compose.modifiers.sysUiResTagContainer import com.android.systemui.initOnBackPressedDispatcherOwner import com.android.systemui.lifecycle.WindowLifecycleState Loading Loading @@ -76,6 +77,7 @@ object SceneWindowRootViewBinder { overlays: Set<Overlay>, onVisibilityChangedInternal: (isVisible: Boolean) -> Unit, dataSourceDelegator: SceneDataSourceDelegator, configurationRepository: ConfigurationRepository, qsSceneAdapter: Provider<QSSceneAdapter>, sceneJankMonitorFactory: SceneJankMonitor.Factory, tintedIconManagerFactory: TintedIconManager.Factory, Loading Loading @@ -132,6 +134,7 @@ object SceneWindowRootViewBinder { containerConfig = containerConfig, sceneJankMonitorFactory = sceneJankMonitorFactory, tintedIconManagerFactory = tintedIconManagerFactory, configurationRepository = configurationRepository, ) .also { it.id = R.id.scene_container_root_composable } ) Loading @@ -155,6 +158,7 @@ object SceneWindowRootViewBinder { viewModelFactory = viewModel.dualShadeEducationalTooltipsViewModelFactory, windowInsets = windowInsets, configurationRepository = configurationRepository, ) ) Loading @@ -177,16 +181,19 @@ object SceneWindowRootViewBinder { overlayByKey: Map<OverlayKey, Overlay>, dataSourceDelegator: SceneDataSourceDelegator, qsSceneAdapter: Provider<QSSceneAdapter>, configurationRepository: ConfigurationRepository, containerConfig: SceneContainerConfig, sceneJankMonitorFactory: SceneJankMonitor.Factory, tintedIconManagerFactory: TintedIconManager.Factory, ): View { val displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets) val cornerRadius = cornerRadius(scope, configurationRepository, context) return ComposeView(context).apply { setContent { PlatformTheme { ScreenDecorProvider( displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets), screenCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context), displayCutout = displayCutout, screenCornerRadius = cornerRadius, ) { WithStatusIconContext(tintedIconManagerFactory = tintedIconManagerFactory) { SceneContainer( Loading @@ -212,7 +219,10 @@ object SceneWindowRootViewBinder { context: Context, viewModelFactory: DualShadeEducationalTooltipsViewModel.Factory, windowInsets: StateFlow<WindowInsets?>, configurationRepository: ConfigurationRepository, ): View { val displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets) val cornerRadius = cornerRadius(scope, configurationRepository, context) return ComposeView(context).apply { layoutParams = FrameLayout.LayoutParams( Loading @@ -222,8 +232,8 @@ object SceneWindowRootViewBinder { setContent { PlatformTheme { ScreenDecorProvider( displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets), screenCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context), displayCutout = displayCutout, screenCornerRadius = cornerRadius, ) { DualShadeEducationalTooltips(viewModelFactory = viewModelFactory) } Loading @@ -232,6 +242,23 @@ object SceneWindowRootViewBinder { } } /** * The corner radius can chang every time the window is moved to another display. This keeps it * up to date. */ private fun cornerRadius( scope: CoroutineScope, configurationRepository: ConfigurationRepository, context: Context, ): StateFlow<Float> = configurationRepository.onMovedToDisplay .map { ScreenDecorationsUtils.getWindowCornerRadius(context) } .stateIn( scope, SharingStarted.WhileSubscribed(), ScreenDecorationsUtils.getWindowCornerRadius(context), ) // TODO(b/298525212): remove once Compose exposes window inset bounds. private fun displayCutoutFromWindowInsets( scope: CoroutineScope, Loading @@ -239,8 +266,15 @@ object SceneWindowRootViewBinder { windowInsets: StateFlow<WindowInsets?>, ): StateFlow<DisplayCutout> = windowInsets .map { val boundingRect = it?.displayCutout?.boundingRectTop .map { it.toCutout(context) } .stateIn( scope, SharingStarted.WhileSubscribed(), initialValue = windowInsets.value.toCutout(context), ) private fun WindowInsets?.toCutout(context: Context): DisplayCutout { val boundingRect = this?.displayCutout?.boundingRectTop val width = boundingRect?.let { boundingRect.right - boundingRect.left } ?: 0 val left = boundingRect?.left?.toDp(context) ?: 0.dp val top = boundingRect?.top?.toDp(context) ?: 0.dp Loading @@ -253,10 +287,9 @@ object SceneWindowRootViewBinder { right >= getDisplayWidth(context) -> CutoutLocation.RIGHT else -> CutoutLocation.CENTER } val viewDisplayCutout = it?.displayCutout DisplayCutout(left, top, right, bottom, location, viewDisplayCutout) val viewDisplayCutout = this?.displayCutout return DisplayCutout(left, top, right, bottom, location, viewDisplayCutout) } .stateIn(scope, SharingStarted.WhileSubscribed(), DisplayCutout()) // TODO(b/298525212): remove once Compose exposes window inset bounds. private fun getDisplayWidth(context: Context): Dp { Loading packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt +3 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.android.keyguard.logging.ScrimLogger import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.biometrics.AuthRippleView import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags Loading Loading @@ -101,6 +102,7 @@ abstract class ShadeViewProviderModule { choreographer: Choreographer?, @Main mainDispatcher: CoroutineDispatcher, tintedIconManagerFactory: TintedIconManager.Factory, @ShadeDisplayAware configurationRepository: ConfigurationRepository, ): WindowRootView { return if (SceneContainerFlag.isEnabled) { checkNoSceneDuplicates(scenesProvider.get()) Loading @@ -121,6 +123,7 @@ abstract class ShadeViewProviderModule { scenes = scenesProvider.get(), overlays = overlaysProvider.get(), layoutInsetController = layoutInsetController, configurationRepository = configurationRepository, sceneDataSourceDelegator = sceneDataSourceDelegator.get(), qsSceneAdapter = qsSceneAdapter, sceneJankMonitorFactory = sceneJankMonitorFactory, Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/common/ui/compose/windowinsets/ScreenDecorProvider.kt +4 −2 Original line number Diff line number Diff line Loading @@ -34,11 +34,13 @@ val LocalScreenCornerRadius = staticCompositionLocalOf { 0.dp } @Composable fun ScreenDecorProvider( displayCutout: StateFlow<DisplayCutout>, screenCornerRadius: Float, screenCornerRadius: StateFlow<Float>, content: @Composable () -> Unit, ) { val cutout by displayCutout.collectAsStateWithLifecycle() val screenCornerRadiusDp = with(LocalDensity.current) { screenCornerRadius.toDp() } val screenCornerRadiusPx by screenCornerRadius.collectAsStateWithLifecycle() val screenCornerRadiusDp = with(LocalDensity.current) { screenCornerRadiusPx.toDp() } CompositionLocalProvider( LocalScreenCornerRadius provides screenCornerRadiusDp, Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +7 −4 Original line number Diff line number Diff line Loading @@ -61,7 +61,6 @@ import androidx.compose.ui.layout.positionInWindow import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.Constraints import androidx.compose.ui.unit.Dp Loading @@ -80,6 +79,7 @@ import com.android.compose.animation.scene.animateElementFloatAsState import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.modifiers.thenIf import com.android.compose.theme.colorAttr import com.android.internal.policy.SystemBarUtils import com.android.settingslib.Utils import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController Loading Loading @@ -137,9 +137,12 @@ object ShadeHeader { val ChipPaddingVertical = 4.dp val StatusBarHeight: Dp // TODO(b/414737230): This is a temporary workaround, until we fix the zero padding // issue given by WindowInsets.statusBars.asPaddingValues().calculateTopPadding(). @Composable get() = dimensionResource(R.dimen.status_bar_height) @Composable get() { return with(LocalDensity.current) { SystemBarUtils.getStatusBarHeight(LocalContext.current).toDp() } } } object TestTags { Loading
packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootView.kt +3 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.view.MotionEvent import android.view.View import android.view.WindowInsets import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.scene.shared.model.SceneContainerConfig import com.android.systemui.scene.shared.model.SceneDataSourceDelegator Loading @@ -31,6 +32,7 @@ class SceneWindowRootView(context: Context, attrs: AttributeSet?) : WindowRootVi scenes: Set<Scene>, overlays: Set<Overlay>, layoutInsetController: LayoutInsetsController, configurationRepository: ConfigurationRepository, sceneDataSourceDelegator: SceneDataSourceDelegator, qsSceneAdapter: Provider<QSSceneAdapter>, sceneJankMonitorFactory: SceneJankMonitor.Factory, Loading @@ -53,6 +55,7 @@ class SceneWindowRootView(context: Context, attrs: AttributeSet?) : WindowRootVi super.setVisibility(if (isVisible) View.VISIBLE else View.INVISIBLE) }, dataSourceDelegator = sceneDataSourceDelegator, configurationRepository = configurationRepository, qsSceneAdapter = qsSceneAdapter, sceneJankMonitorFactory = sceneJankMonitorFactory, tintedIconManagerFactory = tintedIconManagerFactory, Loading
packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt +54 −21 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import com.android.internal.policy.ScreenDecorationsUtils import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation import com.android.systemui.common.ui.compose.windowinsets.DisplayCutout import com.android.systemui.common.ui.compose.windowinsets.ScreenDecorProvider import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.compose.modifiers.sysUiResTagContainer import com.android.systemui.initOnBackPressedDispatcherOwner import com.android.systemui.lifecycle.WindowLifecycleState Loading Loading @@ -76,6 +77,7 @@ object SceneWindowRootViewBinder { overlays: Set<Overlay>, onVisibilityChangedInternal: (isVisible: Boolean) -> Unit, dataSourceDelegator: SceneDataSourceDelegator, configurationRepository: ConfigurationRepository, qsSceneAdapter: Provider<QSSceneAdapter>, sceneJankMonitorFactory: SceneJankMonitor.Factory, tintedIconManagerFactory: TintedIconManager.Factory, Loading Loading @@ -132,6 +134,7 @@ object SceneWindowRootViewBinder { containerConfig = containerConfig, sceneJankMonitorFactory = sceneJankMonitorFactory, tintedIconManagerFactory = tintedIconManagerFactory, configurationRepository = configurationRepository, ) .also { it.id = R.id.scene_container_root_composable } ) Loading @@ -155,6 +158,7 @@ object SceneWindowRootViewBinder { viewModelFactory = viewModel.dualShadeEducationalTooltipsViewModelFactory, windowInsets = windowInsets, configurationRepository = configurationRepository, ) ) Loading @@ -177,16 +181,19 @@ object SceneWindowRootViewBinder { overlayByKey: Map<OverlayKey, Overlay>, dataSourceDelegator: SceneDataSourceDelegator, qsSceneAdapter: Provider<QSSceneAdapter>, configurationRepository: ConfigurationRepository, containerConfig: SceneContainerConfig, sceneJankMonitorFactory: SceneJankMonitor.Factory, tintedIconManagerFactory: TintedIconManager.Factory, ): View { val displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets) val cornerRadius = cornerRadius(scope, configurationRepository, context) return ComposeView(context).apply { setContent { PlatformTheme { ScreenDecorProvider( displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets), screenCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context), displayCutout = displayCutout, screenCornerRadius = cornerRadius, ) { WithStatusIconContext(tintedIconManagerFactory = tintedIconManagerFactory) { SceneContainer( Loading @@ -212,7 +219,10 @@ object SceneWindowRootViewBinder { context: Context, viewModelFactory: DualShadeEducationalTooltipsViewModel.Factory, windowInsets: StateFlow<WindowInsets?>, configurationRepository: ConfigurationRepository, ): View { val displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets) val cornerRadius = cornerRadius(scope, configurationRepository, context) return ComposeView(context).apply { layoutParams = FrameLayout.LayoutParams( Loading @@ -222,8 +232,8 @@ object SceneWindowRootViewBinder { setContent { PlatformTheme { ScreenDecorProvider( displayCutout = displayCutoutFromWindowInsets(scope, context, windowInsets), screenCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context), displayCutout = displayCutout, screenCornerRadius = cornerRadius, ) { DualShadeEducationalTooltips(viewModelFactory = viewModelFactory) } Loading @@ -232,6 +242,23 @@ object SceneWindowRootViewBinder { } } /** * The corner radius can chang every time the window is moved to another display. This keeps it * up to date. */ private fun cornerRadius( scope: CoroutineScope, configurationRepository: ConfigurationRepository, context: Context, ): StateFlow<Float> = configurationRepository.onMovedToDisplay .map { ScreenDecorationsUtils.getWindowCornerRadius(context) } .stateIn( scope, SharingStarted.WhileSubscribed(), ScreenDecorationsUtils.getWindowCornerRadius(context), ) // TODO(b/298525212): remove once Compose exposes window inset bounds. private fun displayCutoutFromWindowInsets( scope: CoroutineScope, Loading @@ -239,8 +266,15 @@ object SceneWindowRootViewBinder { windowInsets: StateFlow<WindowInsets?>, ): StateFlow<DisplayCutout> = windowInsets .map { val boundingRect = it?.displayCutout?.boundingRectTop .map { it.toCutout(context) } .stateIn( scope, SharingStarted.WhileSubscribed(), initialValue = windowInsets.value.toCutout(context), ) private fun WindowInsets?.toCutout(context: Context): DisplayCutout { val boundingRect = this?.displayCutout?.boundingRectTop val width = boundingRect?.let { boundingRect.right - boundingRect.left } ?: 0 val left = boundingRect?.left?.toDp(context) ?: 0.dp val top = boundingRect?.top?.toDp(context) ?: 0.dp Loading @@ -253,10 +287,9 @@ object SceneWindowRootViewBinder { right >= getDisplayWidth(context) -> CutoutLocation.RIGHT else -> CutoutLocation.CENTER } val viewDisplayCutout = it?.displayCutout DisplayCutout(left, top, right, bottom, location, viewDisplayCutout) val viewDisplayCutout = this?.displayCutout return DisplayCutout(left, top, right, bottom, location, viewDisplayCutout) } .stateIn(scope, SharingStarted.WhileSubscribed(), DisplayCutout()) // TODO(b/298525212): remove once Compose exposes window inset bounds. private fun getDisplayWidth(context: Context): Dp { Loading
packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt +3 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.android.keyguard.logging.ScrimLogger import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.biometrics.AuthRippleView import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags Loading Loading @@ -101,6 +102,7 @@ abstract class ShadeViewProviderModule { choreographer: Choreographer?, @Main mainDispatcher: CoroutineDispatcher, tintedIconManagerFactory: TintedIconManager.Factory, @ShadeDisplayAware configurationRepository: ConfigurationRepository, ): WindowRootView { return if (SceneContainerFlag.isEnabled) { checkNoSceneDuplicates(scenesProvider.get()) Loading @@ -121,6 +123,7 @@ abstract class ShadeViewProviderModule { scenes = scenesProvider.get(), overlays = overlaysProvider.get(), layoutInsetController = layoutInsetController, configurationRepository = configurationRepository, sceneDataSourceDelegator = sceneDataSourceDelegator.get(), qsSceneAdapter = qsSceneAdapter, sceneJankMonitorFactory = sceneJankMonitorFactory, Loading