OSDN Git Service

Transition bars to opaque on user interaction.
authorJohn Spurlock <jspurlock@google.com>
Sat, 17 Aug 2013 21:18:08 +0000 (17:18 -0400)
committerJohn Spurlock <jspurlock@google.com>
Mon, 19 Aug 2013 14:22:28 +0000 (10:22 -0400)
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

packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

index 609cdf0..e40c4e5 100644 (file)
@@ -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);
index 4d71c61..62f8596 100644 (file)
@@ -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);
index 6e9de66..cc5e6ea 100644 (file)
@@ -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() {