StatusBarIconView.java revision 209bede6b9edb9171e5bee4077b48e35004a37b4
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.pm.PackageManager; 220cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.content.res.Resources; 230cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport android.graphics.Canvas; 246c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onoratoimport android.graphics.Paint; 256c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onoratoimport android.graphics.Rect; 26de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.graphics.drawable.Drawable; 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; 510cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 526179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov public StatusBarIconView(Context context, String slot, Notification notification) { 530cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato super(context); 546c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final Resources res = context.getResources(); 550cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mSlot = slot; 566c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain = new Paint(); 576c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain.setTextAlign(Paint.Align.CENTER); 586c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain.setColor(res.getColor(R.drawable.notification_number_text_color)); 596c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberPain.setAntiAlias(true); 606179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov mNotification = notification; 616179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov setContentDescription(notification); 6226c84b139f0bfd2d3906f2ac163df8f1f15155d8Daniel Sandler 637579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler // We do not resize and scale system icons (on the right), only notification icons (on the 647579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler // left). 657579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler if (notification != null) { 667579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); 677579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); 687579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler final float scale = (float)imageBounds / (float)outerBounds; 697579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler setScaleX(scale); 707579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler setScaleY(scale); 717579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1); 727579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler setAlpha(alpha); 737579bca7a02477353700d3b716f172b4fab267c0Daniel Sandler } 74abff032e783398be7a1c6b7e1e25a73a8467adcfDaniel Sandler 75abff032e783398be7a1c6b7e1e25a73a8467adcfDaniel Sandler setScaleType(ImageView.ScaleType.CENTER); 760cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 770cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 7805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler public StatusBarIconView(Context context, AttributeSet attrs) { 7905e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler super(context, attrs); 8005e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final Resources res = context.getResources(); 8105e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final int outerBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); 8205e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final int imageBounds = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); 8305e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final float scale = (float)imageBounds / (float)outerBounds; 8405e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler setScaleX(scale); 8505e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler setScaleY(scale); 8605e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1); 8705e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler setAlpha(alpha); 8805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler } 8905e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler 900cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato private static boolean streq(String a, String b) { 9166d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato if (a == b) { 9266d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato return true; 9366d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato } 940cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (a == null && b != null) { 950cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return false; 960cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 970cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (a != null && b == null) { 980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return false; 990cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1000cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return a.equals(b); 1010cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1020cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 103005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato /** 104005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato * Returns whether the set succeeded. 105005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato */ 106005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato public boolean set(StatusBarIcon icon) { 107005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato final boolean iconEquals = mIcon != null 108005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato && streq(mIcon.iconPackage, icon.iconPackage) 109005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato && mIcon.iconId == icon.iconId; 110005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato final boolean levelEquals = iconEquals 111005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato && mIcon.iconLevel == icon.iconLevel; 112005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato final boolean visibilityEquals = mIcon != null 113005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato && mIcon.visible == icon.visible; 1146c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato final boolean numberEquals = mIcon != null 1156c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato && mIcon.number == icon.number; 1166c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mIcon = icon.clone(); 1176179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov setContentDescription(icon.contentDescription); 118005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato if (!iconEquals) { 11982fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio if (!updateDrawable(false /* no clear */)) return false; 120005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato } 121005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato if (!levelEquals) { 122005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato setImageLevel(icon.iconLevel); 1230cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 12426c84b139f0bfd2d3906f2ac163df8f1f15155d8Daniel Sandler 1256c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (!numberEquals) { 1268595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato if (icon.number > 0 && mContext.getResources().getBoolean( 1278595a3dd9a6feff70f8ddbad924d79b591d611e4Joe Onorato R.bool.config_statusBarShowNumber)) { 1286c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (mNumberBackground == null) { 1296c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberBackground = getContext().getResources().getDrawable( 1306c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato R.drawable.ic_notification_overlay); 1316c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 1326c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato placeNumber(); 1336c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } else { 1346c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberBackground = null; 1356c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato mNumberText = null; 1366c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 1376c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato invalidate(); 1386c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 139005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato if (!visibilityEquals) { 140005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato setVisibility(icon.visible ? VISIBLE : GONE); 1410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 142005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato return true; 1430cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1440cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 14582fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio public void updateDrawable() { 14682fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio updateDrawable(true /* with clear */); 14782fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 14882fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio 14982fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio private boolean updateDrawable(boolean withClear) { 15082fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio Drawable drawable = getIcon(mIcon); 15182fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio if (drawable == null) { 152cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock Log.w(TAG, "No icon for slot " + mSlot); 15382fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio return false; 15482fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 15582fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio if (withClear) { 15682fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio setImageDrawable(null); 15782fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 15882fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio setImageDrawable(drawable); 15982fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio return true; 16082fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio } 16182fca5d27dac1597d5dd739cbdd4529fd8a00861Fabrice Di Meglio 162f55105405578bfd8315584e69faa655800edef77Joe Onorato private Drawable getIcon(StatusBarIcon icon) { 163f55105405578bfd8315584e69faa655800edef77Joe Onorato return getIcon(getContext(), icon); 164f55105405578bfd8315584e69faa655800edef77Joe Onorato } 165f55105405578bfd8315584e69faa655800edef77Joe Onorato 1660cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato /** 1670cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * Returns the right icon to use for this item, respecting the iconId and 1680cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * iconPackage (if set) 169209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock * 1700cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * @param context Context to use to get resources if iconPackage is not set 1710cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * @return Drawable for this item, or null if the package or item could not 1720cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato * be found 1730cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */ 174f55105405578bfd8315584e69faa655800edef77Joe Onorato public static Drawable getIcon(Context context, StatusBarIcon icon) { 1750cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato Resources r = null; 1760cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1770cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (icon.iconPackage != null) { 1780cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 179ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey int userId = icon.user.getIdentifier(); 180ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey if (userId == UserHandle.USER_ALL) { 181ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey userId = UserHandle.USER_OWNER; 182ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey } 183ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey r = context.getPackageManager() 184ded653b168b19f6061889907d4f562d764c5559bJeff Sharkey .getResourcesForApplicationAsUser(icon.iconPackage, userId); 1850cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (PackageManager.NameNotFoundException ex) { 186cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock Log.e(TAG, "Icon package not found: " + icon.iconPackage); 1870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return null; 1880cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1890cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } else { 1900cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato r = context.getResources(); 1910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1920cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1930cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (icon.iconId == 0) { 1940cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return null; 1950cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 196209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock 1970cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 1980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return r.getDrawable(icon.iconId); 1990cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RuntimeException e) { 200cd686b5b6d4166b510df8e32138479a9559bc117John Spurlock Log.w(TAG, "Icon not found in " 2010cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato + (icon.iconPackage != null ? icon.iconId : "<system>") 2020cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato + ": " + Integer.toHexString(icon.iconId)); 2030cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2040cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2050cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato return null; 2060cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 207b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato 208b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato public StatusBarIcon getStatusBarIcon() { 209b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato return mIcon; 210b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato } 211f9ec03c0f5fc2c6eba5bbead24c4eb314c0205beJoe Onorato 2126179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 2136179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 2146179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 2156179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov if (mNotification != null) { 2166179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov event.setParcelableData(mNotification); 2176179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2186179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov } 2196179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov 2206179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @Override 2216c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato protected void onSizeChanged(int w, int h, int oldw, int oldh) { 2226c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato super.onSizeChanged(w, h, oldw, oldh); 2236c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato if (mNumberBackground != null) { 2246c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato placeNumber(); 2256c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2266c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato } 2276c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato 2286179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov @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; 247ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler final int tooBig = mContext.getResources().getInteger( 248ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler android.R.integer.status_bar_notification_info_maxnum); 249ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler if (mIcon.number > tooBig) { 250ebce0115e239919680fc5574ae4ca79e617fcce8Daniel Sandler str = mContext.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 } 2910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato} 292