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

Commit dc6c43fa authored by Roman Birg's avatar Roman Birg Committed by Gerrit Code Review
Browse files

SystemUI: fix dpad arrow keys after rotation



We need to keep the saved visibilities of the side buttons separately
for both vertical and horizontal layouts because they can get out of
sync. For instance rotating a device when IME keys are shown, does not
guarentee that they will be shown after the rotation is finished.

Change-Id: I7cfe7dc941811b7663d965e4f08dd52a8c0fdea4
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 837b9675
Loading
Loading
Loading
Loading
+46 −23
Original line number Diff line number Diff line
@@ -104,11 +104,16 @@ public class NavigationBarView extends LinearLayout {
    private DeadZone mDeadZone;
    private final NavigationBarTransitions mBarTransitions;

    // Visibility of R.id.one view prior to swapping it for a left arrow key
    public int mSlotOneVisibility = -1;

    // Visibility of R.id.six view prior to swapping it for a right arrow key
    public int mSlotSixVisibility = -1;
    /**
     * Tracks the current visibilities of the far left (R.id.one) and right (R.id.six) buttons
     * while dpad arrow keys are visible.
     *
     * We keep track of the orientations separately because they can get in different states,
     * We can be showing dpad arrow keys on vertical, but on portrait that may not be so.
     */
    public int[][] mSideButtonVisibilities = new int[][] {
        {-1, -1} /* portrait */, {-1, -1} /* vertical */
    };

    // workaround for LayoutTransitions leaving the nav buttons in a weird state (bug 5549288)
    final static boolean WORKAROUND_INVALID_LAYOUT = true;
@@ -412,6 +417,9 @@ public class NavigationBarView extends LinearLayout {

        setDisabledFlags(mDisabledFlags, true);

        // Update menu button in case the IME state has changed.
        setMenuVisibility(mShowMenu, true);

        if (mShowDpadArrowKeys) { // overrides IME button
            final boolean showingIme = ((mNavigationIconHints
                    & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0);
@@ -422,27 +430,34 @@ public class NavigationBarView extends LinearLayout {
            View one = getCurrentView().findViewById(mVertical ? R.id.six : R.id.one);
            View six = getCurrentView().findViewById(mVertical ? R.id.one : R.id.six);
            if (showingIme) {
                if (mSlotOneVisibility == View.VISIBLE || one.getVisibility() == View.VISIBLE) {
                    mSlotOneVisibility = View.VISIBLE;
                if (one.getVisibility() != View.GONE) {
                    setSideButtonVisibility(true, one.getVisibility());
                    setVisibleOrGone(one, false);
                }
                if (mSlotSixVisibility == View.VISIBLE || six.getVisibility() == View.VISIBLE) {
                    mSlotSixVisibility = View.VISIBLE;

                if (six.getVisibility() != View.GONE) {
                    setSideButtonVisibility(false, six.getVisibility());
                    setVisibleOrGone(six, false);
                }
            } else {
                if (mSlotOneVisibility != -1) {
                    one.setVisibility(mSlotOneVisibility);
                    mSlotOneVisibility = -1;
                if (getSideButtonVisibility(true) != -1) {
                    one.setVisibility(getSideButtonVisibility(true));
                    setSideButtonVisibility(true, - 1);
                }
                if (mSlotSixVisibility != -1) {
                    six.setVisibility(mSlotSixVisibility);
                    mSlotSixVisibility = -1;
                if (getSideButtonVisibility(false) != -1) {
                    six.setVisibility(getSideButtonVisibility(false));
                    setSideButtonVisibility(false, -1);
                }
            }
        }
        // Update menu button in case the IME state has changed.
        setMenuVisibility(mShowMenu, true);
    }

    private int getSideButtonVisibility(boolean left) {
        return mSideButtonVisibilities[mVertical ? 1 : 0][left ? 0 : 1];
    }

    private void setSideButtonVisibility(boolean left, int vis) {
        mSideButtonVisibilities[mVertical ? 1 : 0][left ? 0 : 1] = vis;
    }

    public void setDisabledFlags(int disabledFlags) {
@@ -831,10 +846,14 @@ public class NavigationBarView extends LinearLayout {
            return;
        }
        int visibility = visible ? View.VISIBLE : View.INVISIBLE;
        if (mSlotOneVisibility != -1 && findView.getId() == R.id.one) {
            mSlotOneVisibility = visibility;
        } else if (mSlotSixVisibility != -1 && findView.getId() == R.id.six) {
            mSlotSixVisibility = visibility;
        // if we're showing dpad arrow keys (e.g. the side button visibility where it's shown != -1)
        // then don't actually update that buttons visibility, but update the stored value
        if (getSideButtonVisibility(true) != -1
                && findView.getId() == (mVertical ? R.id.six : R.id.one)) {
            setSideButtonVisibility(true, visibility);
        } else if (getSideButtonVisibility(false) != -1
                && findView.getId() == (mVertical ? R.id.one : R.id.six)) {
            setSideButtonVisibility(false, visibility);
        } else {
            findView.setVisibility(visibility);
        }
@@ -902,8 +921,12 @@ public class NavigationBarView extends LinearLayout {
        protected void update() {
            mShowDpadArrowKeys = Settings.System.getIntForUser(mContext.getContentResolver(),
                    Settings.System.NAVIGATION_BAR_MENU_ARROW_KEYS, 0, UserHandle.USER_CURRENT) != 0;
            mSlotOneVisibility = -1;
            mSlotSixVisibility = -1;
            // reset saved side button visibilities
            for (int i = 0; i < mSideButtonVisibilities.length; i++) {
                for (int j = 0; j < mSideButtonVisibilities[i].length; j++) {
                    mSideButtonVisibilities[i][j] = -1;
                }
            }
            setNavigationIconHints(mNavigationIconHints, true);
        }
    }