From 9678d36dc59ef80d2b0a5f89cf11f328454a6ec2 Mon Sep 17 00:00:00 2001 From: Garfield Tan Date: Fri, 5 Aug 2022 15:34:42 -0700 Subject: [PATCH] Move caption under DecorationContainerSurface Therefore caption can be put at the same layer as other window decorations. It adds CaptionContainerSurface to host the caption so that WindowDecoration can put the caption at the same position as the task surface. Bug: 241598994 Test: atest WindowDecorationTests Test: Caption is shown in front of embedded activities. Change-Id: I9ec571859680f622449f4c3b5cea27222ec4c788 --- .../shell/windowdecor/WindowDecoration.java | 43 +++++++++++++++---- .../windowdecor/WindowDecorationTests.java | 21 +++++++++ 2 files changed, 56 insertions(+), 8 deletions(-) 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 5e64a06e03265..2f41aa932d05a 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 @@ -89,7 +89,8 @@ public abstract class WindowDecoration SurfaceControl mDecorationContainerSurface; SurfaceControl mTaskBackgroundSurface; - private final CaptionWindowManager mCaptionWindowManager; + SurfaceControl mCaptionContainerSurface; + private CaptionWindowManager mCaptionWindowManager; private SurfaceControlViewHost mViewHost; private final Rect mCaptionInsetsRect = new Rect(); @@ -127,11 +128,6 @@ public abstract class WindowDecoration mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId); mDecorWindowContext = mContext.createConfigurationContext(mTaskInfo.getConfiguration()); - - // Put caption under task surface because ViewRootImpl sets the destination frame of - // windowless window layers and BLASTBufferQueue#update() doesn't support offset. - mCaptionWindowManager = - new CaptionWindowManager(mTaskInfo.getConfiguration(), mTaskSurface); } /** @@ -213,6 +209,7 @@ public abstract class WindowDecoration startT.setPosition( mDecorationContainerSurface, decorContainerOffsetX, decorContainerOffsetY) .setWindowCrop(mDecorationContainerSurface, outResult.mWidth, outResult.mHeight) + // TODO(b/244455401): Change the z-order when it's better organized .setLayer(mDecorationContainerSurface, mTaskInfo.numActivities + 1) .show(mDecorationContainerSurface); @@ -234,12 +231,35 @@ public abstract class WindowDecoration startT.setWindowCrop(mTaskBackgroundSurface, taskBounds.width(), taskBounds.height()) .setShadowRadius(mTaskBackgroundSurface, shadowRadius) .setColor(mTaskBackgroundSurface, mTmpColor) + // TODO(b/244455401): Change the z-order when it's better organized .setLayer(mTaskBackgroundSurface, -1) .show(mTaskBackgroundSurface); + // CaptionContainerSurface, CaptionWindowManager + if (mCaptionContainerSurface == null) { + final SurfaceControl.Builder builder = mSurfaceControlBuilderSupplier.get(); + mCaptionContainerSurface = builder + .setName("Caption container of Task=" + mTaskInfo.taskId) + .setContainerLayer() + .setParent(mDecorationContainerSurface) + .build(); + } + + final int captionHeight = (int) Math.ceil(captionHeightDp * outResult.mDensity); + startT.setPosition( + mCaptionContainerSurface, -decorContainerOffsetX, -decorContainerOffsetY) + .setWindowCrop(mCaptionContainerSurface, taskBounds.width(), captionHeight) + .show(mCaptionContainerSurface); + + if (mCaptionWindowManager == null) { + // Put caption under a container surface because ViewRootImpl sets the destination frame + // of windowless window layers and BLASTBufferQueue#update() doesn't support offset. + mCaptionWindowManager = new CaptionWindowManager( + mTaskInfo.getConfiguration(), mCaptionContainerSurface); + } + // Caption view mCaptionWindowManager.setConfiguration(taskConfig); - final int captionHeight = (int) Math.ceil(captionHeightDp * outResult.mDensity); final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(taskBounds.width(), captionHeight, WindowManager.LayoutParams.TYPE_APPLICATION, @@ -262,7 +282,7 @@ public abstract class WindowDecoration mCaptionInsetsRect.bottom = mCaptionInsetsRect.top + captionHeight; wct.addRectInsetsProvider(mTaskInfo.token, mCaptionInsetsRect, CAPTION_INSETS_TYPES); } else { - outResult.mRootView.setVisibility(View.GONE); + startT.hide(mCaptionContainerSurface); } // Task surface itself @@ -298,6 +318,13 @@ public abstract class WindowDecoration mViewHost = null; } + mCaptionWindowManager = null; + + if (mCaptionContainerSurface != null) { + mCaptionContainerSurface.release(); + mCaptionContainerSurface = null; + } + if (mDecorationContainerSurface != null) { mDecorationContainerSurface.release(); mDecorationContainerSurface = null; 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 e11be31aa40ea..1b74d7d0e9824 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 @@ -123,6 +123,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder taskBackgroundSurfaceBuilder = createMockSurfaceControlBuilder(taskBackgroundSurface); mMockSurfaceControlBuilders.add(taskBackgroundSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final ActivityManager.TaskDescription.Builder taskDescriptionBuilder = new ActivityManager.TaskDescription.Builder() @@ -147,6 +151,7 @@ public class WindowDecorationTests extends ShellTestCase { verify(decorContainerSurfaceBuilder, never()).build(); verify(taskBackgroundSurfaceBuilder, never()).build(); + verify(captionContainerSurfaceBuilder, never()).build(); verify(mMockSurfaceControlViewHostFactory, never()).create(any(), any(), any()); verify(mMockSurfaceControlFinishT).hide(taskSurface); @@ -168,6 +173,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder taskBackgroundSurfaceBuilder = createMockSurfaceControlBuilder(taskBackgroundSurface); mMockSurfaceControlBuilders.add(taskBackgroundSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final ActivityManager.TaskDescription.Builder taskDescriptionBuilder = new ActivityManager.TaskDescription.Builder() @@ -205,6 +214,12 @@ public class WindowDecorationTests extends ShellTestCase { verify(mMockSurfaceControlStartT).setLayer(taskBackgroundSurface, -1); verify(mMockSurfaceControlStartT).show(taskBackgroundSurface); + verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface); + verify(captionContainerSurfaceBuilder).setContainerLayer(); + verify(mMockSurfaceControlStartT).setPosition(captionContainerSurface, 20, 40); + verify(mMockSurfaceControlStartT).setWindowCrop(captionContainerSurface, 300, 64); + verify(mMockSurfaceControlStartT).show(captionContainerSurface); + verify(mMockSurfaceControlViewHostFactory).create(any(), eq(defaultDisplay), any()); verify(mMockSurfaceControlViewHost) .setView(same(mMockView), @@ -245,6 +260,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder taskBackgroundSurfaceBuilder = createMockSurfaceControlBuilder(taskBackgroundSurface); mMockSurfaceControlBuilders.add(taskBackgroundSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final ActivityManager.TaskDescription.Builder taskDescriptionBuilder = new ActivityManager.TaskDescription.Builder() @@ -270,6 +289,7 @@ public class WindowDecorationTests extends ShellTestCase { verify(mMockSurfaceControlViewHost, never()).release(); verify(decorContainerSurface, never()).release(); verify(taskBackgroundSurface, never()).release(); + verify(captionContainerSurface, never()).release(); verify(mMockWindowContainerTransaction, never()) .removeInsetsProvider(eq(taskInfo.token), any()); @@ -279,6 +299,7 @@ public class WindowDecorationTests extends ShellTestCase { verify(mMockSurfaceControlViewHost).release(); verify(decorContainerSurface).release(); verify(taskBackgroundSurface).release(); + verify(captionContainerSurface).release(); verify(mMockWindowContainerTransaction).removeInsetsProvider(eq(taskInfo.token), any()); }