Merge "Include ActivityRecord in the transition when windowingMode changed" into tm-dev

This commit is contained in:
TreeHugger Robot
2022-03-01 06:20:01 +00:00
committed by Android (Google) Code Review
2 changed files with 35 additions and 0 deletions

View File

@@ -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

View File

@@ -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