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