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

Commit 4603244f authored by Robert Snoeberger's avatar Robert Snoeberger
Browse files

Delete the color extraction blacklist

Bug: 124180048
Test: TonalTest passes
Change-Id: Ia3c00d88e2b224a5ea2f81e3734f2b3eff8a712a
parent 516218f9
Loading
Loading
Loading
Loading
+1 −50
Original line number Diff line number Diff line
@@ -56,7 +56,6 @@ public class Tonal implements ExtractionType {

    private final TonalPalette mGreyPalette;
    private final ArrayList<TonalPalette> mTonalPalettes;
    private final ArrayList<ColorRange> mBlacklistedColors;

    // Temporary variable to avoid allocations
    private float[] mTmpHSL = new float[3];
@@ -65,7 +64,6 @@ public class Tonal implements ExtractionType {

        ConfigParser parser = new ConfigParser(context);
        mTonalPalettes = parser.getTonalPalettes();
        mBlacklistedColors = parser.getBlacklistedColors();

        mGreyPalette = mTonalPalettes.get(0);
        mTonalPalettes.remove(0);
@@ -131,7 +129,7 @@ public class Tonal implements ExtractionType {
                    Color.blue(colorValue), hsl);

            // Stop when we find a color that meets our criteria
            if (!generatedFromBitmap || !isBlacklisted(hsl)) {
            if (!generatedFromBitmap) {
                bestColor = color;
                break;
            }
@@ -300,22 +298,6 @@ public class Tonal implements ExtractionType {
        return getColorPalette(palette.h, palette.s, palette.l);
    }


    /**
     * Checks if a given color exists in the blacklist
     * @param hsl float array with 3 components (H 0..360, S 0..1 and L 0..1)
     * @return true if color should be avoided
     */
    private boolean isBlacklisted(float[] hsl) {
        for (int i = mBlacklistedColors.size() - 1; i >= 0; i--) {
            ColorRange badRange = mBlacklistedColors.get(i);
            if (badRange.containsColor(hsl[0], hsl[1], hsl[2])) {
                return true;
            }
        }
        return false;
    }

    /**
     * Offsets all colors by a delta, clamping values that go beyond what's
     * supported on the color space.
@@ -364,11 +346,6 @@ public class Tonal implements ExtractionType {
        return minErrorIndex;
    }

    @VisibleForTesting
    public List<ColorRange> getBlacklistedColors() {
        return mBlacklistedColors;
    }

    @Nullable
    private TonalPalette findTonalPalette(float h, float s) {
        // Fallback to a grey palette if the color is too desaturated.
@@ -502,11 +479,9 @@ public class Tonal implements ExtractionType {
    @VisibleForTesting
    public static class ConfigParser {
        private final ArrayList<TonalPalette> mTonalPalettes;
        private final ArrayList<ColorRange> mBlacklistedColors;

        public ConfigParser(Context context) {
            mTonalPalettes = new ArrayList<>();
            mBlacklistedColors = new ArrayList<>();

            // Load all palettes and the blacklist from an XML.
            try {
@@ -520,8 +495,6 @@ public class Tonal implements ExtractionType {
                        String tagName = parser.getName();
                        if (tagName.equals("palettes")) {
                            parsePalettes(parser);
                        } else if (tagName.equals("blacklist")) {
                            parseBlacklist(parser);
                        }
                    } else {
                        throw new XmlPullParserException("Invalid XML event " + eventType + " - "
@@ -538,28 +511,6 @@ public class Tonal implements ExtractionType {
            return mTonalPalettes;
        }

        public ArrayList<ColorRange> getBlacklistedColors() {
            return mBlacklistedColors;
        }

        private void parseBlacklist(XmlPullParser parser)
                throws XmlPullParserException, IOException {
            parser.require(XmlPullParser.START_TAG, null, "blacklist");
            while (parser.next() != XmlPullParser.END_TAG) {
                if (parser.getEventType() != XmlPullParser.START_TAG) {
                    continue;
                }
                String name = parser.getName();
                // Starts by looking for the entry tag
                if (name.equals("range")) {
                    mBlacklistedColors.add(readRange(parser));
                    parser.next();
                } else {
                    throw new XmlPullParserException("Invalid tag: " + name, parser, null);
                }
            }
        }

        private ColorRange readRange(XmlPullParser parser)
                throws XmlPullParserException, IOException {
            parser.require(XmlPullParser.START_TAG, null, "range");
+1 −106
Original line number Diff line number Diff line
@@ -246,109 +246,4 @@
                0.6549019607843137,0.7549019607843137,0.8509803921568627,
                0.9411764705882353"/>
    </palettes>
    <blacklist>
        <!-- Red -->
        <range h="0, 20"
               s="0.7, 1"
               l="0.21, 0.79"/>
        <range h="0, 20"
               s="0.3, 0.7"
               l="0.355, 0.653"/>
        <!-- Red Orange -->
        <range h="20, 40"
               s="0.7, 1"
               l="0.2, 0.643"/>
        <range h="20, 40"
               s="0.3, 0.7"
               l="0.414, 0.561"/>
        <range h="20, 40"
               s="0, 0.3"
               l="0.343, 0.584"/>
        <!-- Orange -->
        <range h="40, 60"
               s="0.7, 1"
               l="0.173, 0.38"/>
        <range h="40, 60"
               s="0.3, 0.7"
               l="0.233, 0.427"/>
        <range h="40, 60"
               s="0, 0.3"
               l="0.231, 0.48"/>
        <!-- Yellow 60 -->
        <range h="60, 80"
               s="0.7, 1"
               l="0.15, 0.40"/>
        <range h="60, 80"
               s="0.3, 0.7"
               l="0.15, 0.42"/>
        <range h="60, 80"
               s="0, 0.3"
               l="0.35, 0.57"/>
        <!-- Yellow Green 80 -->
        <range h="80, 100"
               s="0.7, 1"
               l="0.36, 0.65"/>
        <range h="80, 100"
               s="0.3, 0.7"
               l="0.48, 0.57"/>
        <!-- Yellow green 100 -->
        <range h="100, 120"
               s="0.7, 1"
               l="0.388, 0.67"/>
        <range h="100, 120"
               s="0.3, 0.7"
               l="0.424, 0.58"/>
        <!-- Green -->
        <range h="120, 140"
               s="0.7, 1"
               l="0.37, 0.65"/>
        <range h="120, 140"
               s="0.3, 0.7"
               l="0.435, 0.58"/>
        <!-- Green Blue 140 -->
        <range h="140, 160"
               s="0.7, 1"
               l="0.43, 0.641"/>
        <!-- Seaoam -->
        <range h="160, 180"
               s="0.7, 1"
               l="0.496, 0.567"/>
        <!-- Cyan -->
        <range h="180, 200"
               s="0.7, 1"
               l="0.52, 0.729"/>
        <!-- Blue -->
        <range h="220, 240"
               s="0.7, 1"
               l="0.396, 0.571"/>
        <range h="220, 240"
               s="0.3, 0.7"
               l="0.425, 0.551"/>
        <!-- Blue Purple 240 -->
        <range h="240, 260"
               s="0.7, 1"
               l="0.418, 0.639"/>
        <range h="220, 240"
               s="0.3, 0.7"
               l="0.441, 0.576"/>
        <!-- Blue Purple 260 -->
        <range h="260, 280"
               s="0.3, 1"
               l="0.461, 0.553"/>
        <!-- Fuchsia -->
        <range h="300, 320"
               s="0.7, 1"
               l="0.484, 0.588"/>
        <range h="300, 320"
               s="0.3, 0.7"
               l="0.48, 0.592"/>
        <!-- Pink -->
        <range h="320, 340"
               s="0.7, 1"
               l="0.466, 0.629"/>
        <!-- Soft red -->
        <range h="340, 360"
               s="0.7, 1"
               l="0.437, 0.596"/>
    </blacklist>
</colorextraction>
+0 −39
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.graphics.ColorUtils;

import org.junit.Test;
import org.junit.runner.RunWith;
@@ -96,7 +95,6 @@ public class TonalTest {
        Tonal.ConfigParser config = new Tonal.ConfigParser(InstrumentationRegistry.getContext());
        // 1 to avoid regression where only first item would be parsed.
        assertTrue("Tonal palettes are empty", config.getTonalPalettes().size() > 1);
        assertTrue("Blacklisted colors are empty", config.getBlacklistedColors().size() > 1);
    }

    @Test
@@ -113,41 +111,4 @@ public class TonalTest {
            assertTrue("L should be <= to 1.", palette.l[1] <= 1);
        }
    }

    @Test
    public void tonal_blacklistTest() {
        // Make sure that palette generation will fail.
        final Tonal tonal = new Tonal(InstrumentationRegistry.getContext());

        // Creating a WallpaperColors object that contains *only* blacklisted colors.
        final float[] hsl = tonal.getBlacklistedColors().get(0).getCenter();
        final int blacklistedColor = ColorUtils.HSLToColor(hsl);
        WallpaperColors colorsFromBitmap = new WallpaperColors(Color.valueOf(blacklistedColor),
                null, null, WallpaperColors.HINT_FROM_BITMAP);

        // Make sure that palette generation will fail
        final GradientColors normal = new GradientColors();
        tonal.extractInto(colorsFromBitmap, normal, new GradientColors(),
                new GradientColors());
        assertTrue("Cannot generate a tonal palette from blacklisted colors.",
                normal.getMainColor() == Tonal.MAIN_COLOR_DARK);
    }

    @Test
    public void tonal_ignoreBlacklistTest() {
        final Tonal tonal = new Tonal(InstrumentationRegistry.getContext());

        // Creating a WallpaperColors object that contains *only* blacklisted colors.
        final float[] hsl = tonal.getBlacklistedColors().get(0).getCenter();
        final int blacklistedColor = ColorUtils.HSLToColor(hsl);
        WallpaperColors colors = new WallpaperColors(Color.valueOf(blacklistedColor),
                null, null);

        // Blacklist should be ignored when HINT_FROM_BITMAP isn't present.
        final GradientColors normal = new GradientColors();
        tonal.extractInto(colors, normal, new GradientColors(),
                new GradientColors());
        assertTrue("Blacklist should never be used on WallpaperColors generated using "
                + "default constructor.", normal.getMainColor() == blacklistedColor);
    }
}