From 741aef12d0528f7919937be4f60da536a8670dcb Mon Sep 17 00:00:00 2001 From: Galia Peycheva Date: Tue, 21 Mar 2023 17:12:36 +0000 Subject: [PATCH] Add outline to tv pip menu arrows In order to have an outline for the arrows, we draw them programmatically instead of in xml with vector drawables. This way, we can ensure that the Path for the drawable is the same as the Path for the ViewOutlineProvider. Bug: 220108601 Test: atest TvPipMenuController Test: flash and check arrows are visible over white background Change-Id: I965e9ac33f474012446b6f8096edf39d93a0c92e --- .../Shell/res/drawable/pip_ic_move_down.xml | 25 ------- .../Shell/res/drawable/pip_ic_move_left.xml | 25 ------- .../Shell/res/drawable/pip_ic_move_right.xml | 25 ------- .../Shell/res/drawable/pip_ic_move_up.xml | 25 ------- .../Shell/res/layout/tv_pip_menu.xml | 16 +--- .../Shell/res/values-tvdpi/dimen.xml | 4 +- .../Shell/res/values/colors_tv.xml | 4 + .../wm/shell/pip/tv/TvPipMenuView.java | 74 +++++++++++++++++-- 8 files changed, 76 insertions(+), 122 deletions(-) delete mode 100644 libs/WindowManager/Shell/res/drawable/pip_ic_move_down.xml delete mode 100644 libs/WindowManager/Shell/res/drawable/pip_ic_move_left.xml delete mode 100644 libs/WindowManager/Shell/res/drawable/pip_ic_move_right.xml delete mode 100644 libs/WindowManager/Shell/res/drawable/pip_ic_move_up.xml diff --git a/libs/WindowManager/Shell/res/drawable/pip_ic_move_down.xml b/libs/WindowManager/Shell/res/drawable/pip_ic_move_down.xml deleted file mode 100644 index d8f356164358d..0000000000000 --- a/libs/WindowManager/Shell/res/drawable/pip_ic_move_down.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - \ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/pip_ic_move_left.xml b/libs/WindowManager/Shell/res/drawable/pip_ic_move_left.xml deleted file mode 100644 index 3e0011c65942f..0000000000000 --- a/libs/WindowManager/Shell/res/drawable/pip_ic_move_left.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - \ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/pip_ic_move_right.xml b/libs/WindowManager/Shell/res/drawable/pip_ic_move_right.xml deleted file mode 100644 index f6b3c72e3cb5f..0000000000000 --- a/libs/WindowManager/Shell/res/drawable/pip_ic_move_right.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - \ No newline at end of file diff --git a/libs/WindowManager/Shell/res/drawable/pip_ic_move_up.xml b/libs/WindowManager/Shell/res/drawable/pip_ic_move_up.xml deleted file mode 100644 index 1a34462495738..0000000000000 --- a/libs/WindowManager/Shell/res/drawable/pip_ic_move_up.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - \ No newline at end of file diff --git a/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml b/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml index dcce4698c2524..bcb789586bfb2 100644 --- a/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml +++ b/libs/WindowManager/Shell/res/layout/tv_pip_menu.xml @@ -104,9 +104,7 @@ android:layout_centerHorizontal="true" android:layout_alignParentTop="true" android:alpha="0" - android:contentDescription="@string/a11y_action_pip_move_up" - android:elevation="@dimen/pip_menu_arrow_elevation" - android:src="@drawable/pip_ic_move_up" /> + android:contentDescription="@string/a11y_action_pip_move_up"/> + android:contentDescription="@string/a11y_action_pip_move_right"/> + android:contentDescription="@string/a11y_action_pip_move_down"/> + android:contentDescription="@string/a11y_action_pip_move_left"/> diff --git a/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml b/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml index adbf65648dd12..fd825639f1e81 100644 --- a/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml +++ b/libs/WindowManager/Shell/res/values-tvdpi/dimen.xml @@ -33,8 +33,8 @@ 20dp - 24dp - 5dp + 12dp + 1dp 1dp 7dp diff --git a/libs/WindowManager/Shell/res/values/colors_tv.xml b/libs/WindowManager/Shell/res/values/colors_tv.xml index e6933ca3fce62..5f7fb12c30022 100644 --- a/libs/WindowManager/Shell/res/values/colors_tv.xml +++ b/libs/WindowManager/Shell/res/values/colors_tv.xml @@ -27,6 +27,10 @@ #E8EAED #990E0E0F #1E232C + + #F1F3F4 #99D2E3FC #D2E3FC diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java index 6eb719ba60a36..bcf70aa2bd3ea 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java @@ -31,12 +31,19 @@ import static com.android.wm.shell.pip.tv.TvPipMenuController.MODE_MOVE_MENU; import static com.android.wm.shell.pip.tv.TvPipMenuController.MODE_NO_MENU; import android.content.Context; +import android.content.res.Resources; +import android.graphics.Outline; +import android.graphics.Path; import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.PathShape; import android.os.Handler; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; +import android.view.ViewOutlineProvider; import android.view.accessibility.AccessibilityManager; import android.widget.FrameLayout; import android.widget.ImageView; @@ -89,6 +96,8 @@ public class TvPipMenuView extends FrameLayout implements TvPipActionsProvider.L private final ImageView mArrowLeft; private final TvWindowMenuActionButton mA11yDoneButton; + private final int mArrowElevation; + private @TvPipMenuController.TvPipMenuMode int mCurrentMenuMode = MODE_NO_MENU; private final Rect mCurrentPipBounds = new Rect(); private int mCurrentPipGravity; @@ -129,21 +138,70 @@ public class TvPipMenuView extends FrameLayout implements TvPipActionsProvider.L mArrowLeft = findViewById(R.id.tv_pip_menu_arrow_left); mA11yDoneButton = findViewById(R.id.tv_pip_menu_done_button); - mResizeAnimationDuration = context.getResources().getInteger( - R.integer.config_pipResizeAnimationDuration); - mPipMenuFadeAnimationDuration = context.getResources() - .getInteger(R.integer.tv_window_menu_fade_animation_duration); + final Resources res = context.getResources(); + mResizeAnimationDuration = res.getInteger(R.integer.config_pipResizeAnimationDuration); + mPipMenuFadeAnimationDuration = + res.getInteger(R.integer.tv_window_menu_fade_animation_duration); + mPipMenuOuterSpace = res.getDimensionPixelSize(R.dimen.pip_menu_outer_space); + mPipMenuBorderWidth = res.getDimensionPixelSize(R.dimen.pip_menu_border_width); + mArrowElevation = res.getDimensionPixelSize(R.dimen.pip_menu_arrow_elevation); - mPipMenuOuterSpace = context.getResources() - .getDimensionPixelSize(R.dimen.pip_menu_outer_space); - mPipMenuBorderWidth = context.getResources() - .getDimensionPixelSize(R.dimen.pip_menu_border_width); + initMoveArrows(); mEduTextDrawer = new TvPipMenuEduTextDrawer(mContext, mainHandler, mListener); ((FrameLayout) findViewById(R.id.tv_pip_menu_edu_text_drawer_placeholder)) .addView(mEduTextDrawer); } + private void initMoveArrows() { + final int arrowSize = + mContext.getResources().getDimensionPixelSize(R.dimen.pip_menu_arrow_size); + final Path arrowPath = createArrowPath(arrowSize); + + final ShapeDrawable arrowDrawable = new ShapeDrawable(); + arrowDrawable.setShape(new PathShape(arrowPath, arrowSize, arrowSize)); + arrowDrawable.setTint(mContext.getResources().getColor(R.color.tv_pip_menu_arrow_color)); + + final ViewOutlineProvider arrowOutlineProvider = new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setPath(createArrowPath(view.getMeasuredHeight())); + } + }; + + initArrow(mArrowRight, arrowOutlineProvider, arrowDrawable, 0); + initArrow(mArrowDown, arrowOutlineProvider, arrowDrawable, 90); + initArrow(mArrowLeft, arrowOutlineProvider, arrowDrawable, 180); + initArrow(mArrowUp, arrowOutlineProvider, arrowDrawable, 270); + } + + /** + * Creates a Path for a movement arrow in the MODE_MOVE_MENU. The resulting Path is a simple + * right-pointing triangle with its tip in the center of a size x size square: + * _ _ _ _ _ + * |* | + * |* * | + * |* * | + * |* * | + * |* _ _ _ _| + * + */ + private Path createArrowPath(int size) { + final Path triangle = new Path(); + triangle.lineTo(0, size); + triangle.lineTo(size / 2, size / 2); + triangle.close(); + return triangle; + } + + private void initArrow(View v, ViewOutlineProvider arrowOutlineProvider, Drawable arrowDrawable, + int rotation) { + v.setOutlineProvider(arrowOutlineProvider); + v.setBackground(arrowDrawable); + v.setRotation(rotation); + v.setElevation(mArrowElevation); + } + void onPipTransitionToTargetBoundsStarted(Rect targetBounds) { if (targetBounds == null) { return;