Fix to make MenuViewLayer not interfere with user inputs.
MenuViewLayer is only clickable while a tooltip is present. Clicking it (clicking most of the screen) will still dismiss the tooltip.
In addition, the tuck/dock tooltip will automatically dismiss itself after enough time has elapsed.
Bug: 411287116
Test: atest com.android.systemui.accessibility.floatingmenu
Test: acquire TreeDebug logs while FAB is present - verify the FrameLayout referring to MenuViewLayer is no longer clickable.
Test: in addition, verify the tooltip works as described above.
Flag: com.android.systemui.floating_menu_remove_fullscreen_taps
Change-Id: If997b6bab9acf4bbe43ff859f59d8a85e270e7f6
diff --git a/packages/SystemUI/aconfig/accessibility.aconfig b/packages/SystemUI/aconfig/accessibility.aconfig
index 6df39fb..ac75eb1 100644
--- a/packages/SystemUI/aconfig/accessibility.aconfig
+++ b/packages/SystemUI/aconfig/accessibility.aconfig
@@ -39,6 +39,16 @@
}
flag {
+ name: "floating_menu_remove_fullscreen_taps"
+ namespace: "accessibility"
+ description: "Stops MenuViewLayer from taking some inputs by making it unclickable."
+ bug: "411287116"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "redesign_magnification_window_size"
namespace: "accessibility"
description: "Redesigns the window magnification magnifier sizes provided in the settings panel."
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java
index ab39640..493402b 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuAnimationController.java
@@ -515,8 +515,9 @@
mHandler.removeCallbacksAndMessages(/* token= */ null);
}
- void startTuckedAnimationPreview() {
+ Animation startTuckedAnimationPreview() {
fadeInNowIfEnabled();
+ mMenuView.clearAnimation();
final float toXValue = isOnLeftSide()
? -ANIMATION_TO_X_VALUE
@@ -529,10 +530,10 @@
animation.setDuration(ANIMATION_DURATION_MS);
animation.setRepeatMode(Animation.REVERSE);
animation.setInterpolator(new OvershootInterpolator());
- animation.setRepeatCount(Animation.INFINITE);
animation.setStartOffset(ANIMATION_START_OFFSET_MS);
mMenuView.startAnimation(animation);
+ return animation;
}
private Handler createUiHandler() {
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
index e8187cc..dfa6b03 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java
@@ -56,6 +56,7 @@
import android.view.WindowManager;
import android.view.WindowMetrics;
import android.view.accessibility.AccessibilityManager;
+import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.TextView;
@@ -134,6 +135,8 @@
private final Rect mImeInsetsRect = new Rect();
private boolean mIsMigrationTooltipShowing;
private boolean mShouldShowDockTooltip;
+ private boolean mShouldLoopDockDemo;
+ private boolean mIsDockDemoDocked;
private boolean mIsNotificationShown;
private Optional<MenuEduTooltipView> mEduTooltipView = Optional.empty();
private BroadcastReceiver mNotificationActionReceiver;
@@ -179,6 +182,29 @@
}
};
+ Animation.AnimationListener mTuckDemoListener = new Animation.AnimationListener() {
+ @Override
+ public void onAnimationStart(Animation animation) {
+ mIsDockDemoDocked = false;
+ }
+
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ mEduTooltipView.ifPresent(view -> removeTooltip(view));
+ }
+
+ @Override
+ public void onAnimationRepeat(Animation animation) {
+ if (Flags.floatingMenuRemoveFullscreenTaps()) {
+ mIsDockDemoDocked = !mIsDockDemoDocked;
+ // Only stop animation once MenuView has looped back to its normal position.
+ if (!mShouldLoopDockDemo && !mIsDockDemoDocked) {
+ mMenuView.clearAnimation();
+ }
+ }
+ }
+ };
+
MenuViewLayer(@NonNull Context context, WindowManager windowManager,
AccessibilityManager accessibilityManager,
MenuViewModel menuViewModel,
@@ -331,7 +357,9 @@
super.onAttachedToWindow();
mMenuView.show();
- setOnClickListener(this);
+ if (!Flags.floatingMenuRemoveFullscreenTaps()) {
+ setOnClickListener(this);
+ }
setOnApplyWindowInsetsListener((view, insets) -> onWindowInsetsApplied(insets));
getViewTreeObserver().addOnComputeInternalInsetsListener(this);
mMenuViewModel.getDockTooltipVisibilityData().observeForever(mDockTooltipObserver);
@@ -435,7 +463,11 @@
getContext().getText(R.string.accessibility_floating_button_docking_tooltip),
TooltipType.DOCK));
- mMenuAnimationController.startTuckedAnimationPreview();
+ mShouldLoopDockDemo = true;
+ dispatchTooltipTuckAnimation();
+ mHandler.postDelayed(() -> mShouldLoopDockDemo = false,
+ mAccessibilityManager.getRecommendedTimeoutMillis(
+ SHOW_MESSAGE_DELAY_MS, AccessibilityManager.FLAG_CONTENT_TEXT));
}
if (!mMenuView.isMoveToTucked()) {
@@ -444,6 +476,14 @@
mMenuView.onArrivalAtPosition(false);
}
+ void dispatchTooltipTuckAnimation() {
+ Animation animation =
+ mMenuAnimationController.startTuckedAnimationPreview();
+ if (Flags.floatingMenuRemoveFullscreenTaps()) {
+ animation.setAnimationListener(mTuckDemoListener);
+ }
+ }
+
void dispatchAccessibilityAction(int id) {
if (id == R.id.action_remove_menu) {
if (Flags.floatingMenuDragToHide()) {
@@ -520,6 +560,9 @@
mMenuListViewTouchHandler.setOnActionDownEndListener(
() -> mEduTooltipView.ifPresent(this::removeTooltip));
+ if (Flags.floatingMenuRemoveFullscreenTaps()) {
+ setOnClickListener(this);
+ }
}
private void removeTooltip(View tooltipView) {
@@ -538,6 +581,10 @@
mMenuListViewTouchHandler.setOnActionDownEndListener(null);
mEduTooltipView = Optional.empty();
+
+ if (Flags.floatingMenuRemoveFullscreenTaps()) {
+ setClickable(false);
+ }
}
@VisibleForTesting