diff options
| author | 2022-02-25 18:10:21 +0800 | |
|---|---|---|
| committer | 2022-03-01 11:28:36 +0800 | |
| commit | 798fd18b1e18c25fa2593e8bcaa0dd1594f4bf73 (patch) | |
| tree | 715617394857c14bc9bdb47b2ce92c78ec655e35 | |
| parent | 95db721b82cd3b6e5b0a6ef1d4efac28876ceb3b (diff) | |
Include ActivityRecord in the transition when windowingMode changed
When Shell start transition with changing windowing mode on Task, it
may only collect the Task as a transition participant. We want to also
include ActivityRecord so that when the transition is finished, it will
dispatch app transition finished event correctly.
Fix: 221185010
Test: atest WmTests:ActivityRecordTests
#testShellTransitionTaskWindowingModeChange
Change-Id: Ib59b83600b803bd6e96ed7b0db1089b7c3da21bd
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 15 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java | 20 |
2 files changed, 35 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 26815b4c4fde..764d14832476 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -44,6 +44,7 @@ import static android.app.WindowConfiguration.ROTATION_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.activityTypeToString; import static android.app.WindowConfiguration.isSplitScreenWindowingMode; import static android.app.admin.DevicePolicyResources.Drawables.Source.PROFILE_SWITCH_ANIMATION; @@ -8211,6 +8212,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override public void onConfigurationChanged(Configuration newParentConfig) { + // We want to collect the ActivityRecord if the windowing mode is changed, so that it will + // dispatch app transition finished event correctly at the end. + // Check #isVisible() because we don't want to animate for activity that stays invisible. + // Activity with #isVisibleRequested() changed should be collected when that is requested. + if (mTransitionController.isShellTransitionsEnabled() && isVisible() + && isVisibleRequested()) { + final int projectedWindowingMode = + getRequestedOverrideWindowingMode() == WINDOWING_MODE_UNDEFINED + ? newParentConfig.windowConfiguration.getWindowingMode() + : getRequestedOverrideWindowingMode(); + if (getWindowingMode() != projectedWindowingMode) { + mTransitionController.collect(this); + } + } if (mCompatDisplayInsets != null) { Configuration overrideConfig = getRequestedOverrideConfiguration(); // Adapt to changes in orientation locking. The app is still non-resizable, but 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 b3d6b3e04d59..2ea0bdc4354e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -24,6 +24,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_LAYOUT; import static android.content.pm.ActivityInfo.FLAG_SUPPORTS_PICTURE_IN_PICTURE; @@ -54,6 +55,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_OLD_ACTIVITY_OPEN; +import static android.view.WindowManager.TRANSIT_PIP; import static android.window.StartingWindowInfo.TYPE_PARAMETER_LEGACY_SPLASH_SCREEN; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; @@ -3397,6 +3399,24 @@ public class ActivityRecordTests extends WindowTestsBase { assertFalse(activity.mVisibleRequested); } + @Test + public void testShellTransitionTaskWindowingModeChange() { + final ActivityRecord activity = createActivityWithTask(); + final Task task = activity.getTask(); + task.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + + assertTrue(activity.isVisible()); + assertTrue(activity.isVisibleRequested()); + assertEquals(WINDOWING_MODE_FULLSCREEN, activity.getWindowingMode()); + + registerTestTransitionPlayer(); + task.mTransitionController.requestTransitionIfNeeded(TRANSIT_PIP, task); + task.setWindowingMode(WINDOWING_MODE_PINNED); + + // Collect activity in the transition if the Task windowing mode is going to change. + assertTrue(activity.inTransition()); + } + private ICompatCameraControlCallback getCompatCameraControlCallback() { return new ICompatCameraControlCallback.Stub() { @Override |