From 6c01a11a20d5fc796360e5e97998401a6cc84f27 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Mon, 4 Oct 2010 17:38:47 -0400 Subject: [PATCH] implement the number bubbles on the status bar Bug: 2993482 Change-Id: I73b1f8c39e995fd4f986c25ea04127eb23c3cd07 --- .../ic_notification_overlay.9.png | Bin 1014 -> 935 bytes packages/SystemUI/res/values/colors.xml | 1 + .../systemui/statusbar/IconMerger.java | 46 ++++-------- .../systemui/statusbar/StatusBarIconView.java | 70 +++++++++++++++++- .../systemui/statusbar/StatusBarService.java | 9 +-- .../statusbartest/NotificationTestList.java | 2 +- 6 files changed, 88 insertions(+), 40 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 index 744178f1abeb258d359b2c02f44e7cf61e0e16fa..d6c8a217550302773af1eae88ae4ee9f50febd6b 100644 GIT binary patch literal 935 zcmV;Y16cftP)q}E%9Nt&AqsGb$STp-z+1#eBO-*O0X_7kAoMxz)S2E3%E`r!UAqYWV{R4y`=u2W# zNX)J}%XIg1c4;sW1Yz*&_d7eKZCj3YgJK%lT1m3}V@ZQ(+ z_&IblIEHh$Ccr&zn=%g=(qj^H3^g{nMw+)hLk-~Vs|HWI4&2Qea5t*JrI+)dK8?{F zzXsRho-O->hU%!qZ2h&Pt^qx`dn&=xTF8@gRp)>!%K)}C4cL;@Ah1tkH0P?%1$S!^ zczUY<_Xe!}HGL6@neSG#uw9klYA*qIgA&QIf+AN=g0tWRIJHT;C`jhVXpX&_&I|Ld z(J^ua%$*g7J6$tqvutg;ZLXyNTy;6Xm7f8&_|&eDCUJl8;wW64!tdeq7lFH72)2$= z|GGh!a3M%Tgu-Q`y;>aKYjBO(urIafm8|p-`$4QJp zT*Ub?j|q!Z^dXO#{jO%fb~%26R^0JEIuU8H$O!qx$L_m0~^SzlDXwR~kJTdQ;@U zEC^8l2aZ$e(;6%gyfcX}VrQZ4ja-sGuVS7fNq}Phg!qylbWWf?jV%X-c8m(~WJpDd zVita@5ckb1Brh@UC4?X0qyD^-nVC~aI*%-l|1IQ~J{la^egRk9Bb8Ri1JVEh002ov JPDHLkV1fspye0qu literal 1014 zcmV8(IFKLB> zP>}`#Errs$aaRkvaFIprD&+}+AYBx@C~Y_5Mrm;+2;xez5=AkBWMd#8f`Yhi8`?#? zP+9|pU?A;#_iOIV@qgxiG}eaK+vLH#_qg}Y`OW`-&Y8K2nW@W1Ddi_%p6WDj5@`K{ zcV~k*UeHRREQ7pgw={M`o1-gHEI2*ttwt%?$dHASAQPcxy zKx(j$)XY9|(Ui@ty)gUbPm4Q({(A4tVNdJtwE<-Gu!ba1QUZdsu-jf0@&#A`SOjGQ z(g4x)ezJgN)}EgG>X+4~fLhR<;mNsv9Nvmd(O1bs;_(P}rIl3z*r{j)s5GpMyp1HV z!G1DPyp`nU$kC-gHUy-b=OZpZ39_V5V}VpkSd#DT&XB6k{WC22!@_9vh-kb;Ivu|d zx$^3Nth;^s_}n1WcVlA$osDZH0&$&sjI=02flT$uPEAu0ghgWAOUGAk{S*58r5P$q z0hLI2k=J&0Yve|qUtpmmFQmg>tQ`&ImItXKpZ5)K(JOXBP9}h0gD)P^IbyMt%X|x> zB0E9ImJ+YK+VwP^YhaQ;I#zW9q_8mu$e76$_N=N9!^e`C#=O`namodMS;OPwhL9$;NcTi#KxhaYb zzh@D1sz~9#UP4Q1|icYgO_)zi#~sV4&!X3~&zO(&74b>rc#Fhni)Kl{eNN=c6;I kd0FhR?d;M1&07*qoM6N<$f_3HV00000 diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 4b1fcf0f41b5d..6550438ecdb14 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -19,4 +19,5 @@ #ff282828 #ff969696 + #ffffffff diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java b/packages/SystemUI/src/com/android/systemui/statusbar/IconMerger.java index 027bed4acdfe0..e87d003c7470e 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); + + 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 addMoreView(StatusBarIconView v, LinearLayout.LayoutParams lp) { - super.addView(v, lp); - mMoreView = v; - } - - 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 0ca0572337668..8419e565eb73c 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 ea54656298be8..f3da2a3668174 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 21f3be426890a..cfce7bd8feeab 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)); }