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

Commit 22228960 authored by Maryam's avatar Maryam
Browse files

Move caption view constants to resources

Test: Manual Testing
Bug: 251908245
Change-Id: I4133afe8bd82da125b9c374621a285ed72adce04
parent f4ceebba
Loading
Loading
Loading
Loading
+17 −0
Original line number Original line Diff line number Diff line
@@ -321,4 +321,21 @@


    <!-- The smaller size of the dismiss target (shrinks when something is in the target). -->
    <!-- The smaller size of the dismiss target (shrinks when something is in the target). -->
    <dimen name="floating_dismiss_circle_small">120dp</dimen>
    <dimen name="floating_dismiss_circle_small">120dp</dimen>

    <!-- The thickness of shadows of a window that has focus in DIP. -->
    <dimen name="freeform_decor_shadow_focused_thickness">20dp</dimen>

    <!-- The thickness of shadows of a window that doesn't have focus in DIP. -->
    <dimen name="freeform_decor_shadow_unfocused_thickness">5dp</dimen>

    <!-- Height of button (32dp)  + 2 * margin (5dp each). -->
    <dimen name="freeform_decor_caption_height">42dp</dimen>

    <!-- Width of buttons (64dp) + handle (128dp) + padding (24dp total). -->
    <dimen name="freeform_decor_caption_width">216dp</dimen>

    <dimen name="freeform_resize_handle">30dp</dimen>

    <dimen name="freeform_resize_corner">44dp</dimen>

</resources>
</resources>
+24 −26
Original line number Original line Diff line number Diff line
@@ -21,7 +21,6 @@ import android.app.WindowConfiguration;
import android.content.Context;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.VectorDrawable;
import android.graphics.drawable.VectorDrawable;
import android.os.Handler;
import android.os.Handler;
import android.view.Choreographer;
import android.view.Choreographer;
@@ -43,22 +42,6 @@ import com.android.wm.shell.desktopmode.DesktopModeStatus;
 * The shadow's thickness is 20dp when the window is in focus and 5dp when the window isn't.
 * The shadow's thickness is 20dp when the window is in focus and 5dp when the window isn't.
 */
 */
public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearLayout> {
public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearLayout> {
    // The thickness of shadows of a window that has focus in DIP.
    private static final int DECOR_SHADOW_FOCUSED_THICKNESS_IN_DIP = 20;
    // The thickness of shadows of a window that doesn't have focus in DIP.
    private static final int DECOR_SHADOW_UNFOCUSED_THICKNESS_IN_DIP = 5;

    // Height of button (32dp)  + 2 * margin (5dp each)
    private static final int DECOR_CAPTION_HEIGHT_IN_DIP = 42;
    // Width of buttons (64dp) + handle (128dp) + padding (24dp total)
    private static final int DECOR_CAPTION_WIDTH_IN_DIP = 216;
    private static final int RESIZE_HANDLE_IN_DIP = 30;
    private static final int RESIZE_CORNER_IN_DIP = 44;

    private static final Rect EMPTY_OUTSET = new Rect();
    private static final Rect RESIZE_HANDLE_OUTSET = new Rect(
            RESIZE_HANDLE_IN_DIP, RESIZE_HANDLE_IN_DIP, RESIZE_HANDLE_IN_DIP, RESIZE_HANDLE_IN_DIP);

    private final Handler mHandler;
    private final Handler mHandler;
    private final Choreographer mChoreographer;
    private final Choreographer mChoreographer;
    private final SyncTransactionQueue mSyncQueue;
    private final SyncTransactionQueue mSyncQueue;
@@ -69,6 +52,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL


    private DragResizeInputListener mDragResizeListener;
    private DragResizeInputListener mDragResizeListener;


    private RelayoutParams mRelayoutParams = new RelayoutParams();
    private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult =
    private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult =
            new WindowDecoration.RelayoutResult<>();
            new WindowDecoration.RelayoutResult<>();


@@ -114,19 +98,31 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL


    void relayout(ActivityManager.RunningTaskInfo taskInfo,
    void relayout(ActivityManager.RunningTaskInfo taskInfo,
            SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT) {
            SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT) {
        final int shadowRadiusDp = taskInfo.isFocused
        final int shadowRadiusID = taskInfo.isFocused
                ? DECOR_SHADOW_FOCUSED_THICKNESS_IN_DIP : DECOR_SHADOW_UNFOCUSED_THICKNESS_IN_DIP;
                ? R.dimen.freeform_decor_shadow_focused_thickness
                : R.dimen.freeform_decor_shadow_unfocused_thickness;
        final boolean isFreeform = mTaskInfo.configuration.windowConfiguration.getWindowingMode()
        final boolean isFreeform = mTaskInfo.configuration.windowConfiguration.getWindowingMode()
                == WindowConfiguration.WINDOWING_MODE_FREEFORM;
                == WindowConfiguration.WINDOWING_MODE_FREEFORM;
        final boolean isDragResizeable = isFreeform && mTaskInfo.isResizeable;
        final boolean isDragResizeable = isFreeform && mTaskInfo.isResizeable;
        final Rect outset = isDragResizeable ? RESIZE_HANDLE_OUTSET : EMPTY_OUTSET;


        WindowDecorLinearLayout oldRootView = mResult.mRootView;
        WindowDecorLinearLayout oldRootView = mResult.mRootView;
        final SurfaceControl oldDecorationSurface = mDecorationContainerSurface;
        final SurfaceControl oldDecorationSurface = mDecorationContainerSurface;
        final WindowContainerTransaction wct = new WindowContainerTransaction();
        final WindowContainerTransaction wct = new WindowContainerTransaction();
        relayout(taskInfo, R.layout.caption_window_decoration, oldRootView,

                DECOR_CAPTION_HEIGHT_IN_DIP, DECOR_CAPTION_WIDTH_IN_DIP, outset, shadowRadiusDp,
        int outsetLeftId = R.dimen.freeform_resize_handle;
                startT, finishT, wct, mResult);
        int outsetTopId = R.dimen.freeform_resize_handle;
        int outsetRightId = R.dimen.freeform_resize_handle;
        int outsetBottomId = R.dimen.freeform_resize_handle;

        mRelayoutParams.mRunningTaskInfo = taskInfo;
        mRelayoutParams.mLayoutResId = R.layout.caption_window_decoration;
        mRelayoutParams.mCaptionHeightId = R.dimen.freeform_decor_caption_height;
        mRelayoutParams.mCaptionWidthId = R.dimen.freeform_decor_caption_width;
        mRelayoutParams.mShadowRadiusId = shadowRadiusID;
        if (isDragResizeable) {
            mRelayoutParams.setOutsets(outsetLeftId, outsetTopId, outsetRightId, outsetBottomId);
        }
        relayout(mRelayoutParams, startT, finishT, wct, oldRootView, mResult);


        mTaskOrganizer.applyTransaction(wct);
        mTaskOrganizer.applyTransaction(wct);


@@ -167,10 +163,12 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
        }
        }


        int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()).getScaledTouchSlop();
        int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()).getScaledTouchSlop();

        int resize_handle = mResult.mRootView.getResources()
                .getDimensionPixelSize(R.dimen.freeform_resize_handle);
        int resize_corner = mResult.mRootView.getResources()
                .getDimensionPixelSize(R.dimen.freeform_resize_corner);
        mDragResizeListener.setGeometry(
        mDragResizeListener.setGeometry(
                mResult.mWidth, mResult.mHeight, (int) (mResult.mDensity * RESIZE_HANDLE_IN_DIP),
                mResult.mWidth, mResult.mHeight, resize_handle, resize_corner, touchSlop);
                (int) (mResult.mDensity * RESIZE_CORNER_IN_DIP), touchSlop);
    }
    }


    /**
    /**
+67 −27
Original line number Original line Diff line number Diff line
@@ -19,11 +19,11 @@ package com.android.wm.shell.windowdecor;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Display;
import android.view.InsetsState;
import android.view.InsetsState;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
@@ -142,15 +142,14 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
     */
     */
    abstract void relayout(RunningTaskInfo taskInfo);
    abstract void relayout(RunningTaskInfo taskInfo);


    void relayout(RunningTaskInfo taskInfo, int layoutResId, T rootView, float captionHeightDp,
    void relayout(RelayoutParams params, SurfaceControl.Transaction startT,
            float captionWidthDp, Rect outsetsDp, float shadowRadiusDp,
            SurfaceControl.Transaction finishT, WindowContainerTransaction wct, T rootView,
            SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT,
            RelayoutResult<T> outResult) {
            WindowContainerTransaction wct, RelayoutResult<T> outResult) {
        outResult.reset();
        outResult.reset();


        final Configuration oldTaskConfig = mTaskInfo.getConfiguration();
        final Configuration oldTaskConfig = mTaskInfo.getConfiguration();
        if (taskInfo != null) {
        if (params.mRunningTaskInfo != null) {
            mTaskInfo = taskInfo;
            mTaskInfo = params.mRunningTaskInfo;
        }
        }


        if (!mTaskInfo.isVisible) {
        if (!mTaskInfo.isVisible) {
@@ -159,7 +158,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
            return;
            return;
        }
        }


        if (rootView == null && layoutResId == 0) {
        if (rootView == null && params.mLayoutResId == 0) {
            throw new IllegalArgumentException("layoutResId and rootView can't both be invalid.");
            throw new IllegalArgumentException("layoutResId and rootView can't both be invalid.");
        }
        }


@@ -176,15 +175,15 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
                return;
                return;
            }
            }
            mDecorWindowContext = mContext.createConfigurationContext(taskConfig);
            mDecorWindowContext = mContext.createConfigurationContext(taskConfig);
            if (layoutResId != 0) {
            if (params.mLayoutResId != 0) {
                outResult.mRootView =
                outResult.mRootView = (T) LayoutInflater.from(mDecorWindowContext)
                        (T) LayoutInflater.from(mDecorWindowContext).inflate(layoutResId, null);
                                .inflate(params.mLayoutResId, null);
            }
            }
        }
        }


        if (outResult.mRootView == null) {
        if (outResult.mRootView == null) {
            outResult.mRootView =
            outResult.mRootView = (T) LayoutInflater.from(mDecorWindowContext)
                    (T) LayoutInflater.from(mDecorWindowContext).inflate(layoutResId, null);
                            .inflate(params.mLayoutResId , null);
        }
        }


        // DecorationContainerSurface
        // DecorationContainerSurface
@@ -200,18 +199,18 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
        }
        }


        final Rect taskBounds = taskConfig.windowConfiguration.getBounds();
        final Rect taskBounds = taskConfig.windowConfiguration.getBounds();
        outResult.mDensity = taskConfig.densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE;
        final int decorContainerOffsetX = -loadResource(params.mOutsetLeftId);
        final int decorContainerOffsetX = -(int) (outsetsDp.left * outResult.mDensity);
        final int decorContainerOffsetY = -loadResource(params.mOutsetTopId);
        final int decorContainerOffsetY = -(int) (outsetsDp.top * outResult.mDensity);
        outResult.mWidth = taskBounds.width()
        outResult.mWidth = taskBounds.width()
                + (int) (outsetsDp.right * outResult.mDensity)
                + loadResource(params.mOutsetRightId)
                - decorContainerOffsetX;
                - decorContainerOffsetX;
        outResult.mHeight = taskBounds.height()
        outResult.mHeight = taskBounds.height()
                + (int) (outsetsDp.bottom * outResult.mDensity)
                + loadResource(params.mOutsetBottomId)
                - decorContainerOffsetY;
                - decorContainerOffsetY;
        startT.setPosition(
        startT.setPosition(
                        mDecorationContainerSurface, decorContainerOffsetX, decorContainerOffsetY)
                        mDecorationContainerSurface, decorContainerOffsetX, decorContainerOffsetY)
                .setWindowCrop(mDecorationContainerSurface, outResult.mWidth, outResult.mHeight)
                .setWindowCrop(mDecorationContainerSurface,
                        outResult.mWidth, outResult.mHeight)
                // TODO(b/244455401): Change the z-order when it's better organized
                // TODO(b/244455401): Change the z-order when it's better organized
                .setLayer(mDecorationContainerSurface, mTaskInfo.numActivities + 1)
                .setLayer(mDecorationContainerSurface, mTaskInfo.numActivities + 1)
                .show(mDecorationContainerSurface);
                .show(mDecorationContainerSurface);
@@ -226,12 +225,13 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
                    .build();
                    .build();
        }
        }


        float shadowRadius = outResult.mDensity * shadowRadiusDp;
        float shadowRadius = loadResource(params.mShadowRadiusId);
        int backgroundColorInt = mTaskInfo.taskDescription.getBackgroundColor();
        int backgroundColorInt = mTaskInfo.taskDescription.getBackgroundColor();
        mTmpColor[0] = (float) Color.red(backgroundColorInt) / 255.f;
        mTmpColor[0] = (float) Color.red(backgroundColorInt) / 255.f;
        mTmpColor[1] = (float) Color.green(backgroundColorInt) / 255.f;
        mTmpColor[1] = (float) Color.green(backgroundColorInt) / 255.f;
        mTmpColor[2] = (float) Color.blue(backgroundColorInt) / 255.f;
        mTmpColor[2] = (float) Color.blue(backgroundColorInt) / 255.f;
        startT.setWindowCrop(mTaskBackgroundSurface, taskBounds.width(), taskBounds.height())
        startT.setWindowCrop(mTaskBackgroundSurface, taskBounds.width(),
                        taskBounds.height())
                .setShadowRadius(mTaskBackgroundSurface, shadowRadius)
                .setShadowRadius(mTaskBackgroundSurface, shadowRadius)
                .setColor(mTaskBackgroundSurface, mTmpColor)
                .setColor(mTaskBackgroundSurface, mTmpColor)
                // TODO(b/244455401): Change the z-order when it's better organized
                // TODO(b/244455401): Change the z-order when it's better organized
@@ -248,8 +248,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
                    .build();
                    .build();
        }
        }


        final int captionHeight = (int) Math.ceil(captionHeightDp * outResult.mDensity);
        final int captionHeight = loadResource(params.mCaptionHeightId);
        final int captionWidth = (int) Math.ceil(captionWidthDp * outResult.mDensity);
        final int captionWidth = loadResource(params.mCaptionWidthId);


        //Prevent caption from going offscreen if task is too high up
        //Prevent caption from going offscreen if task is too high up
        final int captionYPos = taskBounds.top <= captionHeight / 2 ? 0 : captionHeight / 2;
        final int captionYPos = taskBounds.top <= captionHeight / 2 ? 0 : captionHeight / 2;
@@ -289,8 +289,10 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>


            // Caption insets
            // Caption insets
            mCaptionInsetsRect.set(taskBounds);
            mCaptionInsetsRect.set(taskBounds);
            mCaptionInsetsRect.bottom = mCaptionInsetsRect.top + captionHeight - captionYPos;
            mCaptionInsetsRect.bottom =
            wct.addRectInsetsProvider(mTaskInfo.token, mCaptionInsetsRect, CAPTION_INSETS_TYPES);
                    mCaptionInsetsRect.top + captionHeight - captionYPos;
            wct.addRectInsetsProvider(mTaskInfo.token, mCaptionInsetsRect,
                    CAPTION_INSETS_TYPES);
        } else {
        } else {
            startT.hide(mCaptionContainerSurface);
            startT.hide(mCaptionContainerSurface);
        }
        }
@@ -307,6 +309,13 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
                .setCrop(mTaskSurface, mTaskSurfaceCrop);
                .setCrop(mTaskSurface, mTaskSurfaceCrop);
    }
    }


    private int loadResource(int resourceId) {
        if (resourceId == Resources.ID_NULL) {
            return 0;
        }
        return mDecorWindowContext.getResources().getDimensionPixelSize(resourceId);
    }

    /**
    /**
     * Obtains the {@link Display} instance for the display ID in {@link #mTaskInfo} if it exists or
     * Obtains the {@link Display} instance for the display ID in {@link #mTaskInfo} if it exists or
     * registers {@link #mOnDisplaysChangedListener} if it doesn't.
     * registers {@link #mOnDisplaysChangedListener} if it doesn't.
@@ -368,13 +377,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
    static class RelayoutResult<T extends View & TaskFocusStateConsumer> {
    static class RelayoutResult<T extends View & TaskFocusStateConsumer> {
        int mWidth;
        int mWidth;
        int mHeight;
        int mHeight;
        float mDensity;
        T mRootView;
        T mRootView;


        void reset() {
        void reset() {
            mWidth = 0;
            mWidth = 0;
            mHeight = 0;
            mHeight = 0;
            mDensity = 0;
            mRootView = null;
            mRootView = null;
        }
        }
    }
    }
@@ -395,4 +402,37 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
            return new SurfaceControlViewHost(c, d, wmm);
            return new SurfaceControlViewHost(c, d, wmm);
        }
        }
    }
    }

    static class RelayoutParams{
        RunningTaskInfo mRunningTaskInfo;
        int mLayoutResId;
        int mCaptionHeightId;
        int mCaptionWidthId;
        int mShadowRadiusId;

        int mOutsetTopId;
        int mOutsetBottomId;
        int mOutsetLeftId;
        int mOutsetRightId;

        void setOutsets(int leftId, int topId, int rightId, int bottomId) {
            mOutsetLeftId = leftId;
            mOutsetTopId = topId;
            mOutsetRightId = rightId;
            mOutsetBottomId = bottomId;
        }

        void reset() {
            mLayoutResId = Resources.ID_NULL;
            mCaptionHeightId = Resources.ID_NULL;
            mCaptionWidthId = Resources.ID_NULL;
            mShadowRadiusId = Resources.ID_NULL;

            mOutsetTopId = Resources.ID_NULL;
            mOutsetBottomId = Resources.ID_NULL;
            mOutsetLeftId = Resources.ID_NULL;
            mOutsetRightId = Resources.ID_NULL;
        }

    }
}
}
 No newline at end of file
+34 −21
Original line number Original line Diff line number Diff line
@@ -51,6 +51,7 @@ import android.window.WindowContainerTransaction;


import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestRunningTaskInfoBuilder;
import com.android.wm.shell.TestRunningTaskInfoBuilder;
@@ -76,13 +77,9 @@ import java.util.function.Supplier;
@SmallTest
@SmallTest
@RunWith(AndroidTestingRunner.class)
@RunWith(AndroidTestingRunner.class)
public class WindowDecorationTests extends ShellTestCase {
public class WindowDecorationTests extends ShellTestCase {
    private static final int CAPTION_HEIGHT_DP = 32;
    private static final int CAPTION_WIDTH_DP = 216;
    private static final int SHADOW_RADIUS_DP = 5;
    private static final Rect TASK_BOUNDS = new Rect(100, 300, 400, 400);
    private static final Rect TASK_BOUNDS = new Rect(100, 300, 400, 400);
    private static final Point TASK_POSITION_IN_PARENT = new Point(40, 60);
    private static final Point TASK_POSITION_IN_PARENT = new Point(40, 60);


    private final Rect mOutsetsDp = new Rect();
    private final WindowDecoration.RelayoutResult<TestView> mRelayoutResult =
    private final WindowDecoration.RelayoutResult<TestView> mRelayoutResult =
            new WindowDecoration.RelayoutResult<>();
            new WindowDecoration.RelayoutResult<>();


@@ -104,6 +101,7 @@ public class WindowDecorationTests extends ShellTestCase {
    private final List<SurfaceControl.Builder> mMockSurfaceControlBuilders = new ArrayList<>();
    private final List<SurfaceControl.Builder> mMockSurfaceControlBuilders = new ArrayList<>();
    private SurfaceControl.Transaction mMockSurfaceControlStartT;
    private SurfaceControl.Transaction mMockSurfaceControlStartT;
    private SurfaceControl.Transaction mMockSurfaceControlFinishT;
    private SurfaceControl.Transaction mMockSurfaceControlFinishT;
    private WindowDecoration.RelayoutParams mRelayoutParams = new WindowDecoration.RelayoutParams();


    @Before
    @Before
    public void setUp() {
    public void setUp() {
@@ -147,7 +145,8 @@ public class WindowDecorationTests extends ShellTestCase {
        // Density is 2. Outsets are (20, 40, 60, 80) px. Shadow radius is 10px. Caption height is
        // Density is 2. Outsets are (20, 40, 60, 80) px. Shadow radius is 10px. Caption height is
        // 64px.
        // 64px.
        taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
        taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
        mOutsetsDp.set(10, 20, 30, 40);
        mRelayoutParams.setOutsets(R.dimen.freeform_resize_handle, R.dimen.freeform_resize_handle,
                R.dimen.freeform_resize_handle, R.dimen.freeform_resize_handle);


        final SurfaceControl taskSurface = mock(SurfaceControl.class);
        final SurfaceControl taskSurface = mock(SurfaceControl.class);
        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
@@ -197,8 +196,13 @@ public class WindowDecorationTests extends ShellTestCase {
        // Density is 2. Outsets are (20, 40, 60, 80) px. Shadow radius is 10px. Caption height is
        // Density is 2. Outsets are (20, 40, 60, 80) px. Shadow radius is 10px. Caption height is
        // 64px.
        // 64px.
        taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
        taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
        mOutsetsDp.set(10, 20, 30, 40);
//        int outsetLeftId = R.dimen.split_divider_bar_width;

//        int outsetTopId = R.dimen.gestures_onehanded_drag_threshold;
//        int outsetRightId = R.dimen.freeform_resize_handle;
//        int outsetBottomId = R.dimen.bubble_dismiss_target_padding_x;
//        mRelayoutParams.setOutsets(outsetLeftId, outsetTopId, outsetRightId, outsetBottomId);
        mRelayoutParams.setOutsets(R.dimen.freeform_resize_handle, R.dimen.freeform_resize_handle,
                R.dimen.freeform_resize_handle, R.dimen.freeform_resize_handle);
        final SurfaceControl taskSurface = mock(SurfaceControl.class);
        final SurfaceControl taskSurface = mock(SurfaceControl.class);
        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);


@@ -207,8 +211,8 @@ public class WindowDecorationTests extends ShellTestCase {
        verify(decorContainerSurfaceBuilder).setParent(taskSurface);
        verify(decorContainerSurfaceBuilder).setParent(taskSurface);
        verify(decorContainerSurfaceBuilder).setContainerLayer();
        verify(decorContainerSurfaceBuilder).setContainerLayer();
        verify(mMockSurfaceControlStartT).setTrustedOverlay(decorContainerSurface, true);
        verify(mMockSurfaceControlStartT).setTrustedOverlay(decorContainerSurface, true);
        verify(mMockSurfaceControlStartT).setPosition(decorContainerSurface, -20, -40);
        verify(mMockSurfaceControlStartT).setPosition(decorContainerSurface, -60, -60);
        verify(mMockSurfaceControlStartT).setWindowCrop(decorContainerSurface, 380, 220);
        verify(mMockSurfaceControlStartT).setWindowCrop(decorContainerSurface, 420, 220);


        verify(taskBackgroundSurfaceBuilder).setParent(taskSurface);
        verify(taskBackgroundSurfaceBuilder).setParent(taskSurface);
        verify(taskBackgroundSurfaceBuilder).setEffectLayer();
        verify(taskBackgroundSurfaceBuilder).setEffectLayer();
@@ -221,34 +225,36 @@ public class WindowDecorationTests extends ShellTestCase {


        verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface);
        verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface);
        verify(captionContainerSurfaceBuilder).setContainerLayer();
        verify(captionContainerSurfaceBuilder).setContainerLayer();
        verify(mMockSurfaceControlStartT).setPosition(captionContainerSurface, -46, 8);
        verify(mMockSurfaceControlStartT).setPosition(captionContainerSurface, -6, -156);
        verify(mMockSurfaceControlStartT).setWindowCrop(captionContainerSurface, 300, 64);
        verify(mMockSurfaceControlStartT).setWindowCrop(captionContainerSurface, 300, 432);
        verify(mMockSurfaceControlStartT).show(captionContainerSurface);
        verify(mMockSurfaceControlStartT).show(captionContainerSurface);


        verify(mMockSurfaceControlViewHostFactory).create(any(), eq(defaultDisplay), any());
        verify(mMockSurfaceControlViewHostFactory).create(any(), eq(defaultDisplay), any());

        verify(mMockSurfaceControlViewHost)
        verify(mMockSurfaceControlViewHost)
                .setView(same(mMockView),
                .setView(same(mMockView),
                        argThat(lp -> lp.height == 64
                        argThat(lp -> lp.height == 432
                                && lp.width == 300
                                && lp.width == 432
                                && (lp.flags & LayoutParams.FLAG_NOT_FOCUSABLE) != 0));
                                && (lp.flags & LayoutParams.FLAG_NOT_FOCUSABLE) != 0));
        if (ViewRootImpl.CAPTION_ON_SHELL) {
        if (ViewRootImpl.CAPTION_ON_SHELL) {
            verify(mMockView).setTaskFocusState(true);
            verify(mMockView).setTaskFocusState(true);
            verify(mMockWindowContainerTransaction)
            verify(mMockWindowContainerTransaction)
                    .addRectInsetsProvider(taskInfo.token,
                    .addRectInsetsProvider(taskInfo.token,
                            new Rect(100, 300, 400, 364),
                            new Rect(100, 300, 400, 516),
                            new int[] { InsetsState.ITYPE_CAPTION_BAR });
                            new int[] { InsetsState.ITYPE_CAPTION_BAR });
        }
        }


        verify(mMockSurfaceControlFinishT)
        verify(mMockSurfaceControlFinishT)
                .setPosition(taskSurface, TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y);
                .setPosition(taskSurface, TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y);
        verify(mMockSurfaceControlFinishT)
        verify(mMockSurfaceControlFinishT)
                .setCrop(taskSurface, new Rect(-20, -40, 360, 180));
                .setCrop(taskSurface, new Rect(-60, -60, 360, 160));
        verify(mMockSurfaceControlStartT)
        verify(mMockSurfaceControlStartT)
                .show(taskSurface);
                .show(taskSurface);


        assertEquals(380, mRelayoutResult.mWidth);
        assertEquals(420, mRelayoutResult.mWidth);
        assertEquals(220, mRelayoutResult.mHeight);
        assertEquals(220, mRelayoutResult.mHeight);
        assertEquals(2, mRelayoutResult.mDensity, 0.f);


    }
    }


    @Test
    @Test
@@ -287,7 +293,8 @@ public class WindowDecorationTests extends ShellTestCase {
        // Density is 2. Outsets are (20, 40, 60, 80) px. Shadow radius is 10px. Caption height is
        // Density is 2. Outsets are (20, 40, 60, 80) px. Shadow radius is 10px. Caption height is
        // 64px.
        // 64px.
        taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
        taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2;
        mOutsetsDp.set(10, 20, 30, 40);
        mRelayoutParams.setOutsets(R.dimen.freeform_resize_handle, R.dimen.freeform_resize_handle,
                R.dimen.freeform_resize_handle, R.dimen.freeform_resize_handle);


        final SurfaceControl taskSurface = mock(SurfaceControl.class);
        final SurfaceControl taskSurface = mock(SurfaceControl.class);
        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
        final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo, taskSurface);
@@ -410,9 +417,15 @@ public class WindowDecorationTests extends ShellTestCase {


        @Override
        @Override
        void relayout(ActivityManager.RunningTaskInfo taskInfo) {
        void relayout(ActivityManager.RunningTaskInfo taskInfo) {
            relayout(null /* taskInfo */, 0 /* layoutResId */, mMockView, CAPTION_HEIGHT_DP,

                    CAPTION_WIDTH_DP, mOutsetsDp, SHADOW_RADIUS_DP, mMockSurfaceControlStartT,
            mRelayoutParams.mLayoutResId = 0;
                    mMockSurfaceControlFinishT, mMockWindowContainerTransaction, mRelayoutResult);
            mRelayoutParams.mCaptionHeightId = R.dimen.freeform_decor_caption_width;
            mRelayoutParams.mCaptionWidthId = R.dimen.freeform_decor_caption_width;
            mRelayoutParams.mShadowRadiusId =
                    R.dimen.freeform_decor_shadow_unfocused_thickness;

            relayout(mRelayoutParams, mMockSurfaceControlStartT, mMockSurfaceControlFinishT,
                    mMockWindowContainerTransaction, mMockView, mRelayoutResult);
        }
        }
    }
    }
}
}