summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author vignesh ramanathan <vigneshrsastra@google.com> 2024-10-04 17:59:28 +0000
committer vignesh ramanathan <vigneshrsastra@google.com> 2024-10-15 20:48:33 +0000
commit2a180d47d32429fd8166d0d9e07b8cd1e2bf16d3 (patch)
tree71724e61b07a97970dbfcfb3475ee86a78b511ec
parent5bc51807e9d0ffee6f2baaa4939ac3f023d4dfa3 (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
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt32
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearMaterialBridgedLegacyTheme.kt82
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt38
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt54
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) {