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

Commit 97ae20c5 authored by Evan Laird's avatar Evan Laird
Browse files

Allow mobile status bar icon to overflow

With display size set to larest, a wide notch emulated, and battery
percentage showing, it's possible to not be able to fit a single status
icon other than the battery. In this case, the mobile icon needs to
overflow into the etc area.

Some other changes:
- set View.INVISIBLE instead of View.GONE when hiding the mobile view so
that it correctly reports its width on measure
- Don't subtract padding from width when laying out StatusIconContainer

Test: visual
Change-Id: Ic8e73402a3371331dd4c803f3c4559da276ba0a2
Fixes: 78149953
Fixes: 77504032
parent a1aafd77
Loading
Loading
Loading
Loading
+56 −48
Original line number Diff line number Diff line
@@ -21,10 +21,17 @@
    xmlns:systemui="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mobile_combo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_height="match_parent"
    android:gravity="center_vertical" >

    <com.android.keyguard.AlphaOptimizedLinearLayout
        android:id="@+id/mobile_group"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:paddingStart="2dp"
        android:orientation="horizontal" >

        <FrameLayout
            android:id="@+id/inout_container"
            android:layout_height="17dp"
@@ -78,5 +85,6 @@
                android:contentDescription="@string/data_connection_roaming"
                android:visibility="gone" />
        </FrameLayout>
    </com.android.keyguard.AlphaOptimizedLinearLayout>
</com.android.systemui.statusbar.StatusBarMobileView>
+60 −17
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.systemui.statusbar;

import static com.android.systemui.statusbar.StatusBarIconView.STATE_DOT;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN;
import static com.android.systemui.statusbar.StatusBarIconView.STATE_ICON;
import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
import static com.android.systemui.statusbar.policy.DarkIconDispatcher.isInArea;

@@ -24,10 +27,14 @@ import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

import android.widget.LinearLayout;
import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.AlphaOptimizedLinearLayout;
import com.android.settingslib.graph.SignalDrawable;
@@ -35,10 +42,14 @@ import com.android.systemui.R;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy.MobileIconState;
import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;

public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements DarkReceiver,
public class StatusBarMobileView extends FrameLayout implements DarkReceiver,
        StatusIconDisplayable {
    private static final String TAG = "StatusBarMobileView";

    /// Used to show etc dots
    private StatusBarIconView mDotView;
    /// The main icon view
    private LinearLayout mMobileGroup;
    private String mSlot;
    private MobileIconState mState;
    private SignalDrawable mMobileDrawable;
@@ -47,12 +58,17 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D
    private ImageView mOut;
    private ImageView mMobile, mMobileType, mMobileRoaming;
    private View mMobileRoamingSpace;
    private int mVisibleState = -1;

    public static StatusBarMobileView fromContext(Context context) {
    public static StatusBarMobileView fromContext(Context context, String slot) {
        LayoutInflater inflater = LayoutInflater.from(context);

        return (StatusBarMobileView)
        StatusBarMobileView v = (StatusBarMobileView)
                inflater.inflate(R.layout.status_bar_mobile_signal_group, null);

        v.setSlot(slot);
        v.init();
        v.setVisibleState(STATE_ICON);
        return v;
    }

    public StatusBarMobileView(Context context) {
@@ -72,14 +88,8 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        init();
    }

    private void init() {
        mMobileGroup = findViewById(R.id.mobile_group);
        mMobile = findViewById(R.id.mobile_signal);
        mMobileType = findViewById(R.id.mobile_type);
        mMobileRoaming = findViewById(R.id.mobile_roaming);
@@ -90,6 +100,18 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D

        mMobileDrawable = new SignalDrawable(getContext());
        mMobile.setImageDrawable(mMobileDrawable);

        initDotView();
    }

    private void initDotView() {
        mDotView = new StatusBarIconView(mContext, mSlot, null);
        mDotView.setVisibleState(STATE_DOT);

        int width = mContext.getResources().getDimensionPixelSize(R.dimen.status_bar_icon_size);
        LayoutParams lp = new LayoutParams(width, width);
        lp.gravity = Gravity.CENTER_VERTICAL | Gravity.START;
        addView(mDotView, lp);
    }

    public void applyMobileState(MobileIconState state) {
@@ -113,9 +135,9 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D
    private void initViewState() {
        setContentDescription(mState.contentDescription);
        if (!mState.visible) {
            setVisibility(View.GONE);
            mMobileGroup.setVisibility(View.GONE);
        } else {
            setVisibility(View.VISIBLE);
            mMobileGroup.setVisibility(View.VISIBLE);
        }
        mMobileDrawable.setLevel(mState.strengthId);
        if (mState.typeId > 0) {
@@ -137,7 +159,7 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D
    private void updateState(MobileIconState state) {
        setContentDescription(state.contentDescription);
        if (mState.visible != state.visible) {
            setVisibility(state.visible ? View.VISIBLE : View.GONE);
            mMobileGroup.setVisibility(state.visible ? View.VISIBLE : View.GONE);
        }
        if (mState.strengthId != state.strengthId) {
            mMobileDrawable.setLevel(state.strengthId);
@@ -173,6 +195,8 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D
        mOut.setImageTintList(color);
        mMobileType.setImageTintList(color);
        mMobileRoaming.setImageTintList(color);
        mDotView.setDecorColor(tint);
        mDotView.setIconColor(tint, false);
    }

    @Override
@@ -194,11 +218,12 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D
        mOut.setImageTintList(list);
        mMobileType.setImageTintList(list);
        mMobileRoaming.setImageTintList(list);
        mDotView.setDecorColor(color);
    }

    @Override
    public void setDecorColor(int color) {
        //TODO: May also not be needed
        mDotView.setDecorColor(color);
    }

    @Override
@@ -208,12 +233,30 @@ public class StatusBarMobileView extends AlphaOptimizedLinearLayout implements D

    @Override
    public void setVisibleState(int state) {
        //TODO: May not be needed. Mobile is always expected to be visible (not a dot)
        if (state == mVisibleState) {
            return;
        }

        mVisibleState = state;
        switch (state) {
            case STATE_ICON:
                mMobileGroup.setVisibility(View.VISIBLE);
                mDotView.setVisibility(View.GONE);
                break;
            case STATE_DOT:
                mMobileGroup.setVisibility(View.INVISIBLE);
                mDotView.setVisibility(View.VISIBLE);
                break;
            case STATE_HIDDEN:
            default:
                setVisibility(View.INVISIBLE);
                break;
        }
    }

    @Override
    public int getVisibleState() {
        return 0;
        return mVisibleState;
    }

    @VisibleForTesting
+1 −2
Original line number Diff line number Diff line
@@ -237,9 +237,8 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da

    public void addMobileView(MobileIconState state) {
        Log.d(TAG, "addMobileView: ");
        StatusBarMobileView view = StatusBarMobileView.fromContext(mContext);
        StatusBarMobileView view = StatusBarMobileView.fromContext(mContext, state.slot);

        view.setSlot(state.slot);
        view.applyMobileState(state);
        view.setStaticDrawableColor(mColor);

+1 −2
Original line number Diff line number Diff line
@@ -296,8 +296,7 @@ public interface StatusBarIconController {
        }

        private StatusBarMobileView onCreateStatusBarMobileView(String slot) {
            StatusBarMobileView view = StatusBarMobileView.fromContext(mContext);
            view.setSlot(slot);
            StatusBarMobileView view = StatusBarMobileView.fromContext(mContext, slot);
            return view;
        }

+6 −5
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {
    private static final String TAG = "StatusIconContainer";
    private static final boolean DEBUG = false;
    private static final boolean DEBUG_OVERFLOW = false;
    // Max 5 status icons including battery
    // Max 8 status icons including battery
    private static final int MAX_ICONS = 7;
    private static final int MAX_DOTS = 1;

@@ -152,7 +152,7 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {

        int visibleCount = mMeasureViews.size();
        int maxVisible = visibleCount <= MAX_ICONS ? MAX_ICONS : MAX_ICONS - 1;
        int totalWidth = getPaddingStart() + getPaddingEnd();
        int totalWidth = mPaddingLeft + mPaddingRight;
        boolean trackWidth = true;

        // Measure all children so that they report the correct width
@@ -208,8 +208,8 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {
     */
    private void calculateIconTranslations() {
        mLayoutStates.clear();
        float width = getWidth() - getPaddingEnd();
        float translationX = width;
        float width = getWidth();
        float translationX = width - getPaddingEnd();
        float contentStart = getPaddingStart();
        int childCount = getChildCount();
        // Underflow === don't show content until that index
@@ -344,10 +344,11 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout {
                animate = true;
            }

            icon.setVisibleState(visibleState);
            if (animate) {
                animateTo(view, animationProperties);
                icon.setVisibleState(visibleState);
            } else {
                icon.setVisibleState(visibleState);
                super.applyToView(view);
            }