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);