Make ImageWallpaper handle WallpaperService messages on its own thread

When a wallpaper is called to be attached, IWallpaperEngineWrapper
sends a DO_ATTACH message to be handled on the main looper of the
wallpaper implementation. In the case of ImageWallpaper, it is
currently systemui. When system ui is occupied by other tasks,
reception of this message is delayed. And this decreases the
performance of switching between Android users in case the target user
has an ImageWallpaper.

This CL makes sure these service messages are handled on
ImageWallpaper's own thread, and the drawing of the wallpaper is not
delayed.

Bug: 242969351
Test: Manual comparison of perfetto traces
Change-Id: Ia911f1b879a20658d0b71e3486c079cbbcb081c8
This commit is contained in:
Yasin Kilicdere
2022-11-09 16:24:07 +00:00
parent 2ff1284e94
commit 696adad614
2 changed files with 23 additions and 2 deletions

View File

@@ -2149,6 +2149,17 @@ public abstract class WallpaperService extends Service {
}
}
/**
* Returns a Looper which messages such as {@link WallpaperService#DO_ATTACH},
* {@link WallpaperService#DO_DETACH} etc. are sent to.
* By default, returns the process's main looper.
* @hide
*/
@NonNull
public Looper onProvideEngineLooper() {
return super.getMainLooper();
}
private boolean isValid(RectF area) {
if (area == null) return false;
boolean valid = area.bottom > area.top && area.left < area.right
@@ -2180,12 +2191,12 @@ public abstract class WallpaperService extends Service {
Engine mEngine;
IWallpaperEngineWrapper(WallpaperService context,
IWallpaperEngineWrapper(WallpaperService service,
IWallpaperConnection conn, IBinder windowToken,
int windowType, boolean isPreview, int reqWidth, int reqHeight, Rect padding,
int displayId) {
mWallpaperManager = getSystemService(WallpaperManager.class);
mCaller = new HandlerCaller(context, context.getMainLooper(), this, true);
mCaller = new HandlerCaller(service, service.onProvideEngineLooper(), this, true);
mConnection = conn;
mWindowToken = windowToken;
mWindowType = windowType;

View File

@@ -29,6 +29,7 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
@@ -101,6 +102,15 @@ public class ImageWallpaper extends WallpaperService {
mMainExecutor = mainExecutor;
}
@Override
public Looper onProvideEngineLooper() {
// Receive messages on mWorker thread instead of SystemUI's main handler.
// All other wallpapers have their own process, and they can receive messages on their own
// main handler without any delay. But since ImageWallpaper lives in SystemUI, performance
// of the image wallpaper could be negatively affected when SystemUI's main handler is busy.
return mWorker != null ? mWorker.getLooper() : super.onProvideEngineLooper();
}
@Override
public void onCreate() {
super.onCreate();