diff options
3 files changed, 66 insertions, 6 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 2eb6ca758970..11dd30b82e78 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -2171,6 +2171,10 @@ public class Notification implements Parcelable } } + private void visitUris(@NonNull Consumer<Uri> visitor) { + visitIconUri(visitor, getIcon()); + } + @Override public Action clone() { return new Action( @@ -2856,7 +2860,7 @@ public class Notification implements Parcelable if (actions != null) { for (Action action : actions) { - visitIconUri(visitor, action.getIcon()); + action.visitUris(visitor); } } @@ -2947,6 +2951,11 @@ public class Notification implements Parcelable if (mBubbleMetadata != null) { visitIconUri(visitor, mBubbleMetadata.getIcon()); } + + if (extras != null && extras.containsKey(WearableExtender.EXTRA_WEARABLE_EXTENSIONS)) { + WearableExtender extender = new WearableExtender(this); + extender.visitUris(visitor); + } } /** @@ -11711,6 +11720,12 @@ public class Notification implements Parcelable mFlags &= ~mask; } } + + private void visitUris(@NonNull Consumer<Uri> visitor) { + for (Action action : mActions) { + action.visitUris(visitor); + } + } } /** diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 4347dd6d778f..06fe9b7a458e 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -5903,6 +5903,26 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testVisitUris_wearableExtender() { + Icon actionIcon = Icon.createWithContentUri("content://media/action"); + Icon wearActionIcon = Icon.createWithContentUri("content://media/wearAction"); + PendingIntent intent = PendingIntent.getActivity(mContext, 0, new Intent(), + PendingIntent.FLAG_IMMUTABLE); + Notification n = new Notification.Builder(mContext, "a") + .setSmallIcon(android.R.drawable.sym_def_app_icon) + .addAction(new Notification.Action.Builder(actionIcon, "Hey!", intent).build()) + .extend(new Notification.WearableExtender().addAction( + new Notification.Action.Builder(wearActionIcon, "Wear!", intent).build())) + .build(); + + Consumer<Uri> visitor = (Consumer<Uri>) spy(Consumer.class); + n.visitUris(visitor); + + verify(visitor).accept(eq(actionIcon.getUri())); + verify(visitor).accept(eq(wearActionIcon.getUri())); + } + + @Test public void testSetNotificationPolicy_preP_setOldFields() { ZenModeHelper mZenModeHelper = mock(ZenModeHelper.class); mService.mZenModeHelper = mZenModeHelper; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java index 6668f8520820..024c38e5c1f7 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java @@ -66,6 +66,8 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Executable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -87,7 +89,6 @@ public class NotificationVisitUrisTest extends UiServiceTestCase { // This list should be emptied! Items can be removed as bugs are fixed. private static final Multimap<Class<?>, String> KNOWN_BAD = ImmutableMultimap.<Class<?>, String>builder() - .put(Notification.WearableExtender.class, "addAction") // TODO: b/281044385 .put(Person.Builder.class, "setUri") // TODO: b/281044385 .put(RemoteViews.class, "setRemoteAdapter") // TODO: b/281044385 .build(); @@ -149,7 +150,7 @@ public class NotificationVisitUrisTest extends UiServiceTestCase { Generated<Notification> notification = buildNotification(mContext, /* styleClass= */ null, /* extenderClass= */ null, /* actionExtenderClass= */ null, /* includeRemoteViews= */ true); - assertThat(notification.includedUris.size()).isAtLeast(20); + assertThat(notification.includedUris.size()).isAtLeast(900); } @Test @@ -435,19 +436,43 @@ public class NotificationVisitUrisTest extends UiServiceTestCase { Set<Class<?>> excludingClasses, SpecialParameterGenerator specialGenerator) { Log.i(TAG, "About to generate parameters for " + ReflectionUtils.methodToString(executable) + " in " + where); - Class<?>[] parameterTypes = executable.getParameterTypes(); + Type[] parameterTypes = executable.getGenericParameterTypes(); Object[] parameterValues = new Object[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; i++) { - parameterValues[i] = generateObject( + parameterValues[i] = generateParameter( parameterTypes[i], where.plus(executable, - String.format("[%d,%s]", i, parameterTypes[i].getName())), + String.format("[%d,%s]", i, parameterTypes[i].getTypeName())), excludingClasses, specialGenerator); } return parameterValues; } + private static Object generateParameter(Type parameterType, Location where, + Set<Class<?>> excludingClasses, SpecialParameterGenerator specialGenerator) { + if (parameterType instanceof Class<?> parameterClass) { + return generateObject( + parameterClass, + where, + excludingClasses, + specialGenerator); + } else if (parameterType instanceof ParameterizedType parameterizedType) { + if (parameterizedType.getRawType().equals(List.class) + && parameterizedType.getActualTypeArguments()[0] instanceof Class<?>) { + ArrayList listValue = new ArrayList(); + for (int i = 0; i < NUM_ELEMENTS_IN_ARRAY; i++) { + listValue.add( + generateObject((Class<?>) parameterizedType.getActualTypeArguments()[0], + where, excludingClasses, specialGenerator)); + } + return listValue; + } + } + throw new IllegalArgumentException( + "I have no idea how to produce a(n) " + parameterType + ", sorry"); + } + private static class ReflectionUtils { static Set<Class<?>> getConcreteSubclasses(Class<?> clazz, Class<?> containerClass) { return Arrays.stream(containerClass.getDeclaredClasses()) |