Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 195b900a authored by Lucas Dupin's avatar Lucas Dupin Committed by Android (Google) Code Review
Browse files

Merge "Update libmonet with upstream contrast fixes" into udc-dev

parents 6e1eb305 7b6b8437
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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;
            }
        }

+96 −0
Original line number Diff line number Diff line
@@ -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;
    }
}