diff options
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 5e64a06e0326..2f41aa932d05 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<T extends View & TaskFocusStateConsumer> 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<T extends View & TaskFocusStateConsumer> 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<T extends View & TaskFocusStateConsumer> 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<T extends View & TaskFocusStateConsumer> 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<T extends View & TaskFocusStateConsumer> 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<T extends View & TaskFocusStateConsumer> 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 e11be31aa40e..1b74d7d0e982 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()); } |