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

Commit 103dc83f authored by Maryam Dehaini's avatar Maryam Dehaini
Browse files

Remove inset for non-freeform tasks when desktop mode is enabled

The desktop windowing caption for non-fullscreen tasks (i.e. tasks in
fullscreen and split) is the same height as the status bar which means
that we are reporting the same inset twice, once as a status bar inset
and once as a caption bar inset.

When a task enters immersive mode the status bar and its inset is
removed. When the desktop window decor gets notified of the status bar
inset being removed, the caption bar is hiden and the caption bar is
removed. The issue with this is that this causes two
onWindowInsetsChanged calls which is very costly.

To fix this, this change only reports the caption bar inset if the task
is in freeform (and therefore has a caption bar inset equal to the
status bar inset).

Bug: 368359962
Test: Manual testing
Flag: EXEMPT bugfix

Change-Id: I82b5cde47349d3f8c782d7ca561e4ad9ee10ea2d
parent 19131b50
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -812,7 +812,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
                    || (isStatusBarVisible && !isKeyguardVisibleAndOccluded);
        }
        relayoutParams.mIsCaptionVisible = showCaption;

        relayoutParams.mIsInsetSource = isAppHeader && !inFullImmersiveMode;
        if (isAppHeader) {
            if (TaskInfoKt.isTransparentCaptionBarAppearance(taskInfo)) {
                // If the app is requesting to customize the caption bar, allow input to fall
@@ -837,7 +837,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
                        WindowInsets.Type.systemBars() & ~WindowInsets.Type.captionBar(),
                        false /* ignoreVisibility */);
                relayoutParams.mCaptionTopPadding = systemBarInsets.top;
                relayoutParams.mIsInsetSource = false;
            }
            // Report occluding elements as bounding rects to the insets system so that apps can
            // draw in the empty space in the center:
+18 −11
Original line number Diff line number Diff line
@@ -391,11 +391,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>

        final WindowDecorationInsets newInsets = new WindowDecorationInsets(
                mTaskInfo.token, mOwner, captionInsetsRect, boundingRects,
                params.mInsetSourceFlags);
                params.mInsetSourceFlags, params.mIsInsetSource);
        if (!newInsets.equals(mWindowDecorationInsets)) {
            // Add or update this caption as an insets source.
            mWindowDecorationInsets = newInsets;
            mWindowDecorationInsets.addOrUpdate(wct);
            mWindowDecorationInsets.update(wct);
        }
    }

@@ -710,10 +710,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
        final int captionHeight = loadDimensionPixelSize(mContext.getResources(), captionHeightId);
        final Rect captionInsets = new Rect(0, 0, 0, captionHeight);
        final WindowDecorationInsets newInsets = new WindowDecorationInsets(mTaskInfo.token,
                mOwner, captionInsets, null /* boundingRets */, 0 /* flags */);
                mOwner, captionInsets, null /* boundingRets */, 0 /* flags */,
                true /* shouldAddCaptionInset */);
        if (!newInsets.equals(mWindowDecorationInsets)) {
            mWindowDecorationInsets = newInsets;
            mWindowDecorationInsets.addOrUpdate(wct);
            mWindowDecorationInsets.update(wct);
        }
    }

@@ -814,22 +815,27 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
        private final Rect mFrame;
        private final Rect[] mBoundingRects;
        private final @InsetsSource.Flags int mFlags;
        private final boolean mShouldAddCaptionInset;

        private WindowDecorationInsets(WindowContainerToken token, Binder owner, Rect frame,
                Rect[] boundingRects, @InsetsSource.Flags int flags) {
                Rect[] boundingRects, @InsetsSource.Flags int flags,
                boolean shouldAddCaptionInset) {
            mToken = token;
            mOwner = owner;
            mFrame = frame;
            mBoundingRects = boundingRects;
            mFlags = flags;
            mShouldAddCaptionInset = shouldAddCaptionInset;
        }

        void addOrUpdate(WindowContainerTransaction wct) {
        void update(WindowContainerTransaction wct) {
            if (mShouldAddCaptionInset) {
                wct.addInsetsSource(mToken, mOwner, INDEX, captionBar(), mFrame, mBoundingRects,
                        mFlags);
                wct.addInsetsSource(mToken, mOwner, INDEX, mandatorySystemGestures(), mFrame,
                        mBoundingRects, 0 /* flags */);
            }
        }

        void remove(WindowContainerTransaction wct) {
            wct.removeInsetsSource(mToken, mOwner, INDEX, captionBar());
@@ -843,7 +849,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
            return Objects.equals(mToken, that.mToken) && Objects.equals(mOwner,
                    that.mOwner) && Objects.equals(mFrame, that.mFrame)
                    && Objects.deepEquals(mBoundingRects, that.mBoundingRects)
                    && mFlags == that.mFlags;
                    && mFlags == that.mFlags
                    && mShouldAddCaptionInset == that.mShouldAddCaptionInset;
        }

        @Override