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
This commit is contained in:
Aurélien Pomini
2023-04-28 17:28:05 +00:00
parent fbba5e15f6
commit 9eceeb066b

View File

@@ -2445,12 +2445,36 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
/**
* 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 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
/**
* 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 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
/**
* 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 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
}
/**
* 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 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
/**
* 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 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
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;