From 16974702576808512100f4c0e9625e3003048235 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Tue, 16 Aug 2022 14:04:41 +0800 Subject: [PATCH] Do not start change transition when the bounds size is not changed Before, we take screenshot if the organized TaskFragment bounds is changed. Now, we only take screenshot if the bounds size is changed. Fix: 242666263 Test: testStartChangeTransition_doNotFreezeWhenSizeNotChanged Change-Id: I30230024ce85482732374b57dd666d1f902b4fc3 --- .../com/android/server/wm/TaskFragment.java | 5 ++++- .../com/android/server/wm/TaskFragmentTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 3b25f2876de4e..8b1f9140e0d15 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -2333,7 +2333,10 @@ class TaskFragment extends WindowContainer { return false; } - return !startBounds.equals(getBounds()); + // Only take snapshot if the bounds are resized. + final Rect endBounds = getConfiguration().windowConfiguration.getBounds(); + return endBounds.width() != startBounds.width() + || endBounds.height() != startBounds.height(); } boolean canHaveEmbeddingActivityTransition(@NonNull ActivityRecord child) { 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 1096351524d77..0dd57560e0152 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -132,6 +132,23 @@ public class TaskFragmentTest extends WindowTestsBase { verify(mTransaction).setWindowCrop(mLeash, 500, 500); } + @Test + public void testStartChangeTransition_doNotFreezeWhenOnlyMoved() { + final Rect startBounds = new Rect(0, 0, 1000, 1000); + final Rect endBounds = new Rect(startBounds); + endBounds.offset(500, 0); + mTaskFragment.setBounds(startBounds); + doReturn(true).when(mTaskFragment).isVisible(); + doReturn(true).when(mTaskFragment).isVisibleRequested(); + + clearInvocations(mTransaction); + mTaskFragment.setBounds(endBounds); + + // No change transition, but update the organized surface position. + verify(mTaskFragment, never()).initializeChangeTransition(any(), any()); + verify(mTransaction).setPosition(mLeash, endBounds.left, endBounds.top); + } + @Test public void testNotOkToAnimate_doNotStartChangeTransition() { mockSurfaceFreezerSnapshot(mTaskFragment.mSurfaceFreezer);