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