diff options
4 files changed, 61 insertions, 12 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java index 5748ec9beef8..19980a221576 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java @@ -211,6 +211,11 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D          //TODO: May not be needed. Mobile is always expected to be visible (not a dot)      } +    @Override +    public int getVisibleState() { +        return 0; +    } +      @VisibleForTesting      public MobileIconState getState() {          return mState; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java index c3b4fdd07bab..ca00a5aed6d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java @@ -146,6 +146,11 @@ public class StatusBarWifiView extends FrameLayout implements DarkReceiver,          }      } +    @Override +    public int getVisibleState() { +        return mVisibleState; +    } +      private void init() {          int dualToneLightTheme = Utils.getThemeAttr(mContext, R.attr.lightIconTheme);          int dualToneDarkTheme = Utils.getThemeAttr(mContext, R.attr.darkIconTheme); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java index 6383816ead31..b831b8657be3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java @@ -23,6 +23,7 @@ public interface StatusIconDisplayable extends DarkReceiver {      void setStaticDrawableColor(int color);      void setDecorColor(int color);      void setVisibleState(int state); +    int getVisibleState();      boolean isIconVisible();      default boolean isIconBlocked() {          return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java index 8398879b9c07..4538977f7a6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java @@ -30,12 +30,12 @@ import android.util.AttributeSet;  import android.util.Log;  import android.view.View; -import android.view.ViewGroup;  import com.android.keyguard.AlphaOptimizedLinearLayout;  import com.android.systemui.R;  import com.android.systemui.statusbar.StatusIconDisplayable; +import com.android.systemui.statusbar.stack.AnimationFilter; +import com.android.systemui.statusbar.stack.AnimationProperties;  import com.android.systemui.statusbar.stack.ViewState; -import java.lang.ref.WeakReference;  import java.util.ArrayList;  /** @@ -50,8 +50,8 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {      private static final boolean DEBUG = false;      private static final boolean DEBUG_OVERFLOW = false;      // Max 5 status icons including battery -    private static final int MAX_ICONS = 4; -    private static final int MAX_DOTS = 3; +    private static final int MAX_ICONS = 7; +    private static final int MAX_DOTS = 1;      private int mDotPadding;      private int mStaticDotDiameter; @@ -97,7 +97,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {          mDotPadding = getResources().getDimensionPixelSize(R.dimen.overflow_icon_dot_padding);          int radius = getResources().getDimensionPixelSize(R.dimen.overflow_dot_radius);          mStaticDotDiameter = 2 * radius; -        mUnderflowWidth = mIconDotFrameWidth + 2 * (mStaticDotDiameter + mDotPadding); +        mUnderflowWidth = mIconDotFrameWidth + (MAX_DOTS - 1) * (mStaticDotDiameter + mDotPadding);      }      @Override @@ -193,6 +193,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {      public void onViewAdded(View child) {          super.onViewAdded(child);          StatusIconState vs = new StatusIconState(); +        vs.justAdded = true;          child.setTag(R.id.status_bar_view_state_tag, vs);      } @@ -212,7 +213,6 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {          float contentStart = getPaddingStart();          int childCount = getChildCount();          // Underflow === don't show content until that index -        int firstUnderflowIndex = -1;          if (DEBUG) android.util.Log.d(TAG, "calculateIconTranslations: start=" + translationX                  + " width=" + width + " underflow=" + mNeedsUnderflow); @@ -235,13 +235,13 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {              translationX -= getViewTotalWidth(child);          } -        // Show either 1-4 dots, or 3 dots + overflow +        // Show either 1-MAX_ICONS icons, or (MAX_ICONS - 1) icons + overflow          int totalVisible = mLayoutStates.size();          int maxVisible = totalVisible <= MAX_ICONS ? MAX_ICONS : MAX_ICONS - 1;          mUnderflowStart = 0;          int visible = 0; -        firstUnderflowIndex = -1; +        int firstUnderflowIndex = -1;          for (int i = totalVisible - 1; i >= 0; i--) {              StatusIconState state = mLayoutStates.get(i);              // Allow room for underflow if we found we need it in onMeasure @@ -324,14 +324,52 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {      public static class StatusIconState extends ViewState {          /// StatusBarIconView.STATE_*          public int visibleState = STATE_ICON; +        public boolean justAdded = true;          @Override          public void applyToView(View view) { -            if (view instanceof  StatusIconDisplayable) { -                StatusIconDisplayable icon = (StatusIconDisplayable) view; -                icon.setVisibleState(visibleState); +            if (!(view instanceof StatusIconDisplayable)) { +                return; +            } +            StatusIconDisplayable icon = (StatusIconDisplayable) view; +            AnimationProperties animationProperties = null; +            boolean animate = false; + +            if (justAdded) { +                super.applyToView(view); +                animationProperties = ADD_ICON_PROPERTIES; +                animate = true; +            } else if (icon.getVisibleState() != visibleState) { +                animationProperties = DOT_ANIMATION_PROPERTIES; +                animate = true; +            } + +            icon.setVisibleState(visibleState); +            if (animate) { +                animateTo(view, animationProperties); +            } else { +                super.applyToView(view);              } -            super.applyToView(view); + +            justAdded = false;          }      } + +    private static final AnimationProperties ADD_ICON_PROPERTIES = new AnimationProperties() { +        private AnimationFilter mAnimationFilter = new AnimationFilter().animateAlpha(); + +        @Override +        public AnimationFilter getAnimationFilter() { +            return mAnimationFilter; +        } +    }.setDuration(200).setDelay(50); + +    private static final AnimationProperties DOT_ANIMATION_PROPERTIES = new AnimationProperties() { +        private AnimationFilter mAnimationFilter = new AnimationFilter().animateX(); + +        @Override +        public AnimationFilter getAnimationFilter() { +            return mAnimationFilter; +        } +    }.setDuration(200);  }  |