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.annotation.ColorInt 20 import android.content.Context 21 import androidx.compose.runtime.staticCompositionLocalOf 22 import androidx.compose.ui.graphics.Color 23 import com.android.internal.R 24 25 /** CompositionLocal used to pass [AndroidColorScheme] down the tree. */ 26 val LocalAndroidColorScheme = 27 staticCompositionLocalOf<AndroidColorScheme> { 28 throw IllegalStateException( 29 "No AndroidColorScheme configured. Make sure to use LocalAndroidColorScheme in a " + 30 "Composable surrounded by a PlatformTheme {}." 31 ) 32 } 33 34 /** 35 * The Android color scheme. 36 * 37 * Important: Use M3 colors from MaterialTheme.colorScheme whenever possible instead. In the future, 38 * most of the colors in this class will be removed in favor of their M3 counterpart. 39 */ 40 class AndroidColorScheme(context: Context) { 41 val onSecondaryFixedVariant = getColor(context, R.attr.materialColorOnSecondaryFixedVariant) 42 val onTertiaryFixedVariant = getColor(context, R.attr.materialColorOnTertiaryFixedVariant) 43 val surfaceContainerLowest = getColor(context, R.attr.materialColorSurfaceContainerLowest) 44 val onPrimaryFixedVariant = getColor(context, R.attr.materialColorOnPrimaryFixedVariant) 45 val onSecondaryContainer = getColor(context, R.attr.materialColorOnSecondaryContainer) 46 val onTertiaryContainer = getColor(context, R.attr.materialColorOnTertiaryContainer) 47 val surfaceContainerLow = getColor(context, R.attr.materialColorSurfaceContainerLow) 48 val onPrimaryContainer = getColor(context, R.attr.materialColorOnPrimaryContainer) 49 val secondaryFixedDim = getColor(context, R.attr.materialColorSecondaryFixedDim) 50 val onErrorContainer = getColor(context, R.attr.materialColorOnErrorContainer) 51 val onSecondaryFixed = getColor(context, R.attr.materialColorOnSecondaryFixed) 52 val onSurfaceInverse = getColor(context, R.attr.materialColorOnSurfaceInverse) 53 val tertiaryFixedDim = getColor(context, R.attr.materialColorTertiaryFixedDim) 54 val onTertiaryFixed = getColor(context, R.attr.materialColorOnTertiaryFixed) 55 val primaryFixedDim = getColor(context, R.attr.materialColorPrimaryFixedDim) 56 val secondaryContainer = getColor(context, R.attr.materialColorSecondaryContainer) 57 val errorContainer = getColor(context, R.attr.materialColorErrorContainer) 58 val onPrimaryFixed = getColor(context, R.attr.materialColorOnPrimaryFixed) 59 val primaryInverse = getColor(context, R.attr.materialColorPrimaryInverse) 60 val secondaryFixed = getColor(context, R.attr.materialColorSecondaryFixed) 61 val surfaceInverse = getColor(context, R.attr.materialColorSurfaceInverse) 62 val surfaceVariant = getColor(context, R.attr.materialColorSurfaceVariant) 63 val tertiaryContainer = getColor(context, R.attr.materialColorTertiaryContainer) 64 val tertiaryFixed = getColor(context, R.attr.materialColorTertiaryFixed) 65 val primaryContainer = getColor(context, R.attr.materialColorPrimaryContainer) 66 val onBackground = getColor(context, R.attr.materialColorOnBackground) 67 val primaryFixed = getColor(context, R.attr.materialColorPrimaryFixed) 68 val onSecondary = getColor(context, R.attr.materialColorOnSecondary) 69 val onTertiary = getColor(context, R.attr.materialColorOnTertiary) 70 val surfaceDim = getColor(context, R.attr.materialColorSurfaceDim) 71 val surfaceBright = getColor(context, R.attr.materialColorSurfaceBright) 72 val onError = getColor(context, R.attr.materialColorOnError) 73 val surface = getColor(context, R.attr.materialColorSurface) 74 val surfaceContainerHigh = getColor(context, R.attr.materialColorSurfaceContainerHigh) 75 val surfaceContainerHighest = getColor(context, R.attr.materialColorSurfaceContainerHighest) 76 val onSurfaceVariant = getColor(context, R.attr.materialColorOnSurfaceVariant) 77 val outline = getColor(context, R.attr.materialColorOutline) 78 val outlineVariant = getColor(context, R.attr.materialColorOutlineVariant) 79 val onPrimary = getColor(context, R.attr.materialColorOnPrimary) 80 val onSurface = getColor(context, R.attr.materialColorOnSurface) 81 val surfaceContainer = getColor(context, R.attr.materialColorSurfaceContainer) 82 val primary = getColor(context, R.attr.materialColorPrimary) 83 val secondary = getColor(context, R.attr.materialColorSecondary) 84 val tertiary = getColor(context, R.attr.materialColorTertiary) 85 86 @Deprecated("Use the new android tokens: go/sysui-colors") 87 val deprecated = DeprecatedValues(context) 88 89 class DeprecatedValues(context: Context) { 90 val colorPrimary = getColor(context, R.attr.colorPrimary) 91 val colorPrimaryDark = getColor(context, R.attr.colorPrimaryDark) 92 val colorAccent = getColor(context, R.attr.colorAccent) 93 val colorAccentPrimary = getColor(context, R.attr.colorAccentPrimary) 94 val colorAccentSecondary = getColor(context, R.attr.colorAccentSecondary) 95 val colorAccentTertiary = getColor(context, R.attr.colorAccentTertiary) 96 val colorAccentPrimaryVariant = getColor(context, R.attr.colorAccentPrimaryVariant) 97 val colorAccentSecondaryVariant = getColor(context, R.attr.colorAccentSecondaryVariant) 98 val colorAccentTertiaryVariant = getColor(context, R.attr.colorAccentTertiaryVariant) 99 val colorSurface = getColor(context, R.attr.colorSurface) 100 val colorSurfaceHighlight = getColor(context, R.attr.colorSurfaceHighlight) 101 val colorSurfaceVariant = getColor(context, R.attr.colorSurfaceVariant) 102 val colorSurfaceHeader = getColor(context, R.attr.colorSurfaceHeader) 103 val colorError = getColor(context, R.attr.colorError) 104 val colorBackground = getColor(context, R.attr.colorBackground) 105 val colorBackgroundFloating = getColor(context, R.attr.colorBackgroundFloating) 106 val panelColorBackground = getColor(context, R.attr.panelColorBackground) 107 val textColorPrimary = getColor(context, R.attr.textColorPrimary) 108 val textColorSecondary = getColor(context, R.attr.textColorSecondary) 109 val textColorTertiary = getColor(context, R.attr.textColorTertiary) 110 val textColorPrimaryInverse = getColor(context, R.attr.textColorPrimaryInverse) 111 val textColorSecondaryInverse = getColor(context, R.attr.textColorSecondaryInverse) 112 val textColorTertiaryInverse = getColor(context, R.attr.textColorTertiaryInverse) 113 val textColorOnAccent = getColor(context, R.attr.textColorOnAccent) 114 val colorForeground = getColor(context, R.attr.colorForeground) 115 val colorForegroundInverse = getColor(context, R.attr.colorForegroundInverse) 116 } 117 118 companion object { 119 fun getColor(context: Context, attr: Int): Color { 120 val ta = context.obtainStyledAttributes(intArrayOf(attr)) 121 @ColorInt val color = ta.getColor(0, 0) 122 ta.recycle() 123 return Color(color) 124 } 125 } 126 } 127