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