diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index b011414bc5561..34e81fcd074c4 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -405,6 +405,12 @@ public interface WindowManagerPolicy { * not attached to any stack. */ int getStackId(); + + /** + * Returns true if the window is current in multi-windowing mode. i.e. it shares the + * screen with other application windows. + */ + public boolean inMultiWindowMode(); } /** diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 9af1304afc689..0115a08cefe55 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -4635,7 +4635,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { } // TYPE_SYSTEM_ERROR is above the NavigationBar so it can't be allowed to extend over it. - if ((fl & FLAG_LAYOUT_NO_LIMITS) != 0 && attrs.type != TYPE_SYSTEM_ERROR) { + // Also, we don't allow windows in multi-window mode to extend out of the screen. + if ((fl & FLAG_LAYOUT_NO_LIMITS) != 0 && attrs.type != TYPE_SYSTEM_ERROR + && !win.inMultiWindowMode()) { df.left = df.top = -10000; df.right = df.bottom = 10000; if (attrs.type != TYPE_WALLPAPER) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 910788ea8b91e..aff668bb48187 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -642,7 +642,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { mHaveFrame = true; final Task task = getTask(); - final boolean fullscreenTask = task == null || task.isFullscreen(); + final boolean fullscreenTask = !inMultiWindowMode(); final boolean windowsAreFloating = task != null && task.isFloating(); if (fullscreenTask || (isChildWindow() @@ -2215,6 +2215,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { return task != null && task.inFreeformWorkspace(); } + @Override + public boolean inMultiWindowMode() { + final Task task = getTask(); + return task != null && !task.isFullscreen(); + } + boolean isDragResizeChanged() { return mDragResizing != computeDragResizing(); } @@ -2506,9 +2512,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { final int pw = mContainingFrame.width(); final int ph = mContainingFrame.height(); final Task task = getTask(); - final boolean nonFullscreenTask = task != null && !task.isFullscreen(); - final boolean fitToDisplay = task != null && - !task.isFloating(); + final boolean nonFullscreenTask = inMultiWindowMode(); + final boolean fitToDisplay = task != null && !task.isFloating(); float x, y; int w,h;