Loading services/core/java/com/android/server/wm/AppWindowToken.java +16 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean removed; // Information about an application starting window if displayed. // Note: these are de-referenced before the starting window animates away. StartingData mStartingData; WindowState startingWindow; StartingSurface startingSurface; Loading Loading @@ -1243,6 +1244,21 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree return true; } /** * @return {@code true} if starting window is in app's hierarchy. */ boolean hasStartingWindow() { if (startingDisplayed || mStartingData != null) { return true; } for (int i = mChildren.size() - 1; i >= 0; i--) { if (getChildAt(i).mAttrs.type == TYPE_APPLICATION_STARTING) { return true; } } return false; } @Override void addWindow(WindowState w) { super.addWindow(w); Loading services/core/java/com/android/server/wm/DisplayContent.java +7 −3 Original line number Diff line number Diff line Loading @@ -4845,9 +4845,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // // In the case where we have no IME target we assign it where it's base layer would // place it in the AboveAppWindowContainers. if (imeTarget != null && !(imeTarget.inSplitScreenWindowingMode() || imeTarget.mToken.isAppAnimating()) && (imeTarget.getSurfaceControl() != null)) { // // Keep IME window in mAboveAppWindowsContainers as long as app's starting window exists // so it get's layered above the starting window. if (imeTarget != null && !(imeTarget.mAppToken != null && imeTarget.mAppToken.hasStartingWindow()) && (!(imeTarget.inSplitScreenWindowingMode() || imeTarget.mToken.isAppAnimating()) && (imeTarget.getSurfaceControl() != null))) { mImeWindowsContainers.assignRelativeLayer(t, imeTarget.getSurfaceControl(), // TODO: We need to use an extra level on the app surface to ensure // this is always above SurfaceView but always below attached window. Loading services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java +15 −0 Original line number Diff line number Diff line Loading @@ -504,6 +504,21 @@ public class AppWindowTokenTests extends WindowTestsBase { assertEquals(stackBounds, mToken.getAnimationBounds(STACK_CLIP_BEFORE_ANIM)); } @Test public void testHasStartingWindow() { final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION_STARTING); final WindowTestUtils.TestWindowState startingWindow = createWindowState(attrs, mToken); mToken.startingDisplayed = true; mToken.addWindow(startingWindow); assertTrue("Starting window should be present", mToken.hasStartingWindow()); mToken.startingDisplayed = false; assertTrue("Starting window should be present", mToken.hasStartingWindow()); mToken.removeChild(startingWindow); assertFalse("Starting window should not be present", mToken.hasStartingWindow()); } private void assertHasStartingWindow(AppWindowToken atoken) { assertNotNull(atoken.startingSurface); assertNotNull(atoken.mStartingData); Loading Loading
services/core/java/com/android/server/wm/AppWindowToken.java +16 −0 Original line number Diff line number Diff line Loading @@ -206,6 +206,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean removed; // Information about an application starting window if displayed. // Note: these are de-referenced before the starting window animates away. StartingData mStartingData; WindowState startingWindow; StartingSurface startingSurface; Loading Loading @@ -1243,6 +1244,21 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree return true; } /** * @return {@code true} if starting window is in app's hierarchy. */ boolean hasStartingWindow() { if (startingDisplayed || mStartingData != null) { return true; } for (int i = mChildren.size() - 1; i >= 0; i--) { if (getChildAt(i).mAttrs.type == TYPE_APPLICATION_STARTING) { return true; } } return false; } @Override void addWindow(WindowState w) { super.addWindow(w); Loading
services/core/java/com/android/server/wm/DisplayContent.java +7 −3 Original line number Diff line number Diff line Loading @@ -4845,9 +4845,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // // In the case where we have no IME target we assign it where it's base layer would // place it in the AboveAppWindowContainers. if (imeTarget != null && !(imeTarget.inSplitScreenWindowingMode() || imeTarget.mToken.isAppAnimating()) && (imeTarget.getSurfaceControl() != null)) { // // Keep IME window in mAboveAppWindowsContainers as long as app's starting window exists // so it get's layered above the starting window. if (imeTarget != null && !(imeTarget.mAppToken != null && imeTarget.mAppToken.hasStartingWindow()) && (!(imeTarget.inSplitScreenWindowingMode() || imeTarget.mToken.isAppAnimating()) && (imeTarget.getSurfaceControl() != null))) { mImeWindowsContainers.assignRelativeLayer(t, imeTarget.getSurfaceControl(), // TODO: We need to use an extra level on the app surface to ensure // this is always above SurfaceView but always below attached window. Loading
services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java +15 −0 Original line number Diff line number Diff line Loading @@ -504,6 +504,21 @@ public class AppWindowTokenTests extends WindowTestsBase { assertEquals(stackBounds, mToken.getAnimationBounds(STACK_CLIP_BEFORE_ANIM)); } @Test public void testHasStartingWindow() { final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION_STARTING); final WindowTestUtils.TestWindowState startingWindow = createWindowState(attrs, mToken); mToken.startingDisplayed = true; mToken.addWindow(startingWindow); assertTrue("Starting window should be present", mToken.hasStartingWindow()); mToken.startingDisplayed = false; assertTrue("Starting window should be present", mToken.hasStartingWindow()); mToken.removeChild(startingWindow); assertFalse("Starting window should not be present", mToken.hasStartingWindow()); } private void assertHasStartingWindow(AppWindowToken atoken) { assertNotNull(atoken.startingSurface); assertNotNull(atoken.mStartingData); Loading