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

Commit 9678d36d authored by Garfield Tan's avatar Garfield Tan
Browse files

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
parent 5effdf21
Loading
Loading
Loading
Loading
+35 −8
Original line number Diff line number Diff line
@@ -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;
+21 −0
Original line number Diff line number Diff line
@@ -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());
    }