From 3b139a9ed06fdaad694ca97b8f99e7038007a054 Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Sat, 17 Aug 2013 17:18:08 -0400 Subject: [PATCH] Transition bars to opaque on user interaction. When the transient bars are revealed, smoothly transition the bar style to opaque to blend with the other panel chrome. Bug:8706719 Change-Id: I65e5b22e2f91a3db0394c0f571127397ba692f46 --- .../systemui/statusbar/phone/BarTransitions.java | 55 ++++++++++++++++------ .../statusbar/phone/NavigationBarView.java | 6 +-- .../systemui/statusbar/phone/PhoneStatusBar.java | 13 ++++- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index 609cdf05bffe..e40c4e5983a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -16,6 +16,9 @@ package com.android.systemui.statusbar.phone; +import android.animation.ArgbEvaluator; +import android.animation.ValueAnimator; +import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.ActivityManager; import android.content.Context; import android.content.res.Resources; @@ -29,25 +32,31 @@ import com.android.systemui.R; public class BarTransitions { private static final boolean DEBUG = false; - public static final int MODE_NORMAL = 0; + public static final int MODE_OPAQUE = 0; public static final int MODE_SEMI_TRANSPARENT = 1; public static final int MODE_TRANSPARENT = 2; private final String mTag; private final View mTarget; - private final Drawable mOpaque; - private final Drawable mSemiTransparent; + private final int mOpaque; + private final int mSemiTransparent; protected Drawable mTransparent; private int mMode; + private final AnimatorUpdateListener mBackgroundColorListener = new AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animator) { + mTarget.setBackgroundColor((Integer) animator.getAnimatedValue()); + } + }; + public BarTransitions(Context context, View target) { mTag = "BarTransitions." + target.getClass().getSimpleName(); mTarget = target; final Resources res = context.getResources(); - mOpaque = new ColorDrawable(res.getColor(R.drawable.status_bar_background)); - mSemiTransparent = - new ColorDrawable(res.getColor(R.color.status_bar_background_semi_transparent)); + mOpaque = res.getColor(R.drawable.status_bar_background); + mSemiTransparent = res.getColor(R.color.status_bar_background_semi_transparent); } public void setTransparent(Drawable transparent) { @@ -58,24 +67,40 @@ public class BarTransitions { } public void transitionTo(int mode) { + transitionTo(mode, false); + } + + public void transitionTo(int mode, boolean animate) { if (mMode == mode) return; int oldMode = mMode; mMode = mode; if (!ActivityManager.isHighEndGfx()) return; - if (DEBUG) Log.d(mTag, String.format("transition from %s to %s", - modeToString(oldMode), modeToString(mode))); - onTransition(oldMode, mMode); + if (DEBUG) Log.d(mTag, modeToString(oldMode) + " -> " + modeToString(mode)); + onTransition(oldMode, mMode, animate); + } + + protected void onTransition(int oldMode, int newMode, boolean animate) { + if (animate && oldMode == MODE_SEMI_TRANSPARENT && newMode == MODE_OPAQUE) { + startColorAnimation(mSemiTransparent, mOpaque); + } else if (animate && oldMode == MODE_OPAQUE && newMode == MODE_SEMI_TRANSPARENT) { + startColorAnimation(mOpaque, mSemiTransparent); + } else if (newMode == MODE_OPAQUE || newMode == MODE_SEMI_TRANSPARENT) { + mTarget.setBackgroundColor(newMode == MODE_OPAQUE ? mOpaque : mSemiTransparent); + } else { + mTarget.setBackground(newMode == MODE_TRANSPARENT? mTransparent + : newMode == MODE_SEMI_TRANSPARENT ? new ColorDrawable(mSemiTransparent) + : new ColorDrawable(mOpaque)); + } } - protected void onTransition(int oldMode, int newMode) { - Drawable background = newMode == MODE_SEMI_TRANSPARENT ? mSemiTransparent - : newMode == MODE_TRANSPARENT ? mTransparent - : mOpaque; - mTarget.setBackground(background); + private void startColorAnimation(int from, int to) { + ValueAnimator anim = ValueAnimator.ofObject(new ArgbEvaluator(), from, to); + anim.addUpdateListener(mBackgroundColorListener); + anim.start(); } public static String modeToString(int mode) { - if (mode == MODE_NORMAL) return "MODE_NORMAL"; + if (mode == MODE_OPAQUE) return "MODE_OPAQUE"; if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT"; if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT"; throw new IllegalArgumentException("Unknown mode " + mode); 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 4d71c612a2b9..62f8596fb6f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -132,9 +132,9 @@ public class NavigationBarView extends LinearLayout { } @Override - protected void onTransition(int oldMode, int newMode) { - super.onTransition(oldMode, newMode); - final float alpha = newMode == MODE_NORMAL ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f; + protected void onTransition(int oldMode, int newMode, boolean animate) { + super.onTransition(oldMode, newMode, animate); + final float alpha = newMode == MODE_OPAQUE ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f; setKeyButtonViewQuiescentAlpha(getBackButton(), alpha); setKeyButtonViewQuiescentAlpha(getHomeButton(), alpha); setKeyButtonViewQuiescentAlpha(getRecentsButton(), alpha); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 6e9de6623abb..cc5e6ea2a922 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -16,7 +16,7 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_NORMAL; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; @@ -1938,13 +1938,21 @@ public class PhoneStatusBar extends BaseStatusBar { private int barMode(int vis, int transientFlag, int transparentFlag) { return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT : (vis & transparentFlag) != 0 ? MODE_TRANSPARENT - : MODE_NORMAL; + : MODE_OPAQUE; } @Override public void resumeAutohide() { if (mAutohideSuspended) { scheduleAutohide(); + animateTransitionTo(BarTransitions.MODE_SEMI_TRANSPARENT); + } + } + + private void animateTransitionTo(int newMode) { + mStatusBarView.getBarTransitions().transitionTo(newMode, true /*animate*/); + if (mNavigationBarView != null) { + mNavigationBarView.getBarTransitions().transitionTo(newMode, true /*animate*/); } } @@ -1952,6 +1960,7 @@ public class PhoneStatusBar extends BaseStatusBar { public void suspendAutohide() { mHandler.removeCallbacks(mAutohide); mAutohideSuspended = 0 != (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT); + animateTransitionTo(BarTransitions.MODE_OPAQUE); } private void cancelAutohide() { -- 2.11.0