diff options
9 files changed, 51 insertions, 39 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 95a286cf9047..d97c845ef7c4 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1387,9 +1387,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A /** Whether we should prepare a transition for this {@link ActivityRecord} parent change. */ private boolean shouldStartChangeTransition( @Nullable TaskFragment newParent, @Nullable TaskFragment oldParent) { - if (mWmService.mDisableTransitionAnimation - || mDisplayContent == null || newParent == null || oldParent == null - || getSurfaceControl() == null || !isVisible() || !isVisibleRequested()) { + if (newParent == null || oldParent == null || !canStartChangeTransition()) { return false; } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 74f7e39492ac..c3c8318b45de 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4715,12 +4715,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mWmService.requestTraversal(); } + @Override boolean okToDisplay() { - return okToDisplay(false); - } - - boolean okToDisplay(boolean ignoreFrozen) { - return okToDisplay(ignoreFrozen, false /* ignoreScreenOn */); + return okToDisplay(false /* ignoreFrozen */, false /* ignoreScreenOn */); } boolean okToDisplay(boolean ignoreFrozen, boolean ignoreScreenOn) { @@ -4732,18 +4729,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mDisplayInfo.state == Display.STATE_ON; } - boolean okToAnimate() { - return okToAnimate(false); - } - - boolean okToAnimate(boolean ignoreFrozen) { - return okToAnimate(ignoreFrozen, false /* ignoreScreenOn */); - } - + @Override boolean okToAnimate(boolean ignoreFrozen, boolean ignoreScreenOn) { return okToDisplay(ignoreFrozen, ignoreScreenOn) && (mDisplayId != DEFAULT_DISPLAY - || mWmService.mPolicy.okToAnimate(ignoreScreenOn)); + || mWmService.mPolicy.okToAnimate(ignoreScreenOn)) + && getDisplayPolicy().isScreenOnFully(); } static final class TaskForResizePointSearchResult { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 1b7a012094f6..d2eea76a29fc 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -2163,10 +2163,7 @@ class Task extends TaskFragment { } private boolean shouldStartChangeTransition(int prevWinMode, int newWinMode) { - if (mWmService.mDisableTransitionAnimation - || !isVisible() - || getSurfaceControl() == null - || !isLeafTask()) { + if (!isLeafTask() || !canStartChangeTransition()) { return false; } // Only do an animation into and out-of freeform mode for now. Other mode diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 51cede0c051d..f32ab1e53318 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2125,13 +2125,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { /** Whether we should prepare a transition for this {@link TaskFragment} bounds change. */ private boolean shouldStartChangeTransition(Rect startBounds) { - if (mWmService.mDisableTransitionAnimation - || mDisplayContent == null - || mTaskFragmentOrganizer == null - || getSurfaceControl() == null - // The change transition will be covered by display. - || mDisplayContent.inTransition() - || !isVisible()) { + if (mTaskFragmentOrganizer == null || !canStartChangeTransition()) { return false; } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 58bc244e9250..5af9147cd56f 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -2600,6 +2600,13 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< mSurfaceFreezer.unfreeze(getPendingTransaction()); } + /** Whether we can start change transition with this window and current display status. */ + boolean canStartChangeTransition() { + return !mWmService.mDisableTransitionAnimation && mDisplayContent != null + && getSurfaceControl() != null && !mDisplayContent.inTransition() + && isVisible() && isVisibleRequested() && okToAnimate(); + } + /** * Initializes a change transition. See {@link SurfaceFreezer} for more information. * @@ -2948,12 +2955,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< } boolean okToAnimate() { - return okToAnimate(false /* ignoreFrozen */); - } - - boolean okToAnimate(boolean ignoreFrozen) { - final DisplayContent dc = getDisplayContent(); - return dc != null && dc.okToAnimate(ignoreFrozen); + return okToAnimate(false /* ignoreFrozen */, false /* ignoreScreenOn */); } boolean okToAnimate(boolean ignoreFrozen, boolean ignoreScreenOn) { diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index fc2c162d058b..707e463424ae 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -1779,11 +1779,6 @@ public class ActivityRecordTests extends WindowTestsBase { anyInt() /* orientation */, anyInt() /* lastRotation */); // Set to visible so the activity can freeze the screen. activity.setVisibility(true); - // Update the display policy to make the screen fully turned on so the freeze is allowed - display.getDisplayPolicy().screenTurnedOn(null); - display.getDisplayPolicy().finishKeyguardDrawn(); - display.getDisplayPolicy().finishWindowsDrawn(); - display.getDisplayPolicy().finishScreenTurningOn(); display.rotateInDifferentOrientationIfNeeded(activity); display.setFixedRotationLaunchingAppUnchecked(activity); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 6737b1ade785..730275cde40b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -16,11 +16,14 @@ package com.android.server.wm; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.any; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.mockito.Mockito.clearInvocations; import android.graphics.Rect; @@ -91,6 +94,7 @@ public class TaskFragmentTest extends WindowTestsBase { final Rect endBounds = new Rect(500, 500, 1000, 1000); mTaskFragment.setBounds(startBounds); doReturn(true).when(mTaskFragment).isVisible(); + doReturn(true).when(mTaskFragment).isVisibleRequested(); clearInvocations(mTransaction); mTaskFragment.setBounds(endBounds); @@ -108,6 +112,25 @@ public class TaskFragmentTest extends WindowTestsBase { verify(mTransaction).setWindowCrop(mLeash, 500, 500); } + @Test + public void testNotOkToAnimate_doNotStartChangeTransition() { + mockSurfaceFreezerSnapshot(mTaskFragment.mSurfaceFreezer); + final Rect startBounds = new Rect(0, 0, 1000, 1000); + final Rect endBounds = new Rect(500, 500, 1000, 1000); + mTaskFragment.setBounds(startBounds); + doReturn(true).when(mTaskFragment).isVisible(); + doReturn(true).when(mTaskFragment).isVisibleRequested(); + + final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy(); + displayPolicy.screenTurnedOff(); + + assertFalse(mTaskFragment.okToAnimate()); + + mTaskFragment.setBounds(endBounds); + + verify(mTaskFragment, never()).initializeChangeTransition(any()); + } + /** * Tests that when a {@link TaskFragmentInfo} is generated from a {@link TaskFragment}, an * activity that has not yet been attached to a process because it is being initialized but diff --git a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java index 0e504d326280..e0f69d4f2eaf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestDisplayContent.java @@ -165,6 +165,11 @@ class TestDisplayContent extends DisplayContent { doReturn(false).when(displayPolicy).hasStatusBar(); doReturn(false).when(newDisplay).supportsSystemDecorations(); } + // Update the display policy to make the screen fully turned on so animation is allowed + displayPolicy.screenTurnedOn(null /* screenOnListener */); + displayPolicy.finishKeyguardDrawn(); + displayPolicy.finishWindowsDrawn(); + displayPolicy.finishScreenTurningOn(); if (mStatusBarHeight > 0) { doReturn(true).when(displayPolicy).hasStatusBar(); doAnswer(invocation -> { diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 88d8ba308b45..b997acfaadcf 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -200,6 +200,13 @@ class WindowTestsBase extends SystemServiceTestsBase { SystemServicesTestRule.checkHoldsLock(mWm.mGlobalLock); mDefaultDisplay = mWm.mRoot.getDefaultDisplay(); + // Update the display policy to make the screen fully turned on so animation is allowed + final DisplayPolicy displayPolicy = mDefaultDisplay.getDisplayPolicy(); + displayPolicy.screenTurnedOn(null /* screenOnListener */); + displayPolicy.finishKeyguardDrawn(); + displayPolicy.finishWindowsDrawn(); + displayPolicy.finishScreenTurningOn(); + mTransaction = mSystemServicesTestRule.mTransaction; mMockSession = mock(Session.class); |