From c24f373d54ae6f9aee28380eb95fd0a97f0bd0b5 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Tue, 8 Aug 2017 19:35:17 -0700 Subject: [PATCH] Don't set inset frame for letterboxed app in fullscreen When transitioning from split-screen to fullscreen for letterboxed apps we were not clearing window inset frame in some cases. This lead to incorrect mFrame calculation and app looked like it was stuck in split screen. This CL always clears inset frame for letterboxed app - when task is fullscreen but app window bounds are not empty. Fixes: 64369819 Test: com.android.server.wm.WindowFrameTests#testLayoutLetterboxedWindow Change-Id: I84d49642efb874caa55f2dbd8092d33e6b6f0ed4 --- .../com/android/server/wm/WindowState.java | 2 +- .../android/server/wm/WindowFrameTests.java | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 02242f3128a70..534b4d8934ab3 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -754,7 +754,7 @@ class WindowState extends WindowContainer implements WindowManagerP // If the task has temp inset bounds set, we have to make sure all its windows uses // the temp inset frame. Otherwise different display frames get applied to the main // window and the child window, making them misaligned. - if (inFullscreenContainer) { + if (inFullscreenContainer || isLetterboxedAppWindow()) { mInsetFrame.setEmpty(); } else if (task != null && isInMultiWindowMode()) { task.getTempInsetBounds(mInsetFrame); diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java index 8fe411653ce20..6e253e743ddba 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java @@ -363,6 +363,50 @@ public class WindowFrameTests extends WindowTestsBase { Math.min(pf.height(), displayInfo.logicalHeight)); } + @Test + public void testLayoutLetterboxedWindow() { + // First verify task behavior in multi-window mode. + final DisplayInfo displayInfo = sWm.getDefaultDisplayContentLocked().getDisplayInfo(); + final int logicalWidth = displayInfo.logicalWidth; + final int logicalHeight = displayInfo.logicalHeight; + + final int taskLeft = logicalWidth / 5; + final int taskTop = logicalHeight / 5; + final int taskRight = logicalWidth / 4 * 3; + final int taskBottom = logicalHeight / 4 * 3; + final Rect taskBounds = new Rect(taskLeft, taskTop, taskRight, taskBottom); + TaskWithBounds task = new TaskWithBounds(taskBounds); + task.mInsetBounds.set(taskLeft, taskTop, taskRight, taskBottom); + task.mFullscreenForTest = false; + WindowState w = createWindow(task, FILL_PARENT, FILL_PARENT); + w.mAttrs.gravity = Gravity.LEFT | Gravity.TOP; + + final Rect pf = new Rect(0, 0, logicalWidth, logicalHeight); + w.computeFrameLw(pf /* parentFrame */, pf /* displayFrame */, pf /* overscanFrame */, + pf /* contentFrame */, pf /* visibleFrame */, pf /* decorFrame */, + pf /* stableFrame */, null /* outsetFrame */); + // For non fullscreen tasks the containing frame is based off the + // task bounds not the parent frame. + assertRect(w.mFrame, taskLeft, taskTop, taskRight, taskBottom); + assertRect(w.getContentFrameLw(), taskLeft, taskTop, taskRight, taskBottom); + assertRect(w.mContentInsets, 0, 0, 0, 0); + + // Now simulate switch to fullscreen for letterboxed app. + final int xInset = logicalWidth / 10; + final int yInset = logicalWidth / 10; + final Rect cf = new Rect(xInset, yInset, logicalWidth - xInset, logicalHeight - yInset); + w.mAppToken.onOverrideConfigurationChanged(w.mAppToken.getOverrideConfiguration(), cf); + pf.set(0, 0, logicalWidth, logicalHeight); + task.mFullscreenForTest = true; + + w.computeFrameLw(pf /* parentFrame */, pf /* displayFrame */, pf /* overscanFrame */, + cf /* contentFrame */, cf /* visibleFrame */, pf /* decorFrame */, + cf /* stableFrame */, null /* outsetFrame */); + assertEquals(cf, w.mFrame); + assertEquals(cf, w.getContentFrameLw()); + assertRect(w.mContentInsets, 0, 0, 0, 0); + } + private WindowStateWithTask createWindow(Task task, int width, int height) { final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION); attrs.width = width;