summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java96
2 files changed, 100 insertions, 4 deletions
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java
index 3a6b3628e937..e6b2c2f9c7ed 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java
+++ b/packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java
@@ -350,7 +350,7 @@ public final class DynamicColor {
if (bgDynamicColor != null) {
final boolean bgHasBg =
bgDynamicColor.background != null && bgDynamicColor.background.apply(scheme)
- == null;
+ != null;
final double standardRatio =
Contrast.ratioOfTones(tone.apply(scheme), bgDynamicColor.tone.apply(scheme));
if (decreasingContrast) {
@@ -358,15 +358,15 @@ public final class DynamicColor {
Contrast.ratioOfTones(
toneMinContrast.apply(scheme),
bgDynamicColor.toneMinContrast.apply(scheme));
- minRatio = bgHasBg ? 1.0 : minContrastRatio;
+ minRatio = bgHasBg ? minContrastRatio : 1.0;
maxRatio = standardRatio;
} else {
final double maxContrastRatio =
Contrast.ratioOfTones(
toneMaxContrast.apply(scheme),
bgDynamicColor.toneMaxContrast.apply(scheme));
- minRatio = !bgHasBg ? 1.0 : min(maxContrastRatio, standardRatio);
- maxRatio = !bgHasBg ? 21.0 : max(maxContrastRatio, standardRatio);
+ minRatio = bgHasBg ? min(maxContrastRatio, standardRatio) : 1.0;
+ maxRatio = bgHasBg ? max(maxContrastRatio, standardRatio) : 21.0;
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java
index 41ac3213d402..d364f47d78b5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java
@@ -18,13 +18,21 @@ package com.android.systemui.monet;
import static com.android.systemui.monet.utils.ArgbSubject.assertThat;
+import static org.junit.Assert.assertTrue;
+
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.monet.contrast.Contrast;
import com.android.systemui.monet.dynamiccolor.DynamicColor;
+import com.android.systemui.monet.dynamiccolor.MaterialDynamicColors;
import com.android.systemui.monet.dynamiccolor.ToneDeltaConstraint;
import com.android.systemui.monet.dynamiccolor.TonePolarity;
import com.android.systemui.monet.hct.Hct;
+import com.android.systemui.monet.scheme.DynamicScheme;
+import com.android.systemui.monet.scheme.SchemeContent;
+import com.android.systemui.monet.scheme.SchemeFidelity;
+import com.android.systemui.monet.scheme.SchemeMonochrome;
import com.android.systemui.monet.scheme.SchemeTonalSpot;
import org.junit.Test;
@@ -90,4 +98,92 @@ public final class DynamicColorTest extends SysuiTestCase {
final SchemeTonalSpot darkScheme = new SchemeTonalSpot(Hct.fromInt(0xff4285f4), true, 0.0);
assertThat(dynamicColor.getArgb(darkScheme)).isSameColorAs(0x33ffffff);
}
+
+ @Test
+ public void respectsContrast() {
+ final Hct[] seedColors =
+ new Hct[]{
+ Hct.fromInt(0xFFFF0000),
+ Hct.fromInt(0xFFFFFF00),
+ Hct.fromInt(0xFF00FF00),
+ Hct.fromInt(0xFF0000FF)
+ };
+
+ final double[] contrastLevels = {-1.0, -0.5, 0.0, 0.5, 1.0};
+
+ for (Hct seedColor : seedColors) {
+ for (double contrastLevel : contrastLevels) {
+ for (boolean isDark : new boolean[]{false, true}) {
+ final DynamicScheme[] schemes =
+ new DynamicScheme[]{
+ new SchemeContent(seedColor, isDark, contrastLevel),
+ new SchemeMonochrome(seedColor, isDark, contrastLevel),
+ new SchemeTonalSpot(seedColor, isDark, contrastLevel),
+ new SchemeFidelity(seedColor, isDark, contrastLevel)
+ };
+ for (final DynamicScheme scheme : schemes) {
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme, MaterialDynamicColors.onPrimary,
+ MaterialDynamicColors.primary));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme,
+ MaterialDynamicColors.onPrimaryContainer,
+ MaterialDynamicColors.primaryContainer));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme, MaterialDynamicColors.onSecondary,
+ MaterialDynamicColors.secondary));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme,
+ MaterialDynamicColors.onSecondaryContainer,
+ MaterialDynamicColors.secondaryContainer));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme, MaterialDynamicColors.onTertiary,
+ MaterialDynamicColors.tertiary));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme,
+ MaterialDynamicColors.onTertiaryContainer,
+ MaterialDynamicColors.tertiaryContainer));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme, MaterialDynamicColors.onError,
+ MaterialDynamicColors.error));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme,
+ MaterialDynamicColors.onErrorContainer,
+ MaterialDynamicColors.errorContainer));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme, MaterialDynamicColors.onBackground,
+ MaterialDynamicColors.background));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme,
+ MaterialDynamicColors.onSurfaceVariant,
+ MaterialDynamicColors.surfaceVariant));
+ assertTrue(
+ pairSatisfiesContrast(
+ scheme,
+ MaterialDynamicColors.onSurfaceInverse,
+ MaterialDynamicColors.surfaceInverse));
+ }
+ }
+ }
+ }
+ }
+
+ private boolean pairSatisfiesContrast(DynamicScheme scheme, DynamicColor fg, DynamicColor bg) {
+ double fgTone = fg.getHct(scheme).getTone();
+ double bgTone = bg.getHct(scheme).getTone();
+ // TODO(b/270915664) - Fix inconsistencies.
+ // TODO(b/270915664) - Minimum requirement should be 4.5 when not reducing contrast.
+ double minimumRequirement = 3.0;
+ return Contrast.ratioOfTones(fgTone, bgTone) >= minimumRequirement;
+ }
}