diff options
| -rw-r--r-- | packages/SystemUI/monet/src/com/android/systemui/monet/dynamiccolor/DynamicColor.java | 8 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/monet/DynamicColorTest.java | 96 |
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; + } } |