From 97ae20c5d841a244369dba5decaa3ab994cdad33 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Thu, 10 May 2018 13:13:27 -0400 Subject: 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 --- .../res/layout/status_bar_mobile_signal_group.xml | 104 +++++++++++---------- .../systemui/statusbar/StatusBarMobileView.java | 77 +++++++++++---- .../systemui/statusbar/phone/DemoStatusIcons.java | 3 +- .../statusbar/phone/StatusBarIconController.java | 3 +- .../statusbar/phone/StatusIconContainer.java | 11 ++- 5 files changed, 124 insertions(+), 74 deletions(-) diff --git a/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml index c8a554467ceb..7931dfe74587 100644 --- a/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml +++ b/packages/SystemUI/res/layout/status_bar_mobile_signal_group.xml @@ -21,62 +21,70 @@ 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:paddingStart="2dp" - android:orientation="horizontal"> - + + - + + + android:layout_gravity="center_vertical"> + + + + - - - - - - - + android:layout_gravity="center_vertical"> + + + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java index 19980a221576..04c500fc8f6a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java index 46b4078a1801..e0e991b4993f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java @@ -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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index 1ba37a9bf9dd..3b9ee8bcd378 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -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; } 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 4538977f7a6f..0811179e23d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java @@ -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); } -- cgit v1.2.3-59-g8ed1b