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

Commit 73e6d9a6 authored by Riley Jones's avatar Riley Jones
Browse files

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
parent 89b2cd7a
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -38,6 +38,16 @@ flag {
    bug: "281140482"
}

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"
+3 −2
Original line number Diff line number Diff line
@@ -515,8 +515,9 @@ class MenuAnimationController {
        mHandler.removeCallbacksAndMessages(/* token= */ null);
    }

    void startTuckedAnimationPreview() {
    Animation startTuckedAnimationPreview() {
        fadeInNowIfEnabled();
        mMenuView.clearAnimation();

        final float toXValue = isOnLeftSide()
                ? -ANIMATION_TO_X_VALUE
@@ -529,10 +530,10 @@ class MenuAnimationController {
        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() {
+49 −2
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import android.view.WindowInsets;
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 @@ class MenuViewLayer extends FrameLayout implements
    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 @@ class MenuViewLayer extends FrameLayout implements
        }
    };

    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 @@ class MenuViewLayer extends FrameLayout implements
        super.onAttachedToWindow();

        mMenuView.show();
        if (!Flags.floatingMenuRemoveFullscreenTaps()) {
            setOnClickListener(this);
        }
        setOnApplyWindowInsetsListener((view, insets) -> onWindowInsetsApplied(insets));
        getViewTreeObserver().addOnComputeInternalInsetsListener(this);
        mMenuViewModel.getDockTooltipVisibilityData().observeForever(mDockTooltipObserver);
@@ -435,7 +463,11 @@ class MenuViewLayer extends FrameLayout implements
                    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 @@ class MenuViewLayer extends FrameLayout implements
        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 @@ class MenuViewLayer extends FrameLayout implements

        mMenuListViewTouchHandler.setOnActionDownEndListener(
                () -> mEduTooltipView.ifPresent(this::removeTooltip));
        if (Flags.floatingMenuRemoveFullscreenTaps()) {
            setOnClickListener(this);
        }
    }

    private void removeTooltip(View tooltipView) {
@@ -538,6 +581,10 @@ class MenuViewLayer extends FrameLayout implements

        mMenuListViewTouchHandler.setOnActionDownEndListener(null);
        mEduTooltipView = Optional.empty();

        if (Flags.floatingMenuRemoveFullscreenTaps()) {
            setClickable(false);
        }
    }

    @VisibleForTesting