Verify URI permissions for notification shortcutIcon.
Bug: 277593270 Change-Id: I1efaa1301bca36895ad4322a919d7421156a60df Test: atest NotificationManagerServiceTest Merged-In: Iaf2a9a82f18e018e60e6cdc020da6ebf7267e8b1
This commit is contained in:
@@ -2476,6 +2476,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
|
||||
@@ -2491,7 +2499,18 @@ 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));
|
||||
|
||||
visitor.accept(extras.getParcelable(EXTRA_AUDIO_CONTENTS_URI));
|
||||
if (extras.containsKey(EXTRA_BACKGROUND_IMAGE_URI)) {
|
||||
visitor.accept(Uri.parse(extras.getString(EXTRA_BACKGROUND_IMAGE_URI)));
|
||||
@@ -2549,14 +2568,12 @@ public class Notification implements Parcelable
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
visitIconUri(visitor, extras.getParcelable(EXTRA_CONVERSATION_ICON));
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4268,6 +4268,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
|
||||
public void testVisitUris() throws Exception {
|
||||
final Uri audioContents = Uri.parse("content://com.example/audio");
|
||||
final Uri backgroundImage = Uri.parse("content://com.example/background");
|
||||
final Icon smallIcon = Icon.createWithContentUri("content://media/small/icon");
|
||||
final Icon largeIcon = Icon.createWithContentUri("content://media/large/icon");
|
||||
final Icon personIcon1 = Icon.createWithContentUri("content://media/person1");
|
||||
final Icon personIcon2 = Icon.createWithContentUri("content://media/person2");
|
||||
final Icon personIcon3 = Icon.createWithContentUri("content://media/person3");
|
||||
@@ -4301,7 +4303,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
|
||||
|
||||
Notification n = new Notification.Builder(mContext, "a")
|
||||
.setContentTitle("notification with uris")
|
||||
.setSmallIcon(android.R.drawable.sym_def_app_icon)
|
||||
.setSmallIcon(smallIcon)
|
||||
.setLargeIcon(largeIcon)
|
||||
.addExtras(extras)
|
||||
.build();
|
||||
|
||||
@@ -4309,6 +4312,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
|
||||
n.visitUris(visitor);
|
||||
verify(visitor, times(1)).accept(eq(audioContents));
|
||||
verify(visitor, times(1)).accept(eq(backgroundImage));
|
||||
verify(visitor, times(1)).accept(eq(smallIcon.getUri()));
|
||||
verify(visitor, times(1)).accept(eq(largeIcon.getUri()));
|
||||
verify(visitor, times(1)).accept(eq(personIcon1.getUri()));
|
||||
verify(visitor, times(1)).accept(eq(personIcon2.getUri()));
|
||||
verify(visitor, times(1)).accept(eq(personIcon3.getUri()));
|
||||
@@ -4316,6 +4321,50 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
|
||||
verify(visitor, times(1)).accept(eq(historyUri2));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVisitUris_messagingStyle() {
|
||||
final Icon personIcon1 = Icon.createWithContentUri("content://media/person1");
|
||||
final Icon personIcon2 = Icon.createWithContentUri("content://media/person2");
|
||||
final Icon personIcon3 = Icon.createWithContentUri("content://media/person3");
|
||||
final Person person1 = new Person.Builder()
|
||||
.setName("Messaging Person 1")
|
||||
.setIcon(personIcon1)
|
||||
.build();
|
||||
final Person person2 = new Person.Builder()
|
||||
.setName("Messaging Person 2")
|
||||
.setIcon(personIcon2)
|
||||
.build();
|
||||
final Person person3 = new Person.Builder()
|
||||
.setName("Messaging Person 3")
|
||||
.setIcon(personIcon3)
|
||||
.build();
|
||||
Icon shortcutIcon = Icon.createWithContentUri("content://media/shortcut");
|
||||
|
||||
Notification.Builder builder = new Notification.Builder(mContext, "a")
|
||||
.setCategory(Notification.CATEGORY_MESSAGE)
|
||||
.setContentTitle("new message!")
|
||||
.setContentText("Conversation Notification")
|
||||
.setSmallIcon(android.R.drawable.sym_def_app_icon);
|
||||
Notification.MessagingStyle.Message message1 = new Notification.MessagingStyle.Message(
|
||||
"Marco?", System.currentTimeMillis(), person2);
|
||||
Notification.MessagingStyle.Message message2 = new Notification.MessagingStyle.Message(
|
||||
"Polo!", System.currentTimeMillis(), person3);
|
||||
Notification.MessagingStyle style = new Notification.MessagingStyle(person1)
|
||||
.addMessage(message1)
|
||||
.addMessage(message2)
|
||||
.setShortcutIcon(shortcutIcon);
|
||||
builder.setStyle(style);
|
||||
Notification n = builder.build();
|
||||
|
||||
Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class);
|
||||
n.visitUris(visitor);
|
||||
|
||||
verify(visitor, times(1)).accept(eq(shortcutIcon.getUri()));
|
||||
verify(visitor, times(1)).accept(eq(personIcon1.getUri()));
|
||||
verify(visitor, times(1)).accept(eq(personIcon2.getUri()));
|
||||
verify(visitor, times(1)).accept(eq(personIcon3.getUri()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSetNotificationPolicy_preP_setOldFields() {
|
||||
ZenModeHelper mZenModeHelper = mock(ZenModeHelper.class);
|
||||
|
||||
Reference in New Issue
Block a user