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