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

Commit d89a5804 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Consider requested orientation for snapshot compatible

For example, the display is portrait so the task is also portrait.
But the activity in the task requested landscape which will make
the display update to landscape later. Then if the snapshot was
taken in landscape, the snapshot should be compatible because
the activity will be pre-rotated with fixed rotation.

Bug: 216079545
Test: ActivityRecordTests#testIsSnapshotCompatibleTaskSizeChanged
Test: Swipe quickstep to an existing activity with different
      orientation. There should not be splash screen window.
Change-Id: Ic87ead99c918de19438f88472f01541208469a36
parent 08c570a8
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -2452,20 +2452,29 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            // Obsoleted snapshot.
            return false;
        }
        final Rect taskBounds = task.getBounds();
        final Point taskSize = snapshot.getTaskSize();
        // Task size has changed? e.g. foldable device.
        if (Math.abs(((float) taskSize.x / Math.max(taskSize.y, 1))
                - ((float) taskBounds.width() / Math.max(taskBounds.height(), 1))) > 0.01f) {
            return false;
        }
        final int rotation = mDisplayContent.rotationForActivityInDifferentOrientation(this);
        final int currentRotation = task.getWindowConfiguration().getRotation();
        final int targetRotation = rotation != ROTATION_UNDEFINED
                // The display may rotate according to the orientation of this activity.
                ? rotation
                // The activity won't change display orientation.
                : task.getWindowConfiguration().getRotation();
        return snapshot.getRotation() == targetRotation;
                : currentRotation;
        if (snapshot.getRotation() != targetRotation) {
            return false;
        }
        final Rect taskBounds = task.getBounds();
        int w = taskBounds.width();
        int h = taskBounds.height();
        final Point taskSize = snapshot.getTaskSize();
        if ((Math.abs(currentRotation - targetRotation) % 2) == 1) {
            // Flip the size if the activity will show in 90 degree difference.
            final int t = w;
            w = h;
            h = t;
        }
        // Task size might be changed with the same rotation such as on a foldable device.
        return Math.abs(((float) taskSize.x / Math.max(taskSize.y, 1))
                - ((float) w / Math.max(h, 1))) <= 0.01f;
    }

    /**
+17 −2
Original line number Diff line number Diff line
@@ -1896,10 +1896,13 @@ public class ActivityRecordTests extends WindowTestsBase {
        final ActivityRecord activity = createActivityWithTask();
        final Task task = activity.getTask();
        final Rect taskBounds = task.getBounds();
        final int currentRotation = mDisplayContent.getRotation();
        final int w = taskBounds.width();
        final int h = taskBounds.height();
        final TaskSnapshot snapshot = new TaskSnapshotPersisterTestBase.TaskSnapshotBuilder()
                .setTopActivityComponent(activity.mActivityComponent)
                .setRotation(activity.getWindowConfiguration().getRotation())
                .setTaskSize(taskBounds.width(), taskBounds.height())
                .setRotation(currentRotation)
                .setTaskSize(w, h)
                .build();

        assertTrue(activity.isSnapshotCompatible(snapshot));
@@ -1909,6 +1912,18 @@ public class ActivityRecordTests extends WindowTestsBase {
        activity.getWindowConfiguration().setBounds(taskBounds);

        assertFalse(activity.isSnapshotCompatible(snapshot));

        // Flipped size should be accepted if the activity will show with 90 degree rotation.
        final int targetRotation = currentRotation + 1;
        doReturn(targetRotation).when(mDisplayContent)
                .rotationForActivityInDifferentOrientation(any());
        final TaskSnapshot rotatedSnapshot = new TaskSnapshotPersisterTestBase.TaskSnapshotBuilder()
                .setTopActivityComponent(activity.mActivityComponent)
                .setRotation(targetRotation)
                .setTaskSize(h, w)
                .build();
        task.getWindowConfiguration().getBounds().set(0, 0, w, h);
        assertTrue(activity.isSnapshotCompatible(rotatedSnapshot));
    }

    @Test