diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index f0bba4a952d54..9e66c28b56292 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -23,6 +23,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; import static android.view.WindowManager.LayoutParams.FLAG_SCALED; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; +import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static com.android.server.wm.AppWindowAnimator.sDummyAnimation; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; @@ -1322,6 +1323,23 @@ class WindowStateAnimator { return; } + // We crop wallpaper windows to the stack bounds of their current target to avoid them + // showing behind transparent windows in other stacks in split-screen mode. + if (w.getBaseType() == TYPE_WALLPAPER) { + final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); + if (wallpaperTarget != null) { + final Task task = wallpaperTarget.getTask(); + if (task != null && !task.isFullscreen()) { + final TaskStack stack = task.mStack; + if (stack != null && !stack.isFullscreen()) { + stack.getDimBounds(mTmpStackBounds); + clipRect.intersect(mTmpStackBounds); + } + } + } + return; + } + final Task task = w.getTask(); if (task == null || !task.cropWindowsToStackBounds()) { return;