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

Commit fc53675a authored by Winson Chung's avatar Winson Chung
Browse files

Make specific nav touchable region when the IME is showing

- IMEs would like to receive touches that are near the bottom
  of the screen under the nav bar so we should allow this

Bug: 168552683
Test: Verify touchable region from dumpsys input in all nav
      modes w/ ime switcher
Change-Id: Ic2ee8cc8ce59c4025c6730195d6e1050daddf87a
parent e9897deb
Loading
Loading
Loading
Loading
+34 −29
Original line number Diff line number Diff line
@@ -124,7 +124,8 @@ public class NavigationBarView extends FrameLayout implements
    int mNavigationIconHints = 0;
    private int mNavBarMode;

    private final Region mActiveRegion = new Region();
    private final Region mTmpRegion = new Region();
    private final int[] mTmpPosition = new int[2];
    private Rect mTmpBounds = new Rect();

    private KeyButtonDrawable mBackIcon;
@@ -266,24 +267,14 @@ public class NavigationBarView extends FrameLayout implements
    private final OnComputeInternalInsetsListener mOnComputeInternalInsetsListener = info -> {
        // When the nav bar is in 2-button or 3-button mode, or when IME is visible in fully
        // gestural mode, the entire nav bar should be touchable.
        if (!mEdgeBackGestureHandler.isHandlingGestures() || mImeVisible) {
        if (!mEdgeBackGestureHandler.isHandlingGestures()) {
            info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
            return;
        }

        info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
        ButtonDispatcher imeSwitchButton = getImeSwitchButton();
        if (imeSwitchButton.getVisibility() == VISIBLE) {
            // If the IME is not up, but the ime switch button is visible, then make sure that
            // button is touchable
            int[] loc = new int[2];
            View buttonView = imeSwitchButton.getCurrentView();
            buttonView.getLocationInWindow(loc);
            info.touchableRegion.set(loc[0], loc[1], loc[0] + buttonView.getWidth(),
                    loc[1] + buttonView.getHeight());
            return;
        }
        info.touchableRegion.setEmpty();
        info.touchableRegion.set(getButtonLocations(false /* includeFloatingRotationButton */,
                false /* inScreen */));
    };

    private final Consumer<Boolean> mRotationButtonListener = (visible) -> {
@@ -956,30 +947,44 @@ public class NavigationBarView extends FrameLayout implements
     * Notifies the overview service of the active touch regions.
     */
    public void notifyActiveTouchRegions() {
        mActiveRegion.setEmpty();
        updateButtonLocation(getBackButton());
        updateButtonLocation(getHomeButton());
        updateButtonLocation(getRecentsButton());
        updateButtonLocation(getImeSwitchButton());
        updateButtonLocation(getAccessibilityButton());
        if (mFloatingRotationButton.isVisible()) {
            View floatingRotationView = mFloatingRotationButton.getCurrentView();
            floatingRotationView.getBoundsOnScreen(mTmpBounds);
            mActiveRegion.op(mTmpBounds, Op.UNION);
        mOverviewProxyService.onActiveNavBarRegionChanges(
                getButtonLocations(true /* includeFloatingRotationButton */, true /* inScreen */));
    }

    private Region getButtonLocations(boolean includeFloatingRotationButton,
            boolean inScreenSpace) {
        mTmpRegion.setEmpty();
        updateButtonLocation(getBackButton(), inScreenSpace);
        updateButtonLocation(getHomeButton(), inScreenSpace);
        updateButtonLocation(getRecentsButton(), inScreenSpace);
        updateButtonLocation(getImeSwitchButton(), inScreenSpace);
        updateButtonLocation(getAccessibilityButton(), inScreenSpace);
        if (includeFloatingRotationButton && mFloatingRotationButton.isVisible()) {
            updateButtonLocation(mFloatingRotationButton.getCurrentView(), inScreenSpace);
        } else {
            updateButtonLocation(getRotateSuggestionButton());
            updateButtonLocation(getRotateSuggestionButton(), inScreenSpace);
        }
        mOverviewProxyService.onActiveNavBarRegionChanges(mActiveRegion);
        return mTmpRegion;
    }

    private void updateButtonLocation(ButtonDispatcher button) {
    private void updateButtonLocation(ButtonDispatcher button, boolean inScreenSpace) {
        View view = button.getCurrentView();
        if (view == null || !button.isVisible()) {
            return;
        }
        updateButtonLocation(view, inScreenSpace);
    }

    private void updateButtonLocation(View view, boolean inScreenSpace) {
        if (inScreenSpace) {
            view.getBoundsOnScreen(mTmpBounds);
        mActiveRegion.op(mTmpBounds, Op.UNION);
        } else {
            view.getLocationInWindow(mTmpPosition);
            mTmpBounds.set(mTmpPosition[0], mTmpPosition[1],
                    mTmpPosition[0] + view.getWidth(),
                    mTmpPosition[1] + view.getHeight());
        }
        mTmpRegion.op(mTmpBounds, Op.UNION);
    }

    private void updateOrientationViews() {