From efc5b0f54e8ce06a5d997c3f8f4fb6b3af44a64b Mon Sep 17 00:00:00 2001 From: Chris Poultney Date: Thu, 26 Sep 2024 11:49:26 -0400 Subject: Change timing of wallpaper changed intent and add destination Bug: 369814294 Test: manually verified timing when setting wallpaper Flag: android.app.fix_wallpaper_changed Change-Id: I4369d2993c3cfca7c66c1983508b6ab5dad02a6c --- core/java/android/app/WallpaperManager.java | 8 +++++ core/java/android/app/wallpaper.aconfig | 8 +++++ .../server/wallpaper/WallpaperManagerService.java | 37 +++++++++++++++++++--- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 38f59adfcc1e..c1c96eaa098d 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -298,6 +298,14 @@ public class WallpaperManager { public static final String EXTRA_FROM_FOREGROUND_APP = "android.service.wallpaper.extra.FROM_FOREGROUND_APP"; + /** + * Extra passed on {@link Intent.ACTION_WALLPAPER_CHANGED} indicating if wallpaper was set from + * a foreground app. + * @hide + */ + public static final String EXTRA_WHICH_WALLPAPER_CHANGED = + "android.service.wallpaper.extra.WHICH_WALLPAPER_CHANGED"; + /** * The different screen orientations. {@link #getOrientation} provides their exact definition. * This is only used internally by the framework and the WallpaperBackupAgent. diff --git a/core/java/android/app/wallpaper.aconfig b/core/java/android/app/wallpaper.aconfig index 409162202b59..c5bd56ff67aa 100644 --- a/core/java/android/app/wallpaper.aconfig +++ b/core/java/android/app/wallpaper.aconfig @@ -1,8 +1,16 @@ package: "android.app" container: "system" + flag { name: "remove_next_wallpaper_component" namespace: "systemui" description: "Remove deprecated field WallpaperData#nextWallpaperComponent. Only effective after rebooting." bug: "365991991" } + +flag { + name: "fix_wallpaper_changed" + namespace: "systemui" + description: "Fixes timing of wallpaper changed notification and adds extra information. Only effective after rebooting." + bug: "369814294" +} diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 4754ffb5cf6e..1043c69319f3 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.MANAGE_EXTERNAL_STORAGE; import static android.Manifest.permission.READ_WALLPAPER_INTERNAL; import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; +import static android.app.Flags.fixWallpaperChanged; import static android.app.Flags.removeNextWallpaperComponent; import static android.app.WallpaperManager.COMMAND_REAPPLY; import static android.app.WallpaperManager.FLAG_LOCK; @@ -349,7 +350,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (DEBUG) { Slog.d(TAG, "publish system wallpaper changed!"); } - notifyWallpaperChanged(wallpaper); + notifyWallpaperComplete(wallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(wallpaper); + } } }; @@ -369,7 +373,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub if (DEBUG) { Slog.d(TAG, "publish lock wallpaper changed!"); } - notifyWallpaperChanged(wallpaper); + notifyWallpaperComplete(wallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(wallpaper); + } } }; @@ -403,8 +410,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } - private void notifyWallpaperChanged(WallpaperData wallpaper) { - // Publish completion *after* we've persisted the changes + /* + * Calls wallpaper setComplete methods. Called for static wallpapers after the wallpaper is set + * and changes are persisted. + */ + private void notifyWallpaperComplete(WallpaperData wallpaper) { if (wallpaper.setComplete != null) { try { wallpaper.setComplete.onWallpaperChanged(); @@ -1787,6 +1797,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub switchWallpaper(systemWallpaper, null); // TODO(b/278261563): call notifyCallbacksLocked inside switchWallpaper notifyCallbacksLocked(systemWallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(systemWallpaper); + } } if (mLockWallpaperWaitingForUnlock) { final WallpaperData lockWallpaper = @@ -1794,6 +1807,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub lockWallpaper.mBindSource = BindSource.SWITCH_WALLPAPER_UNLOCK_USER; switchWallpaper(lockWallpaper, null); notifyCallbacksLocked(lockWallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(lockWallpaper); + } } // Make sure that the SELinux labeling of all the relevant files is correct. @@ -3248,6 +3264,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } newWallpaper.wallpaperId = makeWallpaperIdLocked(); notifyCallbacksLocked(newWallpaper); + if (fixWallpaperChanged()) { + notifyWallpaperChanged(newWallpaper); + } shouldNotifyColors = true; if (offloadColorExtraction()) { shouldNotifyColors = false; @@ -3610,8 +3629,18 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } wallpaper.callbacks.finishBroadcast(); + if (!fixWallpaperChanged()) { + final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED); + intent.putExtra(WallpaperManager.EXTRA_FROM_FOREGROUND_APP, + wallpaper.fromForegroundApp); + mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId)); + } + } + + private void notifyWallpaperChanged(WallpaperData wallpaper) { final Intent intent = new Intent(Intent.ACTION_WALLPAPER_CHANGED); intent.putExtra(WallpaperManager.EXTRA_FROM_FOREGROUND_APP, wallpaper.fromForegroundApp); + intent.putExtra(WallpaperManager.EXTRA_WHICH_WALLPAPER_CHANGED, wallpaper.mWhich); mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId)); } -- cgit v1.2.3-59-g8ed1b