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

Commit 93c869be authored by Lucas Dupin's avatar Lucas Dupin Committed by Automerger Merge Worker
Browse files

Merge "Update libmonet with upstream contrast fixes" into udc-dev am: 195b900a

parents 3c29de94 195b900a
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;
    }
}