summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java27
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java19
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