Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 832730d3 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Use top activity for fixed rotation from snapshot starting window

Assume T=trampoline activity, M=main activity.
When launching T into an existing task which contains the existing M:
The task will have
 Top    = T (no window)  = 'activity'
 Bottom = M (has window) = 'topFullscreenActivity'
Because the real top launching activity is T, we should use it
for checking whether to apply fix rotation. Otherwise fixed rotation
will be skipped because M is not the current top activity, which
will cause the snapshot starting window to be half cropped.

Also make sure the trampoline activity has the same rotation as
the snapshot. Because the snapshot starting window will be shown
on the trampoline first and then transfer to the existing activity.

This relates to commit a95bd4a8 that enables snapshot starting window
to take effect across trampoline activity.

Bug: 236200669
Test: Assume A,B are landscape singleTask activities with the same
      task affinity. A will be finished (clear-task-stack) after
      starting B. Launch the app and return to home and launch it
      again. The starting window should not be cropped.

Change-Id: I11cea671c0e6b9a58ba28f28ce0f735eb576c55d
parent 41bcf680
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -2462,9 +2462,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        if (!newTask && taskSwitch && processRunning && !activityCreated && task.intent != null
                && mActivityComponent.equals(task.intent.getComponent())) {
            final ActivityRecord topAttached = task.getActivity(ActivityRecord::attachedToProcess);
            if (topAttached != null && topAttached.isSnapshotCompatible(snapshot)) {
            if (topAttached != null) {
                if (topAttached.isSnapshotCompatible(snapshot)
                        // This trampoline must be the same rotation.
                        && mDisplayContent.getDisplayRotation().rotationForOrientation(mOrientation,
                                mDisplayContent.getRotation()) == snapshot.getRotation()) {
                    return STARTING_WINDOW_TYPE_SNAPSHOT;
                }
                // No usable snapshot. And a splash screen may also be weird because an existing
                // activity may be shown right after the trampoline is finished.
                return STARTING_WINDOW_TYPE_NONE;
            }
        }
        final boolean isActivityHome = isActivityTypeHome();
        if ((newTask || !processRunning || (taskSwitch && !activityCreated))
+2 −3
Original line number Diff line number Diff line
@@ -158,14 +158,13 @@ public class StartingSurfaceController {
                        + topFullscreenActivity);
                return null;
            }
            if (topFullscreenActivity.getWindowConfiguration().getRotation()
                    != taskSnapshot.getRotation()) {
            if (activity.mDisplayContent.getRotation() != taskSnapshot.getRotation()) {
                // The snapshot should have been checked by ActivityRecord#isSnapshotCompatible
                // that the activity will be updated to the same rotation as the snapshot. Since
                // the transition is not started yet, fixed rotation transform needs to be applied
                // earlier to make the snapshot show in a rotated container.
                activity.mDisplayContent.handleTopActivityLaunchingInDifferentOrientation(
                        topFullscreenActivity, false /* checkOpening */);
                        activity, false /* checkOpening */);
            }
                mService.mAtmService.mTaskOrganizerController.addStartingWindow(task,
                        activity, 0 /* launchTheme */, taskSnapshot);