diff options
author | Stefan Niedermann <info@niedermann.it> | 2020-10-28 17:09:09 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2020-10-28 17:09:09 +0300 |
commit | db3fe7aa94bed2d466a493abd073378601242db3 (patch) | |
tree | d6a6ba144a7d7548ff9ca191aebe2618d376926b /app/src/main/java/it/niedermann/owncloud/notes/shared | |
parent | 9f066ffc3314b35949e544d3cf76c33c096f2ce5 (diff) |
Use ColorUtils from android-commons where possible
Diffstat (limited to 'app/src/main/java/it/niedermann/owncloud/notes/shared')
4 files changed, 60 insertions, 162 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java index 21f5b6ac..77eed718 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/model/Capabilities.java @@ -13,7 +13,7 @@ import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; import org.json.JSONException; import org.json.JSONObject; -import it.niedermann.owncloud.notes.shared.util.ColorUtil; +import it.niedermann.android.util.ColorUtil; import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; @@ -72,14 +72,14 @@ public class Capabilities { final JSONObject theming = capabilities.getJSONObject(JSON_OCS_DATA_CAPABILITIES_THEMING); if (theming.has(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR)) { try { - this.color = Color.parseColor(ColorUtil.formatColorToParsableHexString(theming.getString(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR))); + this.color = Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(theming.getString(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR))); } catch (Exception e) { e.printStackTrace(); } } if (theming.has(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR_TEXT)) { try { - this.textColor = Color.parseColor(ColorUtil.formatColorToParsableHexString(theming.getString(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR_TEXT))); + this.textColor = Color.parseColor(ColorUtil.INSTANCE.formatColorToParsableHexString(theming.getString(JSON_OCS_DATA_CAPABILITIES_THEMING_COLOR_TEXT))); } catch (Exception e) { e.printStackTrace(); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ColorUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ColorUtil.java deleted file mode 100644 index a7f1b566..00000000 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/ColorUtil.java +++ /dev/null @@ -1,154 +0,0 @@ -package it.niedermann.owncloud.notes.shared.util; - -import android.graphics.Color; - -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.util.Pair; - -import java.util.HashMap; -import java.util.Map; - -public final class ColorUtil { - - private static final Map<ColorPair, Boolean> CONTRAST_RATIO_SUFFICIENT_CACHE = new HashMap<>(); - private static final Map<Integer, Integer> FOREGROUND_CACHE = new HashMap<>(); - private static final Map<Integer, Boolean> IS_DARK_COLOR_CACHE = new HashMap<>(); - - private ColorUtil() { - } - - @ColorInt - public static int getForegroundColorForBackgroundColor(@ColorInt int color) { - Integer ret = FOREGROUND_CACHE.get(color); - if (ret == null) { - if (Color.TRANSPARENT == color) - ret = Color.BLACK; - else if (isColorDark(color)) - ret = Color.WHITE; - else - ret = Color.BLACK; - - FOREGROUND_CACHE.put(color, ret); - } - return ret; - } - - public static boolean isColorDark(@ColorInt int color) { - Boolean ret = IS_DARK_COLOR_CACHE.get(color); - if (ret == null) { - ret = getBrightness(color) < 200; - IS_DARK_COLOR_CACHE.put(color, ret); - } - return ret; - } - - private static int getBrightness(@ColorInt int color) { - final int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)}; - - return (int) Math.sqrt(rgb[0] * rgb[0] * .241 + rgb[1] - * rgb[1] * .691 + rgb[2] * rgb[2] * .068); - } - - // --------------------------------------------------- - // Based on https://github.com/LeaVerou/contrast-ratio - // --------------------------------------------------- - - public static boolean contrastRatioIsSufficient(@ColorInt int colorOne, @ColorInt int colorTwo) { - ColorPair key = new ColorPair(colorOne, colorTwo); - Boolean ret = CONTRAST_RATIO_SUFFICIENT_CACHE.get(key); - if (ret == null) { - ret = getContrastRatio(colorOne, colorTwo) > 3d; - CONTRAST_RATIO_SUFFICIENT_CACHE.put(key, ret); - return ret; - } - return ret; - } - - private static double getContrastRatio(@ColorInt int colorOne, @ColorInt int colorTwo) { - final double lum1 = getLuminanace(colorOne); - final double lum2 = getLuminanace(colorTwo); - final double brightest = Math.max(lum1, lum2); - final double darkest = Math.min(lum1, lum2); - return (brightest + 0.05) / (darkest + 0.05); - } - - private static double getLuminanace(@ColorInt int color) { - final int[] rgb = {Color.red(color), Color.green(color), Color.blue(color)}; - return getSubcolorLuminance(rgb[0]) * 0.2126 + getSubcolorLuminance(rgb[1]) * 0.7152 + getSubcolorLuminance(rgb[2]) * 0.0722; - } - - private static double getSubcolorLuminance(@ColorInt int color) { - final double value = color / 255d; - return value <= 0.03928 - ? value / 12.92 - : Math.pow((value + 0.055) / 1.055, 2.4); - } - - private static class ColorPair extends Pair<Integer, Integer> { - - private ColorPair(@Nullable Integer first, @Nullable Integer second) { - super(first, second); - } - - @SuppressWarnings({"EqualsWhichDoesntCheckParameterClass", "NumberEquality"}) - @Override - public boolean equals(Object o) { - final ColorPair colorPair = (ColorPair) o; - if (first != colorPair.first) return false; - return second == colorPair.second; - } - - @SuppressWarnings("ConstantConditions") - @Override - public int hashCode() { - int result = first; - result = 31 * result + second; - return result; - } - } - - /** - * @return well formatted string starting with a hash followed by 6 hex numbers that is parsable by {@link Color#parseColor(String)}. - */ - public static String formatColorToParsableHexString(String input) { - if (input == null) { - throw new IllegalArgumentException("input color string is null"); - } - if (isParsableValidHexColorString(input)) { - return input; - } - final char[] chars = input.replaceAll("#", "").toCharArray(); - final StringBuilder sb = new StringBuilder(7).append("#"); - if (chars.length == 6) { - sb.append(chars); - } else if (chars.length == 3) { - for (char c : chars) { - sb.append(c).append(c); - } - } else { - throw new IllegalArgumentException("unparsable color string: \"" + input + "\""); - } - final String formattedHexColor = sb.toString(); - if (isParsableValidHexColorString(formattedHexColor)) { - return formattedHexColor; - } else { - throw new IllegalArgumentException("\"" + input + "\" is not a valid color string. Result of tried normalizing: " + formattedHexColor); - } - } - - /** - * Checking for {@link Color#parseColor(String)} being able to parse the input is the important part because we don't know the implementation and rely on it to be able to parse the color. - * - * @return true, if the input starts with a hash followed by 6 characters of hex numbers and is parsable by {@link Color#parseColor(String)}. - */ - private static boolean isParsableValidHexColorString(@NonNull String input) { - try { - Color.parseColor(input); - return input.matches("#[a-fA-F0-9]{6}"); - } catch (Exception e) { - return false; - } - } -} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java index 05921aee..68e6ee7c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/DisplayUtils.java @@ -37,6 +37,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import it.niedermann.android.util.ColorUtil; import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandingUtil; @@ -44,8 +45,6 @@ import it.niedermann.owncloud.notes.main.navigation.NavigationAdapter; import it.niedermann.owncloud.notes.main.navigation.NavigationItem; import it.niedermann.owncloud.notes.persistence.entity.CategoryWithNotesCount; -import static it.niedermann.owncloud.notes.shared.util.ColorUtil.isColorDark; - public class DisplayUtils { private DisplayUtils() { @@ -104,7 +103,7 @@ public class DisplayUtils { public void updateDrawState(TextPaint tp) { if (current) { if (NotesApplication.isDarkThemeActive(context)) { - if (isColorDark(mainColor)) { + if (ColorUtil.INSTANCE.isColorDark(mainColor)) { tp.bgColor = Color.WHITE; tp.setColor(mainColor); } else { @@ -112,11 +111,11 @@ public class DisplayUtils { tp.setColor(Color.BLACK); } } else { - if (isColorDark(mainColor)) { + if (ColorUtil.INSTANCE.isColorDark(mainColor)) { tp.bgColor = mainColor; tp.setColor(Color.WHITE); } else { - if (ColorUtil.contrastRatioIsSufficient(mainColor, highlightColor)) { + if (NotesColorUtil.contrastRatioIsSufficient(mainColor, highlightColor)) { tp.bgColor = highlightColor; } else { tp.bgColor = Color.BLACK; diff --git a/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java new file mode 100644 index 00000000..3eb40e97 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/shared/util/NotesColorUtil.java @@ -0,0 +1,53 @@ +package it.niedermann.owncloud.notes.shared.util; + +import androidx.annotation.ColorInt; +import androidx.annotation.Nullable; +import androidx.core.util.Pair; + +import java.util.HashMap; +import java.util.Map; + +import it.niedermann.android.util.ColorUtil; + +public final class NotesColorUtil { + + private static final Map<ColorPair, Boolean> CONTRAST_RATIO_SUFFICIENT_CACHE = new HashMap<>(); + + // --------------------------------------------------- + // Based on https://github.com/LeaVerou/contrast-ratio + // --------------------------------------------------- + + public static boolean contrastRatioIsSufficient(@ColorInt int colorOne, @ColorInt int colorTwo) { + ColorPair key = new ColorPair(colorOne, colorTwo); + Boolean ret = CONTRAST_RATIO_SUFFICIENT_CACHE.get(key); + if (ret == null) { + ret = ColorUtil.INSTANCE.getContrastRatio(colorOne, colorTwo) > 3d; + CONTRAST_RATIO_SUFFICIENT_CACHE.put(key, ret); + return ret; + } + return ret; + } + + private static class ColorPair extends Pair<Integer, Integer> { + + private ColorPair(@Nullable Integer first, @Nullable Integer second) { + super(first, second); + } + + @SuppressWarnings({"EqualsWhichDoesntCheckParameterClass", "NumberEquality"}) + @Override + public boolean equals(Object o) { + final ColorPair colorPair = (ColorPair) o; + if (first != colorPair.first) return false; + return second == colorPair.second; + } + + @SuppressWarnings("ConstantConditions") + @Override + public int hashCode() { + int result = first; + result = 31 * result + second; + return result; + } + } +} |