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

Commit 20e07892 authored by Adrian Roos's avatar Adrian Roos
Browse files

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
parent 999e97f4
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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();
        }
    }
}
+19 −0
Original line number Diff line number Diff line
@@ -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);
        }
    }
}
+17 −9
Original line number Diff line number Diff line
@@ -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));
    }

    /**