Loading packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java +5 −0 Original line number Diff line number Diff line Loading @@ -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); Loading packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java +50 −12 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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); } Loading @@ -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); Loading @@ -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 Loading Loading @@ -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) { if (!(view instanceof StatusIconDisplayable)) { return; } StatusIconDisplayable icon = (StatusIconDisplayable) view; icon.setVisibleState(visibleState); 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); } 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); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java +5 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
packages/SystemUI/src/com/android/systemui/statusbar/StatusIconDisplayable.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java +50 −12 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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); } Loading @@ -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); Loading @@ -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 Loading Loading @@ -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) { if (!(view instanceof StatusIconDisplayable)) { return; } StatusIconDisplayable icon = (StatusIconDisplayable) view; icon.setVisibleState(visibleState); 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); } 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); }