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
This commit is contained in:
Adrian Roos
2018-02-23 19:12:01 +01:00
parent 999e97f405
commit 20e07892d4
3 changed files with 46 additions and 9 deletions

View File

@@ -1728,6 +1728,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
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 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
}
return stringName + ((mIsExiting) ? " mIsExiting=" : "");
}
Rect getLetterboxInsets() {
if (mLetterbox != null) {
return mLetterbox.getInsets();
} else {
return new Rect();
}
}
}

View File

@@ -67,6 +67,17 @@ public class Letterbox {
mRight.setRect(t, inner.right, outer.top, outer.right, inner.bottom);
}
/**
* 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.
*
@@ -141,5 +152,13 @@ public class Letterbox {
mSurface = null;
}
}
public int getWidth() {
return Math.max(0, mLastRight - mLastLeft);
}
public int getHeight() {
return Math.max(0, mLastBottom - mLastTop);
}
}
}

View File

@@ -281,17 +281,25 @@ class TaskSnapshotController {
}
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));
}
/**