10cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato/* 20cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Copyright (C) 2008 The Android Open Source Project 30cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * 40cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 50cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * you may not use this file except in compliance with the License. 60cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * You may obtain a copy of the License at 70cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * 80cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 90cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * 100cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Unless required by applicable law or agreed to in writing, software 110cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 120cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * See the License for the specific language governing permissions and 140cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * limitations under the License. 150cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */ 160cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1779de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratopackage com.android.systemui.statusbar; 180cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 196179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.app.Notification; 200cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.content.Context; 210cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.content.res.Resources; 220cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.graphics.Canvas; 236c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onoratoimport android.graphics.Paint; 246c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onoratoimport android.graphics.Rect; 25de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.graphics.drawable.Drawable; 26d63f9321e62064660d426efd5abbd885c4a24652Dan Sandlerimport android.graphics.drawable.Icon; 27ded653b168b19f6061889907d4f562d764c5559bJeff Sharkeyimport android.os.UserHandle; 286179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.text.TextUtils; 2905e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandlerimport android.util.AttributeSet; 30f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onoratoimport android.util.Log; 310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.view.ViewDebug; 326179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 33abff032e783398be7a1c6b7e1e25a73a8467adcfDaniel Sandlerimport android.widget.ImageView; 340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon; 366c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onoratoimport com.android.systemui.R; 376c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato 38de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport java.text.NumberFormat; 39de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlock 400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratopublic class StatusBarIconView extends AnimatedImageView { 410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato private static final String TAG = "StatusBarIconView"; 420cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 430cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato private StatusBarIcon mIcon; 440cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato @ViewDebug.ExportedProperty private String mSlot; 456c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato private Drawable mNumberBackground; 466c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato private Paint mNumberPain; 476c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato private int mNumberX; 486c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato private int mNumberY; 496c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato private String mNumberText; 506179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov private Notification mNotification; 513b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk private final boolean mBlocked; 520cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 53e6f0a716501e57616c8e1d809c0f60b08d21eb0aJohn Spurlock public StatusBarIconView(Context context, String slot, Notification notification) { 543b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk this(context, slot, notification, false); 553b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk } 563b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk 573b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk public StatusBarIconView(Context context, String slot, Notification notification, 583b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk boolean blocked) { 590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato super(context); 606c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final Resources res = context.getResources(); 613b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk mBlocked = blocked; 620cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mSlot = slot; 636c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain = new Paint(); 646c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain.setTextAlign(Paint.Align.CENTER); 654a357cd2e55293402d7172766f7f9419815fc1e8Alan Viverette mNumberPain.setColor(context.getColor(R.drawable.notification_number_text_color)); 666c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain.setAntiAlias(true); 67a0506e72f5e5c7404986bdd9af07ab536cad2634Christoph Studer setNotification(notification); 6826c84b139f0bfd2d3906f2ac163df8f1f15155d8Daniel Sandler 697579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler // We do not resize and scale system icons (on the right), only notification icons (on the 707579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler // left). 717579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler if (notification != null) { 727579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); 737579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); 747579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler final float scale = (float)imageBounds / (float)outerBounds; 757579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler setScaleX(scale); 767579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler setScaleY(scale); 777579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler } 78abff032e783398be7a1c6b7e1e25a73a8467adcfDaniel Sandler 79abff032e783398be7a1c6b7e1e25a73a8467adcfDaniel Sandler setScaleType(ImageView.ScaleType.CENTER); 800cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 810cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 82a0506e72f5e5c7404986bdd9af07ab536cad2634Christoph Studer public void setNotification(Notification notification) { 83a0506e72f5e5c7404986bdd9af07ab536cad2634Christoph Studer mNotification = notification; 84a0506e72f5e5c7404986bdd9af07ab536cad2634Christoph Studer setContentDescription(notification); 85a0506e72f5e5c7404986bdd9af07ab536cad2634Christoph Studer } 86a0506e72f5e5c7404986bdd9af07ab536cad2634Christoph Studer 8705e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler public StatusBarIconView(Context context, AttributeSet attrs) { 8805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler super(context, attrs); 893b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk mBlocked = false; 9005e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final Resources res = context.getResources(); 9105e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); 9205e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); 9305e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final float scale = (float)imageBounds / (float)outerBounds; 9405e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler setScaleX(scale); 9505e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler setScaleY(scale); 9605e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler } 9705e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler 980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato private static boolean streq(String a, String b) { 9966d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato if (a == b) { 10066d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato return true; 10166d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato } 1020cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (a == null && b != null) { 1030cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return false; 1040cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1050cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (a != null && b == null) { 1060cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return false; 1070cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1080cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return a.equals(b); 1090cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1100cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 111d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler public boolean equalIcons(Icon a, Icon b) { 112d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler if (a == b) return true; 113d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler if (a.getType() != b.getType()) return false; 114d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler switch (a.getType()) { 115d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler case Icon.TYPE_RESOURCE: 116d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler return a.getResPackage().equals(b.getResPackage()) && a.getResId() == b.getResId(); 117d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler case Icon.TYPE_URI: 118d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler return a.getUriString().equals(b.getUriString()); 119d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler default: 120d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler return false; 121d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler } 122d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler } 123005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato /** 124005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato * Returns whether the set succeeded. 125005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato */ 126005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato public boolean set(StatusBarIcon icon) { 127d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler final boolean iconEquals = mIcon != null && equalIcons(mIcon.icon, icon.icon); 128005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato final boolean levelEquals = iconEquals 129005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato && mIcon.iconLevel == icon.iconLevel; 130005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato final boolean visibilityEquals = mIcon != null 131005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato && mIcon.visible == icon.visible; 1326c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final boolean numberEquals = mIcon != null 1336c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato && mIcon.number == icon.number; 1346c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mIcon = icon.clone(); 1356179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov setContentDescription(icon.contentDescription); 136005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato if (!iconEquals) { 13782fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio if (!updateDrawable(false /* no clear */)) return false; 138005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato } 139005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato if (!levelEquals) { 140005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato setImageLevel(icon.iconLevel); 1410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 14226c84b139f0bfd2d3906f2ac163df8f1f15155d8Daniel Sandler 1436c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (!numberEquals) { 14401534780dfaf81c9f89a6e19fe2fe42cfdd01ff7John Spurlock if (icon.number > 0 && getContext().getResources().getBoolean( 1458595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato R.bool.config_statusBarShowNumber)) { 1466c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (mNumberBackground == null) { 1476c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberBackground = getContext().getResources().getDrawable( 1486c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato R.drawable.ic_notification_overlay); 1496c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 1506c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato placeNumber(); 1516c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } else { 1526c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberBackground = null; 1536c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberText = null; 1546c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 1556c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato invalidate(); 1566c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 157005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato if (!visibilityEquals) { 1583b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk setVisibility(icon.visible && !mBlocked ? VISIBLE : GONE); 1590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 160005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato return true; 1610cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1620cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 16382fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio public void updateDrawable() { 16482fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio updateDrawable(true /* with clear */); 16582fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 16682fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio 16782fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio private boolean updateDrawable(boolean withClear) { 16866ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi if (mIcon == null) { 16966ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi return false; 17066ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi } 17182fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio Drawable drawable = getIcon(mIcon); 17282fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio if (drawable == null) { 173cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock Log.w(TAG, "No icon for slot " + mSlot); 17482fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio return false; 17582fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 17682fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio if (withClear) { 17782fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio setImageDrawable(null); 17882fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 17982fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio setImageDrawable(drawable); 18082fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio return true; 18182fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 18282fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio 183f55105405578bfd8315584e69faa655800edef77Joe Onorato private Drawable getIcon(StatusBarIcon icon) { 184f55105405578bfd8315584e69faa655800edef77Joe Onorato return getIcon(getContext(), icon); 185f55105405578bfd8315584e69faa655800edef77Joe Onorato } 186f55105405578bfd8315584e69faa655800edef77Joe Onorato 1870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato /** 188d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler * Returns the right icon to use for this item 189209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock * 190d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler * @param context Context to use to get resources 1910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * @return Drawable for this item, or null if the package or item could not 1920cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * be found 1930cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */ 194f55105405578bfd8315584e69faa655800edef77Joe Onorato public static Drawable getIcon(Context context, StatusBarIcon icon) { 195d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler int userId = icon.user.getIdentifier(); 196d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler if (userId == UserHandle.USER_ALL) { 197d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler userId = UserHandle.USER_OWNER; 1980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 199d63f9321e62064660d426efd5abbd885c4a24652Dan Sandler return icon.icon.loadDrawableAsUser(context, userId); 2000cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 201b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato 202b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato public StatusBarIcon getStatusBarIcon() { 203b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato return mIcon; 204b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato } 205f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onorato 2066179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 2076179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 2086179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 2096179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov if (mNotification != null) { 2106179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov event.setParcelableData(mNotification); 2116179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2126179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2136179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov 2146179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 2156c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato protected void onSizeChanged(int w, int h, int oldw, int oldh) { 2166c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato super.onSizeChanged(w, h, oldw, oldh); 2176c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (mNumberBackground != null) { 2186c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato placeNumber(); 2196c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2206c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2216c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato 2226179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 22366ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi public void onRtlPropertiesChanged(int layoutDirection) { 22466ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi super.onRtlPropertiesChanged(layoutDirection); 22566ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi updateDrawable(); 22666ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi } 22766ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi 22866ac133971f4e2f80cd7cfff89cc6f8a3f7e899fJorim Jaggi @Override 2296c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato protected void onDraw(Canvas canvas) { 2306c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato super.onDraw(canvas); 2316c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato 2326c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (mNumberBackground != null) { 2336c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberBackground.draw(canvas); 2346c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato canvas.drawText(mNumberText, mNumberX, mNumberY, mNumberPain); 2356c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2366c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2376c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato 2386179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 239f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onorato protected void debug(int depth) { 240f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onorato super.debug(depth); 241f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onorato Log.d("View", debugIndent(depth) + "slot=" + mSlot); 242f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onorato Log.d("View", debugIndent(depth) + "icon=" + mIcon); 243f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onorato } 2446c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato 2456c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato void placeNumber() { 246ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler final String str; 24701534780dfaf81c9f89a6e19fe2fe42cfdd01ff7John Spurlock final int tooBig = getContext().getResources().getInteger( 248ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler android.R.integer.status_bar_notification_info_maxnum); 249ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler if (mIcon.number > tooBig) { 25001534780dfaf81c9f89a6e19fe2fe42cfdd01ff7John Spurlock str = getContext().getResources().getString( 251ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler android.R.string.status_bar_notification_info_overflow); 252ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler } else { 253ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler NumberFormat f = NumberFormat.getIntegerInstance(); 254ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler str = f.format(mIcon.number); 255ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler } 256ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler mNumberText = str; 257ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler 2586c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final int w = getWidth(); 2596c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final int h = getHeight(); 2606c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final Rect r = new Rect(); 2616c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain.getTextBounds(str, 0, str.length(), r); 2626c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final int tw = r.right - r.left; 2636c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final int th = r.bottom - r.top; 2646c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberBackground.getPadding(r); 2656c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato int dw = r.left + tw + r.right; 2666c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (dw < mNumberBackground.getMinimumWidth()) { 2676c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato dw = mNumberBackground.getMinimumWidth(); 2686c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2696c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberX = w-r.right-((dw-r.right-r.left)/2); 2706c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato int dh = r.top + th + r.bottom; 2716c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (dh < mNumberBackground.getMinimumWidth()) { 2726c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato dh = mNumberBackground.getMinimumWidth(); 2736c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2746c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberY = h-r.bottom-((dh-r.top-th-r.bottom)/2); 2756c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberBackground.setBounds(w-dw, h-dh, w, h); 2766c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2776179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov 2786179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov private void setContentDescription(Notification notification) { 2796179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov if (notification != null) { 2806179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov CharSequence tickerText = notification.tickerText; 2816179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov if (!TextUtils.isEmpty(tickerText)) { 2826179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov setContentDescription(tickerText); 2836179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2846179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2856179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2867579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler 2877579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler public String toString() { 288209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock return "StatusBarIconView(slot=" + mSlot + " icon=" + mIcon 2897579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler + " notification=" + mNotification + ")"; 2907579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler } 2913b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk 2923b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk public String getSlot() { 2933b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk return mSlot; 2943b230077dc53c1f83aa6e9b70585148d8193dd82Jason Monk } 2950cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato} 296