From f47b41a138ebd60f7b518fb6a9d8aa8230488422 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Mon, 8 May 2023 19:26:22 +0000 Subject: [PATCH] Add visitUri method to Person and MessagingStyle.Message. This is both to avoid repeating code when visiting these classes, as well as to make it more likely that if someone changes the class (e.g. adds another icon), they see this method and update it accordingly. Otherwise they'd have to know about Notification.visitUris. Bug: 281044385 Test: atest NotificationTest NotificationManagerTest Change-Id: I1ce6bebd9452466d005505dc5b99a0fdc0e05e80 --- core/java/android/app/Notification.java | 46 ++++++++++++++----------- core/java/android/app/Person.java | 14 ++++++++ 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 2eb6ca758970f..8d2394b204389 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -2833,12 +2833,14 @@ public class Notification implements Parcelable } /** - * Note all {@link Uri} that are referenced internally, with the expectation - * that Uri permission grants will need to be issued to ensure the recipient - * of this object is able to render its contents. - * - * @hide - */ + * Note all {@link Uri} that are referenced internally, with the expectation that Uri permission + * grants will need to be issued to ensure the recipient of this object is able to render its + * contents. + * See b/281044385 for more context and examples about what happens when this isn't done + * correctly. + * + * @hide + */ public void visitUris(@NonNull Consumer visitor) { if (publicVersion != null) { publicVersion.visitUris(visitor); @@ -2882,13 +2884,13 @@ public class Notification implements Parcelable ArrayList people = extras.getParcelableArrayList(EXTRA_PEOPLE_LIST, android.app.Person.class); if (people != null && !people.isEmpty()) { for (Person p : people) { - visitor.accept(p.getIconUri()); + p.visitUris(visitor); } } final Person person = extras.getParcelable(EXTRA_MESSAGING_PERSON, Person.class); if (person != null) { - visitor.accept(person.getIconUri()); + person.visitUris(visitor); } final RemoteInputHistoryItem[] history = extras.getParcelableArray( @@ -2910,12 +2912,7 @@ public class Notification implements Parcelable if (!ArrayUtils.isEmpty(messages)) { for (MessagingStyle.Message message : MessagingStyle.Message .getMessagesFromBundleArray(messages)) { - visitor.accept(message.getDataUri()); - - Person senderPerson = message.getSenderPerson(); - if (senderPerson != null) { - visitor.accept(senderPerson.getIconUri()); - } + message.visitUris(visitor); } } @@ -2924,12 +2921,7 @@ public class Notification implements Parcelable if (!ArrayUtils.isEmpty(historic)) { for (MessagingStyle.Message message : MessagingStyle.Message .getMessagesFromBundleArray(historic)) { - visitor.accept(message.getDataUri()); - - Person senderPerson = message.getSenderPerson(); - if (senderPerson != null) { - visitor.accept(senderPerson.getIconUri()); - } + message.visitUris(visitor); } } @@ -2939,7 +2931,7 @@ public class Notification implements Parcelable if (isStyle(CallStyle.class) & extras != null) { Person callPerson = extras.getParcelable(EXTRA_CALL_PERSON, Person.class); if (callPerson != null) { - visitor.accept(callPerson.getIconUri()); + callPerson.visitUris(visitor); } visitIconUri(visitor, extras.getParcelable(EXTRA_VERIFICATION_ICON, Icon.class)); } @@ -8832,6 +8824,18 @@ public class Notification implements Parcelable return bundle; } + /** + * See {@link Notification#visitUris(Consumer)}. + * + * @hide + */ + public void visitUris(@NonNull Consumer visitor) { + visitor.accept(getDataUri()); + if (mSender != null) { + mSender.visitUris(visitor); + } + } + /** * Returns a list of messages read from the given bundle list, e.g. * {@link #EXTRA_MESSAGES} or {@link #EXTRA_HISTORIC_MESSAGES}. diff --git a/core/java/android/app/Person.java b/core/java/android/app/Person.java index 97a794d4e4ea4..18fc0ce6af151 100644 --- a/core/java/android/app/Person.java +++ b/core/java/android/app/Person.java @@ -24,6 +24,7 @@ import android.os.Parcel; import android.os.Parcelable; import java.util.Objects; +import java.util.function.Consumer; /** * Provides an immutable reference to an entity that appears repeatedly on different surfaces of the @@ -177,6 +178,19 @@ public final class Person implements Parcelable { dest.writeBoolean(mIsBot); } + /** + * Note all {@link Uri} that are referenced internally, with the expectation that Uri permission + * grants will need to be issued to ensure the recipient of this object is able to render its + * contents. + * See b/281044385 for more context and examples about what happens when this isn't done + * correctly. + * + * @hide + */ + public void visitUris(@NonNull Consumer visitor) { + visitor.accept(getIconUri()); + } + /** Builder for the immutable {@link Person} class. */ public static class Builder { @Nullable private CharSequence mName;