diff options
3 files changed, 49 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayArea.java b/services/core/java/com/android/server/wm/DisplayArea.java index 2be3acc52058..fa2a42e72054 100644 --- a/services/core/java/com/android/server/wm/DisplayArea.java +++ b/services/core/java/com/android/server/wm/DisplayArea.java @@ -200,6 +200,9 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { Comparator.comparingInt(WindowToken::getWindowLayerFromType); private final Predicate<WindowState> mGetOrientingWindow = w -> { + if (!w.isVisible() || !w.mLegacyPolicyVisibilityAfterAnim) { + return false; + } final WindowManagerPolicy policy = mWmService.mPolicy; if (policy.isKeyguardHostWindow(w.mAttrs)) { if (mWmService.mKeyguardGoingAway) { @@ -235,6 +238,7 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> { @Override int getOrientation(int candidate) { + mLastOrientationSource = null; // Find a window requesting orientation. final WindowState win = getWindow(mGetOrientingWindow); diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 0ade5867d059..dd5afdd4f2b9 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -2555,8 +2555,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< pw.print(prefix); pw.println("ContainerAnimator:"); mSurfaceAnimator.dump(pw, prefix + " "); } - if (mLastOrientationSource != null) { + if (mLastOrientationSource != null && this == mDisplayContent) { pw.println(prefix + "mLastOrientationSource=" + mLastOrientationSource); + pw.println(prefix + "deepestLastOrientationSource=" + getLastOrientationSource()); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java index 880c486c15af..d42ab72a22b7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaTest.java @@ -20,6 +20,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.DisplayArea.Type.ABOVE_TASKS; import static com.android.server.wm.DisplayArea.Type.ANY; import static com.android.server.wm.DisplayArea.Type.BELOW_TASKS; @@ -29,11 +32,15 @@ import static com.android.server.wm.DisplayArea.Type.typeOf; import static com.android.server.wm.testing.Assert.assertThrows; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import android.content.pm.ActivityInfo; import android.os.Binder; import android.platform.test.annotations.Presubmit; import android.view.SurfaceControl; +import android.view.View; +import android.view.WindowManager; import org.junit.Rule; import org.junit.Test; @@ -97,6 +104,42 @@ public class DisplayAreaTest { assertThrows(IllegalStateException.class, () -> checkChild(BELOW_TASKS, ANY)); } + + @Test + public void testGetOrientation() { + final DisplayArea.Tokens area = new DisplayArea.Tokens(mWmsRule.getWindowManagerService(), + ABOVE_TASKS, "test"); + final WindowToken token = createWindowToken(TYPE_APPLICATION_OVERLAY); + spyOn(token); + doReturn(mock(DisplayContent.class)).when(token).getDisplayContent(); + doNothing().when(token).setParent(any()); + final WindowState win = createWindowState(token); + spyOn(win); + doNothing().when(win).setParent(any()); + win.mAttrs.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; + token.addChild(win, 0); + area.addChild(token); + + doReturn(true).when(win).isVisible(); + + assertEquals("Visible window can request orientation", + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, + area.getOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)); + + doReturn(false).when(win).isVisible(); + + assertEquals("Invisible window cannot request orientation", + ActivityInfo.SCREEN_ORIENTATION_NOSENSOR, + area.getOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)); + } + + private WindowState createWindowState(WindowToken token) { + return new WindowState(mWmsRule.getWindowManagerService(), mock(Session.class), + new TestIWindow(), token, null /* parentWindow */, 0 /* appOp */, 0 /* seq*/, + new WindowManager.LayoutParams(), View.VISIBLE, 0 /* ownerId */, 0 /* showUserId */, + false /* ownerCanAddInternalSystemWindow */, null); + } + private WindowToken createWindowToken(int type) { return new WindowToken(mWmsRule.getWindowManagerService(), new Binder(), type, false /* persist */, null /* displayContent */, |