From c6778954399d71d3dbb1923c6dad54bad5521f47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Pomini?= Date: Fri, 28 Apr 2023 15:02:53 +0000 Subject: [PATCH] keyguardGoingAway wallpaperCommand Trigger a wallpaper command when ActivityTaskManagerService#keyguardgoingAway is called. This command is not sent if the user has chosen "None" in the screen lock settings, (in this case pressing the power button goes to home directly). Otherwise, this command is always sent after exiting the keyguard, at the moment when the launcher appears. In case there is a bouncer, this command is sent after the bouncer finishes hiding. If not, the command is sent right after the user swipes to go home from lock screen. Bug: 216838820 Test: manual (put a log in onCommand and verify it's properly called) Change-Id: I0eed455c16bb6ec92a3789d89d7197d20ca15ee1 --- core/java/android/app/WallpaperManager.java | 10 +++++ .../wallpaper/WallpaperManagerInternal.java | 3 ++ .../wallpaper/WallpaperManagerService.java | 44 +++++++++++++++++++ .../server/wm/ActivityTaskManagerService.java | 10 +++++ 4 files changed, 67 insertions(+) diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 6592019dc0d92..8c0934b644f0c 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -230,6 +230,16 @@ public class WallpaperManager { */ public static final String COMMAND_WAKING_UP = "android.wallpaper.wakingup"; + /** + * Command for {@link #sendWallpaperCommand}: reported by System UI when the device keyguard + * starts going away. + * This command is triggered by {@link android.app.IActivityTaskManager#keyguardGoingAway(int)}. + * + * @hide + */ + public static final String COMMAND_KEYGUARD_GOING_AWAY = + "android.wallpaper.keyguardgoingaway"; + /** * Command for {@link #sendWallpaperCommand}: reported by System UI when the device is going to * sleep. The x and y arguments are a location (possibly very roughly) corresponding to the diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java index 3699557706fd1..25c07500b8914 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerInternal.java @@ -33,4 +33,7 @@ public abstract class WallpaperManagerInternal { /** Notifies when the screen starts turning on and is not yet visible to the user. */ public abstract void onScreenTurningOn(int displayId); + + /** Notifies when the keyguard is going away. Sent right after the bouncer is gone. */ + public abstract void onKeyguardGoingAway(); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 45c7c9ad4477a..dacbd11a399c2 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1617,6 +1617,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub public void onScreenTurningOn(int displayId) { notifyScreenTurningOn(displayId); } + + @Override + public void onKeyguardGoingAway() { + notifyKeyguardGoingAway(); + } } void initialize() { @@ -2654,6 +2659,45 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } + /** + * Propagate a keyguard going away event to the wallpaper engine. + */ + private void notifyKeyguardGoingAway() { + synchronized (mLock) { + if (mIsLockscreenLiveWallpaperEnabled) { + for (WallpaperData data : getActiveWallpapers()) { + data.connection.forEachDisplayConnector(displayConnector -> { + if (displayConnector.mEngine != null) { + try { + displayConnector.mEngine.dispatchWallpaperCommand( + WallpaperManager.COMMAND_KEYGUARD_GOING_AWAY, + -1, -1, -1, new Bundle()); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to notify that the keyguard is going away", e); + } + } + }); + } + return; + } + + final WallpaperData data = mWallpaperMap.get(mCurrentUserId); + if (data != null && data.connection != null) { + data.connection.forEachDisplayConnector(displayConnector -> { + if (displayConnector.mEngine != null) { + try { + displayConnector.mEngine.dispatchWallpaperCommand( + WallpaperManager.COMMAND_KEYGUARD_GOING_AWAY, + -1, -1, -1, new Bundle()); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + }); + } + } + } + @Override public boolean setLockWallpaperCallback(IWallpaperManagerCallback cb) { checkPermission(android.Manifest.permission.INTERNAL_SYSTEM_WINDOW); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index a0ea1c3dbdbf6..2b4eab4902c42 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -276,6 +276,7 @@ import com.android.server.sdksandbox.SdkSandboxManagerLocal; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.uri.NeededUriGrants; import com.android.server.uri.UriGrantsManagerInternal; +import com.android.server.wallpaper.WallpaperManagerInternal; import java.io.BufferedReader; import java.io.File; @@ -365,6 +366,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private ComponentName mSysUiServiceComponent; private PermissionPolicyInternal mPermissionPolicyInternal; private StatusBarManagerInternal mStatusBarManagerInternal; + private WallpaperManagerInternal mWallpaperManagerInternal; @VisibleForTesting final ActivityTaskManagerInternal mInternal; private PowerManagerInternal mPowerManagerInternal; @@ -3553,6 +3555,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mRootWindowContainer.forAllDisplays(displayContent -> { mKeyguardController.keyguardGoingAway(displayContent.getDisplayId(), flags); }); + getWallpaperManagerInternal().onKeyguardGoingAway(); } } finally { Binder.restoreCallingIdentity(token); @@ -5224,6 +5227,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return mStatusBarManagerInternal; } + WallpaperManagerInternal getWallpaperManagerInternal() { + if (mWallpaperManagerInternal == null) { + mWallpaperManagerInternal = LocalServices.getService(WallpaperManagerInternal.class); + } + return mWallpaperManagerInternal; + } + AppWarnings getAppWarningsLocked() { return mAppWarnings; }