diff options
author | 2024-10-04 17:59:28 +0000 | |
---|---|---|
committer | 2024-10-15 20:48:33 +0000 | |
commit | 2a180d47d32429fd8166d0d9e07b8cd1e2bf16d3 (patch) | |
tree | 71724e61b07a97970dbfcfb3475ee86a78b511ec | |
parent | 5bc51807e9d0ffee6f2baaa4939ac3f023d4dfa3 (diff) |
Material 2.5 theme based on Material3 resources
Material 2.5 theme is created using Material 3.0 overlay resources.
This is done to maintain to single set of overlay resources when material 3 migration is in progress.
BUG: b/371245645
Relnote: "N/A"
Test: Manual. Existing Test passes.
Flag: NONE "Resource updates only."
LOW_COVERAGE_REASON=FLAG_NOT_ON
Change-Id: I42827b5ee5e9a08bad84faf5e0dd81ba723705c7
4 files changed, 186 insertions, 20 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt index 6af9a28ec..7ac6c8114 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt @@ -29,11 +29,41 @@ import androidx.wear.compose.material3.ColorScheme */ internal object WearComposeMaterial3ColorScheme { + @RequiresApi(Build.VERSION_CODES.S) + fun tonalColorScheme(context: Context): ColorScheme { + val tonalPalette = dynamicTonalPalette(context) + return ColorScheme( + background = tonalPalette.neutral0, + onBackground = tonalPalette.neutral100, + onPrimary = tonalPalette.primary10, + onPrimaryContainer = tonalPalette.primary90, + onSecondary = tonalPalette.secondary10, + onSecondaryContainer = tonalPalette.secondary90, + onSurface = tonalPalette.neutral95, + onSurfaceVariant = tonalPalette.neutralVariant80, + onTertiary = tonalPalette.tertiary10, + onTertiaryContainer = tonalPalette.tertiary90, + outline = tonalPalette.neutralVariant60, + outlineVariant = tonalPalette.neutralVariant40, + primary = tonalPalette.primary90, + primaryContainer = tonalPalette.primary30, + primaryDim = tonalPalette.primary80, + secondary = tonalPalette.secondary90, + secondaryContainer = tonalPalette.secondary30, + secondaryDim = tonalPalette.secondary80, + surfaceContainer = tonalPalette.neutral20, + surfaceContainerHigh = tonalPalette.neutral30, + tertiary = tonalPalette.tertiary90, + tertiaryContainer = tonalPalette.tertiary30, + tertiaryDim = tonalPalette.tertiary80, + ) + } + private fun Color.updatedColor(context: Context, @ColorRes colorRes: Int): Color { return ResourceHelper.getColor(context, colorRes) ?: this } - @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @RequiresApi(36) fun dynamicColorScheme(context: Context): ColorScheme { val defaultColorScheme = ColorScheme() return ColorScheme( diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearMaterialBridgedLegacyTheme.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearMaterialBridgedLegacyTheme.kt new file mode 100644 index 000000000..160dc2e93 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearMaterialBridgedLegacyTheme.kt @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2024 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.permissioncontroller.permission.ui.wear.theme + +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.ui.unit.sp +import androidx.wear.compose.material.Colors +import androidx.wear.compose.material.Shapes +import androidx.wear.compose.material.Typography + +/** + * This exists to support Permission Controller screens that may still use Material 2.5 components + * to maintain consistency with the settings screens. + * + * However to avoid maintaining two sets of resources for overlays, this class construct 2.5 theme + * from 3.0 + */ +@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) +internal class WearMaterialBridgedLegacyTheme +private constructor(newTheme: WearOverlayableMaterial3Theme) { + + val colors = + newTheme.colorScheme.run { + Colors( + background = background, + onBackground = onBackground, + primary = onPrimaryContainer, // primary90 + primaryVariant = primaryDim, // primary80 + onPrimary = onPrimary, // primary10 + secondary = tertiary, // Tertiary90 + secondaryVariant = tertiaryDim, // Tertiary60 - Tertiary80 BestFit. + onSecondary = onTertiary, // Tertiary10 + surface = surfaceContainer, // neutral20 + onSurface = onSurface, // neutral95 + onSurfaceVariant = onSurfaceVariant, // neutralVariant80 + ) + } + + // Based on: + // Material 2: + // wear/compose/compose-material/src/main/java/androidx/wear/compose/material/Typography.kt + // Material 3: + // wear/compose/compose-material3/src/main/java/androidx/wear/compose/material3/tokens/TypeScaleTokens.kt + val typography = + newTheme.typography.run { + Typography( + display1 = displayLarge, // 40.sp + display2 = displayMedium.copy(fontSize = 34.sp, lineHeight = 40.sp), + display3 = displayMedium, // 30.sp + title1 = displaySmall, // 24.sp + title2 = titleLarge, // 20.sp + title3 = titleMedium, // 16.sp + body1 = bodyLarge, // 16.sp + body2 = bodyMedium, // 14.sp + caption1 = bodyMedium, // 14.sp + caption2 = bodySmall, // 12.sp + caption3 = bodyExtraSmall, // 10.sp + button = labelMedium, // 15.sp + ) + } + + val shapes = newTheme.shapes.run { Shapes(large = large, medium = medium, small = small) } + + companion object { + fun createFrom(newTheme: WearOverlayableMaterial3Theme) = + WearMaterialBridgedLegacyTheme(newTheme) + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt index d2b2324ea..8aeb5f74d 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt @@ -15,23 +15,27 @@ */ package com.android.permissioncontroller.permission.ui.wear.theme +import android.content.Context import android.os.Build -import androidx.compose.runtime.Composable -import androidx.compose.ui.platform.LocalContext -import androidx.wear.compose.material3.MaterialTheme +import androidx.annotation.RequiresApi -/** The Material 3 Theme Wrapper for Supporting RRO. */ -@Composable -fun WearOverlayableMaterial3Theme(content: @Composable () -> Unit) { - val context = LocalContext.current - if (Build.VERSION.SDK_INT >= 36) { - MaterialTheme( - colorScheme = WearComposeMaterial3ColorScheme.dynamicColorScheme(context), - typography = WearComposeMaterial3Typography.dynamicTypography(context), - shapes = WearComposeMaterial3Shapes.dynamicShapes(context), - content = content, - ) - } else { - MaterialTheme(content = content) - } +/** + * Theme wrapper providing Material 3 styling while maintaining compatibility with Runtime Resource + * Overlay (RRO). + * + * Uses the tonal palette from the previous Material Design version until dynamic color tokens are + * available in SDK 36. + */ +@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) +internal class WearOverlayableMaterial3Theme(context: Context) { + val colorScheme = + if (Build.VERSION.SDK_INT >= 36) { + WearComposeMaterial3ColorScheme.dynamicColorScheme(context) + } else { + WearComposeMaterial3ColorScheme.tonalColorScheme(context) + } + + val typography = WearComposeMaterial3Typography.dynamicTypography(context) + + val shapes = WearComposeMaterial3Shapes.dynamicShapes(context) } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt index 1d6d25ab1..86a05673a 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt @@ -29,11 +29,61 @@ import androidx.compose.ui.text.font.FontFamily import androidx.wear.compose.material.Colors import androidx.wear.compose.material.MaterialTheme import androidx.wear.compose.material.Typography +import androidx.wear.compose.material3.MaterialTheme as Material3Theme +import com.android.permission.flags.Flags import com.android.permissioncontroller.R +import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionThemeVersion.LEGACY +import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionThemeVersion.MATERIAL3 -/** The Material 2.5 Theme Wrapper for Supporting RRO. */ +enum class WearPermissionThemeVersion { + LEGACY, + MATERIAL3, +} + +/** + * Supports both Material 3 and Material 2 theme. default version for permission theme will be + * LEGACY until we migrate enough screens to 3. LEGACY version will use material 3 overlay resources + * by default. + */ +@Composable +fun WearPermissionTheme( + version: WearPermissionThemeVersion = LEGACY, + content: @Composable () -> Unit, +) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) { + WearPermissionLegacyTheme(content) + } else { + val material3OverlayResourcesEnabled = Flags.wearComposeMaterial3() + if (version == MATERIAL3) { + val material3Theme = WearOverlayableMaterial3Theme(LocalContext.current) + Material3Theme( + colorScheme = material3Theme.colorScheme, + typography = material3Theme.typography, + shapes = material3Theme.shapes, + content = content, + ) + } else if (version == LEGACY && material3OverlayResourcesEnabled) { + val material3Theme = WearOverlayableMaterial3Theme(LocalContext.current) + val bridgedLegacyTheme = WearMaterialBridgedLegacyTheme.createFrom(material3Theme) + MaterialTheme( + colors = bridgedLegacyTheme.colors, + typography = bridgedLegacyTheme.typography, + shapes = bridgedLegacyTheme.shapes, + content = content, + ) + } else { + WearPermissionLegacyTheme(content) + } + } +} + +/** + * The Material 2.5 Theme Wrapper for Supporting RRO with legacy resources. This theme is kept here + * for backward compatibility. When grant screen is updated to material3 will clean up legacy + * resources. + */ @Composable -fun WearPermissionTheme(content: @Composable () -> Unit) { +fun WearPermissionLegacyTheme(content: @Composable () -> Unit) { val context = LocalContext.current val colors = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { |