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:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user