Loading packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java +12 −12 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.wallpapers.canvas.WallpaperColorExtractor; import com.android.systemui.wallpapers.canvas.WallpaperLocalColorExtractor; import com.android.systemui.wallpapers.gl.EglHelper; import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; Loading Loading @@ -521,7 +521,7 @@ public class ImageWallpaper extends WallpaperService { class CanvasEngine extends WallpaperService.Engine implements DisplayListener { private WallpaperManager mWallpaperManager; private final WallpaperColorExtractor mWallpaperColorExtractor; private final WallpaperLocalColorExtractor mWallpaperLocalColorExtractor; private SurfaceHolder mSurfaceHolder; @VisibleForTesting static final int MIN_SURFACE_WIDTH = 128; Loading @@ -543,9 +543,9 @@ public class ImageWallpaper extends WallpaperService { super(); setFixedSizeAllowed(true); setShowForAllUsers(true); mWallpaperColorExtractor = new WallpaperColorExtractor( mWallpaperLocalColorExtractor = new WallpaperLocalColorExtractor( mBackgroundExecutor, new WallpaperColorExtractor.WallpaperColorExtractorCallback() { new WallpaperLocalColorExtractor.WallpaperLocalColorExtractorCallback() { @Override public void onColorsProcessed(List<RectF> regions, List<WallpaperColors> colors) { Loading @@ -570,7 +570,7 @@ public class ImageWallpaper extends WallpaperService { // if the number of pages is already computed, transmit it to the color extractor if (mPagesComputed) { mWallpaperColorExtractor.onPageChanged(mPages); mWallpaperLocalColorExtractor.onPageChanged(mPages); } } Loading @@ -597,7 +597,7 @@ public class ImageWallpaper extends WallpaperService { public void onDestroy() { getDisplayContext().getSystemService(DisplayManager.class) .unregisterDisplayListener(this); mWallpaperColorExtractor.cleanUp(); mWallpaperLocalColorExtractor.cleanUp(); unloadBitmap(); } Loading Loading @@ -813,7 +813,7 @@ public class ImageWallpaper extends WallpaperService { @VisibleForTesting void recomputeColorExtractorMiniBitmap() { mWallpaperColorExtractor.onBitmapChanged(mBitmap); mWallpaperLocalColorExtractor.onBitmapChanged(mBitmap); } @VisibleForTesting Loading @@ -830,14 +830,14 @@ public class ImageWallpaper extends WallpaperService { public void addLocalColorsAreas(@NonNull List<RectF> regions) { // this call will activate the offset notifications // if no colors were being processed before mWallpaperColorExtractor.addLocalColorsAreas(regions); mWallpaperLocalColorExtractor.addLocalColorsAreas(regions); } @Override public void removeLocalColorsAreas(@NonNull List<RectF> regions) { // this call will deactivate the offset notifications // if we are no longer processing colors mWallpaperColorExtractor.removeLocalColorAreas(regions); mWallpaperLocalColorExtractor.removeLocalColorAreas(regions); } @Override Loading @@ -853,7 +853,7 @@ public class ImageWallpaper extends WallpaperService { if (pages != mPages || !mPagesComputed) { mPages = pages; mPagesComputed = true; mWallpaperColorExtractor.onPageChanged(mPages); mWallpaperLocalColorExtractor.onPageChanged(mPages); } } Loading Loading @@ -881,7 +881,7 @@ public class ImageWallpaper extends WallpaperService { .getSystemService(WindowManager.class) .getCurrentWindowMetrics() .getBounds(); mWallpaperColorExtractor.setDisplayDimensions(window.width(), window.height()); mWallpaperLocalColorExtractor.setDisplayDimensions(window.width(), window.height()); } Loading @@ -902,7 +902,7 @@ public class ImageWallpaper extends WallpaperService { : mBitmap.isRecycled() ? "recycled" : mBitmap.getWidth() + "x" + mBitmap.getHeight()); mWallpaperColorExtractor.dump(prefix, fd, out, args); mWallpaperLocalColorExtractor.dump(prefix, fd, out, args); } } } packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperColorExtractor.java→packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractor.java +14 −14 Original line number Diff line number Diff line Loading @@ -45,14 +45,14 @@ import java.util.concurrent.Executor; * It uses a background executor, and uses callbacks to inform that the work is done. * It uses a downscaled version of the wallpaper to extract the colors. */ public class WallpaperColorExtractor { public class WallpaperLocalColorExtractor { private Bitmap mMiniBitmap; @VisibleForTesting static final int SMALL_SIDE = 128; private static final String TAG = WallpaperColorExtractor.class.getSimpleName(); private static final String TAG = WallpaperLocalColorExtractor.class.getSimpleName(); private static final @NonNull RectF LOCAL_COLOR_BOUNDS = new RectF(0, 0, 1, 1); Loading @@ -70,12 +70,12 @@ public class WallpaperColorExtractor { @Background private final Executor mBackgroundExecutor; private final WallpaperColorExtractorCallback mWallpaperColorExtractorCallback; private final WallpaperLocalColorExtractorCallback mWallpaperLocalColorExtractorCallback; /** * Interface to handle the callbacks after the different steps of the color extraction */ public interface WallpaperColorExtractorCallback { public interface WallpaperLocalColorExtractorCallback { /** * Callback after the colors of new regions have been extracted * @param regions the list of new regions that have been processed Loading Loading @@ -103,13 +103,13 @@ public class WallpaperColorExtractor { /** * Creates a new color extractor. * @param backgroundExecutor the executor on which the color extraction will be performed * @param wallpaperColorExtractorCallback an interface to handle the callbacks from * @param wallpaperLocalColorExtractorCallback an interface to handle the callbacks from * the color extractor. */ public WallpaperColorExtractor(@Background Executor backgroundExecutor, WallpaperColorExtractorCallback wallpaperColorExtractorCallback) { public WallpaperLocalColorExtractor(@Background Executor backgroundExecutor, WallpaperLocalColorExtractorCallback wallpaperLocalColorExtractorCallback) { mBackgroundExecutor = backgroundExecutor; mWallpaperColorExtractorCallback = wallpaperColorExtractorCallback; mWallpaperLocalColorExtractorCallback = wallpaperLocalColorExtractorCallback; } /** Loading Loading @@ -157,7 +157,7 @@ public class WallpaperColorExtractor { mBitmapWidth = bitmap.getWidth(); mBitmapHeight = bitmap.getHeight(); mMiniBitmap = createMiniBitmap(bitmap); mWallpaperColorExtractorCallback.onMiniBitmapUpdated(); mWallpaperLocalColorExtractorCallback.onMiniBitmapUpdated(); recomputeColors(); } } Loading Loading @@ -206,7 +206,7 @@ public class WallpaperColorExtractor { boolean wasActive = isActive(); mPendingRegions.addAll(regions); if (!wasActive && isActive()) { mWallpaperColorExtractorCallback.onActivated(); mWallpaperLocalColorExtractorCallback.onActivated(); } processColorsInternal(); } Loading @@ -228,7 +228,7 @@ public class WallpaperColorExtractor { mPendingRegions.removeAll(regions); regions.forEach(mProcessedRegions::remove); if (wasActive && !isActive()) { mWallpaperColorExtractorCallback.onDeactivated(); mWallpaperLocalColorExtractorCallback.onDeactivated(); } } } Loading @@ -252,7 +252,7 @@ public class WallpaperColorExtractor { } private Bitmap createMiniBitmap(@NonNull Bitmap bitmap) { Trace.beginSection("WallpaperColorExtractor#createMiniBitmap"); Trace.beginSection("WallpaperLocalColorExtractor#createMiniBitmap"); // if both sides of the image are larger than SMALL_SIDE, downscale the bitmap. int smallestSide = Math.min(bitmap.getWidth(), bitmap.getHeight()); float scale = Math.min(1.0f, (float) SMALL_SIDE / smallestSide); Loading Loading @@ -359,7 +359,7 @@ public class WallpaperColorExtractor { */ if (mDisplayWidth < 0 || mDisplayHeight < 0 || mPages < 0) return; Trace.beginSection("WallpaperColorExtractor#processColorsInternal"); Trace.beginSection("WallpaperLocalColorExtractor#processColorsInternal"); List<WallpaperColors> processedColors = new ArrayList<>(); for (int i = 0; i < mPendingRegions.size(); i++) { RectF nextArea = mPendingRegions.get(i); Loading @@ -372,7 +372,7 @@ public class WallpaperColorExtractor { mPendingRegions.clear(); Trace.endSection(); mWallpaperColorExtractorCallback.onColorsProcessed(processedRegions, processedColors); mWallpaperLocalColorExtractorCallback.onColorsProcessed(processedRegions, processedColors); } /** Loading packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperColorExtractorTest.java→packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractorTest.java +42 −42 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ import java.util.concurrent.Executor; @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class WallpaperColorExtractorTest extends SysuiTestCase { public class WallpaperLocalColorExtractorTest extends SysuiTestCase { private static final int LOW_BMP_WIDTH = 128; private static final int LOW_BMP_HEIGHT = 128; private static final int HIGH_BMP_WIDTH = 3000; Loading Loading @@ -105,11 +105,11 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { return bitmap; } private WallpaperColorExtractor getSpyWallpaperColorExtractor() { private WallpaperLocalColorExtractor getSpyWallpaperLocalColorExtractor() { WallpaperColorExtractor wallpaperColorExtractor = new WallpaperColorExtractor( WallpaperLocalColorExtractor colorExtractor = new WallpaperLocalColorExtractor( mBackgroundExecutor, new WallpaperColorExtractor.WallpaperColorExtractorCallback() { new WallpaperLocalColorExtractor.WallpaperLocalColorExtractorCallback() { @Override public void onColorsProcessed(List<RectF> regions, List<WallpaperColors> colors) { Loading @@ -132,25 +132,25 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { mDeactivatedCount++; } }); WallpaperColorExtractor spyWallpaperColorExtractor = spy(wallpaperColorExtractor); WallpaperLocalColorExtractor spyColorExtractor = spy(colorExtractor); doAnswer(invocation -> { mMiniBitmapWidth = invocation.getArgument(1); mMiniBitmapHeight = invocation.getArgument(2); return getMockBitmap(mMiniBitmapWidth, mMiniBitmapHeight); }).when(spyWallpaperColorExtractor).createMiniBitmap(any(Bitmap.class), anyInt(), anyInt()); }).when(spyColorExtractor).createMiniBitmap(any(Bitmap.class), anyInt(), anyInt()); doAnswer(invocation -> getMockBitmap( invocation.getArgument(1), invocation.getArgument(2))) .when(spyWallpaperColorExtractor) .when(spyColorExtractor) .createMiniBitmap(any(Bitmap.class), anyInt(), anyInt()); doReturn(new WallpaperColors(Color.valueOf(0), Color.valueOf(0), Color.valueOf(0))) .when(spyWallpaperColorExtractor).getLocalWallpaperColors(any(Rect.class)); .when(spyColorExtractor).getLocalWallpaperColors(any(Rect.class)); return spyWallpaperColorExtractor; return spyColorExtractor; } private RectF randomArea() { Loading Loading @@ -180,18 +180,18 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { */ @Test public void testMiniBitmapCreation() { WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); int width = randomBetween(LOW_BMP_WIDTH, HIGH_BMP_WIDTH); int height = randomBetween(LOW_BMP_HEIGHT, HIGH_BMP_HEIGHT); Bitmap bitmap = getMockBitmap(width, height); spyWallpaperColorExtractor.onBitmapChanged(bitmap); spyColorExtractor.onBitmapChanged(bitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(Math.min(mMiniBitmapWidth, mMiniBitmapHeight)) .isAtMost(WallpaperColorExtractor.SMALL_SIDE); .isAtMost(WallpaperLocalColorExtractor.SMALL_SIDE); } } Loading @@ -201,18 +201,18 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { */ @Test public void testSmallMiniBitmapCreation() { WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); int width = randomBetween(VERY_LOW_BMP_WIDTH, LOW_BMP_WIDTH); int height = randomBetween(VERY_LOW_BMP_HEIGHT, LOW_BMP_HEIGHT); Bitmap bitmap = getMockBitmap(width, height); spyWallpaperColorExtractor.onBitmapChanged(bitmap); spyColorExtractor.onBitmapChanged(bitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(Math.max(mMiniBitmapWidth, mMiniBitmapHeight)) .isAtMost(WallpaperColorExtractor.SMALL_SIDE); .isAtMost(WallpaperLocalColorExtractor.SMALL_SIDE); } } Loading @@ -228,15 +228,15 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); List<RectF> regions = listOfRandomAreas(MIN_AREAS, MAX_AREAS); int nPages = randomBetween(PAGES_LOW, PAGES_HIGH); List<Runnable> tasks = Arrays.asList( () -> spyWallpaperColorExtractor.onPageChanged(nPages), () -> spyWallpaperColorExtractor.onBitmapChanged(bitmap), () -> spyWallpaperColorExtractor.setDisplayDimensions( () -> spyColorExtractor.onPageChanged(nPages), () -> spyColorExtractor.onBitmapChanged(bitmap), () -> spyColorExtractor.setDisplayDimensions( DISPLAY_WIDTH, DISPLAY_HEIGHT), () -> spyWallpaperColorExtractor.addLocalColorsAreas( () -> spyColorExtractor.addLocalColorsAreas( regions)); Collections.shuffle(tasks); tasks.forEach(Runnable::run); Loading @@ -245,7 +245,7 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(mColorsProcessed).isEqualTo(regions.size()); spyWallpaperColorExtractor.removeLocalColorAreas(regions); spyColorExtractor.removeLocalColorAreas(regions); assertThat(mDeactivatedCount).isEqualTo(1); } } Loading @@ -260,7 +260,7 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); List<RectF> regions1 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions2 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions = new ArrayList<>(); Loading @@ -268,20 +268,20 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { regions.addAll(regions2); int nPages = randomBetween(PAGES_LOW, PAGES_HIGH); List<Runnable> tasks = Arrays.asList( () -> spyWallpaperColorExtractor.onPageChanged(nPages), () -> spyWallpaperColorExtractor.onBitmapChanged(bitmap), () -> spyWallpaperColorExtractor.setDisplayDimensions( () -> spyColorExtractor.onPageChanged(nPages), () -> spyColorExtractor.onBitmapChanged(bitmap), () -> spyColorExtractor.setDisplayDimensions( DISPLAY_WIDTH, DISPLAY_HEIGHT), () -> spyWallpaperColorExtractor.removeLocalColorAreas(regions1)); () -> spyColorExtractor.removeLocalColorAreas(regions1)); spyWallpaperColorExtractor.addLocalColorsAreas(regions); spyColorExtractor.addLocalColorsAreas(regions); assertThat(mActivatedCount).isEqualTo(1); Collections.shuffle(tasks); tasks.forEach(Runnable::run); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(mDeactivatedCount).isEqualTo(0); spyWallpaperColorExtractor.removeLocalColorAreas(regions2); spyColorExtractor.removeLocalColorAreas(regions2); assertThat(mDeactivatedCount).isEqualTo(1); } } Loading @@ -295,18 +295,18 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { @Test public void testRecomputeColorExtraction() { Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); List<RectF> regions1 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions2 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions = new ArrayList<>(); regions.addAll(regions1); regions.addAll(regions2); spyWallpaperColorExtractor.addLocalColorsAreas(regions); spyColorExtractor.addLocalColorsAreas(regions); assertThat(mActivatedCount).isEqualTo(1); int nPages = PAGES_LOW; spyWallpaperColorExtractor.onBitmapChanged(bitmap); spyWallpaperColorExtractor.onPageChanged(nPages); spyWallpaperColorExtractor.setDisplayDimensions(DISPLAY_WIDTH, DISPLAY_HEIGHT); spyColorExtractor.onBitmapChanged(bitmap); spyColorExtractor.onPageChanged(nPages); spyColorExtractor.setDisplayDimensions(DISPLAY_WIDTH, DISPLAY_HEIGHT); int nSimulations = 20; for (int i = 0; i < nSimulations; i++) { Loading @@ -315,22 +315,22 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { // verify that if we remove some regions, they are not recomputed after other changes if (i == nSimulations / 2) { regions.removeAll(regions2); spyWallpaperColorExtractor.removeLocalColorAreas(regions2); spyColorExtractor.removeLocalColorAreas(regions2); } if (Math.random() >= 0.5) { int nPagesNew = randomBetween(PAGES_LOW, PAGES_HIGH); if (nPagesNew == nPages) continue; nPages = nPagesNew; spyWallpaperColorExtractor.onPageChanged(nPagesNew); spyColorExtractor.onPageChanged(nPagesNew); } else { Bitmap newBitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT); spyWallpaperColorExtractor.onBitmapChanged(newBitmap); spyColorExtractor.onBitmapChanged(newBitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); } assertThat(mColorsProcessed).isEqualTo(regions.size()); } spyWallpaperColorExtractor.removeLocalColorAreas(regions); spyColorExtractor.removeLocalColorAreas(regions); assertThat(mDeactivatedCount).isEqualTo(1); } Loading @@ -339,12 +339,12 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { resetCounters(); Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT); doNothing().when(bitmap).recycle(); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); spyWallpaperColorExtractor.onPageChanged(PAGES_LOW); spyWallpaperColorExtractor.onBitmapChanged(bitmap); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); spyColorExtractor.onPageChanged(PAGES_LOW); spyColorExtractor.onBitmapChanged(bitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); spyWallpaperColorExtractor.cleanUp(); spyWallpaperColorExtractor.addLocalColorsAreas(listOfRandomAreas(MIN_AREAS, MAX_AREAS)); spyColorExtractor.cleanUp(); spyColorExtractor.addLocalColorsAreas(listOfRandomAreas(MIN_AREAS, MAX_AREAS)); assertThat(mColorsProcessed).isEqualTo(0); } } Loading
packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java +12 −12 Original line number Diff line number Diff line Loading @@ -47,7 +47,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.wallpapers.canvas.WallpaperColorExtractor; import com.android.systemui.wallpapers.canvas.WallpaperLocalColorExtractor; import com.android.systemui.wallpapers.gl.EglHelper; import com.android.systemui.wallpapers.gl.ImageWallpaperRenderer; Loading Loading @@ -521,7 +521,7 @@ public class ImageWallpaper extends WallpaperService { class CanvasEngine extends WallpaperService.Engine implements DisplayListener { private WallpaperManager mWallpaperManager; private final WallpaperColorExtractor mWallpaperColorExtractor; private final WallpaperLocalColorExtractor mWallpaperLocalColorExtractor; private SurfaceHolder mSurfaceHolder; @VisibleForTesting static final int MIN_SURFACE_WIDTH = 128; Loading @@ -543,9 +543,9 @@ public class ImageWallpaper extends WallpaperService { super(); setFixedSizeAllowed(true); setShowForAllUsers(true); mWallpaperColorExtractor = new WallpaperColorExtractor( mWallpaperLocalColorExtractor = new WallpaperLocalColorExtractor( mBackgroundExecutor, new WallpaperColorExtractor.WallpaperColorExtractorCallback() { new WallpaperLocalColorExtractor.WallpaperLocalColorExtractorCallback() { @Override public void onColorsProcessed(List<RectF> regions, List<WallpaperColors> colors) { Loading @@ -570,7 +570,7 @@ public class ImageWallpaper extends WallpaperService { // if the number of pages is already computed, transmit it to the color extractor if (mPagesComputed) { mWallpaperColorExtractor.onPageChanged(mPages); mWallpaperLocalColorExtractor.onPageChanged(mPages); } } Loading @@ -597,7 +597,7 @@ public class ImageWallpaper extends WallpaperService { public void onDestroy() { getDisplayContext().getSystemService(DisplayManager.class) .unregisterDisplayListener(this); mWallpaperColorExtractor.cleanUp(); mWallpaperLocalColorExtractor.cleanUp(); unloadBitmap(); } Loading Loading @@ -813,7 +813,7 @@ public class ImageWallpaper extends WallpaperService { @VisibleForTesting void recomputeColorExtractorMiniBitmap() { mWallpaperColorExtractor.onBitmapChanged(mBitmap); mWallpaperLocalColorExtractor.onBitmapChanged(mBitmap); } @VisibleForTesting Loading @@ -830,14 +830,14 @@ public class ImageWallpaper extends WallpaperService { public void addLocalColorsAreas(@NonNull List<RectF> regions) { // this call will activate the offset notifications // if no colors were being processed before mWallpaperColorExtractor.addLocalColorsAreas(regions); mWallpaperLocalColorExtractor.addLocalColorsAreas(regions); } @Override public void removeLocalColorsAreas(@NonNull List<RectF> regions) { // this call will deactivate the offset notifications // if we are no longer processing colors mWallpaperColorExtractor.removeLocalColorAreas(regions); mWallpaperLocalColorExtractor.removeLocalColorAreas(regions); } @Override Loading @@ -853,7 +853,7 @@ public class ImageWallpaper extends WallpaperService { if (pages != mPages || !mPagesComputed) { mPages = pages; mPagesComputed = true; mWallpaperColorExtractor.onPageChanged(mPages); mWallpaperLocalColorExtractor.onPageChanged(mPages); } } Loading Loading @@ -881,7 +881,7 @@ public class ImageWallpaper extends WallpaperService { .getSystemService(WindowManager.class) .getCurrentWindowMetrics() .getBounds(); mWallpaperColorExtractor.setDisplayDimensions(window.width(), window.height()); mWallpaperLocalColorExtractor.setDisplayDimensions(window.width(), window.height()); } Loading @@ -902,7 +902,7 @@ public class ImageWallpaper extends WallpaperService { : mBitmap.isRecycled() ? "recycled" : mBitmap.getWidth() + "x" + mBitmap.getHeight()); mWallpaperColorExtractor.dump(prefix, fd, out, args); mWallpaperLocalColorExtractor.dump(prefix, fd, out, args); } } }
packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperColorExtractor.java→packages/SystemUI/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractor.java +14 −14 Original line number Diff line number Diff line Loading @@ -45,14 +45,14 @@ import java.util.concurrent.Executor; * It uses a background executor, and uses callbacks to inform that the work is done. * It uses a downscaled version of the wallpaper to extract the colors. */ public class WallpaperColorExtractor { public class WallpaperLocalColorExtractor { private Bitmap mMiniBitmap; @VisibleForTesting static final int SMALL_SIDE = 128; private static final String TAG = WallpaperColorExtractor.class.getSimpleName(); private static final String TAG = WallpaperLocalColorExtractor.class.getSimpleName(); private static final @NonNull RectF LOCAL_COLOR_BOUNDS = new RectF(0, 0, 1, 1); Loading @@ -70,12 +70,12 @@ public class WallpaperColorExtractor { @Background private final Executor mBackgroundExecutor; private final WallpaperColorExtractorCallback mWallpaperColorExtractorCallback; private final WallpaperLocalColorExtractorCallback mWallpaperLocalColorExtractorCallback; /** * Interface to handle the callbacks after the different steps of the color extraction */ public interface WallpaperColorExtractorCallback { public interface WallpaperLocalColorExtractorCallback { /** * Callback after the colors of new regions have been extracted * @param regions the list of new regions that have been processed Loading Loading @@ -103,13 +103,13 @@ public class WallpaperColorExtractor { /** * Creates a new color extractor. * @param backgroundExecutor the executor on which the color extraction will be performed * @param wallpaperColorExtractorCallback an interface to handle the callbacks from * @param wallpaperLocalColorExtractorCallback an interface to handle the callbacks from * the color extractor. */ public WallpaperColorExtractor(@Background Executor backgroundExecutor, WallpaperColorExtractorCallback wallpaperColorExtractorCallback) { public WallpaperLocalColorExtractor(@Background Executor backgroundExecutor, WallpaperLocalColorExtractorCallback wallpaperLocalColorExtractorCallback) { mBackgroundExecutor = backgroundExecutor; mWallpaperColorExtractorCallback = wallpaperColorExtractorCallback; mWallpaperLocalColorExtractorCallback = wallpaperLocalColorExtractorCallback; } /** Loading Loading @@ -157,7 +157,7 @@ public class WallpaperColorExtractor { mBitmapWidth = bitmap.getWidth(); mBitmapHeight = bitmap.getHeight(); mMiniBitmap = createMiniBitmap(bitmap); mWallpaperColorExtractorCallback.onMiniBitmapUpdated(); mWallpaperLocalColorExtractorCallback.onMiniBitmapUpdated(); recomputeColors(); } } Loading Loading @@ -206,7 +206,7 @@ public class WallpaperColorExtractor { boolean wasActive = isActive(); mPendingRegions.addAll(regions); if (!wasActive && isActive()) { mWallpaperColorExtractorCallback.onActivated(); mWallpaperLocalColorExtractorCallback.onActivated(); } processColorsInternal(); } Loading @@ -228,7 +228,7 @@ public class WallpaperColorExtractor { mPendingRegions.removeAll(regions); regions.forEach(mProcessedRegions::remove); if (wasActive && !isActive()) { mWallpaperColorExtractorCallback.onDeactivated(); mWallpaperLocalColorExtractorCallback.onDeactivated(); } } } Loading @@ -252,7 +252,7 @@ public class WallpaperColorExtractor { } private Bitmap createMiniBitmap(@NonNull Bitmap bitmap) { Trace.beginSection("WallpaperColorExtractor#createMiniBitmap"); Trace.beginSection("WallpaperLocalColorExtractor#createMiniBitmap"); // if both sides of the image are larger than SMALL_SIDE, downscale the bitmap. int smallestSide = Math.min(bitmap.getWidth(), bitmap.getHeight()); float scale = Math.min(1.0f, (float) SMALL_SIDE / smallestSide); Loading Loading @@ -359,7 +359,7 @@ public class WallpaperColorExtractor { */ if (mDisplayWidth < 0 || mDisplayHeight < 0 || mPages < 0) return; Trace.beginSection("WallpaperColorExtractor#processColorsInternal"); Trace.beginSection("WallpaperLocalColorExtractor#processColorsInternal"); List<WallpaperColors> processedColors = new ArrayList<>(); for (int i = 0; i < mPendingRegions.size(); i++) { RectF nextArea = mPendingRegions.get(i); Loading @@ -372,7 +372,7 @@ public class WallpaperColorExtractor { mPendingRegions.clear(); Trace.endSection(); mWallpaperColorExtractorCallback.onColorsProcessed(processedRegions, processedColors); mWallpaperLocalColorExtractorCallback.onColorsProcessed(processedRegions, processedColors); } /** Loading
packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperColorExtractorTest.java→packages/SystemUI/tests/src/com/android/systemui/wallpapers/canvas/WallpaperLocalColorExtractorTest.java +42 −42 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ import java.util.concurrent.Executor; @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class WallpaperColorExtractorTest extends SysuiTestCase { public class WallpaperLocalColorExtractorTest extends SysuiTestCase { private static final int LOW_BMP_WIDTH = 128; private static final int LOW_BMP_HEIGHT = 128; private static final int HIGH_BMP_WIDTH = 3000; Loading Loading @@ -105,11 +105,11 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { return bitmap; } private WallpaperColorExtractor getSpyWallpaperColorExtractor() { private WallpaperLocalColorExtractor getSpyWallpaperLocalColorExtractor() { WallpaperColorExtractor wallpaperColorExtractor = new WallpaperColorExtractor( WallpaperLocalColorExtractor colorExtractor = new WallpaperLocalColorExtractor( mBackgroundExecutor, new WallpaperColorExtractor.WallpaperColorExtractorCallback() { new WallpaperLocalColorExtractor.WallpaperLocalColorExtractorCallback() { @Override public void onColorsProcessed(List<RectF> regions, List<WallpaperColors> colors) { Loading @@ -132,25 +132,25 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { mDeactivatedCount++; } }); WallpaperColorExtractor spyWallpaperColorExtractor = spy(wallpaperColorExtractor); WallpaperLocalColorExtractor spyColorExtractor = spy(colorExtractor); doAnswer(invocation -> { mMiniBitmapWidth = invocation.getArgument(1); mMiniBitmapHeight = invocation.getArgument(2); return getMockBitmap(mMiniBitmapWidth, mMiniBitmapHeight); }).when(spyWallpaperColorExtractor).createMiniBitmap(any(Bitmap.class), anyInt(), anyInt()); }).when(spyColorExtractor).createMiniBitmap(any(Bitmap.class), anyInt(), anyInt()); doAnswer(invocation -> getMockBitmap( invocation.getArgument(1), invocation.getArgument(2))) .when(spyWallpaperColorExtractor) .when(spyColorExtractor) .createMiniBitmap(any(Bitmap.class), anyInt(), anyInt()); doReturn(new WallpaperColors(Color.valueOf(0), Color.valueOf(0), Color.valueOf(0))) .when(spyWallpaperColorExtractor).getLocalWallpaperColors(any(Rect.class)); .when(spyColorExtractor).getLocalWallpaperColors(any(Rect.class)); return spyWallpaperColorExtractor; return spyColorExtractor; } private RectF randomArea() { Loading Loading @@ -180,18 +180,18 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { */ @Test public void testMiniBitmapCreation() { WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); int width = randomBetween(LOW_BMP_WIDTH, HIGH_BMP_WIDTH); int height = randomBetween(LOW_BMP_HEIGHT, HIGH_BMP_HEIGHT); Bitmap bitmap = getMockBitmap(width, height); spyWallpaperColorExtractor.onBitmapChanged(bitmap); spyColorExtractor.onBitmapChanged(bitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(Math.min(mMiniBitmapWidth, mMiniBitmapHeight)) .isAtMost(WallpaperColorExtractor.SMALL_SIDE); .isAtMost(WallpaperLocalColorExtractor.SMALL_SIDE); } } Loading @@ -201,18 +201,18 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { */ @Test public void testSmallMiniBitmapCreation() { WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); int width = randomBetween(VERY_LOW_BMP_WIDTH, LOW_BMP_WIDTH); int height = randomBetween(VERY_LOW_BMP_HEIGHT, LOW_BMP_HEIGHT); Bitmap bitmap = getMockBitmap(width, height); spyWallpaperColorExtractor.onBitmapChanged(bitmap); spyColorExtractor.onBitmapChanged(bitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(Math.max(mMiniBitmapWidth, mMiniBitmapHeight)) .isAtMost(WallpaperColorExtractor.SMALL_SIDE); .isAtMost(WallpaperLocalColorExtractor.SMALL_SIDE); } } Loading @@ -228,15 +228,15 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); List<RectF> regions = listOfRandomAreas(MIN_AREAS, MAX_AREAS); int nPages = randomBetween(PAGES_LOW, PAGES_HIGH); List<Runnable> tasks = Arrays.asList( () -> spyWallpaperColorExtractor.onPageChanged(nPages), () -> spyWallpaperColorExtractor.onBitmapChanged(bitmap), () -> spyWallpaperColorExtractor.setDisplayDimensions( () -> spyColorExtractor.onPageChanged(nPages), () -> spyColorExtractor.onBitmapChanged(bitmap), () -> spyColorExtractor.setDisplayDimensions( DISPLAY_WIDTH, DISPLAY_HEIGHT), () -> spyWallpaperColorExtractor.addLocalColorsAreas( () -> spyColorExtractor.addLocalColorsAreas( regions)); Collections.shuffle(tasks); tasks.forEach(Runnable::run); Loading @@ -245,7 +245,7 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(mColorsProcessed).isEqualTo(regions.size()); spyWallpaperColorExtractor.removeLocalColorAreas(regions); spyColorExtractor.removeLocalColorAreas(regions); assertThat(mDeactivatedCount).isEqualTo(1); } } Loading @@ -260,7 +260,7 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { int nSimulations = 10; for (int i = 0; i < nSimulations; i++) { resetCounters(); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); List<RectF> regions1 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions2 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions = new ArrayList<>(); Loading @@ -268,20 +268,20 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { regions.addAll(regions2); int nPages = randomBetween(PAGES_LOW, PAGES_HIGH); List<Runnable> tasks = Arrays.asList( () -> spyWallpaperColorExtractor.onPageChanged(nPages), () -> spyWallpaperColorExtractor.onBitmapChanged(bitmap), () -> spyWallpaperColorExtractor.setDisplayDimensions( () -> spyColorExtractor.onPageChanged(nPages), () -> spyColorExtractor.onBitmapChanged(bitmap), () -> spyColorExtractor.setDisplayDimensions( DISPLAY_WIDTH, DISPLAY_HEIGHT), () -> spyWallpaperColorExtractor.removeLocalColorAreas(regions1)); () -> spyColorExtractor.removeLocalColorAreas(regions1)); spyWallpaperColorExtractor.addLocalColorsAreas(regions); spyColorExtractor.addLocalColorsAreas(regions); assertThat(mActivatedCount).isEqualTo(1); Collections.shuffle(tasks); tasks.forEach(Runnable::run); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); assertThat(mDeactivatedCount).isEqualTo(0); spyWallpaperColorExtractor.removeLocalColorAreas(regions2); spyColorExtractor.removeLocalColorAreas(regions2); assertThat(mDeactivatedCount).isEqualTo(1); } } Loading @@ -295,18 +295,18 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { @Test public void testRecomputeColorExtraction() { Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); List<RectF> regions1 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions2 = listOfRandomAreas(MIN_AREAS / 2, MAX_AREAS / 2); List<RectF> regions = new ArrayList<>(); regions.addAll(regions1); regions.addAll(regions2); spyWallpaperColorExtractor.addLocalColorsAreas(regions); spyColorExtractor.addLocalColorsAreas(regions); assertThat(mActivatedCount).isEqualTo(1); int nPages = PAGES_LOW; spyWallpaperColorExtractor.onBitmapChanged(bitmap); spyWallpaperColorExtractor.onPageChanged(nPages); spyWallpaperColorExtractor.setDisplayDimensions(DISPLAY_WIDTH, DISPLAY_HEIGHT); spyColorExtractor.onBitmapChanged(bitmap); spyColorExtractor.onPageChanged(nPages); spyColorExtractor.setDisplayDimensions(DISPLAY_WIDTH, DISPLAY_HEIGHT); int nSimulations = 20; for (int i = 0; i < nSimulations; i++) { Loading @@ -315,22 +315,22 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { // verify that if we remove some regions, they are not recomputed after other changes if (i == nSimulations / 2) { regions.removeAll(regions2); spyWallpaperColorExtractor.removeLocalColorAreas(regions2); spyColorExtractor.removeLocalColorAreas(regions2); } if (Math.random() >= 0.5) { int nPagesNew = randomBetween(PAGES_LOW, PAGES_HIGH); if (nPagesNew == nPages) continue; nPages = nPagesNew; spyWallpaperColorExtractor.onPageChanged(nPagesNew); spyColorExtractor.onPageChanged(nPagesNew); } else { Bitmap newBitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT); spyWallpaperColorExtractor.onBitmapChanged(newBitmap); spyColorExtractor.onBitmapChanged(newBitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); } assertThat(mColorsProcessed).isEqualTo(regions.size()); } spyWallpaperColorExtractor.removeLocalColorAreas(regions); spyColorExtractor.removeLocalColorAreas(regions); assertThat(mDeactivatedCount).isEqualTo(1); } Loading @@ -339,12 +339,12 @@ public class WallpaperColorExtractorTest extends SysuiTestCase { resetCounters(); Bitmap bitmap = getMockBitmap(HIGH_BMP_WIDTH, HIGH_BMP_HEIGHT); doNothing().when(bitmap).recycle(); WallpaperColorExtractor spyWallpaperColorExtractor = getSpyWallpaperColorExtractor(); spyWallpaperColorExtractor.onPageChanged(PAGES_LOW); spyWallpaperColorExtractor.onBitmapChanged(bitmap); WallpaperLocalColorExtractor spyColorExtractor = getSpyWallpaperLocalColorExtractor(); spyColorExtractor.onPageChanged(PAGES_LOW); spyColorExtractor.onBitmapChanged(bitmap); assertThat(mMiniBitmapUpdatedCount).isEqualTo(1); spyWallpaperColorExtractor.cleanUp(); spyWallpaperColorExtractor.addLocalColorsAreas(listOfRandomAreas(MIN_AREAS, MAX_AREAS)); spyColorExtractor.cleanUp(); spyColorExtractor.addLocalColorsAreas(listOfRandomAreas(MIN_AREAS, MAX_AREAS)); assertThat(mColorsProcessed).isEqualTo(0); } }