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

Commit c50f47d9 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

WallpaperColors hint computation

Public WallpaperColors surface should not compute hints, malicious apps
might use theme inversion to slow down the system.

Change-Id: I9d14259e433b1047d2512b3d994524dca5e8531a
Fixes: 69532159
Test: set white wallpaper, black wallpaper, observe theme changing
Test: runtest -x services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java
parent 999e97f4
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -137,6 +137,13 @@ public final class WallpaperColors implements Parcelable {
     * @param bitmap Source where to extract from.
     */
    public static WallpaperColors fromBitmap(@NonNull Bitmap bitmap) {
        return fromBitmap(bitmap, false /* computeHints */);
    }

    /**
     * @hide
     */
    public static WallpaperColors fromBitmap(@NonNull Bitmap bitmap, boolean computeHints) {
        if (bitmap == null) {
            throw new IllegalArgumentException("Bitmap can't be null");
        }
@@ -186,7 +193,7 @@ public final class WallpaperColors implements Parcelable {
            }
        }

        int hints = calculateDarkHints(bitmap);
        int hints = computeHints ? calculateDarkHints(bitmap) : 0;

        if (shouldRecycle) {
            bitmap.recycle();
+1 −1
Original line number Diff line number Diff line
@@ -458,7 +458,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
        if (cropFile != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(cropFile);
            if (bitmap != null) {
                colors = WallpaperColors.fromBitmap(bitmap);
                colors = WallpaperColors.fromBitmap(bitmap, true /* computeHints */);
                bitmap.recycle();
            }
        }
+15 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import android.app.WallpaperColors;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
@@ -85,4 +87,17 @@ public class WallpaperServiceTests {
        assertEquals("OnComputeColors should have been deferred.",
                0, eventCountdown.getCount());
    }

    @Test
    public void testFromDrawableTest_doesntComputeHints() {
        WallpaperColors wallpaperColors = WallpaperColors.fromDrawable(
                new ColorDrawable(Color.BLACK));
        assertEquals("WallpaperColors should not support dark theme.", 0,
                wallpaperColors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_THEME);

        wallpaperColors = WallpaperColors.fromDrawable(
                new ColorDrawable(Color.WHITE));
        assertEquals("WallpaperColors should not support dark text.", 0,
                wallpaperColors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT);
    }
}