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

Commit 42acf600 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Don't recycle bitmaps we don't own

WallpaperColors#fromBitmap should only recycle the bitmaps
created by itself.

Test: runtest -x tests/Internal/src/android/app/WallpaperColorsTest.java
Fixes: 63758291
Change-Id: I1710bf7118b6ae871442f9606f95ac9c9dbb7d24
parent ef940062
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -136,12 +136,12 @@ public final class WallpaperColors implements Parcelable {
        }

        final int bitmapArea = bitmap.getWidth() * bitmap.getHeight();
        boolean shouldRecycle = false;
        if (bitmapArea > MAX_WALLPAPER_EXTRACTION_AREA) {
            shouldRecycle = true;
            Size optimalSize = calculateOptimalSize(bitmap.getWidth(), bitmap.getHeight());
            Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, optimalSize.getWidth(),
            bitmap = Bitmap.createScaledBitmap(bitmap, optimalSize.getWidth(),
                    optimalSize.getHeight(), true /* filter */);
            bitmap.recycle();
            bitmap = scaledBitmap;
        }

        final Palette palette = Palette
@@ -181,6 +181,11 @@ public final class WallpaperColors implements Parcelable {
        }

        int hints = calculateHints(bitmap);

        if (shouldRecycle) {
            bitmap.recycle();
        }

        return new WallpaperColors(primary, secondary, tertiary, hints);
    }

+12 −0
Original line number Diff line number Diff line
@@ -77,4 +77,16 @@ public class WallpaperColorsTest {
        Assert.assertFalse("Light surface shouldn't support dark text "
                + "when it contains dark pixels", supportsDarkText);
    }

    /**
     * WallpaperColors should not recycle bitmaps that it didn't create.
     */
    @Test
    public void wallpaperRecycleBitmapTest() {
        Bitmap image = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
        WallpaperColors.fromBitmap(image);
        Canvas canvas = new Canvas();
        // This would crash:
        canvas.drawBitmap(image, 0, 0, new Paint());
    }
}