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

Commit d3d3e7ba authored by Yunfan Chen's avatar Yunfan Chen Committed by Android (Google) Code Review
Browse files

Merge "Avoid the caption bar overlaps with status bar" into main

parents 299b5525 22821f90
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Insets;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.GradientDrawable;
@@ -37,10 +38,12 @@ import android.graphics.drawable.VectorDrawable;
import android.os.Handler;
import android.util.Size;
import android.view.Choreographer;
import android.view.InsetsState;
import android.view.MotionEvent;
import android.view.SurfaceControl;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.window.WindowContainerTransaction;

@@ -195,7 +198,8 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
            RelayoutParams relayoutParams,
            ActivityManager.RunningTaskInfo taskInfo,
            boolean applyStartTransactionOnDraw,
            boolean setTaskCropAndPosition) {
            boolean setTaskCropAndPosition,
            InsetsState displayInsetsState) {
        relayoutParams.reset();
        relayoutParams.mRunningTaskInfo = taskInfo;
        relayoutParams.mLayoutResId = R.layout.caption_window_decor;
@@ -223,6 +227,8 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
        controlsElement.mWidthResId = R.dimen.caption_right_buttons_width;
        controlsElement.mAlignment = RelayoutParams.OccludingCaptionElement.Alignment.END;
        relayoutParams.mOccludingCaptionElements.add(controlsElement);
        relayoutParams.mCaptionTopPadding = getTopPadding(relayoutParams,
                taskInfo.getConfiguration().windowConfiguration.getBounds(), displayInsetsState);
    }

    @SuppressLint("MissingPermission")
@@ -238,7 +244,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
        final WindowContainerTransaction wct = new WindowContainerTransaction();

        updateRelayoutParams(mRelayoutParams, taskInfo, applyStartTransactionOnDraw,
                setTaskCropAndPosition);
                setTaskCropAndPosition, mDisplayController.getInsetsState(taskInfo.displayId));

        relayout(mRelayoutParams, startT, finishT, wct, oldRootView, mResult);
        // After this line, mTaskInfo is up-to-date and should be used instead of taskInfo
@@ -344,6 +350,18 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
        mDragResizeListener = null;
    }

    private static int getTopPadding(RelayoutParams params, Rect taskBounds,
            InsetsState insetsState) {
        if (!params.mRunningTaskInfo.isFreeform()) {
            Insets systemDecor = insetsState.calculateInsets(taskBounds,
                    WindowInsets.Type.systemBars() & ~WindowInsets.Type.captionBar(),
                    false /* ignoreVisibility */);
            return systemDecor.top;
        } else {
            return 0;
        }
    }

    /**
     * Checks whether the touch event falls inside the customizable caption region.
     */
+8 −1
Original line number Diff line number Diff line
@@ -239,7 +239,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
        outResult.mHeight = taskBounds.height();
        outResult.mRootView.setTaskFocusState(mTaskInfo.isFocused);
        final Resources resources = mDecorWindowContext.getResources();
        outResult.mCaptionHeight = loadDimensionPixelSize(resources, params.mCaptionHeightId);
        outResult.mCaptionHeight = loadDimensionPixelSize(resources, params.mCaptionHeightId)
                + params.mCaptionTopPadding;
        outResult.mCaptionWidth = params.mCaptionWidthId != Resources.ID_NULL
                ? loadDimensionPixelSize(resources, params.mCaptionWidthId) : taskBounds.width();
        outResult.mCaptionX = (outResult.mWidth - outResult.mCaptionWidth) / 2;
@@ -459,6 +460,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
                }
                mViewHost.getRootSurfaceControl().applyTransactionOnDraw(onDrawTransaction);
            }
            outResult.mRootView.setPadding(0, params.mCaptionTopPadding, 0, 0);
            mViewHost.setView(outResult.mRootView, lp);
            Trace.endSection();
        } else {
@@ -469,6 +471,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
                }
                mViewHost.getRootSurfaceControl().applyTransactionOnDraw(onDrawTransaction);
            }
            outResult.mRootView.setPadding(0, params.mCaptionTopPadding, 0, 0);
            mViewHost.relayout(lp);
            Trace.endSection();
        }
@@ -700,6 +703,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
        int mShadowRadiusId;
        int mCornerRadius;

        int mCaptionTopPadding;

        Configuration mWindowDecorConfig;

        boolean mApplyStartTransactionOnDraw;
@@ -716,6 +721,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
            mShadowRadiusId = Resources.ID_NULL;
            mCornerRadius = 0;

            mCaptionTopPadding = 0;

            mApplyStartTransactionOnDraw = false;
            mSetTaskPositionAndCrop = false;
            mWindowDecorConfig = null;
+7 −3
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.app.WindowConfiguration
import android.content.ComponentName
import android.testing.AndroidTestingRunner
import android.view.Display
import android.view.InsetsState
import android.view.WindowInsetsController
import androidx.test.filters.SmallTest
import com.android.wm.shell.ShellTestCase
@@ -45,7 +46,8 @@ class CaptionWindowDecorationTests : ShellTestCase() {
            relayoutParams,
            taskInfo,
            true,
            false
            false,
            InsetsState()
        )

        Truth.assertThat(relayoutParams.hasInputFeatureSpy()).isTrue()
@@ -63,7 +65,8 @@ class CaptionWindowDecorationTests : ShellTestCase() {
            relayoutParams,
            taskInfo,
            true,
            false
            false,
            InsetsState()
        )

        Truth.assertThat(relayoutParams.hasInputFeatureSpy()).isFalse()
@@ -77,7 +80,8 @@ class CaptionWindowDecorationTests : ShellTestCase() {
            relayoutParams,
            taskInfo,
            true,
            false
            false,
            InsetsState()
        )
        Truth.assertThat(relayoutParams.mOccludingCaptionElements.size).isEqualTo(2)
        Truth.assertThat(relayoutParams.mOccludingCaptionElements[0].mAlignment).isEqualTo(
+3 −0
Original line number Diff line number Diff line
@@ -867,6 +867,7 @@ public class WindowDecorationTests extends ShellTestCase {
        final TestWindowDecoration windowDecor = createWindowDecoration(
                new TestRunningTaskInfoBuilder().build());
        mRelayoutParams.mApplyStartTransactionOnDraw = true;
        mRelayoutResult.mRootView = mMockView;

        windowDecor.updateViewHost(mRelayoutParams, mMockSurfaceControlStartT, mRelayoutResult);

@@ -878,6 +879,7 @@ public class WindowDecorationTests extends ShellTestCase {
        final TestWindowDecoration windowDecor = createWindowDecoration(
                new TestRunningTaskInfoBuilder().build());
        mRelayoutParams.mApplyStartTransactionOnDraw = true;
        mRelayoutResult.mRootView = mMockView;

        assertThrows(IllegalArgumentException.class,
                () -> windowDecor.updateViewHost(
@@ -889,6 +891,7 @@ public class WindowDecorationTests extends ShellTestCase {
        final TestWindowDecoration windowDecor = createWindowDecoration(
                new TestRunningTaskInfoBuilder().build());
        mRelayoutParams.mApplyStartTransactionOnDraw = false;
        mRelayoutResult.mRootView = mMockView;

        windowDecor.updateViewHost(mRelayoutParams, null /* onDrawTransaction */, mRelayoutResult);
    }