Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a914cf0a authored by android-build-team Robot's avatar android-build-team Robot Committed by Android (Google) Code Review
Browse files

Merge "Show up to 8 icons before eliding; fix animations" into pi-dev

parents 478e0805 150701d4
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
+5 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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;
+50 −12
Original line number Diff line number Diff line
@@ -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) {
            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);
}