From b49b0aec0b1e404e816e8ec2bbd06a3d4a74c8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Pomini?= Date: Tue, 22 Nov 2022 17:10:55 +0000 Subject: [PATCH] Move all the ImageWallpaper logic outside the main thread In order to avoid any thread contention, all the ImageWallpaper logic should be moved out of the main thread. This CL moves the last things that were done on the main thread: - Call surface.lockCanvas and canvas.drawBitmap - Call reportEngineShown Bug: 242969351 Test: atest ImageWallpaperTest Test: treehugger Change-Id: I2a4400c8eaf0d9b8a182e618655855188a15892b --- .../systemui/wallpapers/ImageWallpaper.java | 33 ++++++++----------- .../wallpapers/ImageWallpaperTest.java | 8 ++--- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java index ad97ef4a79bc1..ef43702e97b84 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/ImageWallpaper.java @@ -45,7 +45,6 @@ import androidx.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; 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.WallpaperLocalColorExtractor; @@ -57,7 +56,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.Executor; import javax.inject.Inject; @@ -88,17 +86,12 @@ public class ImageWallpaper extends WallpaperService { private final DelayableExecutor mBackgroundExecutor; private static final int DELAY_UNLOAD_BITMAP = 2000; - @Main - private final Executor mMainExecutor; - @Inject public ImageWallpaper(FeatureFlags featureFlags, - @Background DelayableExecutor backgroundExecutor, - @Main Executor mainExecutor) { + @Background DelayableExecutor backgroundExecutor) { super(); mFeatureFlags = featureFlags; mBackgroundExecutor = backgroundExecutor; - mMainExecutor = mainExecutor; } @Override @@ -662,13 +655,9 @@ public class ImageWallpaper extends WallpaperService { loadWallpaperAndDrawFrameInternal(); } else { mBitmapUsages++; - - // drawing is done on the main thread - mMainExecutor.execute(() -> { - drawFrameOnCanvas(mBitmap); - reportEngineShown(false); - unloadBitmapIfNotUsed(); - }); + drawFrameOnCanvas(mBitmap); + reportEngineShown(false); + unloadBitmapIfNotUsedInternal(); } } @@ -706,11 +695,15 @@ public class ImageWallpaper extends WallpaperService { private void unloadBitmapIfNotUsedSynchronized() { synchronized (mLock) { - mBitmapUsages -= 1; - if (mBitmapUsages <= 0) { - mBitmapUsages = 0; - unloadBitmapInternal(); - } + unloadBitmapIfNotUsedInternal(); + } + } + + private void unloadBitmapIfNotUsedInternal() { + mBitmapUsages -= 1; + if (mBitmapUsages <= 0) { + mBitmapUsages = 0; + unloadBitmapInternal(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java index 379bb28ae0322..30dc0d20600f1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallpapers/ImageWallpaperTest.java @@ -108,7 +108,6 @@ public class ImageWallpaperTest extends SysuiTestCase { private FeatureFlags mFeatureFlags; FakeSystemClock mFakeSystemClock = new FakeSystemClock(); - FakeExecutor mFakeMainExecutor = new FakeExecutor(mFakeSystemClock); FakeExecutor mFakeBackgroundExecutor = new FakeExecutor(mFakeSystemClock); private CountDownLatch mEventCountdown; @@ -163,7 +162,7 @@ public class ImageWallpaperTest extends SysuiTestCase { } private ImageWallpaper createImageWallpaper() { - return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor, mFakeMainExecutor) { + return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor) { @Override public Engine onCreateEngine() { return new GLEngine(mHandler) { @@ -242,7 +241,7 @@ public class ImageWallpaperTest extends SysuiTestCase { private ImageWallpaper createImageWallpaperCanvas() { - return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor, mFakeMainExecutor) { + return new ImageWallpaper(mFeatureFlags, mFakeBackgroundExecutor) { @Override public Engine onCreateEngine() { return new CanvasEngine() { @@ -315,11 +314,10 @@ public class ImageWallpaperTest extends SysuiTestCase { assertThat(mFakeBackgroundExecutor.numPending()).isAtLeast(1); int n = 0; - while (mFakeBackgroundExecutor.numPending() + mFakeMainExecutor.numPending() >= 1) { + while (mFakeBackgroundExecutor.numPending() >= 1) { n++; assertThat(n).isAtMost(10); mFakeBackgroundExecutor.runNextReady(); - mFakeMainExecutor.runNextReady(); mFakeSystemClock.advanceTime(1000); }