Send screen events to both engines
Changes are only under our flag. If there are two active engines,
notify both for the following events:
- setInAmbientMode (only sent if ImageWallpaper or supportsAmbientMode
is true)
- notifyWakingUp
- notifyGoingToSleep
- notifyScreenTurnedOn
- notifyScreenTurningOn
Bug: 253507223
Test: Manual (log the events with two different live wallpapers)
Change-Id: I1ebbafaca39ce875d2b8e31da986d26f55e45de4
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 9020cb3..45c7c9a 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -2445,12 +2445,36 @@
/**
* TODO(multi-display) Extends this method with specific display.
- * Propagate ambient state to wallpaper engine.
+ * Propagate ambient state to wallpaper engine(s).
*
* @param inAmbientMode {@code true} when in ambient mode, {@code false} otherwise.
* @param animationDuration Duration of the animation, or 0 when immediate.
*/
public void setInAmbientMode(boolean inAmbientMode, long animationDuration) {
+ if (mIsLockscreenLiveWallpaperEnabled) {
+ List<IWallpaperEngine> engines = new ArrayList<>();
+ synchronized (mLock) {
+ mInAmbientMode = inAmbientMode;
+ for (WallpaperData data : getActiveWallpapers()) {
+ if (data.connection.mInfo == null
+ || data.connection.mInfo.supportsAmbientMode()) {
+ // TODO(multi-display) Extends this method with specific display.
+ IWallpaperEngine engine = data.connection
+ .getDisplayConnectorOrCreate(DEFAULT_DISPLAY).mEngine;
+ if (engine != null) engines.add(engine);
+ }
+ }
+ }
+ for (IWallpaperEngine engine : engines) {
+ try {
+ engine.setInAmbientMode(inAmbientMode, animationDuration);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to set ambient mode", e);
+ }
+ }
+ return;
+ }
+
final IWallpaperEngine engine;
synchronized (mLock) {
mInAmbientMode = inAmbientMode;
@@ -2475,10 +2499,25 @@
}
/**
- * Propagate a wake event to the wallpaper engine.
+ * Propagate a wake event to the wallpaper engine(s).
*/
public void notifyWakingUp(int x, int y, @NonNull Bundle extras) {
synchronized (mLock) {
+ if (mIsLockscreenLiveWallpaperEnabled) {
+ for (WallpaperData data : getActiveWallpapers()) {
+ data.connection.forEachDisplayConnector(displayConnector -> {
+ if (displayConnector.mEngine != null) {
+ try {
+ displayConnector.mEngine.dispatchWallpaperCommand(
+ WallpaperManager.COMMAND_WAKING_UP, x, y, -1, extras);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to dispatch COMMAND_WAKING_UP", e);
+ }
+ }
+ });
+ }
+ return;
+ }
final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
if (data != null && data.connection != null) {
data.connection.forEachDisplayConnector(
@@ -2497,10 +2536,26 @@
}
/**
- * Propagate a sleep event to the wallpaper engine.
+ * Propagate a sleep event to the wallpaper engine(s).
*/
public void notifyGoingToSleep(int x, int y, @NonNull Bundle extras) {
synchronized (mLock) {
+ if (mIsLockscreenLiveWallpaperEnabled) {
+ for (WallpaperData data : getActiveWallpapers()) {
+ data.connection.forEachDisplayConnector(displayConnector -> {
+ if (displayConnector.mEngine != null) {
+ try {
+ displayConnector.mEngine.dispatchWallpaperCommand(
+ WallpaperManager.COMMAND_GOING_TO_SLEEP, x, y, -1,
+ extras);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to dispatch COMMAND_GOING_TO_SLEEP", e);
+ }
+ }
+ });
+ }
+ return;
+ }
final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
if (data != null && data.connection != null) {
data.connection.forEachDisplayConnector(
@@ -2520,11 +2575,27 @@
}
/**
- * Propagates screen turned on event to wallpaper engine.
+ * Propagates screen turned on event to wallpaper engine(s).
*/
@Override
public void notifyScreenTurnedOn(int displayId) {
synchronized (mLock) {
+ if (mIsLockscreenLiveWallpaperEnabled) {
+ for (WallpaperData data : getActiveWallpapers()) {
+ if (data.connection.containsDisplay(displayId)) {
+ final IWallpaperEngine engine = data.connection
+ .getDisplayConnectorOrCreate(displayId).mEngine;
+ if (engine != null) {
+ try {
+ engine.onScreenTurnedOn();
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to notify that the screen turned on", e);
+ }
+ }
+ }
+ }
+ return;
+ }
final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
if (data != null
&& data.connection != null
@@ -2545,11 +2616,27 @@
/**
- * Propagate screen turning on event to wallpaper engine.
+ * Propagate screen turning on event to wallpaper engine(s).
*/
@Override
public void notifyScreenTurningOn(int displayId) {
synchronized (mLock) {
+ if (mIsLockscreenLiveWallpaperEnabled) {
+ for (WallpaperData data : getActiveWallpapers()) {
+ if (data.connection.containsDisplay(displayId)) {
+ final IWallpaperEngine engine = data.connection
+ .getDisplayConnectorOrCreate(displayId).mEngine;
+ if (engine != null) {
+ try {
+ engine.onScreenTurningOn();
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Failed to notify that the screen is turning on", e);
+ }
+ }
+ }
+ }
+ return;
+ }
final WallpaperData data = mWallpaperMap.get(mCurrentUserId);
if (data != null
&& data.connection != null
@@ -2576,6 +2663,17 @@
return true;
}
+ private WallpaperData[] getActiveWallpapers() {
+ WallpaperData systemWallpaper = mWallpaperMap.get(mCurrentUserId);
+ WallpaperData lockWallpaper = mLockWallpaperMap.get(mCurrentUserId);
+ boolean systemValid = systemWallpaper != null && systemWallpaper.connection != null;
+ boolean lockValid = lockWallpaper != null && lockWallpaper.connection != null;
+ return systemValid && lockValid ? new WallpaperData[]{systemWallpaper, lockWallpaper}
+ : systemValid ? new WallpaperData[]{systemWallpaper}
+ : lockValid ? new WallpaperData[]{lockWallpaper}
+ : new WallpaperData[0];
+ }
+
private IWallpaperEngine getEngine(int which, int userId, int displayId) {
WallpaperData wallpaperData = findWallpaperAtDisplay(userId, displayId);
if (wallpaperData == null) return null;