summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt5
-rw-r--r--api/system-current.txt5
-rw-r--r--core/java/android/app/Notification.java139
-rw-r--r--core/java/com/android/internal/statusbar/StatusBarIcon.java28
-rw-r--r--core/java/com/android/internal/util/NotificationColorUtil.java15
-rw-r--r--graphics/java/android/graphics/drawable/Icon.java82
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java56
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java6
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java8
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);
}