diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 27 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java | 19 |
2 files changed, 35 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 1956cee11f90..e8094fbe5c69 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -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; } /** 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 55147f3e59f6..d65e27d0f642 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -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 |