From 6607c3dc250c81ab4b5e60468d7fcc816d6b6770 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Thu, 26 Apr 2018 15:23:27 -0700 Subject: [PATCH] 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 --- packages/SystemUI/res/layout/menu_ime.xml | 1 + .../statusbar/phone/ButtonDispatcher.java | 73 +++++++++++++++---- .../phone/NavigationBarInflaterView.java | 14 ++-- .../statusbar/phone/NavigationBarView.java | 10 +++ .../statusbar/phone/QuickStepController.java | 8 ++ 5 files changed, 84 insertions(+), 22 deletions(-) diff --git a/packages/SystemUI/res/layout/menu_ime.xml b/packages/SystemUI/res/layout/menu_ime.xml index 5a0e76799e7c5..1be3375b5c076 100644 --- a/packages/SystemUI/res/layout/menu_ime.xml +++ b/packages/SystemUI/res/layout/menu_ime.xml @@ -16,6 +16,7 @@ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java index 7284ee8b39bc5..2161655a64c5a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java @@ -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 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 (mImageDrawable != null) { - ((ButtonInterface) view).setImageDrawable(mImageDrawable); + if (view instanceof ButtonInterface) { + final ButtonInterface button = (ButtonInterface) view; + if (mDarkIntensity != null) { + button.setDarkIntensity(mDarkIntensity); + } + if (mImageDrawable != null) { + button.setImageDrawable(mImageDrawable); + } + if (mDelayTouchFeedback != null) { + button.setDelayTouchFeedback(mDelayTouchFeedback); + } + button.setVertical(mVertical); } - if (mDelayTouchFeedback != null) { - ((ButtonInterface) view).setDelayTouchFeedback(mDelayTouchFeedback); - } - ((ButtonInterface) view).setVertical(mVertical); } public int getId() { @@ -99,7 +119,9 @@ public class ButtonDispatcher { mImageDrawable = drawable; final int N = mViews.size(); for (int i = 0; i < N; i++) { - ((ButtonInterface) mViews.get(i)).setImageDrawable(mImageDrawable); + if (mViews.get(i) instanceof ButtonInterface) { + ((ButtonInterface) mViews.get(i)).setImageDrawable(mImageDrawable); + } } } @@ -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++) { - ((ButtonInterface) mViews.get(i)).abortCurrentGesture(); + 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,7 +156,9 @@ public class ButtonDispatcher { mDarkIntensity = darkIntensity; final int N = mViews.size(); for (int i = 0; i < N; i++) { - ((ButtonInterface) mViews.get(i)).setDarkIntensity(darkIntensity); + if (mViews.get(i) instanceof ButtonInterface) { + ((ButtonInterface) mViews.get(i)).setDarkIntensity(darkIntensity); + } } } @@ -140,7 +166,9 @@ public class ButtonDispatcher { mDelayTouchFeedback = delay; final int N = mViews.size(); for (int i = 0; i < N; i++) { - ((ButtonInterface) mViews.get(i)).setDelayTouchFeedback(delay); + if (mViews.get(i) instanceof ButtonInterface) { + ((ButtonInterface) mViews.get(i)).setDelayTouchFeedback(delay); + } } } @@ -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 getViews() { return mViews; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index 91cf8f0869050..4885c2f796d96 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -168,10 +168,10 @@ public class NavigationBarInflaterView extends FrameLayout } } - public void setButtonDispatchers(SparseArray buttonDisatchers) { - mButtonDispatchers = buttonDisatchers; - for (int i = 0; i < buttonDisatchers.size(); i++) { - initiallyFill(buttonDisatchers.valueAt(i)); + public void setButtonDispatchers(SparseArray 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++) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 6dbe9f89dcdee..6cc96da96e45b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -260,6 +260,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener