Screenshots broken for activities with dialog themes
Makes progress towards fixing screenshots and transitions
for non-fullscreen activities.
Partially reverts I48053f551ed1c118764aa30e0b6408db64d4a5f1 and
applies it in a way that does not break screenshots in general.
Note that screenshots of non-fullscreen activities are still somewhat
broken because their insets can currently not be calculated correctly.
Bug: 72757033
Test: Open dialog activity, go to recents, verify it has a reasonable screenshot and smooth transition
Test: Open letterboxed activity, go to recents, verify it has a reasonable screenshot and smooth transition
Change-Id: Ica4d88370df00a91724d59b2cad6b27826beba04
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index c04522e..2672337 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -1728,6 +1728,8 @@
frame.set(win.mContainingFrame);
}
surfaceInsets = win.getAttrs().surfaceInsets;
+ // XXX(b/72757033): These are insets relative to the window frame, but we're really
+ // interested in the insets relative to the frame we chose in the if-blocks above.
insets.set(win.mContentInsets);
stableInsets.set(win.mStableInsets);
}
@@ -2120,4 +2122,12 @@
}
return stringName + ((mIsExiting) ? " mIsExiting=" : "");
}
+
+ Rect getLetterboxInsets() {
+ if (mLetterbox != null) {
+ return mLetterbox.getInsets();
+ } else {
+ return new Rect();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/wm/Letterbox.java b/services/core/java/com/android/server/wm/Letterbox.java
index 8fa79ab..0f9735d 100644
--- a/services/core/java/com/android/server/wm/Letterbox.java
+++ b/services/core/java/com/android/server/wm/Letterbox.java
@@ -68,6 +68,17 @@
}
/**
+ * Gets the insets between the outer and inner rects.
+ */
+ public Rect getInsets() {
+ return new Rect(
+ mLeft.getWidth(),
+ mTop.getHeight(),
+ mRight.getWidth(),
+ mBottom.getHeight());
+ }
+
+ /**
* Hides the letterbox.
*
* @param t a transaction in which to hide the letterbox
@@ -141,5 +152,13 @@
mSurface = null;
}
}
+
+ public int getWidth() {
+ return Math.max(0, mLastRight - mLastLeft);
+ }
+
+ public int getHeight() {
+ return Math.max(0, mLastBottom - mLastTop);
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 3d7b32c..a5a1ca5 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -281,17 +281,25 @@
}
private Rect getInsetsFromTaskBounds(WindowState state, Task task) {
- final Rect r = new Rect();
- r.set(state.getContentFrameLw());
- r.intersectUnchecked(state.getStableFrameLw());
+ // XXX(b/72757033): These are insets relative to the window frame, but we're really
+ // interested in the insets relative to the task bounds.
+ Rect insets = minRect(state.mContentInsets, state.mStableInsets);
+ insets = maxRect(insets, state.mAppToken.getLetterboxInsets());
+ return insets;
+ }
- final Rect taskBounds = task.getBounds();
+ private Rect minRect(Rect rect1, Rect rect2) {
+ return new Rect(Math.min(rect1.left, rect2.left),
+ Math.min(rect1.top, rect2.top),
+ Math.min(rect1.right, rect2.right),
+ Math.min(rect1.bottom, rect2.bottom));
+ }
- r.set(Math.max(0, r.left - taskBounds.left),
- Math.max(0, r.top - taskBounds.top),
- Math.max(0, taskBounds.right - r.right),
- Math.max(0, taskBounds.bottom - r.bottom));
- return r;
+ private Rect maxRect(Rect rect1, Rect rect2) {
+ return new Rect(Math.max(rect1.left, rect2.left),
+ Math.max(rect1.top, rect2.top),
+ Math.max(rect1.right, rect2.right),
+ Math.max(rect1.bottom, rect2.bottom));
}
/**