diff options
3 files changed, 53 insertions, 0 deletions
diff --git a/packages/SystemUI/compose/core/Android.bp b/packages/SystemUI/compose/core/Android.bp index 510fa1e1fa80..42d088f218a1 100644 --- a/packages/SystemUI/compose/core/Android.bp +++ b/packages/SystemUI/compose/core/Android.bp @@ -34,7 +34,9 @@ android_library { "androidx.compose.runtime_runtime", "androidx.compose.material3_material3", + "androidx.compose.material3_material3-window-size-class", "androidx.savedstate_savedstate", + "androidx.window_window", ], kotlincflags: ["-Xjvm-default=all"], diff --git a/packages/SystemUI/compose/core/src/com/android/compose/theme/PlatformTheme.kt b/packages/SystemUI/compose/core/src/com/android/compose/theme/PlatformTheme.kt index b4e90d63c6b8..06618704e085 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/theme/PlatformTheme.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/theme/PlatformTheme.kt @@ -29,6 +29,8 @@ import com.android.compose.theme.typography.TypefaceNames import com.android.compose.theme.typography.TypefaceTokens import com.android.compose.theme.typography.TypographyTokens import com.android.compose.theme.typography.platformTypography +import com.android.compose.windowsizeclass.LocalWindowSizeClass +import com.android.compose.windowsizeclass.calculateWindowSizeClass /** The Material 3 theme that should wrap all Platform Composables. */ @Composable @@ -51,10 +53,12 @@ fun PlatformTheme( remember(typefaceNames) { platformTypography(TypographyTokens(TypeScaleTokens(TypefaceTokens(typefaceNames)))) } + val windowSizeClass = calculateWindowSizeClass() MaterialTheme(colorScheme, typography = typography) { CompositionLocalProvider( LocalAndroidColorScheme provides androidColorScheme, + LocalWindowSizeClass provides windowSizeClass, ) { content() } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/windowsizeclass/WindowSizeClass.kt b/packages/SystemUI/compose/core/src/com/android/compose/windowsizeclass/WindowSizeClass.kt new file mode 100644 index 000000000000..4674d6e5f25a --- /dev/null +++ b/packages/SystemUI/compose/core/src/com/android/compose/windowsizeclass/WindowSizeClass.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.compose.windowsizeclass + +import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi +import androidx.compose.material3.windowsizeclass.WindowSizeClass +import androidx.compose.runtime.Composable +import androidx.compose.runtime.staticCompositionLocalOf +import androidx.compose.ui.graphics.toComposeRect +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity +import androidx.window.layout.WindowMetricsCalculator + +val LocalWindowSizeClass = + staticCompositionLocalOf<WindowSizeClass> { + throw IllegalStateException( + "No WindowSizeClass configured. Make sure to use LocalWindowSizeClass in a Composable" + + " surrounded by a PlatformTheme {}." + ) + } + +@OptIn(ExperimentalMaterial3WindowSizeClassApi::class) +@Composable +fun calculateWindowSizeClass(): WindowSizeClass { + // Observe view configuration changes and recalculate the size class on each change. + LocalConfiguration.current + val density = LocalDensity.current + val context = LocalContext.current + val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(context) + val size = with(density) { metrics.bounds.toComposeRect().size.toDpSize() } + return WindowSizeClass.calculateFromSize(size) +} |