Loading packages/SystemUI/res/layout/status_bar.xml +27 −13 Original line number Diff line number Diff line Loading @@ -31,21 +31,35 @@ <LinearLayout android:id="@+id/icons" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> android:paddingLeft="6dip" android:paddingRight="6dip" android:orientation="horizontal" > <com.android.systemui.statusbar.phone.IconMerger android:id="@+id/notificationIcons" <LinearLayout android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:orientation="horizontal" > <com.android.systemui.statusbar.StatusBarIconView android:id="@+id/moreIcon" android:layout_width="@dimen/status_bar_icon_size" android:layout_height="match_parent" android:src="@drawable/stat_notify_more" android:visibility="gone" /> <com.android.systemui.statusbar.phone.IconMerger android:id="@+id/notificationIcons" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:paddingLeft="6dip" android:gravity="center_vertical" android:orientation="horizontal"/> </LinearLayout> <LinearLayout android:id="@+id/statusIcons" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:gravity="center_vertical" android:orientation="horizontal"/> Loading @@ -53,7 +67,7 @@ android:id="@+id/signal_battery_cluster" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginRight="6dp" android:paddingLeft="2dp" android:orientation="horizontal" android:gravity="center" > Loading @@ -66,7 +80,7 @@ android:id="@+id/battery" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingLeft="6dip" android:paddingLeft="4dip" /> </LinearLayout> Loading @@ -76,7 +90,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:singleLine="true" android:paddingRight="6dip" android:paddingLeft="6dip" android:gravity="center_vertical|left" /> </LinearLayout> Loading packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +13 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Slog; import android.util.Log; import android.view.ViewDebug; Loading Loading @@ -75,6 +76,18 @@ public class StatusBarIconView extends AnimatedImageView { setScaleType(ImageView.ScaleType.CENTER); } public StatusBarIconView(Context context, AttributeSet attrs) { super(context, attrs); final Resources res = context.getResources(); final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); final float scale = (float)imageBounds / (float)outerBounds; setScaleX(scale); setScaleY(scale); final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1); setAlpha(alpha); } private static boolean streq(String a, String b) { if (a == b) { return true; Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java +32 −86 Original line number Diff line number Diff line Loading @@ -30,113 +30,59 @@ import com.android.systemui.statusbar.StatusBarIconView; public class IconMerger extends LinearLayout { private static final String TAG = "IconMerger"; private static final boolean DEBUG = false; private int mIconSize; private StatusBarIconView mMoreView; private StatusBarIcon mMoreIcon = new StatusBarIcon(null, R.drawable.stat_notify_more, 0, 0, null); private View mMoreView; public IconMerger(Context context, AttributeSet attrs) { super(context, attrs); mIconSize = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.status_bar_icon_size); R.dimen.status_bar_icon_size); mMoreView = new StatusBarIconView(context, "more", null); mMoreView.set(mMoreIcon); super.addView(mMoreView, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize)); if (DEBUG) { setBackgroundColor(0x800099FF); } } public void addView(StatusBarIconView v, int index, LinearLayout.LayoutParams p) { super.addView(v, index+1, p); public void setOverflowIndicator(View v) { mMoreView = v; } public void addView(StatusBarIconView v, int index) { super.addView(v, index+1, new LinearLayout.LayoutParams(mIconSize, mIconSize)); @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // we need to constrain this to an integral multiple of our children int width = getMeasuredWidth(); setMeasuredDimension(width - (width % mIconSize), getMeasuredHeight()); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); final int maxWidth = r - l; final int N = getChildCount(); int i; // get the rightmost one, and see if we even need to do anything int fitRight = -1; for (i=N-1; i>=0; i--) { final View child = getChildAt(i); if (child.getVisibility() != GONE) { fitRight = child.getRight(); break; } checkOverflow(r - l); } // find the first visible one that isn't the more icon final StatusBarIconView moreView = mMoreView; int fitLeft = -1; int startIndex = -1; for (i=0; i<N; i++) { final View child = getChildAt(i); if (child == moreView) { startIndex = i+1; } else if (child.getVisibility() != GONE) { fitLeft = child.getLeft(); break; } } private void checkOverflow(int width) { if (mMoreView == null) return; if (moreView == null || startIndex < 0) { return; /* throw new RuntimeException("Status Bar / IconMerger moreView == " + moreView + " startIndex=" + startIndex); */ } // if it fits without the more icon, then hide the more icon and update fitLeft // so everything gets pushed left int adjust = 0; if (fitRight - fitLeft <= maxWidth) { adjust = fitLeft - moreView.getLeft(); fitLeft -= adjust; fitRight -= adjust; moreView.layout(0, moreView.getTop(), 0, moreView.getBottom()); } int extra = fitRight - r; int shift = -1; int breakingPoint = fitLeft + extra + adjust; int number = 0; for (i=startIndex; i<N; i++) { final StatusBarIconView child = (StatusBarIconView)getChildAt(i); if (child.getVisibility() != GONE) { int childLeft = child.getLeft(); int childRight = child.getRight(); if (childLeft < breakingPoint) { // hide this one child.layout(0, child.getTop(), 0, child.getBottom()); int n = child.getStatusBarIcon().number; if (n == 0) { number += 1; } else if (n > 0) { number += n; } } else { // decide how much to shift by if (shift < 0) { shift = childLeft - fitLeft; } // shift this left by shift child.layout(childLeft-shift, child.getTop(), childRight-shift, child.getBottom()); } final int N = getChildCount(); int visibleChildren = 0; for (int i=0; i<N; i++) { if (getChildAt(i).getVisibility() != GONE) visibleChildren++; } final boolean overflowShown = (mMoreView.getVisibility() == View.VISIBLE); // let's assume we have one more slot if the more icon is already showing if (overflowShown) visibleChildren --; final boolean moreRequired = visibleChildren * mIconSize > width; if (moreRequired != overflowShown) { post(new Runnable() { @Override public void run() { mMoreView.setVisibility(moreRequired ? View.VISIBLE : View.GONE); } }); } mMoreIcon.number = number; mMoreView.set(mMoreIcon); } } packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +3 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,7 @@ public class PhoneStatusBar extends StatusBar { // icons LinearLayout mIcons; IconMerger mNotificationIcons; View mMoreIcon; LinearLayout mStatusIcons; // expanded notifications Loading Loading @@ -307,6 +308,8 @@ public class PhoneStatusBar extends StatusBar { mPixelFormat = PixelFormat.OPAQUE; mStatusIcons = (LinearLayout)sb.findViewById(R.id.statusIcons); mNotificationIcons = (IconMerger)sb.findViewById(R.id.notificationIcons); mMoreIcon = sb.findViewById(R.id.moreIcon); mNotificationIcons.setOverflowIndicator(mMoreIcon); mIcons = (LinearLayout)sb.findViewById(R.id.icons); mTickerView = sb.findViewById(R.id.ticker); Loading Loading
packages/SystemUI/res/layout/status_bar.xml +27 −13 Original line number Diff line number Diff line Loading @@ -31,21 +31,35 @@ <LinearLayout android:id="@+id/icons" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> android:paddingLeft="6dip" android:paddingRight="6dip" android:orientation="horizontal" > <com.android.systemui.statusbar.phone.IconMerger android:id="@+id/notificationIcons" <LinearLayout android:layout_width="0dip" android:layout_height="match_parent" android:layout_weight="1" android:orientation="horizontal" > <com.android.systemui.statusbar.StatusBarIconView android:id="@+id/moreIcon" android:layout_width="@dimen/status_bar_icon_size" android:layout_height="match_parent" android:src="@drawable/stat_notify_more" android:visibility="gone" /> <com.android.systemui.statusbar.phone.IconMerger android:id="@+id/notificationIcons" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:paddingLeft="6dip" android:gravity="center_vertical" android:orientation="horizontal"/> </LinearLayout> <LinearLayout android:id="@+id/statusIcons" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentRight="true" android:gravity="center_vertical" android:orientation="horizontal"/> Loading @@ -53,7 +67,7 @@ android:id="@+id/signal_battery_cluster" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginRight="6dp" android:paddingLeft="2dp" android:orientation="horizontal" android:gravity="center" > Loading @@ -66,7 +80,7 @@ android:id="@+id/battery" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingLeft="6dip" android:paddingLeft="4dip" /> </LinearLayout> Loading @@ -76,7 +90,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:singleLine="true" android:paddingRight="6dip" android:paddingLeft="6dip" android:gravity="center_vertical|left" /> </LinearLayout> Loading
packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +13 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Slog; import android.util.Log; import android.view.ViewDebug; Loading Loading @@ -75,6 +76,18 @@ public class StatusBarIconView extends AnimatedImageView { setScaleType(ImageView.ScaleType.CENTER); } public StatusBarIconView(Context context, AttributeSet attrs) { super(context, attrs); final Resources res = context.getResources(); final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); final float scale = (float)imageBounds / (float)outerBounds; setScaleX(scale); setScaleY(scale); final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1); setAlpha(alpha); } private static boolean streq(String a, String b) { if (a == b) { return true; Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java +32 −86 Original line number Diff line number Diff line Loading @@ -30,113 +30,59 @@ import com.android.systemui.statusbar.StatusBarIconView; public class IconMerger extends LinearLayout { private static final String TAG = "IconMerger"; private static final boolean DEBUG = false; private int mIconSize; private StatusBarIconView mMoreView; private StatusBarIcon mMoreIcon = new StatusBarIcon(null, R.drawable.stat_notify_more, 0, 0, null); private View mMoreView; public IconMerger(Context context, AttributeSet attrs) { super(context, attrs); mIconSize = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.status_bar_icon_size); R.dimen.status_bar_icon_size); mMoreView = new StatusBarIconView(context, "more", null); mMoreView.set(mMoreIcon); super.addView(mMoreView, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize)); if (DEBUG) { setBackgroundColor(0x800099FF); } } public void addView(StatusBarIconView v, int index, LinearLayout.LayoutParams p) { super.addView(v, index+1, p); public void setOverflowIndicator(View v) { mMoreView = v; } public void addView(StatusBarIconView v, int index) { super.addView(v, index+1, new LinearLayout.LayoutParams(mIconSize, mIconSize)); @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // we need to constrain this to an integral multiple of our children int width = getMeasuredWidth(); setMeasuredDimension(width - (width % mIconSize), getMeasuredHeight()); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); final int maxWidth = r - l; final int N = getChildCount(); int i; // get the rightmost one, and see if we even need to do anything int fitRight = -1; for (i=N-1; i>=0; i--) { final View child = getChildAt(i); if (child.getVisibility() != GONE) { fitRight = child.getRight(); break; } checkOverflow(r - l); } // find the first visible one that isn't the more icon final StatusBarIconView moreView = mMoreView; int fitLeft = -1; int startIndex = -1; for (i=0; i<N; i++) { final View child = getChildAt(i); if (child == moreView) { startIndex = i+1; } else if (child.getVisibility() != GONE) { fitLeft = child.getLeft(); break; } } private void checkOverflow(int width) { if (mMoreView == null) return; if (moreView == null || startIndex < 0) { return; /* throw new RuntimeException("Status Bar / IconMerger moreView == " + moreView + " startIndex=" + startIndex); */ } // if it fits without the more icon, then hide the more icon and update fitLeft // so everything gets pushed left int adjust = 0; if (fitRight - fitLeft <= maxWidth) { adjust = fitLeft - moreView.getLeft(); fitLeft -= adjust; fitRight -= adjust; moreView.layout(0, moreView.getTop(), 0, moreView.getBottom()); } int extra = fitRight - r; int shift = -1; int breakingPoint = fitLeft + extra + adjust; int number = 0; for (i=startIndex; i<N; i++) { final StatusBarIconView child = (StatusBarIconView)getChildAt(i); if (child.getVisibility() != GONE) { int childLeft = child.getLeft(); int childRight = child.getRight(); if (childLeft < breakingPoint) { // hide this one child.layout(0, child.getTop(), 0, child.getBottom()); int n = child.getStatusBarIcon().number; if (n == 0) { number += 1; } else if (n > 0) { number += n; } } else { // decide how much to shift by if (shift < 0) { shift = childLeft - fitLeft; } // shift this left by shift child.layout(childLeft-shift, child.getTop(), childRight-shift, child.getBottom()); } final int N = getChildCount(); int visibleChildren = 0; for (int i=0; i<N; i++) { if (getChildAt(i).getVisibility() != GONE) visibleChildren++; } final boolean overflowShown = (mMoreView.getVisibility() == View.VISIBLE); // let's assume we have one more slot if the more icon is already showing if (overflowShown) visibleChildren --; final boolean moreRequired = visibleChildren * mIconSize > width; if (moreRequired != overflowShown) { post(new Runnable() { @Override public void run() { mMoreView.setVisibility(moreRequired ? View.VISIBLE : View.GONE); } }); } mMoreIcon.number = number; mMoreView.set(mMoreIcon); } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +3 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,7 @@ public class PhoneStatusBar extends StatusBar { // icons LinearLayout mIcons; IconMerger mNotificationIcons; View mMoreIcon; LinearLayout mStatusIcons; // expanded notifications Loading Loading @@ -307,6 +308,8 @@ public class PhoneStatusBar extends StatusBar { mPixelFormat = PixelFormat.OPAQUE; mStatusIcons = (LinearLayout)sb.findViewById(R.id.statusIcons); mNotificationIcons = (IconMerger)sb.findViewById(R.id.notificationIcons); mMoreIcon = sb.findViewById(R.id.moreIcon); mNotificationIcons.setOverflowIndicator(mMoreIcon); mIcons = (LinearLayout)sb.findViewById(R.id.icons); mTickerView = sb.findViewById(R.id.ticker); Loading