diff --git a/catalog/java/io/material/catalog/color/ColorGrid.java b/catalog/java/io/material/catalog/color/ColorGrid.java
new file mode 100644
index 00000000000..5349251b68b
--- /dev/null
+++ b/catalog/java/io/material/catalog/color/ColorGrid.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2022 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 io.material.catalog.color;
+
+import io.material.catalog.R;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import com.google.android.material.color.ColorRoles;
+
+/** A class to form side-by-side color palettes. */
+final class ColorGrid {
+
+ @NonNull private final MaterialColorSpec materialColorSpecAccent;
+ @NonNull private final MaterialColorSpec materialColorSpecOnAccent;
+ @NonNull private final MaterialColorSpec materialColorSpecAccentContainer;
+ @NonNull private final MaterialColorSpec materialColorSpecOnAccentContainer;
+
+ static ColorGrid createFromColorGridData(Context context, ColorGridData colorGridData) {
+ ColorRoles colorRoles = colorGridData.getColorRoles();
+ ColorRoleNames colorRoleNames = colorGridData.getColorRoleNames();
+ MaterialColorSpec[] materialColorSpecs =
+ new MaterialColorSpec[] {
+ MaterialColorSpec.createFromColorValue(
+ colorRoleNames.getAccentName(), colorRoles.getAccent()),
+ MaterialColorSpec.createFromColorValue(
+ colorRoleNames.getOnAccentName(), colorRoles.getOnAccent()),
+ MaterialColorSpec.createFromColorValue(
+ colorRoleNames.getAccentContainerName(), colorRoles.getAccentContainer()),
+ MaterialColorSpec.createFromColorValue(
+ colorRoleNames.getOnAccentContainerName(), colorRoles.getOnAccentContainer()),
+ };
+ return new ColorGrid(
+ materialColorSpecs[0], materialColorSpecs[1], materialColorSpecs[2], materialColorSpecs[3]);
+ }
+
+ static ColorGrid createFromAttrResId(Context context, String[] colorNames, int[] attrResIds) {
+ if (colorNames.length < 4 || colorNames.length != attrResIds.length) {
+ throw new IllegalArgumentException(
+ "Color names need to be at least four and correspond to attribute resource ids.");
+ }
+ return new ColorGrid(
+ MaterialColorSpec.createFromAttrResId(context, colorNames[0], attrResIds[0]),
+ MaterialColorSpec.createFromAttrResId(context, colorNames[1], attrResIds[1]),
+ MaterialColorSpec.createFromAttrResId(context, colorNames[2], attrResIds[2]),
+ MaterialColorSpec.createFromAttrResId(context, colorNames[3], attrResIds[3]));
+ }
+
+ private ColorGrid(
+ @NonNull MaterialColorSpec materialColorSpecAccent,
+ @NonNull MaterialColorSpec materialColorSpecOnAccent,
+ @NonNull MaterialColorSpec materialColorSpecAccentContainer,
+ @NonNull MaterialColorSpec materialColorSpecOnAccentContainer) {
+ this.materialColorSpecAccent = materialColorSpecAccent;
+ this.materialColorSpecOnAccent = materialColorSpecOnAccent;
+ this.materialColorSpecAccentContainer = materialColorSpecAccentContainer;
+ this.materialColorSpecOnAccentContainer = materialColorSpecOnAccentContainer;
+ }
+
+ View renderView(Context context, ViewGroup container) {
+ View catalogColorsGrid =
+ LayoutInflater.from(context)
+ .inflate(R.layout.cat_colors_grid, container, /* attachToRoot= */ false);
+
+ bindColorSpecItem(catalogColorsGrid, R.id.cat_color_accent, materialColorSpecAccent);
+ bindColorSpecItem(catalogColorsGrid, R.id.cat_color_on_accent, materialColorSpecOnAccent);
+ bindColorSpecItem(
+ catalogColorsGrid, R.id.cat_color_accent_container, materialColorSpecAccentContainer);
+ bindColorSpecItem(
+ catalogColorsGrid, R.id.cat_color_on_accent_container, materialColorSpecOnAccentContainer);
+
+ return catalogColorsGrid;
+ }
+
+ private static void bindColorSpecItem(
+ View gridView, @IdRes int textViewId, MaterialColorSpec materialColorSpec) {
+ TextView colorSpec = gridView.findViewById(textViewId);
+
+ colorSpec.setText(materialColorSpec.getDescription());
+ colorSpec.setTextColor(ColorDemoUtils.getTextColor(materialColorSpec.getColorValue()));
+ colorSpec.setBackgroundColor(materialColorSpec.getColorValue());
+ }
+}
diff --git a/catalog/java/io/material/catalog/color/ColorGridData.java b/catalog/java/io/material/catalog/color/ColorGridData.java
new file mode 100644
index 00000000000..73fb3f64768
--- /dev/null
+++ b/catalog/java/io/material/catalog/color/ColorGridData.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2022 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 io.material.catalog.color;
+
+import android.content.Context;
+import androidx.annotation.ArrayRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import com.google.android.material.color.ColorRoles;
+import com.google.android.material.color.MaterialColors;
+
+/** A class that provides data for {@link ColorGrid}. */
+final class ColorGridData {
+
+ private final ColorRoles colorRoles;
+ private final ColorRoleNames colorRoleNames;
+
+ static ColorGridData createFromColorResId(
+ Context context, @ColorRes int colorResourceId, @ArrayRes int colorNameIds) {
+ return createFromColorValue(
+ context, context.getResources().getColor(colorResourceId), colorNameIds);
+ }
+
+ static ColorGridData createFromColorValue(
+ Context context, @ColorInt int seedColorValue, @ArrayRes int colorNameIds) {
+ String[] colorNames = context.getResources().getStringArray(colorNameIds);
+ return new ColorGridData(
+ MaterialColors.getColorRoles(context, seedColorValue),
+ new ColorRoleNames(colorNames[0], colorNames[1], colorNames[2], colorNames[3]));
+ }
+
+ private ColorGridData(ColorRoles colorRoles, ColorRoleNames colorRoleNames) {
+ this.colorRoles = colorRoles;
+ this.colorRoleNames = colorRoleNames;
+ }
+
+ ColorRoles getColorRoles() {
+ return colorRoles;
+ }
+
+ ColorRoleNames getColorRoleNames() {
+ return colorRoleNames;
+ }
+}
diff --git a/catalog/java/io/material/catalog/color/ColorRoleNames.java b/catalog/java/io/material/catalog/color/ColorRoleNames.java
new file mode 100644
index 00000000000..6b50742ac8c
--- /dev/null
+++ b/catalog/java/io/material/catalog/color/ColorRoleNames.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2022 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 io.material.catalog.color;
+
+/** A class defines the name for color role. */
+final class ColorRoleNames {
+
+ private final String accentName;
+ private final String onAccentName;
+ private final String accentContainerName;
+ private final String onAccentContainerName;
+
+ public ColorRoleNames(
+ String accentName,
+ String onAccentName,
+ String accentContainerName,
+ String onAccentContainerName) {
+ this.accentName = accentName;
+ this.onAccentName = onAccentName;
+ this.accentContainerName = accentContainerName;
+ this.onAccentContainerName = onAccentContainerName;
+ }
+
+ /** Returns the accent color name. */
+ public String getAccentName() {
+ return accentName;
+ }
+
+ /** Returns the on_accent color name. */
+ public String getOnAccentName() {
+ return onAccentName;
+ }
+
+ /** Returns the accent_container color name. */
+ public String getAccentContainerName() {
+ return accentContainerName;
+ }
+
+ /** Returns the on_accent_container color name. */
+ public String getOnAccentContainerName() {
+ return onAccentContainerName;
+ }
+}
diff --git a/catalog/java/io/material/catalog/color/MaterialColorSpec.java b/catalog/java/io/material/catalog/color/MaterialColorSpec.java
index 88d2bf9f6dd..ad335f852ac 100644
--- a/catalog/java/io/material/catalog/color/MaterialColorSpec.java
+++ b/catalog/java/io/material/catalog/color/MaterialColorSpec.java
@@ -17,10 +17,11 @@
package io.material.catalog.color;
import android.content.Context;
+import androidx.annotation.AttrRes;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
-import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
+import com.google.android.material.color.MaterialColors;
/**
* Represents a color value as defined in the Material Spec.
@@ -51,7 +52,14 @@ static MaterialColorSpec createFromResource(Context context, @ColorRes int color
}
static MaterialColorSpec createFromColorValue(
- Context context, @StringRes int colorNameResId, @ColorInt int colorValue) {
- return new MaterialColorSpec(context.getString(colorNameResId), colorValue);
+ String colorNameResource, @ColorInt int colorValue) {
+ return new MaterialColorSpec(colorNameResource, colorValue);
+ }
+
+ static MaterialColorSpec createFromAttrResId(
+ Context context, String colorNameResource, @AttrRes int attrRes) {
+ return createFromColorValue(
+ colorNameResource,
+ MaterialColors.getColor(context, attrRes, colorNameResource + "cannot be resolved."));
}
}
diff --git a/catalog/java/io/material/catalog/color/res/layout/cat_colors_grid.xml b/catalog/java/io/material/catalog/color/res/layout/cat_colors_grid.xml
new file mode 100644
index 00000000000..5d036ab483e
--- /dev/null
+++ b/catalog/java/io/material/catalog/color/res/layout/cat_colors_grid.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/catalog/java/io/material/catalog/color/res/values/dimens.xml b/catalog/java/io/material/catalog/color/res/values/dimens.xml
index 1351a61eb0b..49f0f7678df 100644
--- a/catalog/java/io/material/catalog/color/res/values/dimens.xml
+++ b/catalog/java/io/material/catalog/color/res/values/dimens.xml
@@ -17,4 +17,6 @@
32dp
+ 4dp
+ 60dp