From f93b6d2717bf80f59ebf4f0bc53616949b1db920 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 21 Mar 2018 13:48:26 +0100 Subject: [PATCH] Preserve letterbox while dragResizing Fixes an issue where the letterbox would disappear while entering and leaving dragResizing, because this clears the hasDrawnState. To fix this, also treat preserved surfaces as ready to show for letterboxing purposes. Change-Id: I4d6e1b1a27d99542370fde8924f126eca1ea80d5 Fixes: 76008154 Test: Enable double cutout, enter split screen, go home, touch slider verify the letterbox does not flicker. --- .../core/java/com/android/server/wm/AppWindowToken.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index d2ddf551fc8d8..f77439e15cafa 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1471,11 +1471,13 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree void layoutLetterbox(WindowState winHint) { final WindowState w = findMainWindow(); - if (w != winHint && winHint != null && w != null) { + if (w == null || winHint != null && w != winHint) { return; } - final boolean needsLetterbox = w != null && w.isLetterboxedAppWindow() - && fillsParent() && w.hasDrawnLw(); + final boolean surfaceReady = w.hasDrawnLw() // Regular case + || w.mWinAnimator.mSurfaceDestroyDeferred // The preserved surface is still ready. + || w.isDragResizeChanged(); // Waiting for relayoutWindow to call preserveSurface. + final boolean needsLetterbox = w.isLetterboxedAppWindow() && fillsParent() && surfaceReady; if (needsLetterbox) { if (mLetterbox == null) { mLetterbox = new Letterbox(() -> makeChildSurface(null));