Loading services/core/java/com/android/server/wm/ActivityRecord.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +20 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +20 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading