blob: 55cc1905e00a56df4b70d7c7bacc4c65fad9a5ae [file] [log] [blame]
/*
* Copyright 2021 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 androidx.compose.material3
import android.content.Context
import android.os.Build
import androidx.annotation.ColorRes
import androidx.annotation.DoNotInline
import androidx.annotation.RequiresApi
import androidx.compose.ui.graphics.Color
/** Dynamic colors in Material. */
@RequiresApi(Build.VERSION_CODES.S)
internal fun dynamicTonalPalette(context: Context): TonalPalette = TonalPalette(
// The neutral tonal range from the generated dynamic color palette.
neutral100 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_0),
neutral99 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_10),
neutral95 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_50),
neutral90 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_100),
neutral80 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_200),
neutral70 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_300),
neutral60 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_400),
neutral50 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_500),
neutral40 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600),
neutral30 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_700),
neutral20 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_800),
neutral10 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_900),
neutral0 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_1000),
// The neutral variant tonal range, sometimes called "neutral 2", from the
// generated dynamic color palette.
neutralVariant100 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_0),
neutralVariant99 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_10),
neutralVariant95 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_50),
neutralVariant90 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_100),
neutralVariant80 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_200),
neutralVariant70 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_300),
neutralVariant60 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_400),
neutralVariant50 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_500),
neutralVariant40 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600),
neutralVariant30 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_700),
neutralVariant20 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_800),
neutralVariant10 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_900),
neutralVariant0 = ColorResourceHelper.getColor(context, android.R.color.system_neutral2_1000),
// The primary tonal range from the generated dynamic color palette.
primary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_0),
primary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_10),
primary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_50),
primary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_100),
primary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_200),
primary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_300),
primary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_400),
primary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_500),
primary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_600),
primary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_700),
primary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_800),
primary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_900),
primary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_1000),
// The secondary tonal range from the generated dynamic color palette.
secondary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_0),
secondary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_10),
secondary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_50),
secondary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_100),
secondary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_200),
secondary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_300),
secondary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_400),
secondary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_500),
secondary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_600),
secondary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_700),
secondary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_800),
secondary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_900),
secondary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_1000),
// The tertiary tonal range from the generated dynamic color palette.
tertiary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_0),
tertiary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_10),
tertiary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_50),
tertiary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_100),
tertiary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_200),
tertiary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_300),
tertiary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_400),
tertiary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_500),
tertiary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_600),
tertiary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_700),
tertiary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_800),
tertiary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_900),
tertiary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_1000),
)
/**
* Creates a light dynamic color scheme.
*
* Use this function to create a color scheme based off the system wallpaper. If the developer
* changes the wallpaper this color scheme will change accordingly. This dynamic scheme is a
* light theme variant.
*
* @param context The context required to get system resource data.
*/
@RequiresApi(Build.VERSION_CODES.S)
fun dynamicLightColorScheme(context: Context): ColorScheme {
val tonalPalette = dynamicTonalPalette(context)
return lightColorScheme(
primary = tonalPalette.primary40,
onPrimary = tonalPalette.primary100,
primaryContainer = tonalPalette.primary90,
onPrimaryContainer = tonalPalette.primary10,
inversePrimary = tonalPalette.primary80,
secondary = tonalPalette.secondary40,
onSecondary = tonalPalette.secondary100,
secondaryContainer = tonalPalette.secondary90,
onSecondaryContainer = tonalPalette.secondary10,
tertiaryContainer = tonalPalette.tertiary90,
onTertiaryContainer = tonalPalette.tertiary10,
background = tonalPalette.neutral99,
onBackground = tonalPalette.neutral10,
surface = tonalPalette.neutral99,
onSurface = tonalPalette.neutral10,
surfaceVariant = tonalPalette.neutralVariant90,
onSurfaceVariant = tonalPalette.neutralVariant30,
inverseSurface = tonalPalette.neutral20,
inverseOnSurface = tonalPalette.neutral95,
outline = tonalPalette.neutralVariant50,
)
}
/**
* Creates a dark dynamic color scheme.
*
* Use this function to create a color scheme based off the system wallpaper. If the developer
* changes the wallpaper this color scheme will change accordingly. This dynamic scheme is a dark
* theme variant.
*
* @param context The context required to get system resource data.
*/
@RequiresApi(Build.VERSION_CODES.S)
fun dynamicDarkColorScheme(context: Context): ColorScheme {
val tonalPalette = dynamicTonalPalette(context)
return darkColorScheme(
primary = tonalPalette.primary80,
onPrimary = tonalPalette.primary20,
primaryContainer = tonalPalette.primary30,
onPrimaryContainer = tonalPalette.primary90,
inversePrimary = tonalPalette.primary40,
secondary = tonalPalette.secondary80,
onSecondary = tonalPalette.secondary20,
secondaryContainer = tonalPalette.secondary30,
onSecondaryContainer = tonalPalette.secondary90,
tertiaryContainer = tonalPalette.tertiary30,
onTertiaryContainer = tonalPalette.tertiary90,
background = tonalPalette.neutral10,
onBackground = tonalPalette.neutral90,
surface = tonalPalette.neutral10,
onSurface = tonalPalette.neutral90,
surfaceVariant = tonalPalette.neutralVariant30,
onSurfaceVariant = tonalPalette.neutralVariant80,
inverseSurface = tonalPalette.neutral90,
inverseOnSurface = tonalPalette.neutral20,
outline = tonalPalette.neutralVariant60,
)
}
@RequiresApi(23)
private object ColorResourceHelper {
@DoNotInline
fun getColor(context: Context, @ColorRes id: Int): Color {
return Color(context.resources.getColor(id, context.theme))
}
}