Skip to content

Commit

Permalink
[M3][Color] Introduce U color tokens
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 574897222
  • Loading branch information
Material Design Team authored and drchen committed Oct 19, 2023
1 parent 2590c42 commit ad63d3f
Show file tree
Hide file tree
Showing 9 changed files with 167 additions and 200 deletions.
51 changes: 1 addition & 50 deletions lib/java/com/google/android/material/color/DynamicColors.java
Expand Up @@ -23,13 +23,11 @@
import android.app.Application.ActivityLifecycleCallbacks;
import android.app.UiModeManager;
import android.content.Context;
import android.content.res.Resources.NotFoundException;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextThemeWrapper;
import androidx.annotation.ChecksSdkIntAtLeast;
import androidx.annotation.NonNull;
Expand All @@ -43,16 +41,12 @@
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;

/** Utility for applying dynamic colors to application/activities. */
public class DynamicColors {
private static final int[] DYNAMIC_COLOR_THEME_OVERLAY_ATTRIBUTE =
new int[] {R.attr.dynamicColorThemeOverlay};

private static final int[] CONTRAST_COLOR_THEME_OVERLAY_ATTRIBUTE =
new int[] {R.attr.contrastColorThemeOverlay};

private static final DeviceSupportCondition DEFAULT_DEVICE_SUPPORT_CONDITION =
new DeviceSupportCondition() {
@Override
Expand Down Expand Up @@ -126,11 +120,6 @@ public boolean isSupported() {
private static final int USE_DEFAULT_THEME_OVERLAY = 0;
private static final String TAG = DynamicColors.class.getSimpleName();

private static final String SYSTEM_OUTLINE_VARIANT_DARK_RESOURCE_ENTRY_NAME =
"system_outline_variant_dark";

private static final int SYSTEM_OUTLINE_VARIANT_DARK_RESOURCE_ID = 0x010600c1;

private DynamicColors() {}

/**
Expand Down Expand Up @@ -326,13 +315,6 @@ public static void applyToActivityIfAvailable(
}
} else {
ThemeUtils.applyThemeOverlay(activity, theme);
// TODO(b/289112889): Remove workaround and roll forward cl/528599594 as soon as U public
// release. Contrast ThemeOverlay is applied on top of Dynamic ThemeOverlay to keep client's
// custom Dynamic theme attributes.
if (isDynamicContrastAvailable(activity)) {
ThemeUtils.applyThemeOverlay(
activity, getDefaultThemeOverlay(activity, CONTRAST_COLOR_THEME_OVERLAY_ATTRIBUTE));
}
}
// Applies client's callback after content-based dynamic colors or just dynamic colors has
// been applied.
Expand Down Expand Up @@ -409,16 +391,7 @@ public static Context wrapContextIfAvailable(
MaterialColorUtilitiesHelper.createColorResourcesIdsToColorValues(scheme));
}
}
Context dynamicContext = new ContextThemeWrapper(originalContext, theme);
// TODO(b/289112889): Remove workaround and roll forward cl/528599594 as soon as U public
// release. Contrast ThemeOverlay is applied on top of Dynamic ThemeOverlay to keep client's
// custom Dynamic theme attributes.
if (isDynamicContrastAvailable(originalContext)) {
return new ContextThemeWrapper(
dynamicContext,
getDefaultThemeOverlay(dynamicContext, CONTRAST_COLOR_THEME_OVERLAY_ATTRIBUTE));
}
return dynamicContext;
return new ContextThemeWrapper(originalContext, theme);
}

/** Returns {@code true} if dynamic colors are available on the current SDK level. */
Expand Down Expand Up @@ -511,26 +484,4 @@ private static float getSystemContrast(Context context) {
? 0
: uiModeManager.getContrast();
}

private static boolean isDynamicContrastAvailable(Context context) {
if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE && areSystemColorRolesDefined(context)) {
return true;
}
return false;
}

// TODO(b/289112889): Remove workaround and roll forward cl/528599594 as soon as U public release.
//
// This is to check and make sure the last material resource defined in the android block of
// resources matches the resource name from app's context.
private static boolean areSystemColorRolesDefined(Context context) {
try {
return Objects.equals(
context.getResources().getResourceEntryName(SYSTEM_OUTLINE_VARIANT_DARK_RESOURCE_ID),
SYSTEM_OUTLINE_VARIANT_DARK_RESOURCE_ENTRY_NAME);
} catch (NotFoundException e) {
Log.i(TAG, SYSTEM_OUTLINE_VARIANT_DARK_RESOURCE_ENTRY_NAME + " resource not found.", e);
}
return false;
}
}
Expand Up @@ -90,4 +90,14 @@
<color name="material_dynamic_neutral_variant95">@color/m3_ref_palette_dynamic_neutral_variant95</color>
<color name="material_dynamic_neutral_variant99">@color/m3_ref_palette_dynamic_neutral_variant99</color>
<color name="material_dynamic_neutral_variant100">@color/m3_ref_palette_dynamic_neutral_variant100</color>

<!-- Dynamic color resources - Error -->
<color name="material_dynamic_color_light_error">@color/m3_sys_color_light_error</color>
<color name="material_dynamic_color_light_on_error">@color/m3_sys_color_light_on_error</color>
<color name="material_dynamic_color_light_error_container">@color/m3_sys_color_light_error_container</color>
<color name="material_dynamic_color_light_on_error_container">@color/m3_sys_color_light_on_error_container</color>
<color name="material_dynamic_color_dark_error">@color/m3_sys_color_dark_error</color>
<color name="material_dynamic_color_dark_on_error">@color/m3_sys_color_dark_on_error</color>
<color name="material_dynamic_color_dark_error_container">@color/m3_sys_color_dark_error_container</color>
<color name="material_dynamic_color_dark_on_error_container">@color/m3_sys_color_dark_on_error_container</color>
</resources>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2023 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.
-->

<resources>
<!-- Dynamic color resources - Error, overrides in v34 to system resources -->
<color name="material_dynamic_color_light_error">@color/m3_sys_color_dynamic_light_error</color>
<color name="material_dynamic_color_light_on_error">@color/m3_sys_color_dynamic_light_on_error</color>
<color name="material_dynamic_color_light_error_container">@color/m3_sys_color_dynamic_light_error_container</color>
<color name="material_dynamic_color_light_on_error_container">@color/m3_sys_color_dynamic_light_on_error_container</color>
<color name="material_dynamic_color_dark_error">@color/m3_sys_color_dynamic_dark_error</color>
<color name="material_dynamic_color_dark_on_error">@color/m3_sys_color_dynamic_dark_on_error</color>
<color name="material_dynamic_color_dark_error_container">@color/m3_sys_color_dynamic_dark_error_container</color>
<color name="material_dynamic_color_dark_on_error_container">@color/m3_sys_color_dynamic_dark_on_error_container</color>
</resources>
120 changes: 120 additions & 0 deletions lib/java/com/google/android/material/color/res/values-v34/tokens.xml
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2023 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.
-->
<!-- AUTOGENERATED FILE. DO NOT MODIFY. -->
<!-- Version: v0.175 -->

<resources>

<!-- Generated from token set (md.sys.color) in context (theme=dark, platform=android, audience=3p, scheme=dynamic). -->
<!-- Primary colors -->
<color name="m3_sys_color_dynamic_dark_primary">@android:color/system_primary_dark</color>
<color name="m3_sys_color_dynamic_dark_primary_container">@android:color/system_primary_container_dark</color>
<color name="m3_sys_color_dynamic_dark_on_primary">@android:color/system_on_primary_dark</color>
<color name="m3_sys_color_dynamic_dark_on_primary_container">@android:color/system_on_primary_container_dark</color>
<color name="m3_sys_color_dynamic_dark_inverse_primary">@android:color/system_primary_light</color>
<!-- Secondary colors -->
<color name="m3_sys_color_dynamic_dark_secondary">@android:color/system_secondary_dark</color>
<color name="m3_sys_color_dynamic_dark_secondary_container">@android:color/system_secondary_container_dark</color>
<color name="m3_sys_color_dynamic_dark_on_secondary">@android:color/system_on_secondary_dark</color>
<color name="m3_sys_color_dynamic_dark_on_secondary_container">@android:color/system_on_secondary_container_dark</color>
<!-- Tertiary colors -->
<color name="m3_sys_color_dynamic_dark_tertiary">@android:color/system_tertiary_dark</color>
<color name="m3_sys_color_dynamic_dark_tertiary_container">@android:color/system_tertiary_container_dark</color>
<color name="m3_sys_color_dynamic_dark_on_tertiary">@android:color/system_on_tertiary_dark</color>
<color name="m3_sys_color_dynamic_dark_on_tertiary_container">@android:color/system_on_tertiary_container_dark</color>
<!-- Surface colors -->
<color name="m3_sys_color_dynamic_dark_surface_dim">@android:color/system_surface_dim_dark</color>
<color name="m3_sys_color_dynamic_dark_surface_bright">@android:color/system_surface_bright_dark</color>
<color name="m3_sys_color_dynamic_dark_surface_container">@android:color/system_surface_container_dark</color>
<color name="m3_sys_color_dynamic_dark_surface_container_low">@android:color/system_surface_container_low_dark</color>
<color name="m3_sys_color_dynamic_dark_surface_container_high">@android:color/system_surface_container_high_dark</color>
<color name="m3_sys_color_dynamic_dark_surface_container_lowest">@android:color/system_surface_container_lowest_dark</color>
<color name="m3_sys_color_dynamic_dark_surface_container_highest">@android:color/system_surface_container_highest_dark</color>
<color name="m3_sys_color_dynamic_dark_surface">@android:color/system_surface_dark</color>
<color name="m3_sys_color_dynamic_dark_surface_variant">@android:color/system_surface_variant_dark</color>
<color name="m3_sys_color_dynamic_dark_on_surface">@android:color/system_on_surface_dark</color>
<color name="m3_sys_color_dynamic_dark_on_surface_variant">@android:color/system_on_surface_variant_dark</color>
<color name="m3_sys_color_dynamic_dark_inverse_surface">@android:color/system_surface_light</color>
<color name="m3_sys_color_dynamic_dark_inverse_on_surface">@android:color/system_on_surface_light</color>
<!-- Background colors -->
<color name="m3_sys_color_dynamic_dark_background">@android:color/system_background_dark</color>
<color name="m3_sys_color_dynamic_dark_on_background">@android:color/system_on_background_dark</color>
<!-- Hairline colors -->
<color name="m3_sys_color_dynamic_dark_outline">@android:color/system_outline_dark</color>
<color name="m3_sys_color_dynamic_dark_outline_variant">@android:color/system_outline_variant_dark</color>
<!-- Error colors -->
<color name="m3_sys_color_dynamic_dark_error">@android:color/system_error_dark</color>
<color name="m3_sys_color_dynamic_dark_error_container">@android:color/system_error_container_dark</color>
<color name="m3_sys_color_dynamic_dark_on_error">@android:color/system_on_error_dark</color>
<color name="m3_sys_color_dynamic_dark_on_error_container">@android:color/system_on_error_container_dark</color>

<!-- Generated from token set (md.sys.color) in context (theme=light, platform=android, audience=3p, scheme=dynamic). -->
<!-- Primary colors -->
<color name="m3_sys_color_dynamic_primary_fixed">@android:color/system_primary_fixed</color>
<color name="m3_sys_color_dynamic_on_primary_fixed">@android:color/system_on_primary_fixed</color>
<color name="m3_sys_color_dynamic_primary_fixed_dim">@android:color/system_primary_fixed_dim</color>
<color name="m3_sys_color_dynamic_on_primary_fixed_variant">@android:color/system_on_primary_fixed_variant</color>
<color name="m3_sys_color_dynamic_light_primary">@android:color/system_primary_light</color>
<color name="m3_sys_color_dynamic_light_primary_container">@android:color/system_primary_container_light</color>
<color name="m3_sys_color_dynamic_light_on_primary">@android:color/system_on_primary_light</color>
<color name="m3_sys_color_dynamic_light_on_primary_container">@android:color/system_on_primary_container_light</color>
<color name="m3_sys_color_dynamic_light_inverse_primary">@android:color/system_primary_dark</color>
<!-- Secondary colors -->
<color name="m3_sys_color_dynamic_secondary_fixed">@android:color/system_secondary_fixed</color>
<color name="m3_sys_color_dynamic_on_secondary_fixed">@android:color/system_on_secondary_fixed</color>
<color name="m3_sys_color_dynamic_secondary_fixed_dim">@android:color/system_secondary_fixed_dim</color>
<color name="m3_sys_color_dynamic_on_secondary_fixed_variant">@android:color/system_on_secondary_fixed_variant</color>
<color name="m3_sys_color_dynamic_light_secondary">@android:color/system_secondary_light</color>
<color name="m3_sys_color_dynamic_light_secondary_container">@android:color/system_secondary_container_light</color>
<color name="m3_sys_color_dynamic_light_on_secondary">@android:color/system_on_secondary_light</color>
<color name="m3_sys_color_dynamic_light_on_secondary_container">@android:color/system_on_secondary_container_light</color>
<!-- Tertiary colors -->
<color name="m3_sys_color_dynamic_tertiary_fixed">@android:color/system_tertiary_fixed</color>
<color name="m3_sys_color_dynamic_on_tertiary_fixed">@android:color/system_on_tertiary_fixed</color>
<color name="m3_sys_color_dynamic_tertiary_fixed_dim">@android:color/system_tertiary_fixed_dim</color>
<color name="m3_sys_color_dynamic_on_tertiary_fixed_variant">@android:color/system_on_tertiary_fixed_variant</color>
<color name="m3_sys_color_dynamic_light_tertiary">@android:color/system_tertiary_light</color>
<color name="m3_sys_color_dynamic_light_tertiary_container">@android:color/system_tertiary_container_light</color>
<color name="m3_sys_color_dynamic_light_on_tertiary">@android:color/system_on_tertiary_light</color>
<color name="m3_sys_color_dynamic_light_on_tertiary_container">@android:color/system_on_tertiary_container_light</color>
<!-- Surface colors -->
<color name="m3_sys_color_dynamic_light_surface_dim">@android:color/system_surface_dim_light</color>
<color name="m3_sys_color_dynamic_light_surface_bright">@android:color/system_surface_bright_light</color>
<color name="m3_sys_color_dynamic_light_surface_container">@android:color/system_surface_container_light</color>
<color name="m3_sys_color_dynamic_light_surface_container_low">@android:color/system_surface_container_low_light</color>
<color name="m3_sys_color_dynamic_light_surface_container_high">@android:color/system_surface_container_high_light</color>
<color name="m3_sys_color_dynamic_light_surface_container_lowest">@android:color/system_surface_container_lowest_light</color>
<color name="m3_sys_color_dynamic_light_surface_container_highest">@android:color/system_surface_container_highest_light</color>
<color name="m3_sys_color_dynamic_light_surface">@android:color/system_surface_light</color>
<color name="m3_sys_color_dynamic_light_surface_variant">@android:color/system_surface_variant_light</color>
<color name="m3_sys_color_dynamic_light_on_surface">@android:color/system_on_surface_light</color>
<color name="m3_sys_color_dynamic_light_on_surface_variant">@android:color/system_on_surface_variant_light</color>
<color name="m3_sys_color_dynamic_light_inverse_surface">@android:color/system_surface_dark</color>
<color name="m3_sys_color_dynamic_light_inverse_on_surface">@android:color/system_on_surface_dark</color>
<!-- Background colors -->
<color name="m3_sys_color_dynamic_light_background">@android:color/system_background_light</color>
<color name="m3_sys_color_dynamic_light_on_background">@android:color/system_on_background_light</color>
<!-- Hairline colors -->
<color name="m3_sys_color_dynamic_light_outline">@android:color/system_outline_light</color>
<color name="m3_sys_color_dynamic_light_outline_variant">@android:color/system_outline_variant_light</color>
<!-- Error colors -->
<color name="m3_sys_color_dynamic_light_error">@android:color/system_error_light</color>
<color name="m3_sys_color_dynamic_light_error_container">@android:color/system_error_container_light</color>
<color name="m3_sys_color_dynamic_light_on_error">@android:color/system_on_error_light</color>
<color name="m3_sys_color_dynamic_light_on_error_container">@android:color/system_on_error_container_light</color>

</resources>
Expand Up @@ -168,10 +168,6 @@
<!-- The default dynamic color theme overlay to use when applying dynamic colors. -->
<attr name="dynamicColorThemeOverlay" format="reference"/>

<!-- The temporary contrast color theme overlay to use when applying contrast colors. -->
<!-- TODO(b/289112889): Remove workaround and roll forward cl/528599594 as soon as U public release. -->
<attr name="contrastColorThemeOverlay" format="reference"/>

<!-- Deprecated. -->

<!-- A tonal variation of the primary color. -->
Expand Down
Expand Up @@ -278,7 +278,6 @@

<!-- Theme overlays. -->
<item name="dynamicColorThemeOverlay">@style/ThemeOverlay.Material3.DynamicColors.Light</item>
<item name="contrastColorThemeOverlay">@style/ThemeOverlay.Material3.DynamicColors.Contrast.Light</item>
</style>

<style name="Base.V14.Theme.Material3.Dark.Dialog" parent="Theme.MaterialComponents.Dialog">
Expand Down Expand Up @@ -540,7 +539,6 @@

<!-- Theme overlays. -->
<item name="dynamicColorThemeOverlay">@style/ThemeOverlay.Material3.DynamicColors.Dark</item>
<item name="contrastColorThemeOverlay">@style/ThemeOverlay.Material3.DynamicColors.Contrast.Dark</item>
</style>

<style name="Base.Theme.Material3.Light.Dialog" parent="Base.V14.Theme.Material3.Light.Dialog"/>
Expand Down

0 comments on commit ad63d3f

Please sign in to comment.