From 0255e16c21223a73d54412c4c9551172f63e3171 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Tue, 21 May 2019 12:54:58 -0400 Subject: [PATCH] Adds assist geture hint handles to ScreenDecorations On screen gesture hint for using the corner gesture to trigger assistant. This provides a placeholder for the view within ScreenDecorations, to relocate from the original location in StatusBar. SysUI AssistManager will control the visibility of the handles, in response to events. By default the handles remain hidden. Bug: 132285072 Test: manual visual verification while developing Change-Id: I0234ce4677c77c9f4367334c1df7f4a8b59e8d66 --- .../res/drawable/corner_gesture_hint.xml | 25 ++++++ .../SystemUI/res/layout/rounded_corners.xml | 18 ++++ .../android/systemui/ScreenDecorations.java | 90 +++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 packages/SystemUI/res/drawable/corner_gesture_hint.xml diff --git a/packages/SystemUI/res/drawable/corner_gesture_hint.xml b/packages/SystemUI/res/drawable/corner_gesture_hint.xml new file mode 100644 index 0000000000000..3f4abb0e0dd4f --- /dev/null +++ b/packages/SystemUI/res/drawable/corner_gesture_hint.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/packages/SystemUI/res/layout/rounded_corners.xml b/packages/SystemUI/res/layout/rounded_corners.xml index 26cf7920c35bd..02651a2128168 100644 --- a/packages/SystemUI/res/layout/rounded_corners.xml +++ b/packages/SystemUI/res/layout/rounded_corners.xml @@ -32,4 +32,22 @@ android:tint="#ff000000" android:layout_gravity="right|bottom" android:src="@drawable/rounded" /> + + diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index c0f03a6f4ef86..69d3af8ff9835 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -105,6 +105,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { private float mDensity; private WindowManager mWindowManager; private int mRotation; + private boolean mAssistHintVisible; private DisplayCutoutView mCutoutTop; private DisplayCutoutView mCutoutBottom; private SecureSetting mColorInversionSetting; @@ -133,6 +134,55 @@ public class ScreenDecorations extends SystemUI implements Tunable { mHandler = startHandlerThread(); mHandler.post(this::startOnScreenDecorationsThread); setupStatusBarPaddingIfNeeded(); + putComponent(ScreenDecorations.class, this); + } + + private void fade(View view, boolean fadeIn) { + if (fadeIn) { + view.animate().cancel(); + view.setAlpha(0f); + view.setVisibility(View.VISIBLE); + view.animate().alpha(1f); + } else { + view.animate().cancel(); + view.animate().alpha(0f).withEndAction(() -> view.setVisibility(View.INVISIBLE)); + } + + } + + /** + * Controls the visibility of the assist gesture handles. + * + * @param visible whether the handles should be shown + */ + public void setAssistHintVisible(boolean visible) { + if (mAssistHintVisible != visible) { + mAssistHintVisible = visible; + + View assistHintTopLeft = mOverlay.findViewById(R.id.assist_hint_left); + View assistHintTopRight = mOverlay.findViewById(R.id.assist_hint_right); + View assistHintBottomLeft = mBottomOverlay.findViewById(R.id.assist_hint_left); + View assistHintBottomRight = mBottomOverlay.findViewById(R.id.assist_hint_right); + + switch (mRotation) { + case RotationUtils.ROTATION_NONE: + fade(assistHintBottomLeft, mAssistHintVisible); + fade(assistHintBottomRight, mAssistHintVisible); + break; + case RotationUtils.ROTATION_LANDSCAPE: + fade(assistHintTopRight, mAssistHintVisible); + fade(assistHintBottomRight, mAssistHintVisible); + break; + case RotationUtils.ROTATION_SEASCAPE: + fade(assistHintTopLeft, mAssistHintVisible); + fade(assistHintBottomLeft, mAssistHintVisible); + break; + case RotationUtils.ROTATION_UPSIDE_DOWN: + fade(assistHintTopLeft, mAssistHintVisible); + fade(assistHintTopRight, mAssistHintVisible); + break; + } + } } @VisibleForTesting @@ -375,12 +425,52 @@ public class ScreenDecorations extends SystemUI implements Tunable { updateView(bottomRight, Gravity.TOP | Gravity.LEFT, 0); } + updateAssistantHandleViews(); mCutoutTop.setRotation(mRotation); mCutoutBottom.setRotation(mRotation); updateWindowVisibilities(); } + private void updateAssistantHandleViews() { + View assistHintTopLeft = mOverlay.findViewById(R.id.assist_hint_left); + View assistHintTopRight = mOverlay.findViewById(R.id.assist_hint_right); + View assistHintBottomLeft = mBottomOverlay.findViewById(R.id.assist_hint_left); + View assistHintBottomRight = mBottomOverlay.findViewById(R.id.assist_hint_right); + + final int assistHintVisibility = mAssistHintVisible ? View.VISIBLE : View.INVISIBLE; + + if (mRotation == RotationUtils.ROTATION_NONE) { + assistHintTopLeft.setVisibility(View.GONE); + assistHintTopRight.setVisibility(View.GONE); + assistHintBottomLeft.setVisibility(assistHintVisibility); + assistHintBottomRight.setVisibility(assistHintVisibility); + updateView(assistHintBottomLeft, Gravity.BOTTOM | Gravity.LEFT, 270); + updateView(assistHintBottomRight, Gravity.BOTTOM | Gravity.RIGHT, 180); + } else if (mRotation == RotationUtils.ROTATION_LANDSCAPE) { + assistHintTopLeft.setVisibility(View.GONE); + assistHintTopRight.setVisibility(assistHintVisibility); + assistHintBottomLeft.setVisibility(View.GONE); + assistHintBottomRight.setVisibility(assistHintVisibility); + updateView(assistHintTopRight, Gravity.BOTTOM | Gravity.LEFT, 270); + updateView(assistHintBottomRight, Gravity.BOTTOM | Gravity.RIGHT, 180); + } else if (mRotation == RotationUtils.ROTATION_UPSIDE_DOWN) { + assistHintTopLeft.setVisibility(assistHintVisibility); + assistHintTopRight.setVisibility(assistHintVisibility); + assistHintBottomLeft.setVisibility(View.GONE); + assistHintBottomRight.setVisibility(View.GONE); + updateView(assistHintTopLeft, Gravity.BOTTOM | Gravity.LEFT, 270); + updateView(assistHintTopRight, Gravity.BOTTOM | Gravity.RIGHT, 180); + } else if (mRotation == RotationUtils.ROTATION_SEASCAPE) { + assistHintTopLeft.setVisibility(assistHintVisibility); + assistHintTopRight.setVisibility(View.GONE); + assistHintBottomLeft.setVisibility(assistHintVisibility); + assistHintBottomRight.setVisibility(View.GONE); + updateView(assistHintTopLeft, Gravity.BOTTOM | Gravity.RIGHT, 180); + updateView(assistHintBottomLeft, Gravity.BOTTOM | Gravity.LEFT, 270); + } + } + private void updateView(View v, int gravity, int rotation) { ((FrameLayout.LayoutParams)v.getLayoutParams()).gravity = gravity; v.setRotation(rotation);