diff options
11 files changed, 117 insertions, 245 deletions
diff --git a/api/current.txt b/api/current.txt index 7adaa41..c70f012 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4781,8 +4781,6 @@ package android.app { method public android.app.Notification clone(); method public int describeContents(); method public java.lang.String getGroup(); - method public android.graphics.drawable.Icon getLargeIcon(); - method public android.graphics.drawable.Icon getSmallIcon(); method public java.lang.String getSortKey(); method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent); method public void writeToParcel(android.os.Parcel, int); @@ -4927,7 +4925,6 @@ package android.app { ctor public Notification.BigPictureStyle(); ctor public Notification.BigPictureStyle(android.app.Notification.Builder); method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.Bitmap); - method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.BigPictureStyle bigPicture(android.graphics.Bitmap); method public android.app.Notification.BigPictureStyle setBigContentTitle(java.lang.CharSequence); method public android.app.Notification.BigPictureStyle setSummaryText(java.lang.CharSequence); @@ -4966,7 +4963,6 @@ package android.app { method public android.app.Notification.Builder setGroup(java.lang.String); method public android.app.Notification.Builder setGroupSummary(boolean); method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap); - method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setLights(int, int, int); method public android.app.Notification.Builder setLocalOnly(boolean); method public android.app.Notification.Builder setNumber(int); @@ -4978,7 +4974,6 @@ package android.app { method public android.app.Notification.Builder setShowWhen(boolean); method public android.app.Notification.Builder setSmallIcon(int); method public android.app.Notification.Builder setSmallIcon(int, int); - method public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setSortKey(java.lang.String); method public android.app.Notification.Builder setSound(android.net.Uri); method public deprecated android.app.Notification.Builder setSound(android.net.Uri, int); diff --git a/api/system-current.txt b/api/system-current.txt index 4b76109..1729ef1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4875,8 +4875,6 @@ package android.app { method public android.app.Notification clone(); method public int describeContents(); method public java.lang.String getGroup(); - method public android.graphics.drawable.Icon getLargeIcon(); - method public android.graphics.drawable.Icon getSmallIcon(); method public java.lang.String getSortKey(); method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent); method public void writeToParcel(android.os.Parcel, int); @@ -5021,7 +5019,6 @@ package android.app { ctor public Notification.BigPictureStyle(); ctor public Notification.BigPictureStyle(android.app.Notification.Builder); method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.Bitmap); - method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.BigPictureStyle bigPicture(android.graphics.Bitmap); method public android.app.Notification.BigPictureStyle setBigContentTitle(java.lang.CharSequence); method public android.app.Notification.BigPictureStyle setSummaryText(java.lang.CharSequence); @@ -5060,7 +5057,6 @@ package android.app { method public android.app.Notification.Builder setGroup(java.lang.String); method public android.app.Notification.Builder setGroupSummary(boolean); method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap); - method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setLights(int, int, int); method public android.app.Notification.Builder setLocalOnly(boolean); method public android.app.Notification.Builder setNumber(int); @@ -5072,7 +5068,6 @@ package android.app { method public android.app.Notification.Builder setShowWhen(boolean); method public android.app.Notification.Builder setSmallIcon(int); method public android.app.Notification.Builder setSmallIcon(int, int); - method public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setSortKey(java.lang.String); method public android.app.Notification.Builder setSound(android.net.Uri); method public deprecated android.app.Notification.Builder setSound(android.net.Uri, int); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index cb6f7d5..49b2549 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -30,7 +30,6 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; -import android.graphics.drawable.Icon; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.session.MediaSession; @@ -886,9 +885,6 @@ public class Notification implements Parcelable */ public static final int HEADS_UP_REQUESTED = 2; - private Icon mSmallIcon; - private Icon mLargeIcon; - /** * Structure to encapsulate a named action that can be shown as part of this notification. * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is @@ -1366,7 +1362,7 @@ public class Notification implements Parcelable int version = parcel.readInt(); when = parcel.readLong(); - mSmallIcon = Icon.CREATOR.createFromParcel(parcel); + icon = parcel.readInt(); number = parcel.readInt(); if (parcel.readInt() != 0) { contentIntent = PendingIntent.CREATOR.createFromParcel(parcel); @@ -1384,7 +1380,7 @@ public class Notification implements Parcelable contentView = RemoteViews.CREATOR.createFromParcel(parcel); } if (parcel.readInt() != 0) { - mLargeIcon = Icon.CREATOR.createFromParcel(parcel); + largeIcon = Bitmap.CREATOR.createFromParcel(parcel); } defaults = parcel.readInt(); flags = parcel.readInt(); @@ -1449,7 +1445,7 @@ public class Notification implements Parcelable */ public void cloneInto(Notification that, boolean heavy) { that.when = this.when; - that.mSmallIcon = this.mSmallIcon; + that.icon = this.icon; that.number = this.number; // PendingIntents are global, so there's no reason (or way) to clone them. @@ -1466,8 +1462,8 @@ public class Notification implements Parcelable if (heavy && this.contentView != null) { that.contentView = this.contentView.clone(); } - if (heavy && this.mLargeIcon != null) { - that.mLargeIcon = this.mLargeIcon; + if (heavy && this.largeIcon != null) { + that.largeIcon = Bitmap.createBitmap(this.largeIcon); } that.iconLevel = this.iconLevel; that.sound = this.sound; // android.net.Uri is immutable @@ -1548,7 +1544,7 @@ public class Notification implements Parcelable contentView = null; bigContentView = null; headsUpContentView = null; - mLargeIcon = null; + largeIcon = null; if (extras != null) { extras.remove(Notification.EXTRA_LARGE_ICON); extras.remove(Notification.EXTRA_LARGE_ICON_BIG); @@ -1590,7 +1586,7 @@ public class Notification implements Parcelable parcel.writeInt(1); parcel.writeLong(when); - mSmallIcon.writeToParcel(parcel, 0); + parcel.writeInt(icon); parcel.writeInt(number); if (contentIntent != null) { parcel.writeInt(1); @@ -1622,9 +1618,9 @@ public class Notification implements Parcelable } else { parcel.writeInt(0); } - if (mLargeIcon != null) { + if (largeIcon != null) { parcel.writeInt(1); - mLargeIcon.writeToParcel(parcel, 0); + largeIcon.writeToParcel(parcel, 0); } else { parcel.writeInt(0); } @@ -1869,27 +1865,6 @@ public class Notification implements Parcelable } /** - * The small icon representing this notification in the status bar and content view. - * - * @return the small icon representing this notification. - * - * @see Builder#getSmallIcon() - * @see Builder#setSmallIcon(Icon) - */ - public Icon getSmallIcon() { - return mSmallIcon; - } - - /** - * The large icon shown in this notification's content view. - * @see Builder#getLargeIcon() - * @see Builder#setLargeIcon(Icon) - */ - public Icon getLargeIcon() { - return mLargeIcon; - } - - /** * @hide */ public boolean isValid() { @@ -1991,7 +1966,7 @@ public class Notification implements Parcelable private Context mContext; private long mWhen; - private Icon mSmallIcon, mLargeIcon; + private int mSmallIcon; private int mSmallIconLevel; private int mNumber; private CharSequence mContentTitle; @@ -2004,6 +1979,7 @@ public class Notification implements Parcelable private PendingIntent mFullScreenIntent; private CharSequence mTickerText; private RemoteViews mTickerView; + private Bitmap mLargeIcon; private Uri mSound; private int mAudioStreamType; private AudioAttributes mAudioAttributes; @@ -2184,7 +2160,8 @@ public class Notification implements Parcelable * @see Notification#icon */ public Builder setSmallIcon(@DrawableRes int icon) { - return setSmallIcon(Icon.createWithResource(mContext.getResources(), icon)); + mSmallIcon = icon; + return this; } /** @@ -2199,20 +2176,8 @@ public class Notification implements Parcelable * @see Notification#iconLevel */ public Builder setSmallIcon(@DrawableRes int icon, int level) { - mSmallIconLevel = level; - return setSmallIcon(icon); - } - - /** - * Set the small icon, which will be used to represent the notification in the - * status bar and content view (unless overriden there by a - * {@link #setLargeIcon(Bitmap) large icon}). - * - * @param icon An Icon object to use. - * @see Notification#icon - */ - public Builder setSmallIcon(Icon icon) { mSmallIcon = icon; + mSmallIconLevel = level; return this; } @@ -2359,24 +2324,14 @@ public class Notification implements Parcelable } /** - * Add a large icon to the notification content view. + * Add a large icon to the notification (and the ticker on some devices). * * In the platform template, this image will be shown on the left of the notification view - * in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small - * badge atop the large icon). - */ - public Builder setLargeIcon(Bitmap b) { - return setLargeIcon(b != null ? Icon.createWithBitmap(b) : null); - } - - /** - * Add a large icon to the notification content view. + * in place of the {@link #setSmallIcon(int) small icon} (which will move to the right side). * - * In the platform template, this image will be shown on the left of the notification view - * in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small - * badge atop the large icon). + * @see Notification#largeIcon */ - public Builder setLargeIcon(Icon icon) { + public Builder setLargeIcon(Bitmap icon) { mLargeIcon = icon; return this; } @@ -2885,13 +2840,13 @@ public class Notification implements Parcelable boolean contentTextInLine2 = false; if (mLargeIcon != null) { - contentView.setImageViewIcon(R.id.icon, mLargeIcon); + contentView.setImageViewBitmap(R.id.icon, mLargeIcon); processLargeLegacyIcon(mLargeIcon, contentView); - contentView.setImageViewIcon(R.id.right_icon, mSmallIcon); + contentView.setImageViewResource(R.id.right_icon, mSmallIcon); contentView.setViewVisibility(R.id.right_icon, View.VISIBLE); processSmallRightIcon(mSmallIcon, contentView); } else { // small icon at left - contentView.setImageViewIcon(R.id.icon, mSmallIcon); + contentView.setImageViewResource(R.id.icon, mSmallIcon); contentView.setViewVisibility(R.id.icon, View.VISIBLE); processSmallIconAsLarge(mSmallIcon, contentView); } @@ -3131,16 +3086,14 @@ public class Notification implements Parcelable /** * Apply any necessary background to smallIcons being used in the largeIcon spot. */ - private void processSmallIconAsLarge(Icon largeIcon, RemoteViews contentView) { + private void processSmallIconAsLarge(int largeIconId, RemoteViews contentView) { if (!isLegacy()) { contentView.setDrawableParameters(R.id.icon, false, -1, 0xFFFFFFFF, PorterDuff.Mode.SRC_ATOP, -1); + } + if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, largeIconId)) { applyLargeIconBackground(contentView); - } else { - if (mColorUtil.isGrayscaleIcon(mContext, largeIcon)) { - applyLargeIconBackground(contentView); - } } } @@ -3149,9 +3102,8 @@ public class Notification implements Parcelable * if it's grayscale). */ // TODO: also check bounds, transparency, that sort of thing. - private void processLargeLegacyIcon(Icon largeIcon, RemoteViews contentView) { - if (largeIcon != null && isLegacy() - && mColorUtil.isGrayscaleIcon(mContext, largeIcon)) { + private void processLargeLegacyIcon(Bitmap largeIcon, RemoteViews contentView) { + if (isLegacy() && mColorUtil.isGrayscaleIcon(largeIcon)) { applyLargeIconBackground(contentView); } else { removeLargeIconBackground(contentView); @@ -3185,16 +3137,14 @@ public class Notification implements Parcelable /** * Recolor small icons when used in the R.id.right_icon slot. */ - private void processSmallRightIcon(Icon smallIcon, RemoteViews contentView) { + private void processSmallRightIcon(int smallIconDrawableId, + RemoteViews contentView) { if (!isLegacy()) { contentView.setDrawableParameters(R.id.right_icon, false, -1, 0xFFFFFFFF, PorterDuff.Mode.SRC_ATOP, -1); } - final boolean gray = isLegacy() - && smallIcon.getType() == Icon.TYPE_RESOURCE - && mColorUtil.isGrayscaleIcon(mContext, smallIcon.getResId()); - if (!isLegacy() || gray) { + if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, smallIconDrawableId)) { contentView.setInt(R.id.right_icon, "setBackgroundResource", R.drawable.notification_icon_legacy_bg); @@ -3230,10 +3180,7 @@ public class Notification implements Parcelable public Notification buildUnstyled() { Notification n = new Notification(); n.when = mWhen; - n.mSmallIcon = mSmallIcon; - if (mSmallIcon.getType() == Icon.TYPE_RESOURCE) { - n.icon = mSmallIcon.getResId(); - } + n.icon = mSmallIcon; n.iconLevel = mSmallIconLevel; n.number = mNumber; @@ -3245,10 +3192,7 @@ public class Notification implements Parcelable n.fullScreenIntent = mFullScreenIntent; n.tickerText = mTickerText; n.tickerView = makeTickerView(); - n.mLargeIcon = mLargeIcon; - if (mLargeIcon != null && mLargeIcon.getType() == Icon.TYPE_BITMAP) { - n.largeIcon = mLargeIcon.getBitmap(); - } + n.largeIcon = mLargeIcon; n.sound = mSound; n.audioStreamType = mAudioStreamType; n.audioAttributes = mAudioAttributes; @@ -3298,7 +3242,7 @@ public class Notification implements Parcelable extras.putCharSequence(EXTRA_TEXT, mContentText); extras.putCharSequence(EXTRA_SUB_TEXT, mSubText); extras.putCharSequence(EXTRA_INFO_TEXT, mContentInfo); - extras.putParcelable(EXTRA_SMALL_ICON, mSmallIcon); + extras.putInt(EXTRA_SMALL_ICON, mSmallIcon); extras.putInt(EXTRA_PROGRESS, mProgress); extras.putInt(EXTRA_PROGRESS_MAX, mProgressMax); extras.putBoolean(EXTRA_PROGRESS_INDETERMINATE, mProgressIndeterminate); @@ -3486,7 +3430,7 @@ public class Notification implements Parcelable // Notification fields. mWhen = n.when; - mSmallIcon = n.mSmallIcon; + mSmallIcon = n.icon; mSmallIconLevel = n.iconLevel; mNumber = n.number; @@ -3497,7 +3441,7 @@ public class Notification implements Parcelable mFullScreenIntent = n.fullScreenIntent; mTickerText = n.tickerText; mTickerView = n.tickerView; - mLargeIcon = n.mLargeIcon; + mLargeIcon = n.largeIcon; mSound = n.sound; mAudioStreamType = n.audioStreamType; mAudioAttributes = n.audioAttributes; @@ -3528,7 +3472,7 @@ public class Notification implements Parcelable mContentText = extras.getCharSequence(EXTRA_TEXT); mSubText = extras.getCharSequence(EXTRA_SUB_TEXT); mContentInfo = extras.getCharSequence(EXTRA_INFO_TEXT); - mSmallIcon = extras.getParcelable(EXTRA_SMALL_ICON); + mSmallIcon = extras.getInt(EXTRA_SMALL_ICON); mProgress = extras.getInt(EXTRA_PROGRESS); mProgressMax = extras.getInt(EXTRA_PROGRESS_MAX); mProgressIndeterminate = extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE); @@ -3820,7 +3764,7 @@ public class Notification implements Parcelable */ public static class BigPictureStyle extends Style { private Bitmap mPicture; - private Icon mBigLargeIcon; + private Bitmap mBigLargeIcon; private boolean mBigLargeIconSet = false; public BigPictureStyle() { @@ -3859,15 +3803,8 @@ public class Notification implements Parcelable * Override the large icon when the big notification is shown. */ public BigPictureStyle bigLargeIcon(Bitmap b) { - return bigLargeIcon(b != null ? Icon.createWithBitmap(b) : null); - } - - /** - * Override the large icon when the big notification is shown. - */ - public BigPictureStyle bigLargeIcon(Icon icon) { mBigLargeIconSet = true; - mBigLargeIcon = icon; + mBigLargeIcon = b; return this; } @@ -3878,7 +3815,7 @@ public class Notification implements Parcelable // 1. mBigLargeIconSet -> mBigLargeIcon (null or non-null) applies, overrides // mLargeIcon // 2. !mBigLargeIconSet -> mLargeIcon applies - Icon oldLargeIcon = null; + Bitmap oldLargeIcon = null; if (mBigLargeIconSet) { oldLargeIcon = mBuilder.mLargeIcon; mBuilder.mLargeIcon = mBigLargeIcon; diff --git a/core/java/com/android/internal/statusbar/StatusBarIcon.java b/core/java/com/android/internal/statusbar/StatusBarIcon.java index 4693d4b..e0792cb 100644 --- a/core/java/com/android/internal/statusbar/StatusBarIcon.java +++ b/core/java/com/android/internal/statusbar/StatusBarIcon.java @@ -16,46 +16,40 @@ package com.android.internal.statusbar; -import android.graphics.drawable.Icon; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; public class StatusBarIcon implements Parcelable { + public String iconPackage; public UserHandle user; - public Icon icon; + public int iconId; public int iconLevel; public boolean visible = true; public int number; public CharSequence contentDescription; - public StatusBarIcon(UserHandle user, Icon icon, int iconLevel, int number, + public StatusBarIcon(String iconPackage, UserHandle user, int iconId, int iconLevel, int number, CharSequence contentDescription) { + this.iconPackage = iconPackage; this.user = user; - this.icon = icon; + this.iconId = iconId; this.iconLevel = iconLevel; this.number = number; this.contentDescription = contentDescription; } - public StatusBarIcon(String iconPackage, UserHandle user, - int iconId, int iconLevel, int number, - CharSequence contentDescription) { - this(user, Icon.createWithResource(iconPackage, iconId), - iconLevel, number, contentDescription); - } - @Override public String toString() { - return "StatusBarIcon(icon=" + this.icon - + " user=" + user.getIdentifier() + return "StatusBarIcon(pkg=" + this.iconPackage + "user=" + user.getIdentifier() + + " id=0x" + Integer.toHexString(this.iconId) + " level=" + this.iconLevel + " visible=" + visible + " num=" + this.number + " )"; } @Override public StatusBarIcon clone() { - StatusBarIcon that = new StatusBarIcon(this.user, this.icon, + StatusBarIcon that = new StatusBarIcon(this.iconPackage, this.user, this.iconId, this.iconLevel, this.number, this.contentDescription); that.visible = this.visible; return that; @@ -69,8 +63,9 @@ public class StatusBarIcon implements Parcelable { } public void readFromParcel(Parcel in) { - this.icon = (Icon) in.readParcelable(null); + this.iconPackage = in.readString(); this.user = (UserHandle) in.readParcelable(null); + this.iconId = in.readInt(); this.iconLevel = in.readInt(); this.visible = in.readInt() != 0; this.number = in.readInt(); @@ -78,8 +73,9 @@ public class StatusBarIcon implements Parcelable { } public void writeToParcel(Parcel out, int flags) { - out.writeParcelable(this.icon, 0); + out.writeString(this.iconPackage); out.writeParcelable(this.user, 0); + out.writeInt(this.iconId); out.writeInt(this.iconLevel); out.writeInt(this.visible ? 1 : 0); out.writeInt(this.number); diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java index 6076973..3249ea3 100644 --- a/core/java/com/android/internal/util/NotificationColorUtil.java +++ b/core/java/com/android/internal/util/NotificationColorUtil.java @@ -24,7 +24,6 @@ import android.graphics.Color; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.graphics.drawable.Icon; import android.graphics.drawable.VectorDrawable; import android.text.SpannableStringBuilder; import android.text.Spanned; @@ -130,20 +129,6 @@ public class NotificationColorUtil { } } - public boolean isGrayscaleIcon(Context context, Icon icon) { - if (icon == null) { - return false; - } - switch (icon.getType()) { - case Icon.TYPE_BITMAP: - return isGrayscaleIcon(icon.getBitmap()); - case Icon.TYPE_RESOURCE: - return isGrayscaleIcon(context, icon.getResId()); - default: - return false; - } - } - /** * Checks whether a drawable with a resoure id is a small grayscale icon. * Grayscale here means "very close to a perfect gray"; icon means "no larger than 64dp". diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index 37fb703..668a14a 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -53,14 +53,10 @@ import java.io.OutputStream; public final class Icon implements Parcelable { private static final String TAG = "Icon"; - /** @hide */ - public static final int TYPE_BITMAP = 1; - /** @hide */ - public static final int TYPE_RESOURCE = 2; - /** @hide */ - public static final int TYPE_DATA = 3; - /** @hide */ - public static final int TYPE_URI = 4; + private static final int TYPE_BITMAP = 1; + private static final int TYPE_RESOURCE = 2; + private static final int TYPE_DATA = 3; + private static final int TYPE_URI = 4; private static final int VERSION_STREAM_SERIALIZER = 1; @@ -85,34 +81,15 @@ public final class Icon implements Parcelable { // TYPE_DATA: data offset private int mInt2; - /** - * @return The type of image data held in this Icon. One of - * {@link #TYPE_BITMAP}, - * {@link #TYPE_RESOURCE}, - * {@link #TYPE_DATA}, or - * {@link #TYPE_URI}. - * @hide - */ - public int getType() { - return mType; - } - - /** - * @return The {@link android.graphics.Bitmap} held by this {@link #TYPE_BITMAP} Icon. - * @hide - */ - public Bitmap getBitmap() { + // Internal accessors for different mType variants + private Bitmap getBitmap() { if (mType != TYPE_BITMAP) { throw new IllegalStateException("called getBitmap() on " + this); } return (Bitmap) mObj1; } - /** - * @return The length of the compressed bitmap byte array held by this {@link #TYPE_DATA} Icon. - * @hide - */ - public int getDataLength() { + private int getDataLength() { if (mType != TYPE_DATA) { throw new IllegalStateException("called getDataLength() on " + this); } @@ -121,12 +98,7 @@ public final class Icon implements Parcelable { } } - /** - * @return The offset into the byte array held by this {@link #TYPE_DATA} Icon at which - * valid compressed bitmap data is found. - * @hide - */ - public int getDataOffset() { + private int getDataOffset() { if (mType != TYPE_DATA) { throw new IllegalStateException("called getDataOffset() on " + this); } @@ -135,12 +107,7 @@ public final class Icon implements Parcelable { } } - /** - * @return The byte array held by this {@link #TYPE_DATA} Icon ctonaining compressed - * bitmap data. - * @hide - */ - public byte[] getDataBytes() { + private byte[] getDataBytes() { if (mType != TYPE_DATA) { throw new IllegalStateException("called getDataBytes() on " + this); } @@ -149,58 +116,39 @@ public final class Icon implements Parcelable { } } - /** - * @return The {@link android.content.res.Resources} for this {@link #TYPE_RESOURCE} Icon. - * @hide - */ - public Resources getResources() { + private Resources getResources() { if (mType != TYPE_RESOURCE) { throw new IllegalStateException("called getResources() on " + this); } return (Resources) mObj1; } - /** - * @return The package containing resources for this {@link #TYPE_RESOURCE} Icon. - * @hide - */ - public String getResPackage() { + private String getResPackage() { if (mType != TYPE_RESOURCE) { throw new IllegalStateException("called getResPackage() on " + this); } return mString1; } - /** - * @return The resource ID for this {@link #TYPE_RESOURCE} Icon. - * @hide - */ - public int getResId() { + private int getResId() { if (mType != TYPE_RESOURCE) { throw new IllegalStateException("called getResId() on " + this); } return mInt1; } - /** - * @return The URI (as a String) for this {@link #TYPE_URI} Icon. - * @hide - */ - public String getUriString() { + private String getUriString() { if (mType != TYPE_URI) { throw new IllegalStateException("called getUriString() on " + this); } return mString1; } - /** - * @return The {@link android.net.Uri} for this {@link #TYPE_URI} Icon. - * @hide - */ - public Uri getUri() { + private Uri getUri() { return Uri.parse(getUriString()); } + // Convert a int32 into a four-char string private static final String typeToString(int x) { switch (x) { case TYPE_BITMAP: return "BITMAP"; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index be33085..715f4e4 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -194,7 +194,7 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi // we compose the final post-save notification below. mNotificationBuilder.setLargeIcon(croppedIcon); // But we still don't set it for the expanded view, allowing the smallIcon to show here. - mNotificationStyle.bigLargeIcon((Bitmap) null); + mNotificationStyle.bigLargeIcon(null); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 1e488f3..2913c7d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1390,9 +1390,9 @@ public abstract class BaseStatusBar extends SystemUI implements final ImageView profileBadge = (ImageView) publicViewLocal.findViewById( R.id.profile_badge_line3); - final StatusBarIcon ic = new StatusBarIcon( + final StatusBarIcon ic = new StatusBarIcon(entry.notification.getPackageName(), entry.notification.getUser(), - entry.notification.getNotification().getSmallIcon(), + entry.notification.getNotification().icon, entry.notification.getNotification().iconLevel, entry.notification.getNotification().number, entry.notification.getNotification().tickerText); @@ -1770,9 +1770,9 @@ public abstract class BaseStatusBar extends SystemUI implements sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), n); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - final StatusBarIcon ic = new StatusBarIcon( + final StatusBarIcon ic = new StatusBarIcon(sbn.getPackageName(), sbn.getUser(), - n.getSmallIcon(), + n.icon, n.iconLevel, n.number, n.tickerText); @@ -1916,9 +1916,9 @@ public abstract class BaseStatusBar extends SystemUI implements try { if (entry.icon != null) { // Update the icon - final StatusBarIcon ic = new StatusBarIcon( + final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), notification.getUser(), - n.getSmallIcon(), + n.icon, n.iconLevel, n.number, n.tickerText); @@ -1938,9 +1938,9 @@ public abstract class BaseStatusBar extends SystemUI implements } if (!updateSuccessful) { if (DEBUG) Log.d(TAG, "not reusing notification for key: " + key); - final StatusBarIcon ic = new StatusBarIcon( + final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), notification.getUser(), - n.getSmallIcon(), + n.icon, n.iconLevel, n.number, n.tickerText); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 3294e15..e6847d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -24,7 +24,6 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.graphics.drawable.Icon; import android.os.UserHandle; import android.text.TextUtils; import android.util.AttributeSet; @@ -101,23 +100,13 @@ public class StatusBarIconView extends AnimatedImageView { return a.equals(b); } - public boolean equalIcons(Icon a, Icon b) { - if (a == b) return true; - if (a.getType() != b.getType()) return false; - switch (a.getType()) { - case Icon.TYPE_RESOURCE: - return a.getResPackage().equals(b.getResPackage()) && a.getResId() == b.getResId(); - case Icon.TYPE_URI: - return a.getUriString().equals(b.getUriString()); - default: - return false; - } - } /** * Returns whether the set succeeded. */ public boolean set(StatusBarIcon icon) { - final boolean iconEquals = mIcon != null && equalIcons(mIcon.icon, icon.icon); + final boolean iconEquals = mIcon != null + && streq(mIcon.iconPackage, icon.iconPackage) + && mIcon.iconId == icon.iconId; final boolean levelEquals = iconEquals && mIcon.iconLevel == icon.iconLevel; final boolean visibilityEquals = mIcon != null @@ -178,18 +167,45 @@ public class StatusBarIconView extends AnimatedImageView { } /** - * Returns the right icon to use for this item + * Returns the right icon to use for this item, respecting the iconId and + * iconPackage (if set) * - * @param context Context to use to get resources + * @param context Context to use to get resources if iconPackage is not set * @return Drawable for this item, or null if the package or item could not * be found */ public static Drawable getIcon(Context context, StatusBarIcon icon) { - int userId = icon.user.getIdentifier(); - if (userId == UserHandle.USER_ALL) { - userId = UserHandle.USER_OWNER; + Resources r = null; + + if (icon.iconPackage != null) { + try { + int userId = icon.user.getIdentifier(); + if (userId == UserHandle.USER_ALL) { + userId = UserHandle.USER_OWNER; + } + r = context.getPackageManager() + .getResourcesForApplicationAsUser(icon.iconPackage, userId); + } catch (PackageManager.NameNotFoundException ex) { + Log.e(TAG, "Icon package not found: " + icon.iconPackage); + return null; + } + } else { + r = context.getResources(); } - return icon.icon.loadDrawableAsUser(context, userId); + + if (icon.iconId == 0) { + return null; + } + + try { + return r.getDrawable(icon.iconId); + } catch (RuntimeException e) { + Log.w(TAG, "Icon not found in " + + (icon.iconPackage != null ? icon.iconId : "<system>") + + ": " + Integer.toHexString(icon.iconId)); + } + + return null; } public StatusBarIcon getStatusBarIcon() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java index 26d1c86..44168bc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.phone; -import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.UserHandle; import android.view.Gravity; @@ -133,7 +132,8 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode { break; } else { StatusBarIcon icon = v.getStatusBarIcon(); - icon.icon = Icon.createWithResource(icon.icon.getResPackage(), iconId); + icon.iconPackage = iconPkg; + icon.iconId = iconId; v.set(icon); v.updateDrawable(); return; @@ -152,4 +152,4 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode { v.set(icon); addView(v, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize)); } -} +}
\ No newline at end of file diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 764d085..ec039b0 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2018,7 +2018,7 @@ public class NotificationManagerService extends SystemService { throw new IllegalArgumentException("null not allowed: pkg=" + pkg + " id=" + id + " notification=" + notification); } - if (notification.getSmallIcon() != null) { + if (notification.icon != 0) { if (!notification.isValid()) { throw new IllegalArgumentException("Invalid notification (): pkg=" + pkg + " id=" + id + " notification=" + notification); @@ -2139,11 +2139,11 @@ public class NotificationManagerService extends SystemService { applyZenModeLocked(r); mRankingHelper.sort(mNotificationList); - if (notification.getSmallIcon() != null) { + if (notification.icon != 0) { StatusBarNotification oldSbn = (old != null) ? old.sbn : null; mListeners.notifyPostedLocked(n, oldSbn); } else { - Slog.e(TAG, "Not posting notification without small icon: " + notification); + Slog.e(TAG, "Not posting notification with icon==0: " + notification); if (old != null && !old.isCanceled) { mListeners.notifyRemovedLocked(n); } @@ -2716,7 +2716,7 @@ public class NotificationManagerService extends SystemService { } // status bar - if (r.getNotification().getSmallIcon() != null) { + if (r.getNotification().icon != 0) { r.isCanceled = true; mListeners.notifyRemovedLocked(r.sbn); } |