From 5e3d35c1021c3b93abc01d4cea202a3c622eedec Mon Sep 17 00:00:00 2001 From: Brian Isganitis Date: Mon, 18 Oct 2021 19:15:24 -0400 Subject: [PATCH] Expose mirror of wallpaper surface in WindowManagerGlobal. Test: Manual Bug: 188222480 Change-Id: I92302053a797de76aec3c2a25e5d895cfc85e6d5 --- core/java/android/view/IWindowManager.aidl | 8 ++++++++ core/java/android/view/WindowManagerGlobal.java | 11 +++++++++++ .../com/android/server/wm/WallpaperController.java | 12 ++++++++++++ .../com/android/server/wm/WindowManagerService.java | 8 ++++++++ 4 files changed, 39 insertions(+) diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 8e149a98af0eb..1791d3a731f74 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -346,6 +346,14 @@ interface IWindowManager */ Bitmap screenshotWallpaper(); + /** + * Mirrors the wallpaper for the given display. + * + * @param displayId ID of the display for the wallpaper. + * @return A SurfaceControl for the parent of the mirrored wallpaper. + */ + SurfaceControl mirrorWallpaperSurface(int displayId); + /** * Registers a wallpaper visibility listener. * @return Current visibility. diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index 18013e815d134..c92a3a086a8bf 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -18,6 +18,7 @@ package android.view; import android.animation.ValueAnimator; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.ActivityManager; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentCallbacks2; @@ -709,6 +710,16 @@ public final class WindowManagerGlobal { } } } + + /** @hide */ + @Nullable + public SurfaceControl mirrorWallpaperSurface(int displayId) { + try { + return getWindowManagerService().mirrorWallpaperSurface(displayId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } final class WindowLeaked extends AndroidRuntimeException { diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index a92e0883db379..d93b649b390af 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -801,6 +801,18 @@ class WallpaperController { wallpaperBuffer.getHardwareBuffer(), wallpaperBuffer.getColorSpace()); } + /** + * Mirrors the visible wallpaper if it's available. + * + * @return A SurfaceControl for the parent of the mirrored wallpaper. + */ + SurfaceControl mirrorWallpaperSurface() { + final WindowState wallpaperWindowState = getTopVisibleWallpaper(); + return wallpaperWindowState != null + ? SurfaceControl.mirrorSurface(wallpaperWindowState.getSurfaceControl()) + : null; + } + WindowState getTopVisibleWallpaper() { mTmpTopWallpaper = null; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ff3919b2c07c0..afa3552e940c6 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3791,6 +3791,14 @@ public class WindowManagerService extends IWindowManager.Stub } } + @Override + public SurfaceControl mirrorWallpaperSurface(int displayId) { + synchronized (mGlobalLock) { + final DisplayContent dc = mRoot.getDisplayContent(displayId); + return dc.mWallpaperController.mirrorWallpaperSurface(); + } + } + /** * Takes a snapshot of the screen. In landscape mode this grabs the whole screen. * In portrait mode, it grabs the upper region of the screen based on the vertical dimension