Remove unused resources and create wear credential theme using overlays

Bug: 323607982
Test: Manual. See go/credential-selector-ui
Change-Id: If1c677cd6106b78a58b989bb7e8df3eb925d6561
diff --git a/packages/CredentialManager/wear/res/drawable/passkey_icon.xml b/packages/CredentialManager/wear/res/drawable/passkey_icon.xml
deleted file mode 100644
index be366bf..0000000
--- a/packages/CredentialManager/wear/res/drawable/passkey_icon.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path
-        android:pathData="M23,10.5H17V13.5H23V10.5Z"
-        android:fillColor="#188038"/>
-    <path
-        android:pathData="M6.5,17.5C3.5,17.5 1,15 1,12C1,9 3.5,6.5 6.5,6.5C9.5,6.5 12,9 12,12C12,15 9.5,17.5 6.5,17.5ZM6.5,9.5C5.1,9.5 4,10.6 4,12C4,13.4 5.1,14.5 6.5,14.5C7.9,14.5 9,13.4 9,12C9,10.6 7.9,9.5 6.5,9.5Z"
-        android:fillColor="#4285F4"/>
-    <path
-        android:pathData="M21,13.5H19H17V16.5H19V15.5C19,14.9 19.4,14.5 20,14.5C20.6,14.5 21,14.9 21,15.5V16.5H23V13.5H21Z"
-        android:fillColor="#34A853"/>
-    <path
-        android:pathData="M11.8,10.5H8.5C8.8,10.9 9,11.4 9,12C9,12.6 8.8,13.1 8.5,13.5H11.8C11.9,13 12,12.5 12,12C12,11.5 11.9,11 11.8,10.5Z"
-        android:fillColor="#EA4335"/>
-    <path
-        android:pathData="M17,10.5H11.8C11.9,11 12,11.5 12,12C12,12.5 11.9,13 11.8,13.5H17V10.5Z"
-        android:fillColor="#FBBC04"/>
-</vector>
diff --git a/packages/CredentialManager/wear/res/values-watch/donottranslate.xml b/packages/CredentialManager/wear/res/values-watch/donottranslate.xml
new file mode 100644
index 0000000..c3ab3cb
--- /dev/null
+++ b/packages/CredentialManager/wear/res/values-watch/donottranslate.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- font-family-device-default is expected to be preloaded in the font_customization.xml(/vendor/<OEM>/products/<PRODUCT>/fonts/fonts_customization.xml)-->
+    <!-- Falls back to system default when font-family-device-default doesn't exist    -->
+    <string name="wear_material_compose_display_1_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_display_2_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_display_3_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_title_1_font_family">font-family-medium-device-default</string>
+    <string name="wear_material_compose_title_2_font_family">font-family-medium-device-default</string>
+    <string name="wear_material_compose_title_3_font_family">font-family-device-default</string>
+    <string name="wear_material_compose_body_1_font_family">font-family-text-device-default</string>
+    <string name="wear_material_compose_body_2_font_family">font-family-text-device-default</string>
+    <string name="wear_material_compose_button_font_family">font-family-text-medium-device-default</string>
+    <string name="wear_material_compose_caption_1_font_family">font-family-text-medium-device-default</string>
+    <string name="wear_material_compose_caption_2_font_family">font-family-text-medium-device-default</string>
+    <string name="wear_material_compose_caption_3_font_family">font-family-text-medium-device-default</string>
+</resources>
diff --git a/packages/CredentialManager/wear/res/values/colors.xml b/packages/CredentialManager/wear/res/values/colors.xml
deleted file mode 100644
index bf10bb3..0000000
--- a/packages/CredentialManager/wear/res/values/colors.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ 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.
-  -->
-
-<resources>
-    <color name="wear_material_almond">#FFFCF7EB</color>
-    <color name="wear_material_almond_dark">#FF262523</color>
-</resources>
\ No newline at end of file
diff --git a/packages/CredentialManager/wear/res/values/overlayable.xml b/packages/CredentialManager/wear/res/values/overlayable.xml
new file mode 100644
index 0000000..5b9d372
--- /dev/null
+++ b/packages/CredentialManager/wear/res/values/overlayable.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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>
+    <overlayable name="CredentialSelectorStyles">
+        <policy type="product|system|vendor|odm|oem">
+            <!--START WEAR SPECIFIC FONT STRINGS -->
+            <item type="string" name="wear_material_compose_display_1_font_family" />
+            <item type="string" name="wear_material_compose_display_2_font_family" />
+            <item type="string" name="wear_material_compose_display_3_font_family" />
+            <item type="string" name="wear_material_compose_title_1_font_family" />
+            <item type="string" name="wear_material_compose_title_2_font_family" />
+            <item type="string" name="wear_material_compose_title_3_font_family" />
+            <item type="string" name="wear_material_compose_body_1_font_family" />
+            <item type="string" name="wear_material_compose_body_2_font_family" />
+            <item type="string" name="wear_material_compose_button_font_family" />
+            <item type="string" name="wear_material_compose_caption_1_font_family" />
+            <item type="string" name="wear_material_compose_caption_2_font_family" />
+            <item type="string" name="wear_material_compose_caption_3_font_family" />
+            <!--END WEAR SPECIFIC FONT STRINGS -->
+
+        </policy>
+
+    </overlayable>
+
+</resources>
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/components/CredentialsScreenChip.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/components/CredentialsScreenChip.kt
index 18c9f31..c641d7f 100644
--- a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/components/CredentialsScreenChip.kt
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/components/CredentialsScreenChip.kt
@@ -32,7 +32,6 @@
 import androidx.wear.compose.material.ChipColors
 import androidx.compose.ui.graphics.asImageBitmap
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.text.style.TextAlign
 import androidx.wear.compose.material.ChipDefaults
 import com.android.credentialmanager.R
@@ -80,8 +79,7 @@
     icon: Drawable? = null,
     isAuthenticationEntryLocked: Boolean = false,
     modifier: Modifier = Modifier,
-    colors: ChipColors =
-        ChipDefaults.chipColors(backgroundColor = colorResource(R.color.wear_material_almond)),
+    colors: ChipColors = ChipDefaults.primaryChipColors(),
     ) {
     val labelParam: (@Composable RowScope.() -> Unit) =
         {
@@ -168,11 +166,9 @@
             WearButtonText(
                 text = stringResource(R.string.dialog_continue_button),
                 textAlign = TextAlign.Center,
-                color = colorResource(R.color.wear_material_almond_dark),
             )
         },
-        colors =
-        ChipDefaults.chipColors(backgroundColor = colorResource(R.color.wear_material_almond)),
+        colors = ChipDefaults.primaryChipColors(),
     )
 }
 
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/theme/WearCredentialSelectorTheme.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/theme/WearCredentialSelectorTheme.kt
new file mode 100644
index 0000000..ee0ba7b
--- /dev/null
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/theme/WearCredentialSelectorTheme.kt
@@ -0,0 +1,144 @@
+/*
+ * 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.credentialmanager.ui.theme
+
+import android.content.Context
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.annotation.StringRes
+import androidx.wear.compose.material.Colors
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.font.DeviceFontFamilyName
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.wear.compose.material.Typography
+import androidx.wear.compose.material.MaterialTheme
+import com.android.credentialmanager.R
+import androidx.compose.ui.graphics.Color
+
+/** The Material 3 Theme Wrapper for Supporting RRO. */
+@Composable
+fun WearCredentialSelectorTheme(content: @Composable () -> Unit) {
+    val context = LocalContext.current
+    val colors =
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            overlayColors(context)
+                .copy(error = MaterialTheme.colors.error, onError = MaterialTheme.colors.onError)
+        } else {
+            MaterialTheme.colors
+        }
+    MaterialTheme(colors = colors, typography = deviceDefaultTypography(context), content = content)
+}
+
+/**
+ * Creates a dynamic color maps that can be overlaid. 100 - Lightest shade; 0 - Darkest Shade; In
+ * wear we only support dark theme for the time being. Thus the fill colors and variants are dark
+ * and anything on top is light. We will use this custom redirection until wear compose material
+ * supports color scheming.
+ *
+ * The mapping is best case match on wear material color tokens from
+ * /android/clockwork/common/wearable/wearmaterial/color/res/values/color-tokens.xml
+ *
+ * @param context The context required to get system resource data.
+ */
+@RequiresApi(Build.VERSION_CODES.S)
+internal fun overlayColors(context: Context): Colors {
+    val tonalPalette = dynamicTonalPalette(context)
+    return Colors(
+        background = Color.Black,
+        onBackground = Color.White,
+        primary = tonalPalette.primary90,
+        primaryVariant = tonalPalette.primary80,
+        onPrimary = tonalPalette.primary10,
+        secondary = tonalPalette.tertiary90,
+        secondaryVariant = tonalPalette.tertiary60,
+        onSecondary = tonalPalette.tertiary10,
+        surface = tonalPalette.neutral20,
+        onSurface = tonalPalette.neutral95,
+        onSurfaceVariant = tonalPalette.neutralVariant80,
+    )
+}
+
+private fun fontFamily(context: Context, @StringRes id: Int): FontFamily {
+    val typefaceName = context.resources.getString(id)
+    val font = Font(familyName = DeviceFontFamilyName(typefaceName))
+    return FontFamily(font)
+}
+
+/*
+ Only customizes font family. The material 3 roles to 2.5 are mapped to the best case matching of
+ google3/java/com/google/android/wearable/libraries/compose/theme/GoogleMaterialTheme.kt
+*/
+internal fun deviceDefaultTypography(context: Context): Typography {
+    val defaultTypography = Typography()
+    return Typography(
+        display1 =
+        defaultTypography.display1.copy(
+            fontFamily =
+            fontFamily(context, R.string.wear_material_compose_display_1_font_family)
+        ),
+        display2 =
+        defaultTypography.display2.copy(
+            fontFamily =
+            fontFamily(context, R.string.wear_material_compose_display_2_font_family)
+        ),
+        display3 =
+        defaultTypography.display1.copy(
+            fontFamily =
+            fontFamily(context, R.string.wear_material_compose_display_3_font_family)
+        ),
+        title1 =
+        defaultTypography.title1.copy(
+            fontFamily = fontFamily(context, R.string.wear_material_compose_title_1_font_family)
+        ),
+        title2 =
+        defaultTypography.title2.copy(
+            fontFamily = fontFamily(context, R.string.wear_material_compose_title_2_font_family)
+        ),
+        title3 =
+        defaultTypography.title3.copy(
+            fontFamily = fontFamily(context, R.string.wear_material_compose_title_3_font_family)
+        ),
+        body1 =
+        defaultTypography.body1.copy(
+            fontFamily = fontFamily(context, R.string.wear_material_compose_body_1_font_family)
+        ),
+        body2 =
+        defaultTypography.body2.copy(
+            fontFamily = fontFamily(context, R.string.wear_material_compose_body_2_font_family)
+        ),
+        button =
+        defaultTypography.button.copy(
+            fontFamily = fontFamily(context, R.string.wear_material_compose_button_font_family)
+        ),
+        caption1 =
+        defaultTypography.caption1.copy(
+            fontFamily =
+            fontFamily(context, R.string.wear_material_compose_caption_1_font_family)
+        ),
+        caption2 =
+        defaultTypography.caption2.copy(
+            fontFamily =
+            fontFamily(context, R.string.wear_material_compose_caption_2_font_family)
+        ),
+        caption3 =
+        defaultTypography.caption3.copy(
+            fontFamily =
+            fontFamily(context, R.string.wear_material_compose_caption_3_font_family)
+        ),
+    )
+}
\ No newline at end of file
diff --git a/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/theme/WearCredentialTonalPalette.kt b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/theme/WearCredentialTonalPalette.kt
new file mode 100644
index 0000000..1d6ed33
--- /dev/null
+++ b/packages/CredentialManager/wear/src/com/android/credentialmanager/ui/theme/WearCredentialTonalPalette.kt
@@ -0,0 +1,205 @@
+/*
+ * 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.credentialmanager.ui.theme
+
+import android.R
+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
+
+/**
+ * Tonal Palette structure in Material.
+ *
+ * A tonal palette is comprised of 5 tonal ranges. Each tonal range includes the 13 stops, or tonal
+ * swatches.
+ *
+ * Tonal range names are:
+ * - Neutral (N)
+ * - Neutral variant (NV)
+ * - Primary (P)
+ * - Secondary (S)
+ * - Tertiary (T)
+ */
+internal class WearCredentialSelectorTonalPalette(
+    // The neutral tonal range.
+    val neutral100: Color,
+    val neutral99: Color,
+    val neutral95: Color,
+    val neutral90: Color,
+    val neutral80: Color,
+    val neutral70: Color,
+    val neutral60: Color,
+    val neutral50: Color,
+    val neutral40: Color,
+    val neutral30: Color,
+    val neutral20: Color,
+    val neutral10: Color,
+    val neutral0: Color,
+
+    // The neutral variant tonal range, sometimes called "neutral 2"
+    val neutralVariant100: Color,
+    val neutralVariant99: Color,
+    val neutralVariant95: Color,
+    val neutralVariant90: Color,
+    val neutralVariant80: Color,
+    val neutralVariant70: Color,
+    val neutralVariant60: Color,
+    val neutralVariant50: Color,
+    val neutralVariant40: Color,
+    val neutralVariant30: Color,
+    val neutralVariant20: Color,
+    val neutralVariant10: Color,
+    val neutralVariant0: Color,
+
+    // The primary tonal range, also known as accent 1
+    val primary100: Color,
+    val primary99: Color,
+    val primary95: Color,
+    val primary90: Color,
+    val primary80: Color,
+    val primary70: Color,
+    val primary60: Color,
+    val primary50: Color,
+    val primary40: Color,
+    val primary30: Color,
+    val primary20: Color,
+    val primary10: Color,
+    val primary0: Color,
+
+    // The Secondary tonal range, also know as accent 2
+    val secondary100: Color,
+    val secondary99: Color,
+    val secondary95: Color,
+    val secondary90: Color,
+    val secondary80: Color,
+    val secondary70: Color,
+    val secondary60: Color,
+    val secondary50: Color,
+    val secondary40: Color,
+    val secondary30: Color,
+    val secondary20: Color,
+    val secondary10: Color,
+    val secondary0: Color,
+
+    // The tertiary tonal range, also known as accent 3
+    val tertiary100: Color,
+    val tertiary99: Color,
+    val tertiary95: Color,
+    val tertiary90: Color,
+    val tertiary80: Color,
+    val tertiary70: Color,
+    val tertiary60: Color,
+    val tertiary50: Color,
+    val tertiary40: Color,
+    val tertiary30: Color,
+    val tertiary20: Color,
+    val tertiary10: Color,
+    val tertiary0: Color,
+)
+/** Dynamic colors for wear compose material to support resource overlay. */
+@RequiresApi(Build.VERSION_CODES.S)
+// TODO: once we have proper support for this on Wear 6+, we will do something similar to
+// https://source.corp.google.com/h/android/platform/superproject/+/androidx-main:frameworks/support/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.android.kt;l=307-362?q=dynamicTonalPalette&sq=repo:android%2Fplatform%2Fsuperproject%20b:androidx-main
+// Tracking Bug: b/270720571
+internal fun dynamicTonalPalette(context: Context) =
+    WearCredentialSelectorTonalPalette(
+        // The neutral tonal range from the generated dynamic color palette.
+        neutral100 = ColorResourceHelper.getColor(context, R.color.system_neutral1_0),
+        neutral99 = ColorResourceHelper.getColor(context, R.color.system_neutral1_10),
+        neutral95 = ColorResourceHelper.getColor(context, R.color.system_neutral1_50),
+        neutral90 = ColorResourceHelper.getColor(context, R.color.system_neutral1_100),
+        neutral80 = ColorResourceHelper.getColor(context, R.color.system_neutral1_200),
+        neutral70 = ColorResourceHelper.getColor(context, R.color.system_neutral1_300),
+        neutral60 = ColorResourceHelper.getColor(context, R.color.system_neutral1_400),
+        neutral50 = ColorResourceHelper.getColor(context, R.color.system_neutral1_500),
+        neutral40 = ColorResourceHelper.getColor(context, R.color.system_neutral1_600),
+        neutral30 = ColorResourceHelper.getColor(context, R.color.system_neutral1_700),
+        neutral20 = ColorResourceHelper.getColor(context, R.color.system_neutral1_800),
+        neutral10 = ColorResourceHelper.getColor(context, R.color.system_neutral1_900),
+        neutral0 = ColorResourceHelper.getColor(context, R.color.system_neutral1_1000),
+
+        // The neutral variant tonal range, sometimes called "neutral 2",  from the
+        // generated dynamic color palette.
+        neutralVariant100 = ColorResourceHelper.getColor(context, R.color.system_neutral2_0),
+        neutralVariant99 = ColorResourceHelper.getColor(context, R.color.system_neutral2_10),
+        neutralVariant95 = ColorResourceHelper.getColor(context, R.color.system_neutral2_50),
+        neutralVariant90 = ColorResourceHelper.getColor(context, R.color.system_neutral2_100),
+        neutralVariant80 = ColorResourceHelper.getColor(context, R.color.system_neutral2_200),
+        neutralVariant70 = ColorResourceHelper.getColor(context, R.color.system_neutral2_300),
+        neutralVariant60 = ColorResourceHelper.getColor(context, R.color.system_neutral2_400),
+        neutralVariant50 = ColorResourceHelper.getColor(context, R.color.system_neutral2_500),
+        neutralVariant40 = ColorResourceHelper.getColor(context, R.color.system_neutral2_600),
+        neutralVariant30 = ColorResourceHelper.getColor(context, R.color.system_neutral2_700),
+        neutralVariant20 = ColorResourceHelper.getColor(context, R.color.system_neutral2_800),
+        neutralVariant10 = ColorResourceHelper.getColor(context, R.color.system_neutral2_900),
+        neutralVariant0 = ColorResourceHelper.getColor(context, R.color.system_neutral2_1000),
+
+        // The primary tonal range from the generated dynamic color palette.
+        primary100 = ColorResourceHelper.getColor(context, R.color.system_accent1_0),
+        primary99 = ColorResourceHelper.getColor(context, R.color.system_accent1_10),
+        primary95 = ColorResourceHelper.getColor(context, R.color.system_accent1_50),
+        primary90 = ColorResourceHelper.getColor(context, R.color.system_accent1_100),
+        primary80 = ColorResourceHelper.getColor(context, R.color.system_accent1_200),
+        primary70 = ColorResourceHelper.getColor(context, R.color.system_accent1_300),
+        primary60 = ColorResourceHelper.getColor(context, R.color.system_accent1_400),
+        primary50 = ColorResourceHelper.getColor(context, R.color.system_accent1_500),
+        primary40 = ColorResourceHelper.getColor(context, R.color.system_accent1_600),
+        primary30 = ColorResourceHelper.getColor(context, R.color.system_accent1_700),
+        primary20 = ColorResourceHelper.getColor(context, R.color.system_accent1_800),
+        primary10 = ColorResourceHelper.getColor(context, R.color.system_accent1_900),
+        primary0 = ColorResourceHelper.getColor(context, R.color.system_accent1_1000),
+
+        // The secondary tonal range from the generated dynamic color palette.
+        secondary100 = ColorResourceHelper.getColor(context, R.color.system_accent2_0),
+        secondary99 = ColorResourceHelper.getColor(context, R.color.system_accent2_10),
+        secondary95 = ColorResourceHelper.getColor(context, R.color.system_accent2_50),
+        secondary90 = ColorResourceHelper.getColor(context, R.color.system_accent2_100),
+        secondary80 = ColorResourceHelper.getColor(context, R.color.system_accent2_200),
+        secondary70 = ColorResourceHelper.getColor(context, R.color.system_accent2_300),
+        secondary60 = ColorResourceHelper.getColor(context, R.color.system_accent2_400),
+        secondary50 = ColorResourceHelper.getColor(context, R.color.system_accent2_500),
+        secondary40 = ColorResourceHelper.getColor(context, R.color.system_accent2_600),
+        secondary30 = ColorResourceHelper.getColor(context, R.color.system_accent2_700),
+        secondary20 = ColorResourceHelper.getColor(context, R.color.system_accent2_800),
+        secondary10 = ColorResourceHelper.getColor(context, R.color.system_accent2_900),
+        secondary0 = ColorResourceHelper.getColor(context, R.color.system_accent2_1000),
+
+        // The tertiary tonal range from the generated dynamic color palette.
+        tertiary100 = ColorResourceHelper.getColor(context, R.color.system_accent3_0),
+        tertiary99 = ColorResourceHelper.getColor(context, R.color.system_accent3_10),
+        tertiary95 = ColorResourceHelper.getColor(context, R.color.system_accent3_50),
+        tertiary90 = ColorResourceHelper.getColor(context, R.color.system_accent3_100),
+        tertiary80 = ColorResourceHelper.getColor(context, R.color.system_accent3_200),
+        tertiary70 = ColorResourceHelper.getColor(context, R.color.system_accent3_300),
+        tertiary60 = ColorResourceHelper.getColor(context, R.color.system_accent3_400),
+        tertiary50 = ColorResourceHelper.getColor(context, R.color.system_accent3_500),
+        tertiary40 = ColorResourceHelper.getColor(context, R.color.system_accent3_600),
+        tertiary30 = ColorResourceHelper.getColor(context, R.color.system_accent3_700),
+        tertiary20 = ColorResourceHelper.getColor(context, R.color.system_accent3_800),
+        tertiary10 = ColorResourceHelper.getColor(context, R.color.system_accent3_900),
+        tertiary0 = ColorResourceHelper.getColor(context, R.color.system_accent3_1000),
+    )
+
+private object ColorResourceHelper {
+    @DoNotInline
+    fun getColor(context: Context, @ColorRes id: Int): Color {
+        return Color(context.resources.getColor(id, context.theme))
+    }
+}
\ No newline at end of file