diff options
| author | 2018-05-04 16:14:00 -0400 | |
|---|---|---|
| committer | 2018-05-07 11:26:34 -0400 | |
| commit | 150701d41f6e766b07265798c4dd9b5fc78e02cc (patch) | |
| tree | 2722cc3e93d55c096af5c2c0f7420b75bf342d14 | |
| parent | 91a14dec3ccaae0156a1754c6ca13062cadc61a6 (diff) | |
Show up to 8 icons before eliding; fix animations
Show up to 8 (including battery) system icons, and after 8 show 7 icons
and only 1 etc dot
Test: visual
Change-Id: I4c1eeb2bd6afd9d5a1aed3358919f0d29ef2a084
Fixes: 79165032
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); } |