diff options
4 files changed, 38 insertions, 6 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java index cf42a49f7103..686f40028753 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java @@ -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; @@ -194,7 +197,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; @@ -222,6 +226,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") @@ -237,7 +243,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 @@ -343,6 +349,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. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java index a691f59a2155..2a571737d20e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java @@ -237,7 +237,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; @@ -456,6 +457,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 { @@ -466,6 +468,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(); } @@ -678,6 +681,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> int mShadowRadiusId; int mCornerRadius; + int mCaptionTopPadding; + Configuration mWindowDecorConfig; boolean mApplyStartTransactionOnDraw; @@ -693,6 +698,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mShadowRadiusId = Resources.ID_NULL; mCornerRadius = 0; + mCaptionTopPadding = 0; + mApplyStartTransactionOnDraw = false; mSetTaskPositionAndCrop = false; mWindowDecorConfig = null; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt index 261d4b5e7d1a..d141c2d771ce 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt @@ -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( diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java index 2d1bf14ffbb3..f511b799daee 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java @@ -865,6 +865,7 @@ public class WindowDecorationTests extends ShellTestCase { final TestWindowDecoration windowDecor = createWindowDecoration( new TestRunningTaskInfoBuilder().build()); mRelayoutParams.mApplyStartTransactionOnDraw = true; + mRelayoutResult.mRootView = mMockView; windowDecor.updateViewHost(mRelayoutParams, mMockSurfaceControlStartT, mRelayoutResult); @@ -876,6 +877,7 @@ public class WindowDecorationTests extends ShellTestCase { final TestWindowDecoration windowDecor = createWindowDecoration( new TestRunningTaskInfoBuilder().build()); mRelayoutParams.mApplyStartTransactionOnDraw = true; + mRelayoutResult.mRootView = mMockView; assertThrows(IllegalArgumentException.class, () -> windowDecor.updateViewHost( @@ -887,6 +889,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); } |