Merge "Fix notifications containing null entries in actions" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
d56f705ac9
@@ -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 =
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user