Merge "Change timing of wallpaper changed intent and add destination" into main
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 38f59ad..c1c96ea 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -299,6 +299,14 @@
"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.
* @hide
diff --git a/core/java/android/app/wallpaper.aconfig b/core/java/android/app/wallpaper.aconfig
index 4091622..c5bd56f 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 2512e11..2d75f35 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.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 @@
if (DEBUG) {
Slog.d(TAG, "publish system wallpaper changed!");
}
- notifyWallpaperChanged(wallpaper);
+ notifyWallpaperComplete(wallpaper);
+ if (fixWallpaperChanged()) {
+ notifyWallpaperChanged(wallpaper);
+ }
}
};
@@ -369,7 +373,10 @@
if (DEBUG) {
Slog.d(TAG, "publish lock wallpaper changed!");
}
- notifyWallpaperChanged(wallpaper);
+ notifyWallpaperComplete(wallpaper);
+ if (fixWallpaperChanged()) {
+ notifyWallpaperChanged(wallpaper);
+ }
}
};
@@ -403,8 +410,11 @@
}
}
- 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 @@
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 @@
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 @@
}
newWallpaper.wallpaperId = makeWallpaperIdLocked();
notifyCallbacksLocked(newWallpaper);
+ if (fixWallpaperChanged()) {
+ notifyWallpaperChanged(newWallpaper);
+ }
shouldNotifyColors = true;
if (offloadColorExtraction()) {
shouldNotifyColors = false;
@@ -3625,8 +3644,18 @@
}
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));
}