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;
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) {
}
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);
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;
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*/);
}
}
public void suspendAutohide() {
mHandler.removeCallbacks(mAutohide);
mAutohideSuspended = 0 != (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT);
+ animateTransitionTo(BarTransitions.MODE_OPAQUE);
}
private void cancelAutohide() {