Loading core/api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -5656,6 +5656,7 @@ package android.app { field public static final String EXTRA_PEOPLE_LIST = "android.people.list"; field public static final String EXTRA_PICTURE = "android.picture"; field public static final String EXTRA_PICTURE_CONTENT_DESCRIPTION = "android.pictureContentDescription"; field public static final String EXTRA_PICTURE_ICON = "android.pictureIcon"; field public static final String EXTRA_PROGRESS = "android.progress"; field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate"; field public static final String EXTRA_PROGRESS_MAX = "android.progressMax"; Loading Loading @@ -5804,6 +5805,7 @@ package android.app { method @NonNull public android.app.Notification.BigPictureStyle bigLargeIcon(@Nullable android.graphics.Bitmap); method @NonNull public android.app.Notification.BigPictureStyle bigLargeIcon(@Nullable android.graphics.drawable.Icon); method @NonNull public android.app.Notification.BigPictureStyle bigPicture(@Nullable android.graphics.Bitmap); method @NonNull public android.app.Notification.BigPictureStyle bigPicture(@Nullable android.graphics.drawable.Icon); method @NonNull public android.app.Notification.BigPictureStyle bigPictureContentDescription(@Nullable CharSequence); method @NonNull public android.app.Notification.BigPictureStyle setBigContentTitle(@Nullable CharSequence); method @NonNull public android.app.Notification.BigPictureStyle setSummaryText(@Nullable CharSequence); core/java/android/app/Notification.java +98 −35 Original line number Diff line number Diff line Loading @@ -1206,6 +1206,13 @@ public class Notification implements Parcelable */ public static final String EXTRA_PICTURE = "android.picture"; /** * {@link #extras} key: this is an {@link Icon} of an image to be * shown in {@link BigPictureStyle} expanded notifications, supplied to * {@link BigPictureStyle#bigPicture(Icon)}. */ public static final String EXTRA_PICTURE_ICON = "android.pictureIcon"; /** * {@link #extras} key: this is a content description of the big picture supplied from * {@link BigPictureStyle#bigPicture(Bitmap)}, supplied to Loading Loading @@ -2668,6 +2675,14 @@ public class Notification implements Parcelable } } private static void visitIconUri(@NonNull Consumer<Uri> visitor, @Nullable Icon icon) { if (icon == null) return; final int iconType = icon.getType(); if (iconType == TYPE_URI || iconType == TYPE_URI_ADAPTIVE_BITMAP) { visitor.accept(icon.getUri()); } } /** * Note all {@link Uri} that are referenced internally, with the expectation * that Uri permission grants will need to be issued to ensure the recipient Loading @@ -2683,7 +2698,19 @@ public class Notification implements Parcelable if (bigContentView != null) bigContentView.visitUris(visitor); if (headsUpContentView != null) headsUpContentView.visitUris(visitor); visitIconUri(visitor, mSmallIcon); visitIconUri(visitor, mLargeIcon); if (actions != null) { for (Action action : actions) { visitIconUri(visitor, action.getIcon()); } } if (extras != null) { visitIconUri(visitor, extras.getParcelable(EXTRA_LARGE_ICON_BIG)); visitIconUri(visitor, extras.getParcelable(EXTRA_PICTURE_ICON)); // NOTE: The documentation of EXTRA_AUDIO_CONTENTS_URI explicitly says that it is a // String representation of a Uri, but the previous implementation (and unit test) of // this method has always treated it as a Uri object. Given the inconsistency, Loading @@ -2702,14 +2729,12 @@ public class Notification implements Parcelable ArrayList<Person> people = extras.getParcelableArrayList(EXTRA_PEOPLE_LIST); if (people != null && !people.isEmpty()) { for (Person p : people) { if (p.getIconUri() != null) { visitor.accept(p.getIconUri()); } } } final Person person = extras.getParcelable(EXTRA_MESSAGING_PERSON); if (person != null && person.getIconUri() != null) { if (person != null) { visitor.accept(person.getIconUri()); } } Loading @@ -2722,7 +2747,7 @@ public class Notification implements Parcelable visitor.accept(message.getDataUri()); Person senderPerson = message.getSenderPerson(); if (senderPerson != null && senderPerson.getIconUri() != null) { if (senderPerson != null) { visitor.accept(senderPerson.getIconUri()); } } Loading @@ -2735,19 +2760,15 @@ public class Notification implements Parcelable visitor.accept(message.getDataUri()); Person senderPerson = message.getSenderPerson(); if (senderPerson != null && senderPerson.getIconUri() != null) { if (senderPerson != null) { visitor.accept(senderPerson.getIconUri()); } } } } if (mBubbleMetadata != null && mBubbleMetadata.getIcon() != null) { final Icon icon = mBubbleMetadata.getIcon(); final int iconType = icon.getType(); if (iconType == TYPE_URI_ADAPTIVE_BITMAP || iconType == TYPE_URI) { visitor.accept(icon.getUri()); } if (mBubbleMetadata != null) { visitIconUri(visitor, mBubbleMetadata.getIcon()); } } Loading Loading @@ -7231,7 +7252,7 @@ public class Notification implements Parcelable * @see Notification#bigContentView */ public static class BigPictureStyle extends Style { private Bitmap mPicture; private Icon mPictureIcon; private Icon mBigLargeIcon; private boolean mBigLargeIconSet = false; private CharSequence mPictureContentDescription; Loading Loading @@ -7280,8 +7301,12 @@ public class Notification implements Parcelable /** * @hide */ public Bitmap getBigPicture() { return mPicture; @Nullable public Icon getBigPicture() { if (mPictureIcon != null) { return mPictureIcon; } return null; } /** Loading @@ -7289,7 +7314,16 @@ public class Notification implements Parcelable */ @NonNull public BigPictureStyle bigPicture(@Nullable Bitmap b) { mPicture = b; mPictureIcon = b == null ? null : Icon.createWithBitmap(b); return this; } /** * Provide the content Uri to be used as the payload for the BigPicture notification. */ @NonNull public BigPictureStyle bigPicture(@Nullable Icon icon) { mPictureIcon = icon; return this; } Loading Loading @@ -7331,10 +7365,8 @@ public class Notification implements Parcelable @Override public void purgeResources() { super.purgeResources(); if (mPicture != null && mPicture.isMutable() && mPicture.getAllocationByteCount() >= MIN_ASHMEM_BITMAP_SIZE) { mPicture = mPicture.asShared(); if (mPictureIcon != null) { mPictureIcon.convertToAshmem(); } if (mBigLargeIcon != null) { mBigLargeIcon.convertToAshmem(); Loading @@ -7349,14 +7381,14 @@ public class Notification implements Parcelable super.reduceImageSizes(context); Resources resources = context.getResources(); boolean isLowRam = ActivityManager.isLowRamDeviceStatic(); if (mPicture != null) { if (mPictureIcon != null) { int maxPictureWidth = resources.getDimensionPixelSize(isLowRam ? R.dimen.notification_big_picture_max_height_low_ram : R.dimen.notification_big_picture_max_height); int maxPictureHeight = resources.getDimensionPixelSize(isLowRam ? R.dimen.notification_big_picture_max_width_low_ram : R.dimen.notification_big_picture_max_width); mPicture = Icon.scaleDownIfNecessary(mPicture, maxPictureWidth, maxPictureHeight); mPictureIcon.scaleDownIfNecessary(maxPictureWidth, maxPictureHeight); } if (mBigLargeIcon != null) { int rightIconSize = resources.getDimensionPixelSize(isLowRam Loading @@ -7371,12 +7403,12 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeContentView(boolean increasedHeight) { if (mPicture == null || !mShowBigPictureWhenCollapsed) { if (mPictureIcon == null || !mShowBigPictureWhenCollapsed) { return super.makeContentView(increasedHeight); } Icon oldLargeIcon = mBuilder.mN.mLargeIcon; mBuilder.mN.mLargeIcon = Icon.createWithBitmap(mPicture); mBuilder.mN.mLargeIcon = mPictureIcon; // The legacy largeIcon might not allow us to clear the image, as it's taken in // replacement if the other one is null. Because we're restoring these legacy icons // for old listeners, this is in general non-null. Loading @@ -7401,12 +7433,12 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeHeadsUpContentView(boolean increasedHeight) { if (mPicture == null || !mShowBigPictureWhenCollapsed) { if (mPictureIcon == null || !mShowBigPictureWhenCollapsed) { return super.makeHeadsUpContentView(increasedHeight); } Icon oldLargeIcon = mBuilder.mN.mLargeIcon; mBuilder.mN.mLargeIcon = Icon.createWithBitmap(mPicture); mBuilder.mN.mLargeIcon = mPictureIcon; // The legacy largeIcon might not allow us to clear the image, as it's taken in // replacement if the other one is null. Because we're restoring these legacy icons // for old listeners, this is in general non-null. Loading Loading @@ -7463,7 +7495,7 @@ public class Notification implements Parcelable mBuilder.mN.largeIcon = largeIconLegacy; } contentView.setImageViewBitmap(R.id.big_picture, mPicture); contentView.setImageViewIcon(R.id.big_picture, mPictureIcon); if (mPictureContentDescription != null) { contentView.setContentDescription(R.id.big_picture, mPictureContentDescription); Loading @@ -7486,7 +7518,17 @@ public class Notification implements Parcelable mPictureContentDescription); } extras.putBoolean(EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED, mShowBigPictureWhenCollapsed); extras.putParcelable(EXTRA_PICTURE, mPicture); // If the icon contains a bitmap, use the old extra so that listeners which look for // that extra can still find the picture. Don't include the new extra in that case, // to avoid duplicating data. if (mPictureIcon != null && mPictureIcon.getType() == Icon.TYPE_BITMAP) { extras.putParcelable(EXTRA_PICTURE, mPictureIcon.getBitmap()); extras.putParcelable(EXTRA_PICTURE_ICON, null); } else { extras.putParcelable(EXTRA_PICTURE, null); extras.putParcelable(EXTRA_PICTURE_ICON, mPictureIcon); } } /** Loading @@ -7507,7 +7549,16 @@ public class Notification implements Parcelable } mShowBigPictureWhenCollapsed = extras.getBoolean(EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED); mPicture = extras.getParcelable(EXTRA_PICTURE); // When this style adds a picture, we only add one of the keys. If both were added, // it would most likely be a legacy app trying to override the picture in some way. // Because of that case it's better to give precedence to the legacy field. Bitmap bitmapPicture = extras.getParcelable(EXTRA_PICTURE); if (bitmapPicture != null) { mPictureIcon = Icon.createWithBitmap(bitmapPicture); } else { mPictureIcon = extras.getParcelable(EXTRA_PICTURE_ICON); } } /** Loading @@ -7529,20 +7580,32 @@ public class Notification implements Parcelable return true; } BigPictureStyle otherS = (BigPictureStyle) other; return areBitmapsObviouslyDifferent(getBigPicture(), otherS.getBigPicture()); return areIconsObviouslyDifferent(getBigPicture(), otherS.getBigPicture()); } private static boolean areBitmapsObviouslyDifferent(Bitmap a, Bitmap b) { private static boolean areIconsObviouslyDifferent(Icon a, Icon b) { if (a == b) { return false; } if (a == null || b == null) { return true; } return a.getWidth() != b.getWidth() || a.getHeight() != b.getHeight() || a.getConfig() != b.getConfig() || a.getGenerationId() != b.getGenerationId(); if (a.sameAs(b)) { return false; } final int aType = a.getType(); if (aType != b.getType()) { return true; } if (aType == Icon.TYPE_BITMAP || aType == Icon.TYPE_ADAPTIVE_BITMAP) { final Bitmap aBitmap = a.getBitmap(); final Bitmap bBitmap = b.getBitmap(); return aBitmap.getWidth() != bBitmap.getWidth() || aBitmap.getHeight() != bBitmap.getHeight() || aBitmap.getConfig() != bBitmap.getConfig() || aBitmap.getGenerationId() != bBitmap.getGenerationId(); } return true; } } Loading Loading
core/api/current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -5656,6 +5656,7 @@ package android.app { field public static final String EXTRA_PEOPLE_LIST = "android.people.list"; field public static final String EXTRA_PICTURE = "android.picture"; field public static final String EXTRA_PICTURE_CONTENT_DESCRIPTION = "android.pictureContentDescription"; field public static final String EXTRA_PICTURE_ICON = "android.pictureIcon"; field public static final String EXTRA_PROGRESS = "android.progress"; field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate"; field public static final String EXTRA_PROGRESS_MAX = "android.progressMax"; Loading Loading @@ -5804,6 +5805,7 @@ package android.app { method @NonNull public android.app.Notification.BigPictureStyle bigLargeIcon(@Nullable android.graphics.Bitmap); method @NonNull public android.app.Notification.BigPictureStyle bigLargeIcon(@Nullable android.graphics.drawable.Icon); method @NonNull public android.app.Notification.BigPictureStyle bigPicture(@Nullable android.graphics.Bitmap); method @NonNull public android.app.Notification.BigPictureStyle bigPicture(@Nullable android.graphics.drawable.Icon); method @NonNull public android.app.Notification.BigPictureStyle bigPictureContentDescription(@Nullable CharSequence); method @NonNull public android.app.Notification.BigPictureStyle setBigContentTitle(@Nullable CharSequence); method @NonNull public android.app.Notification.BigPictureStyle setSummaryText(@Nullable CharSequence);
core/java/android/app/Notification.java +98 −35 Original line number Diff line number Diff line Loading @@ -1206,6 +1206,13 @@ public class Notification implements Parcelable */ public static final String EXTRA_PICTURE = "android.picture"; /** * {@link #extras} key: this is an {@link Icon} of an image to be * shown in {@link BigPictureStyle} expanded notifications, supplied to * {@link BigPictureStyle#bigPicture(Icon)}. */ public static final String EXTRA_PICTURE_ICON = "android.pictureIcon"; /** * {@link #extras} key: this is a content description of the big picture supplied from * {@link BigPictureStyle#bigPicture(Bitmap)}, supplied to Loading Loading @@ -2668,6 +2675,14 @@ public class Notification implements Parcelable } } private static void visitIconUri(@NonNull Consumer<Uri> visitor, @Nullable Icon icon) { if (icon == null) return; final int iconType = icon.getType(); if (iconType == TYPE_URI || iconType == TYPE_URI_ADAPTIVE_BITMAP) { visitor.accept(icon.getUri()); } } /** * Note all {@link Uri} that are referenced internally, with the expectation * that Uri permission grants will need to be issued to ensure the recipient Loading @@ -2683,7 +2698,19 @@ public class Notification implements Parcelable if (bigContentView != null) bigContentView.visitUris(visitor); if (headsUpContentView != null) headsUpContentView.visitUris(visitor); visitIconUri(visitor, mSmallIcon); visitIconUri(visitor, mLargeIcon); if (actions != null) { for (Action action : actions) { visitIconUri(visitor, action.getIcon()); } } if (extras != null) { visitIconUri(visitor, extras.getParcelable(EXTRA_LARGE_ICON_BIG)); visitIconUri(visitor, extras.getParcelable(EXTRA_PICTURE_ICON)); // NOTE: The documentation of EXTRA_AUDIO_CONTENTS_URI explicitly says that it is a // String representation of a Uri, but the previous implementation (and unit test) of // this method has always treated it as a Uri object. Given the inconsistency, Loading @@ -2702,14 +2729,12 @@ public class Notification implements Parcelable ArrayList<Person> people = extras.getParcelableArrayList(EXTRA_PEOPLE_LIST); if (people != null && !people.isEmpty()) { for (Person p : people) { if (p.getIconUri() != null) { visitor.accept(p.getIconUri()); } } } final Person person = extras.getParcelable(EXTRA_MESSAGING_PERSON); if (person != null && person.getIconUri() != null) { if (person != null) { visitor.accept(person.getIconUri()); } } Loading @@ -2722,7 +2747,7 @@ public class Notification implements Parcelable visitor.accept(message.getDataUri()); Person senderPerson = message.getSenderPerson(); if (senderPerson != null && senderPerson.getIconUri() != null) { if (senderPerson != null) { visitor.accept(senderPerson.getIconUri()); } } Loading @@ -2735,19 +2760,15 @@ public class Notification implements Parcelable visitor.accept(message.getDataUri()); Person senderPerson = message.getSenderPerson(); if (senderPerson != null && senderPerson.getIconUri() != null) { if (senderPerson != null) { visitor.accept(senderPerson.getIconUri()); } } } } if (mBubbleMetadata != null && mBubbleMetadata.getIcon() != null) { final Icon icon = mBubbleMetadata.getIcon(); final int iconType = icon.getType(); if (iconType == TYPE_URI_ADAPTIVE_BITMAP || iconType == TYPE_URI) { visitor.accept(icon.getUri()); } if (mBubbleMetadata != null) { visitIconUri(visitor, mBubbleMetadata.getIcon()); } } Loading Loading @@ -7231,7 +7252,7 @@ public class Notification implements Parcelable * @see Notification#bigContentView */ public static class BigPictureStyle extends Style { private Bitmap mPicture; private Icon mPictureIcon; private Icon mBigLargeIcon; private boolean mBigLargeIconSet = false; private CharSequence mPictureContentDescription; Loading Loading @@ -7280,8 +7301,12 @@ public class Notification implements Parcelable /** * @hide */ public Bitmap getBigPicture() { return mPicture; @Nullable public Icon getBigPicture() { if (mPictureIcon != null) { return mPictureIcon; } return null; } /** Loading @@ -7289,7 +7314,16 @@ public class Notification implements Parcelable */ @NonNull public BigPictureStyle bigPicture(@Nullable Bitmap b) { mPicture = b; mPictureIcon = b == null ? null : Icon.createWithBitmap(b); return this; } /** * Provide the content Uri to be used as the payload for the BigPicture notification. */ @NonNull public BigPictureStyle bigPicture(@Nullable Icon icon) { mPictureIcon = icon; return this; } Loading Loading @@ -7331,10 +7365,8 @@ public class Notification implements Parcelable @Override public void purgeResources() { super.purgeResources(); if (mPicture != null && mPicture.isMutable() && mPicture.getAllocationByteCount() >= MIN_ASHMEM_BITMAP_SIZE) { mPicture = mPicture.asShared(); if (mPictureIcon != null) { mPictureIcon.convertToAshmem(); } if (mBigLargeIcon != null) { mBigLargeIcon.convertToAshmem(); Loading @@ -7349,14 +7381,14 @@ public class Notification implements Parcelable super.reduceImageSizes(context); Resources resources = context.getResources(); boolean isLowRam = ActivityManager.isLowRamDeviceStatic(); if (mPicture != null) { if (mPictureIcon != null) { int maxPictureWidth = resources.getDimensionPixelSize(isLowRam ? R.dimen.notification_big_picture_max_height_low_ram : R.dimen.notification_big_picture_max_height); int maxPictureHeight = resources.getDimensionPixelSize(isLowRam ? R.dimen.notification_big_picture_max_width_low_ram : R.dimen.notification_big_picture_max_width); mPicture = Icon.scaleDownIfNecessary(mPicture, maxPictureWidth, maxPictureHeight); mPictureIcon.scaleDownIfNecessary(maxPictureWidth, maxPictureHeight); } if (mBigLargeIcon != null) { int rightIconSize = resources.getDimensionPixelSize(isLowRam Loading @@ -7371,12 +7403,12 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeContentView(boolean increasedHeight) { if (mPicture == null || !mShowBigPictureWhenCollapsed) { if (mPictureIcon == null || !mShowBigPictureWhenCollapsed) { return super.makeContentView(increasedHeight); } Icon oldLargeIcon = mBuilder.mN.mLargeIcon; mBuilder.mN.mLargeIcon = Icon.createWithBitmap(mPicture); mBuilder.mN.mLargeIcon = mPictureIcon; // The legacy largeIcon might not allow us to clear the image, as it's taken in // replacement if the other one is null. Because we're restoring these legacy icons // for old listeners, this is in general non-null. Loading @@ -7401,12 +7433,12 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeHeadsUpContentView(boolean increasedHeight) { if (mPicture == null || !mShowBigPictureWhenCollapsed) { if (mPictureIcon == null || !mShowBigPictureWhenCollapsed) { return super.makeHeadsUpContentView(increasedHeight); } Icon oldLargeIcon = mBuilder.mN.mLargeIcon; mBuilder.mN.mLargeIcon = Icon.createWithBitmap(mPicture); mBuilder.mN.mLargeIcon = mPictureIcon; // The legacy largeIcon might not allow us to clear the image, as it's taken in // replacement if the other one is null. Because we're restoring these legacy icons // for old listeners, this is in general non-null. Loading Loading @@ -7463,7 +7495,7 @@ public class Notification implements Parcelable mBuilder.mN.largeIcon = largeIconLegacy; } contentView.setImageViewBitmap(R.id.big_picture, mPicture); contentView.setImageViewIcon(R.id.big_picture, mPictureIcon); if (mPictureContentDescription != null) { contentView.setContentDescription(R.id.big_picture, mPictureContentDescription); Loading @@ -7486,7 +7518,17 @@ public class Notification implements Parcelable mPictureContentDescription); } extras.putBoolean(EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED, mShowBigPictureWhenCollapsed); extras.putParcelable(EXTRA_PICTURE, mPicture); // If the icon contains a bitmap, use the old extra so that listeners which look for // that extra can still find the picture. Don't include the new extra in that case, // to avoid duplicating data. if (mPictureIcon != null && mPictureIcon.getType() == Icon.TYPE_BITMAP) { extras.putParcelable(EXTRA_PICTURE, mPictureIcon.getBitmap()); extras.putParcelable(EXTRA_PICTURE_ICON, null); } else { extras.putParcelable(EXTRA_PICTURE, null); extras.putParcelable(EXTRA_PICTURE_ICON, mPictureIcon); } } /** Loading @@ -7507,7 +7549,16 @@ public class Notification implements Parcelable } mShowBigPictureWhenCollapsed = extras.getBoolean(EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED); mPicture = extras.getParcelable(EXTRA_PICTURE); // When this style adds a picture, we only add one of the keys. If both were added, // it would most likely be a legacy app trying to override the picture in some way. // Because of that case it's better to give precedence to the legacy field. Bitmap bitmapPicture = extras.getParcelable(EXTRA_PICTURE); if (bitmapPicture != null) { mPictureIcon = Icon.createWithBitmap(bitmapPicture); } else { mPictureIcon = extras.getParcelable(EXTRA_PICTURE_ICON); } } /** Loading @@ -7529,20 +7580,32 @@ public class Notification implements Parcelable return true; } BigPictureStyle otherS = (BigPictureStyle) other; return areBitmapsObviouslyDifferent(getBigPicture(), otherS.getBigPicture()); return areIconsObviouslyDifferent(getBigPicture(), otherS.getBigPicture()); } private static boolean areBitmapsObviouslyDifferent(Bitmap a, Bitmap b) { private static boolean areIconsObviouslyDifferent(Icon a, Icon b) { if (a == b) { return false; } if (a == null || b == null) { return true; } return a.getWidth() != b.getWidth() || a.getHeight() != b.getHeight() || a.getConfig() != b.getConfig() || a.getGenerationId() != b.getGenerationId(); if (a.sameAs(b)) { return false; } final int aType = a.getType(); if (aType != b.getType()) { return true; } if (aType == Icon.TYPE_BITMAP || aType == Icon.TYPE_ADAPTIVE_BITMAP) { final Bitmap aBitmap = a.getBitmap(); final Bitmap bBitmap = b.getBitmap(); return aBitmap.getWidth() != bBitmap.getWidth() || aBitmap.getHeight() != bBitmap.getHeight() || aBitmap.getConfig() != bBitmap.getConfig() || aBitmap.getGenerationId() != bBitmap.getGenerationId(); } return true; } } Loading