summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java20
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