Merge "Fix notifications containing null entries in actions" into tm-qpr-dev

This commit is contained in:
Matías Hernández
2023-02-01 13:32:35 +00:00
committed by Android (Google) Code Review
2 changed files with 65 additions and 0 deletions

View File

@@ -6687,6 +6687,31 @@ public class NotificationManagerService extends SystemService {
}
}
// Ensure all actions are present
if (notification.actions != null) {
boolean hasNullActions = false;
int nActions = notification.actions.length;
for (int i = 0; i < nActions; i++) {
if (notification.actions[i] == null) {
hasNullActions = true;
break;
}
}
if (hasNullActions) {
ArrayList<Notification.Action> nonNullActions = new ArrayList<>();
for (int i = 0; i < nActions; i++) {
if (notification.actions[i] != null) {
nonNullActions.add(notification.actions[i]);
}
}
if (nonNullActions.size() != 0) {
notification.actions = nonNullActions.toArray(new Notification.Action[0]);
} else {
notification.actions = null;
}
}
}
// Ensure CallStyle has all the correct actions
if (notification.isStyle(Notification.CallStyle.class)) {
Notification.Builder builder =

View File

@@ -1644,6 +1644,46 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
FLAG_FOREGROUND_SERVICE | FLAG_CAN_COLORIZE | FLAG_NO_CLEAR | FLAG_ONGOING_EVENT);
}
@Test
public void testEnqueueNotificationWithTag_nullAction_fixed() throws Exception {
Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.addAction(new Notification.Action.Builder(null, "one", null).build())
.addAction(new Notification.Action.Builder(null, "two", null).build())
.addAction(new Notification.Action.Builder(null, "three", null).build())
.build();
n.actions[1] = null;
mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, 0);
waitForIdle();
StatusBarNotification[] posted = mBinderService.getActiveNotifications(PKG);
assertThat(posted).hasLength(1);
assertThat(posted[0].getNotification().actions).hasLength(2);
assertThat(posted[0].getNotification().actions[0].title.toString()).isEqualTo("one");
assertThat(posted[0].getNotification().actions[1].title.toString()).isEqualTo("three");
}
@Test
public void testEnqueueNotificationWithTag_allNullActions_fixed() throws Exception {
Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.addAction(new Notification.Action.Builder(null, "one", null).build())
.addAction(new Notification.Action.Builder(null, "two", null).build())
.build();
n.actions[0] = null;
n.actions[1] = null;
mBinderService.enqueueNotificationWithTag(PKG, PKG, "tag", 0, n, 0);
waitForIdle();
StatusBarNotification[] posted = mBinderService.getActiveNotifications(PKG);
assertThat(posted).hasLength(1);
assertThat(posted[0].getNotification().actions).isNull();
}
@Test
public void testCancelNonexistentNotification() throws Exception {
mBinderService.cancelNotificationWithTag(PKG, PKG,