From 689a1b0f83a8f6427d3086edf320def39ac33aa8 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Thu, 12 Mar 2020 15:33:51 -0700 Subject: [PATCH] Explicitly exclude IME from Task Snapshots In Q we built a mechanism for excluding layers from snapshots for excluding the IME from TaskSnapshots, but somehow we never ended up using it. I guess instead we were relying on reparenting or timing. Whatever we were relying on is somehow no longer working. Seems best to fix it with explicit exclusion so we don't have some hidden dependency. Bug: 148953305 Test: Open IME. Enter recents. Change-Id: Iea2541ba3a1943e9137d6681b2a6f876bb63a392 --- core/java/android/view/SurfaceControl.java | 2 +- .../android/server/wm/TaskSnapshotController.java | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 25f5609d99228..c87808b113f67 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1960,7 +1960,7 @@ public final class SurfaceControl implements Parcelable { * @hide */ public static ScreenshotGraphicBuffer captureLayersExcluding(SurfaceControl layer, - Rect sourceCrop, float frameScale, SurfaceControl[] exclude) { + Rect sourceCrop, float frameScale, int format, SurfaceControl[] exclude) { final IBinder displayToken = SurfaceControl.getInternalDisplayToken(); long[] nativeExcludeObjects = new long[exclude.length]; for (int i = 0; i < exclude.length; i++) { diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index f83b0522846cd..0f5cafe9e4e6f 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -352,9 +352,19 @@ class TaskSnapshotController { } task.getBounds(mTmpRect); mTmpRect.offsetTo(0, 0); + + SurfaceControl[] excludeLayers; + final WindowState imeWindow = task.getDisplayContent().mInputMethodWindow; + if (imeWindow != null) { + excludeLayers = new SurfaceControl[1]; + excludeLayers[0] = imeWindow.getSurfaceControl(); + } else { + excludeLayers = new SurfaceControl[0]; + } final SurfaceControl.ScreenshotGraphicBuffer screenshotBuffer = - SurfaceControl.captureLayers( - task.getSurfaceControl(), mTmpRect, scaleFraction, pixelFormat); + SurfaceControl.captureLayersExcluding( + task.getSurfaceControl(), mTmpRect, scaleFraction, + pixelFormat, excludeLayers); if (outTaskSize != null) { outTaskSize.x = mTmpRect.width(); outTaskSize.y = mTmpRect.height();