diff options
6 files changed, 87 insertions, 39 deletions
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png Binary files differindex 744178f..d6c8a21 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 4b1fcf0f..6550438 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -19,4 +19,5 @@ <resources> <drawable name="shade_bgcolor">#ff282828</drawable> <drawable name="notification_header_text_color">#ff969696</drawable> + <drawable name="notification_number_text_color">#ffffffff</drawable> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java b/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java index 027bed4..e87d003 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java @@ -23,28 +23,34 @@ import android.util.Slog; import android.view.View; import android.widget.LinearLayout; +import com.android.internal.statusbar.StatusBarIcon; + import com.android.systemui.R; public class IconMerger extends LinearLayout { private static final String TAG = "IconMerger"; + private int mIconSize; private StatusBarIconView mMoreView; + private StatusBarIcon mMoreIcon = new StatusBarIcon(null, R.drawable.stat_notify_more, 0); public IconMerger(Context context, AttributeSet attrs) { super(context, attrs); - } - public void addMoreView(StatusBarIconView v, LinearLayout.LayoutParams lp) { - super.addView(v, lp); - mMoreView = v; + mIconSize = context.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.status_bar_icon_size); + + mMoreView = new StatusBarIconView(context, "more"); + mMoreView.set(mMoreIcon); + addView(mMoreView, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize)); } - public void addView(StatusBarIconView v, int index, LinearLayout.LayoutParams lp) { + public void addView(StatusBarIconView v, int index) { if (index == 0) { throw new RuntimeException("Attempt to put view before the more view: " + v); } - super.addView(v, index, lp); + addView(v, index, new LinearLayout.LayoutParams(mIconSize, mIconSize)); } @Override @@ -127,28 +133,8 @@ public class IconMerger extends LinearLayout { } } } - - // BUG: Updating the text during the layout here doesn't seem to cause - // the view to be redrawn fully. The text view gets resized correctly, but the - // text contents aren't drawn properly. To work around this, we post a message - // and provide the value later. We're the only one changing this value show it - // should be ordered correctly. - if (false) { - // TODO this.moreIcon.update(number); - } else { - mBugWorkaroundNumber = number; - mBugWorkaroundHandler.post(mBugWorkaroundRunnable); - } - } - private int mBugWorkaroundNumber; - private Handler mBugWorkaroundHandler = new Handler(); - private Runnable mBugWorkaroundRunnable = new Runnable() { - public void run() { - /* TODO - IconMerger.this.moreIcon.update(mBugWorkaroundNumber); - IconMerger.this.moreIcon.view.invalidate(); - */ - } - }; + mMoreIcon.number = number; + mMoreView.set(mMoreIcon); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 0ca0572..8419e56 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -21,22 +21,37 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; import android.util.Slog; import android.util.Log; +import android.view.View; import android.view.ViewDebug; import android.widget.FrameLayout; import com.android.internal.statusbar.StatusBarIcon; +import com.android.systemui.R; + public class StatusBarIconView extends AnimatedImageView { private static final String TAG = "StatusBarIconView"; private StatusBarIcon mIcon; @ViewDebug.ExportedProperty private String mSlot; + private Drawable mNumberBackground; + private Paint mNumberPain; + private int mNumberX; + private int mNumberY; + private String mNumberText; public StatusBarIconView(Context context, String slot) { super(context); + final Resources res = context.getResources(); mSlot = slot; + mNumberPain = new Paint(); + mNumberPain.setTextAlign(Paint.Align.CENTER); + mNumberPain.setColor(res.getColor(R.drawable.notification_number_text_color)); + mNumberPain.setAntiAlias(true); } private static boolean streq(String a, String b) { @@ -63,6 +78,9 @@ public class StatusBarIconView extends AnimatedImageView { && mIcon.iconLevel == icon.iconLevel; final boolean visibilityEquals = mIcon != null && mIcon.visible == icon.visible; + final boolean numberEquals = mIcon != null + && mIcon.number == icon.number; + mIcon = icon.clone(); if (!iconEquals) { Drawable drawable = getIcon(icon); if (drawable == null) { @@ -74,10 +92,22 @@ public class StatusBarIconView extends AnimatedImageView { if (!levelEquals) { setImageLevel(icon.iconLevel); } + if (!numberEquals) { + if (icon.number > 0) { + if (mNumberBackground == null) { + mNumberBackground = getContext().getResources().getDrawable( + R.drawable.ic_notification_overlay); + } + placeNumber(); + } else { + mNumberBackground = null; + mNumberText = null; + } + invalidate(); + } if (!visibilityEquals) { setVisibility(icon.visible ? VISIBLE : GONE); } - mIcon = icon.clone(); return true; } @@ -126,9 +156,47 @@ public class StatusBarIconView extends AnimatedImageView { return mIcon; } + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (mNumberBackground != null) { + placeNumber(); + } + } + + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + if (mNumberBackground != null) { + mNumberBackground.draw(canvas); + canvas.drawText(mNumberText, mNumberX, mNumberY, mNumberPain); + } + } + protected void debug(int depth) { super.debug(depth); Log.d("View", debugIndent(depth) + "slot=" + mSlot); Log.d("View", debugIndent(depth) + "icon=" + mIcon); } + + void placeNumber() { + final String str = mNumberText = Integer.toString(mIcon.number); + final int w = getWidth(); + final int h = getHeight(); + final Rect r = new Rect(); + mNumberPain.getTextBounds(str, 0, str.length(), r); + final int tw = r.right - r.left; + final int th = r.bottom - r.top; + mNumberBackground.getPadding(r); + int dw = r.left + tw + r.right; + if (dw < mNumberBackground.getMinimumWidth()) { + dw = mNumberBackground.getMinimumWidth(); + } + mNumberX = w-r.right-((dw-r.right-r.left)/2); + int dh = r.top + th + r.bottom; + if (dh < mNumberBackground.getMinimumWidth()) { + dh = mNumberBackground.getMinimumWidth(); + } + mNumberY = h-r.bottom-((dh-r.top-th-r.bottom)/2); + mNumberBackground.setBounds(w-dw, h-dh, w, h); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java index ea54656..f3da2a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java @@ -309,12 +309,6 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore); - // the more notifications icon - StatusBarIconView moreView = new StatusBarIconView(this, "more"); - moreView.set(new StatusBarIcon(null, R.drawable.stat_notify_more, 0)); - mNotificationIcons.addMoreView(moreView, - new LinearLayout.LayoutParams(mIconSize, mIconSize)); - // set the inital view visibility setAreThereNotifications(); mDateView.setVisibility(View.INVISIBLE); @@ -580,8 +574,7 @@ public class StatusBarService extends Service implements CommandQueue.Callbacks parent.addView(row, viewIndex); // Add the icon. final int iconIndex = chooseIconIndex(isOngoing, viewIndex); - mNotificationIcons.addView(iconView, iconIndex, - new LinearLayout.LayoutParams(mIconSize, mIconSize)); + mNotificationIcons.addView(iconView, iconIndex); return iconView; } diff --git a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java index 21f3be4..cfce7bd 100644 --- a/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java +++ b/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java @@ -619,7 +619,7 @@ public class NotificationTestList extends TestActivity } }, - new Test("Persistent with numbers 222") { + new Test("Persistent with numbers 22") { public void run() { mNM.notify(1, notificationWithNumbers(22)); } |