Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9349eb56 authored by Dan Sandler's avatar Dan Sandler Committed by Android Git Automerger
Browse files

am 6da734c6: am 08a04c15: Icon support comes to Notification.

* commit '6da734c6':
  Icon support comes to Notification.
parents 38b00300 6da734c6
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -4781,6 +4781,8 @@ 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);
@@ -4925,6 +4927,7 @@ 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);
@@ -4963,6 +4966,7 @@ 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);
@@ -4974,6 +4978,7 @@ 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);
+5 −0
Original line number Diff line number Diff line
@@ -4875,6 +4875,8 @@ 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);
@@ -5019,6 +5021,7 @@ 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);
@@ -5057,6 +5060,7 @@ 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);
@@ -5068,6 +5072,7 @@ 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);
+100 −38
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ 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;
@@ -885,6 +886,9 @@ 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
@@ -1362,7 +1366,7 @@ public class Notification implements Parcelable
        int version = parcel.readInt();

        when = parcel.readLong();
        icon = parcel.readInt();
        mSmallIcon = Icon.CREATOR.createFromParcel(parcel);
        number = parcel.readInt();
        if (parcel.readInt() != 0) {
            contentIntent = PendingIntent.CREATOR.createFromParcel(parcel);
@@ -1380,7 +1384,7 @@ public class Notification implements Parcelable
            contentView = RemoteViews.CREATOR.createFromParcel(parcel);
        }
        if (parcel.readInt() != 0) {
            largeIcon = Bitmap.CREATOR.createFromParcel(parcel);
            mLargeIcon = Icon.CREATOR.createFromParcel(parcel);
        }
        defaults = parcel.readInt();
        flags = parcel.readInt();
@@ -1445,7 +1449,7 @@ public class Notification implements Parcelable
     */
    public void cloneInto(Notification that, boolean heavy) {
        that.when = this.when;
        that.icon = this.icon;
        that.mSmallIcon = this.mSmallIcon;
        that.number = this.number;

        // PendingIntents are global, so there's no reason (or way) to clone them.
@@ -1462,8 +1466,8 @@ public class Notification implements Parcelable
        if (heavy && this.contentView != null) {
            that.contentView = this.contentView.clone();
        }
        if (heavy && this.largeIcon != null) {
            that.largeIcon = Bitmap.createBitmap(this.largeIcon);
        if (heavy && this.mLargeIcon != null) {
            that.mLargeIcon = this.mLargeIcon;
        }
        that.iconLevel = this.iconLevel;
        that.sound = this.sound; // android.net.Uri is immutable
@@ -1544,7 +1548,7 @@ public class Notification implements Parcelable
        contentView = null;
        bigContentView = null;
        headsUpContentView = null;
        largeIcon = null;
        mLargeIcon = null;
        if (extras != null) {
            extras.remove(Notification.EXTRA_LARGE_ICON);
            extras.remove(Notification.EXTRA_LARGE_ICON_BIG);
@@ -1586,7 +1590,7 @@ public class Notification implements Parcelable
        parcel.writeInt(1);

        parcel.writeLong(when);
        parcel.writeInt(icon);
        mSmallIcon.writeToParcel(parcel, 0);
        parcel.writeInt(number);
        if (contentIntent != null) {
            parcel.writeInt(1);
@@ -1618,9 +1622,9 @@ public class Notification implements Parcelable
        } else {
            parcel.writeInt(0);
        }
        if (largeIcon != null) {
        if (mLargeIcon != null) {
            parcel.writeInt(1);
            largeIcon.writeToParcel(parcel, 0);
            mLargeIcon.writeToParcel(parcel, 0);
        } else {
            parcel.writeInt(0);
        }
@@ -1864,6 +1868,27 @@ 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
     */
@@ -1966,7 +1991,7 @@ public class Notification implements Parcelable
        private Context mContext;

        private long mWhen;
        private int mSmallIcon;
        private Icon mSmallIcon, mLargeIcon;
        private int mSmallIconLevel;
        private int mNumber;
        private CharSequence mContentTitle;
@@ -1979,7 +2004,6 @@ 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;
@@ -2160,8 +2184,7 @@ public class Notification implements Parcelable
         * @see Notification#icon
         */
        public Builder setSmallIcon(@DrawableRes int icon) {
            mSmallIcon = icon;
            return this;
            return setSmallIcon(Icon.createWithResource(mContext.getResources(), icon));
        }

        /**
@@ -2176,8 +2199,20 @@ public class Notification implements Parcelable
         * @see Notification#iconLevel
         */
        public Builder setSmallIcon(@DrawableRes int icon, int level) {
            mSmallIcon = icon;
            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;
            return this;
        }

@@ -2324,14 +2359,24 @@ public class Notification implements Parcelable
        }

        /**
         * Add a large icon to the notification (and the ticker on some devices).
         * Add a large icon to the notification content view.
         *
         * In the platform template, this image will be shown on the left of the notification view
         * in place of the {@link #setSmallIcon(int) small icon} (which will move to the right side).
         * 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.
         *
         * @see Notification#largeIcon
         * 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 icon) {
        public Builder setLargeIcon(Icon icon) {
            mLargeIcon = icon;
            return this;
        }
@@ -2840,13 +2885,13 @@ public class Notification implements Parcelable
            boolean contentTextInLine2 = false;

            if (mLargeIcon != null) {
                contentView.setImageViewBitmap(R.id.icon, mLargeIcon);
                contentView.setImageViewIcon(R.id.icon, mLargeIcon);
                processLargeLegacyIcon(mLargeIcon, contentView);
                contentView.setImageViewResource(R.id.right_icon, mSmallIcon);
                contentView.setImageViewIcon(R.id.right_icon, mSmallIcon);
                contentView.setViewVisibility(R.id.right_icon, View.VISIBLE);
                processSmallRightIcon(mSmallIcon, contentView);
            } else { // small icon at left
                contentView.setImageViewResource(R.id.icon, mSmallIcon);
                contentView.setImageViewIcon(R.id.icon, mSmallIcon);
                contentView.setViewVisibility(R.id.icon, View.VISIBLE);
                processSmallIconAsLarge(mSmallIcon, contentView);
            }
@@ -3086,14 +3131,16 @@ public class Notification implements Parcelable
        /**
         * Apply any necessary background to smallIcons being used in the largeIcon spot.
         */
        private void processSmallIconAsLarge(int largeIconId, RemoteViews contentView) {
        private void processSmallIconAsLarge(Icon largeIcon, 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);
                }
            }
        }

@@ -3102,8 +3149,9 @@ public class Notification implements Parcelable
         * if it's grayscale).
         */
        // TODO: also check bounds, transparency, that sort of thing.
        private void processLargeLegacyIcon(Bitmap largeIcon, RemoteViews contentView) {
            if (isLegacy() && mColorUtil.isGrayscaleIcon(largeIcon)) {
        private void processLargeLegacyIcon(Icon largeIcon, RemoteViews contentView) {
            if (largeIcon != null && isLegacy()
                    && mColorUtil.isGrayscaleIcon(mContext, largeIcon)) {
                applyLargeIconBackground(contentView);
            } else {
                removeLargeIconBackground(contentView);
@@ -3137,14 +3185,15 @@ public class Notification implements Parcelable
        /**
         * Recolor small icons when used in the R.id.right_icon slot.
         */
        private void processSmallRightIcon(int smallIconDrawableId,
                RemoteViews contentView) {
        private void processSmallRightIcon(Icon smallIcon, RemoteViews contentView) {
            if (!isLegacy()) {
                contentView.setDrawableParameters(R.id.right_icon, false, -1,
                        0xFFFFFFFF,
                        PorterDuff.Mode.SRC_ATOP, -1);
            }
            if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, smallIconDrawableId)) {
            final boolean gray = (smallIcon.getType() == Icon.TYPE_RESOURCE
                    && mColorUtil.isGrayscaleIcon(mContext, smallIcon.getResId()));
            if (!isLegacy() || gray) {
                contentView.setInt(R.id.right_icon,
                        "setBackgroundResource",
                        R.drawable.notification_icon_legacy_bg);
@@ -3180,7 +3229,10 @@ public class Notification implements Parcelable
        public Notification buildUnstyled() {
            Notification n = new Notification();
            n.when = mWhen;
            n.icon = mSmallIcon;
            n.mSmallIcon = mSmallIcon;
            if (mSmallIcon.getType() == Icon.TYPE_RESOURCE) {
                n.icon = mSmallIcon.getResId();
            }
            n.iconLevel = mSmallIconLevel;
            n.number = mNumber;

@@ -3192,7 +3244,10 @@ public class Notification implements Parcelable
            n.fullScreenIntent = mFullScreenIntent;
            n.tickerText = mTickerText;
            n.tickerView = makeTickerView();
            n.largeIcon = mLargeIcon;
            n.mLargeIcon = mLargeIcon;
            if (mLargeIcon != null && mLargeIcon.getType() == Icon.TYPE_BITMAP) {
                n.largeIcon = mLargeIcon.getBitmap();
            }
            n.sound = mSound;
            n.audioStreamType = mAudioStreamType;
            n.audioAttributes = mAudioAttributes;
@@ -3242,7 +3297,7 @@ public class Notification implements Parcelable
            extras.putCharSequence(EXTRA_TEXT, mContentText);
            extras.putCharSequence(EXTRA_SUB_TEXT, mSubText);
            extras.putCharSequence(EXTRA_INFO_TEXT, mContentInfo);
            extras.putInt(EXTRA_SMALL_ICON, mSmallIcon);
            extras.putParcelable(EXTRA_SMALL_ICON, mSmallIcon);
            extras.putInt(EXTRA_PROGRESS, mProgress);
            extras.putInt(EXTRA_PROGRESS_MAX, mProgressMax);
            extras.putBoolean(EXTRA_PROGRESS_INDETERMINATE, mProgressIndeterminate);
@@ -3430,7 +3485,7 @@ public class Notification implements Parcelable

            // Notification fields.
            mWhen = n.when;
            mSmallIcon = n.icon;
            mSmallIcon = n.mSmallIcon;
            mSmallIconLevel = n.iconLevel;
            mNumber = n.number;

@@ -3441,7 +3496,7 @@ public class Notification implements Parcelable
            mFullScreenIntent = n.fullScreenIntent;
            mTickerText = n.tickerText;
            mTickerView = n.tickerView;
            mLargeIcon = n.largeIcon;
            mLargeIcon = n.mLargeIcon;
            mSound = n.sound;
            mAudioStreamType = n.audioStreamType;
            mAudioAttributes = n.audioAttributes;
@@ -3472,7 +3527,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.getInt(EXTRA_SMALL_ICON);
            mSmallIcon = extras.getParcelable(EXTRA_SMALL_ICON);
            mProgress = extras.getInt(EXTRA_PROGRESS);
            mProgressMax = extras.getInt(EXTRA_PROGRESS_MAX);
            mProgressIndeterminate = extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE);
@@ -3764,7 +3819,7 @@ public class Notification implements Parcelable
     */
    public static class BigPictureStyle extends Style {
        private Bitmap mPicture;
        private Bitmap mBigLargeIcon;
        private Icon mBigLargeIcon;
        private boolean mBigLargeIconSet = false;

        public BigPictureStyle() {
@@ -3803,8 +3858,15 @@ 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 = b;
            mBigLargeIcon = icon;
            return this;
        }

@@ -3815,7 +3877,7 @@ public class Notification implements Parcelable
            //   1. mBigLargeIconSet -> mBigLargeIcon (null or non-null) applies, overrides
            //          mLargeIcon
            //   2. !mBigLargeIconSet -> mLargeIcon applies
            Bitmap oldLargeIcon = null;
            Icon oldLargeIcon = null;
            if (mBigLargeIconSet) {
                oldLargeIcon = mBuilder.mLargeIcon;
                mBuilder.mLargeIcon = mBigLargeIcon;
+16 −12
Original line number Diff line number Diff line
@@ -16,40 +16,46 @@

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 int iconId;
    public Icon icon;
    public int iconLevel;
    public boolean visible = true;
    public int number;
    public CharSequence contentDescription;

    public StatusBarIcon(String iconPackage, UserHandle user, int iconId, int iconLevel, int number,
    public StatusBarIcon(UserHandle user, Icon icon, int iconLevel, int number,
            CharSequence contentDescription) {
        this.iconPackage = iconPackage;
        this.user = user;
        this.iconId = iconId;
        this.icon = icon;
        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(pkg=" + this.iconPackage + "user=" + user.getIdentifier()
                + " id=0x" + Integer.toHexString(this.iconId)
        return "StatusBarIcon(icon=" + this.icon
                + " user=" + user.getIdentifier()
                + " level=" + this.iconLevel + " visible=" + visible
                + " num=" + this.number + " )";
    }

    @Override
    public StatusBarIcon clone() {
        StatusBarIcon that = new StatusBarIcon(this.iconPackage, this.user, this.iconId,
        StatusBarIcon that = new StatusBarIcon(this.user, this.icon,
                this.iconLevel, this.number, this.contentDescription);
        that.visible = this.visible;
        return that;
@@ -63,9 +69,8 @@ public class StatusBarIcon implements Parcelable {
    }

    public void readFromParcel(Parcel in) {
        this.iconPackage = in.readString();
        this.icon = (Icon) in.readParcelable(null);
        this.user = (UserHandle) in.readParcelable(null);
        this.iconId = in.readInt();
        this.iconLevel = in.readInt();
        this.visible = in.readInt() != 0;
        this.number = in.readInt();
@@ -73,9 +78,8 @@ public class StatusBarIcon implements Parcelable {
    }

    public void writeToParcel(Parcel out, int flags) {
        out.writeString(this.iconPackage);
        out.writeParcelable(this.icon, 0);
        out.writeParcelable(this.user, 0);
        out.writeInt(this.iconId);
        out.writeInt(this.iconLevel);
        out.writeInt(this.visible ? 1 : 0);
        out.writeInt(this.number);
+15 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ 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;
@@ -129,6 +130,20 @@ 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".
Loading