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

Commit 6607c3dc authored by Matthew Ng's avatar Matthew Ng
Browse files

Quickscrub will hide the most right buttons on nav bar

When scrub occurs, it will fade out the container of the navigation bar
menu buttons and animate them back when scrub ends.

Fixes: 77338303
Test: enable magnify in accessibility settings and drag home
Change-Id: Ic5df73b980c2cb20a135b20a9f84002f107db1c0
parent 331a22e3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:systemui="http://schemas.android.com/apk/res-auto"
    android:id="@+id/menu_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
+57 −16
Original line number Diff line number Diff line
@@ -14,8 +14,12 @@

package com.android.systemui.statusbar.phone;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.view.View;

import com.android.systemui.Interpolators;
import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider.ButtonInterface;
import com.android.systemui.statusbar.policy.KeyButtonDrawable;

@@ -26,6 +30,8 @@ import java.util.ArrayList;
 * multiples of the same nav bar icon appearing.
 */
public class ButtonDispatcher {
    private final static int FADE_DURATION_IN = 150;
    private final static int FADE_DURATION_OUT = 100;

    private final ArrayList<View> mViews = new ArrayList<>();

@@ -36,13 +42,24 @@ public class ButtonDispatcher {
    private View.OnLongClickListener mLongClickListener;
    private View.OnHoverListener mOnHoverListener;
    private Boolean mLongClickable;
    private Integer mAlpha;
    private Float mAlpha;
    private Float mDarkIntensity;
    private Integer mVisibility = -1;
    private Boolean mDelayTouchFeedback;
    private KeyButtonDrawable mImageDrawable;
    private View mCurrentView;
    private boolean mVertical;
    private ValueAnimator mFadeAnimator;

    private final ValueAnimator.AnimatorUpdateListener mAlphaListener = animation ->
            setAlpha((float) animation.getAnimatedValue());

    private final AnimatorListenerAdapter mFadeListener = new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            setVisibility(getAlpha() == 1 ? View.VISIBLE : View.INVISIBLE);
        }
    };

    public ButtonDispatcher(int id) {
        mId = id;
@@ -64,19 +81,22 @@ public class ButtonDispatcher {
        if (mAlpha != null) {
            view.setAlpha(mAlpha);
        }
        if (mDarkIntensity != null) {
            ((ButtonInterface) view).setDarkIntensity(mDarkIntensity);
        }
        if (mVisibility != null) {
        if (mVisibility != null && mVisibility != -1) {
            view.setVisibility(mVisibility);
        }
        if (view instanceof ButtonInterface) {
            final ButtonInterface button = (ButtonInterface) view;
            if (mDarkIntensity != null) {
                button.setDarkIntensity(mDarkIntensity);
            }
            if (mImageDrawable != null) {
            ((ButtonInterface) view).setImageDrawable(mImageDrawable);
                button.setImageDrawable(mImageDrawable);
            }
            if (mDelayTouchFeedback != null) {
            ((ButtonInterface) view).setDelayTouchFeedback(mDelayTouchFeedback);
                button.setDelayTouchFeedback(mDelayTouchFeedback);
            }
            button.setVertical(mVertical);
        }
        ((ButtonInterface) view).setVertical(mVertical);
    }

    public int getId() {
@@ -99,9 +119,11 @@ public class ButtonDispatcher {
        mImageDrawable = drawable;
        final int N = mViews.size();
        for (int i = 0; i < N; i++) {
            if (mViews.get(i) instanceof ButtonInterface) {
                ((ButtonInterface) mViews.get(i)).setImageDrawable(mImageDrawable);
            }
        }
    }

    public void setVisibility(int visibility) {
        if (mVisibility == visibility) return;
@@ -116,11 +138,13 @@ public class ButtonDispatcher {
        // This seems to be an instantaneous thing, so not going to persist it.
        final int N = mViews.size();
        for (int i = 0; i < N; i++) {
            if (mViews.get(i) instanceof ButtonInterface) {
                ((ButtonInterface) mViews.get(i)).abortCurrentGesture();
            }
        }
    }

    public void setAlpha(int alpha) {
    public void setAlpha(float alpha) {
        mAlpha = alpha;
        final int N = mViews.size();
        for (int i = 0; i < N; i++) {
@@ -132,17 +156,21 @@ public class ButtonDispatcher {
        mDarkIntensity = darkIntensity;
        final int N = mViews.size();
        for (int i = 0; i < N; i++) {
            if (mViews.get(i) instanceof ButtonInterface) {
                ((ButtonInterface) mViews.get(i)).setDarkIntensity(darkIntensity);
            }
        }
    }

    public void setDelayTouchFeedback(boolean delay) {
        mDelayTouchFeedback = delay;
        final int N = mViews.size();
        for (int i = 0; i < N; i++) {
            if (mViews.get(i) instanceof ButtonInterface) {
                ((ButtonInterface) mViews.get(i)).setDelayTouchFeedback(delay);
            }
        }
    }

    public void setOnClickListener(View.OnClickListener clickListener) {
        mClickListener = clickListener;
@@ -192,6 +220,19 @@ public class ButtonDispatcher {
        }
    }

    public void animateFade(boolean in) {
        if (mFadeAnimator != null) {
            mFadeAnimator.cancel();
        }
        mFadeAnimator = ValueAnimator.ofFloat(getAlpha(), in ? 1 : 0);
        mFadeAnimator.setDuration(in? FADE_DURATION_IN : FADE_DURATION_OUT);
        mFadeAnimator.setInterpolator(in ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT);
        mFadeAnimator.addListener(mFadeListener);
        mFadeAnimator.addUpdateListener(mAlphaListener);
        mFadeAnimator.start();
        setVisibility(View.VISIBLE);
    }

    public ArrayList<View> getViews() {
        return mViews;
    }
+8 −6
Original line number Diff line number Diff line
@@ -168,10 +168,10 @@ public class NavigationBarInflaterView extends FrameLayout
        }
    }

    public void setButtonDispatchers(SparseArray<ButtonDispatcher> buttonDisatchers) {
        mButtonDispatchers = buttonDisatchers;
        for (int i = 0; i < buttonDisatchers.size(); i++) {
            initiallyFill(buttonDisatchers.valueAt(i));
    public void setButtonDispatchers(SparseArray<ButtonDispatcher> buttonDispatchers) {
        mButtonDispatchers = buttonDispatchers;
        for (int i = 0; i < buttonDispatchers.size(); i++) {
            initiallyFill(buttonDispatchers.valueAt(i));
        }
    }

@@ -220,7 +220,8 @@ public class NavigationBarInflaterView extends FrameLayout
            // and will only happen once.
            if (parent.getChildAt(i).getId() == buttonDispatcher.getId()) {
                buttonDispatcher.addView(parent.getChildAt(i));
            } else if (parent.getChildAt(i) instanceof ViewGroup) {
            }
            if (parent.getChildAt(i) instanceof ViewGroup) {
                addAll(buttonDispatcher, (ViewGroup) parent.getChildAt(i));
            }
        }
@@ -411,7 +412,8 @@ public class NavigationBarInflaterView extends FrameLayout
            final int indexOfKey = mButtonDispatchers.indexOfKey(v.getId());
            if (indexOfKey >= 0) {
                mButtonDispatchers.valueAt(indexOfKey).addView(v);
            } else if (v instanceof ViewGroup) {
            }
            if (v instanceof ViewGroup) {
                final ViewGroup viewGroup = (ViewGroup)v;
                final int N = viewGroup.getChildCount();
                for (int i = 0; i < N; i++) {
+10 −0
Original line number Diff line number Diff line
@@ -260,6 +260,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
                new ButtonDispatcher(R.id.accessibility_button));
        mButtonDispatchers.put(R.id.rotate_suggestion,
                new ButtonDispatcher(R.id.rotate_suggestion));
        mButtonDispatchers.put(R.id.menu_container,
                new ButtonDispatcher(R.id.menu_container));
        mDeadZone = new DeadZone(this);
    }

@@ -368,6 +370,10 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
        return mButtonDispatchers.get(R.id.rotate_suggestion);
    }

    public ButtonDispatcher getMenuContainer() {
        return mButtonDispatchers.get(R.id.menu_container);
    }

    public SparseArray<ButtonDispatcher> getButtonDispatchers() {
        return mButtonDispatchers;
    }
@@ -796,6 +802,10 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav

    public boolean isRotateButtonVisible() { return mShowRotateButton; }

    public void setMenuContainerVisibility(boolean visible) {
        getMenuContainer().animateFade(visible);
    }

    @Override
    public void onFinishInflate() {
        mNavigationInflaterView = (NavigationBarInflaterView) findViewById(
+8 −0
Original line number Diff line number Diff line
@@ -401,6 +401,10 @@ public class QuickStepController implements GestureHelper {
            mDarkTrackColor = mContext.getColor(R.color.quick_step_track_background_dark);
            mTrackAnimator.setFloatValues(0, 1);
            mTrackAnimator.start();

            // Hide menu buttons on nav bar until quick scrub has ended
            mNavigationBarView.setMenuContainerVisibility(false /* visible */);

            try {
                mOverviewEventSender.getProxy().onQuickScrubStart();
                if (DEBUG_OVERVIEW_PROXY) {
@@ -416,6 +420,10 @@ public class QuickStepController implements GestureHelper {
    private void endQuickScrub(boolean animate) {
        if (mQuickScrubActive || mDragScrubActive) {
            animateEnd();

            // Restore the nav bar menu buttons visibility
            mNavigationBarView.setMenuContainerVisibility(true /* visible */);

            if (mQuickScrubActive) {
                try {
                    mOverviewEventSender.getProxy().onQuickScrubEnd();