1 /*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.android.compose.theme
18
19 import android.content.Context
20 import androidx.compose.foundation.isSystemInDarkTheme
21 import androidx.compose.material3.ColorScheme
22 import androidx.compose.material3.MaterialTheme
23 import androidx.compose.material3.dynamicDarkColorScheme
24 import androidx.compose.material3.dynamicLightColorScheme
25 import androidx.compose.runtime.Composable
26 import androidx.compose.runtime.CompositionLocalProvider
27 import androidx.compose.runtime.remember
28 import androidx.compose.ui.platform.LocalContext
29 import com.android.compose.theme.AndroidColorScheme.Companion.color
30 import com.android.compose.theme.typography.TypeScaleTokens
31 import com.android.compose.theme.typography.TypefaceNames
32 import com.android.compose.theme.typography.TypefaceTokens
33 import com.android.compose.theme.typography.TypographyTokens
34 import com.android.compose.theme.typography.VariableFontTypeScaleEmphasizedTokens
35 import com.android.compose.theme.typography.platformTypography
36 import com.android.compose.windowsizeclass.LocalWindowSizeClass
37 import com.android.compose.windowsizeclass.calculateWindowSizeClass
38 import com.android.internal.R
39
40 /** The Material 3 theme that should wrap all Platform Composables. */
41 @Composable
PlatformThemenull42 fun PlatformTheme(isDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
43 val context = LocalContext.current
44
45 val colorScheme = remember(context, isDarkTheme) { platformColorScheme(isDarkTheme, context) }
46 val androidColorScheme = remember(context, isDarkTheme) { AndroidColorScheme(context) }
47 val typefaceNames = remember(context) { TypefaceNames.get(context) }
48 val typefaceTokens = remember(typefaceNames) { TypefaceTokens(typefaceNames) }
49 val typography =
50 remember(typefaceTokens) {
51 platformTypography(
52 TypographyTokens(
53 TypeScaleTokens(typefaceTokens),
54 VariableFontTypeScaleEmphasizedTokens(typefaceTokens),
55 )
56 )
57 }
58 val windowSizeClass = calculateWindowSizeClass()
59
60 MaterialTheme(colorScheme = colorScheme, typography = typography) {
61 CompositionLocalProvider(
62 LocalAndroidColorScheme provides androidColorScheme,
63 LocalWindowSizeClass provides windowSizeClass,
64 content = content,
65 )
66 }
67 }
68
platformColorSchemenull69 private fun platformColorScheme(isDarkTheme: Boolean, context: Context): ColorScheme {
70 return if (isDarkTheme) {
71 dynamicDarkColorScheme(context)
72 .copy(
73 inverseSurface = color(context, R.color.system_inverse_surface_dark),
74 inverseOnSurface = color(context, R.color.system_inverse_on_surface_dark),
75 inversePrimary = color(context, R.color.system_inverse_primary_dark),
76 error = color(context, R.color.system_error_dark),
77 onError = color(context, R.color.system_on_error_dark),
78 errorContainer = color(context, R.color.system_error_container_dark),
79 onErrorContainer = color(context, R.color.system_on_error_container_dark),
80 )
81 } else {
82 dynamicLightColorScheme(context)
83 .copy(
84 inverseSurface = color(context, R.color.system_inverse_surface_light),
85 inverseOnSurface = color(context, R.color.system_inverse_on_surface_light),
86 inversePrimary = color(context, R.color.system_inverse_primary_light),
87 error = color(context, R.color.system_error_light),
88 onError = color(context, R.color.system_on_error_light),
89 errorContainer = color(context, R.color.system_error_container_light),
90 onErrorContainer = color(context, R.color.system_on_error_container_light),
91 )
92 }
93 }
94