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

Commit 7b1c22cd authored by Aurélien Pomini's avatar Aurélien Pomini
Browse files

Force rebind live wallpapers when destination change

When a live wallpaper is on system-only, and the same wallpaper
component is reapplied to system+lock, the binding would be skipped due
to the "changingToSame(...)" check. Given that the picker will call
clear(FLAG_LOCK) after applying the wallpaper to system+lock, and given
the lockscreen wallpaper current implementation, this would lead to a
black screen. Forcing the rebind prevents the black screen issue.

Also, log the "which" flag in setWallpaperComponent since it's often
useful.

Test: atest WallpaperManagerTest
Test: manual: follow the repro steps of b/286428230 with/without this CL
Bug: 286428230
Change-Id: I7f70f676ae0c4eb480e3049af49d2b5232d9360b
parent cceba8e2
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -3293,7 +3293,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
        WallpaperData wallpaper;
        WallpaperData wallpaper;


        synchronized (mLock) {
        synchronized (mLock) {
            Slog.v(TAG, "setWallpaperComponent name=" + name);
            Slog.v(TAG, "setWallpaperComponent name=" + name + ", which=" + which);
            wallpaper = mWallpaperMap.get(userId);
            wallpaper = mWallpaperMap.get(userId);
            if (wallpaper == null) {
            if (wallpaper == null) {
                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
                throw new IllegalStateException("Wallpaper not yet initialized for user " + userId);
@@ -3324,7 +3324,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
                wallpaper.mWhich = which;
                wallpaper.mWhich = which;
                wallpaper.fromForegroundApp = isFromForegroundApp(callingPackage);
                wallpaper.fromForegroundApp = isFromForegroundApp(callingPackage);
                boolean same = changingToSame(name, wallpaper);
                boolean same = changingToSame(name, wallpaper);
                if (bindWallpaperComponentLocked(name, false, true, wallpaper, null)) {

                // force rebind when reapplying a system-only wallpaper to system+lock
                boolean forceRebind = same && mLockWallpaperMap.get(userId) != null
                        && which == (FLAG_SYSTEM | FLAG_LOCK);
                if (bindWallpaperComponentLocked(name, forceRebind, true, wallpaper, null)) {
                    if (!same) {
                    if (!same) {
                        wallpaper.primaryColors = null;
                        wallpaper.primaryColors = null;
                    } else {
                    } else {