RankingHelperTest.java revision aebfc4e7a3e3b66382e9004d5ed141b50e26a71b
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package com.android.server.notification; 17 18import static junit.framework.Assert.fail; 19 20import org.junit.Before; 21import org.junit.Test; 22import org.junit.runner.RunWith; 23 24import com.android.internal.util.FastXmlSerializer; 25 26import org.mockito.Mock; 27import org.mockito.MockitoAnnotations; 28import org.xmlpull.v1.XmlPullParser; 29import org.xmlpull.v1.XmlSerializer; 30 31import android.app.Notification; 32import android.content.Context; 33import android.app.NotificationChannel; 34import android.app.NotificationManager; 35import android.content.pm.ApplicationInfo; 36import android.content.pm.PackageManager; 37import android.net.Uri; 38import android.os.Build; 39import android.os.UserHandle; 40import android.service.notification.StatusBarNotification; 41import android.support.test.InstrumentationRegistry; 42import android.support.test.runner.AndroidJUnit4; 43import android.test.suitebuilder.annotation.SmallTest; 44import android.util.Xml; 45 46import java.io.BufferedInputStream; 47import java.io.BufferedOutputStream; 48import java.io.ByteArrayInputStream; 49import java.io.ByteArrayOutputStream; 50import java.util.ArrayList; 51import java.util.Arrays; 52 53import static org.junit.Assert.assertEquals; 54import static org.junit.Assert.assertFalse; 55import static org.junit.Assert.assertNotNull; 56import static org.junit.Assert.assertTrue; 57import static org.mockito.Matchers.anyInt; 58import static org.mockito.Matchers.eq; 59import static org.mockito.Mockito.when; 60 61@SmallTest 62@RunWith(AndroidJUnit4.class) 63public class RankingHelperTest { 64 @Mock NotificationUsageStats mUsageStats; 65 @Mock RankingHandler handler; 66 @Mock PackageManager mPm; 67 68 private Notification mNotiGroupGSortA; 69 private Notification mNotiGroupGSortB; 70 private Notification mNotiNoGroup; 71 private Notification mNotiNoGroup2; 72 private Notification mNotiNoGroupSortA; 73 private NotificationRecord mRecordGroupGSortA; 74 private NotificationRecord mRecordGroupGSortB; 75 private NotificationRecord mRecordNoGroup; 76 private NotificationRecord mRecordNoGroup2; 77 private NotificationRecord mRecordNoGroupSortA; 78 private RankingHelper mHelper; 79 private final String pkg = "com.android.server.notification"; 80 private final int uid = 0; 81 private final String pkg2 = "pkg2"; 82 private final int uid2 = 1111111; 83 84 private Context getContext() { 85 return InstrumentationRegistry.getTargetContext(); 86 } 87 88 @Before 89 public void setUp() { 90 MockitoAnnotations.initMocks(this); 91 UserHandle user = UserHandle.ALL; 92 93 mHelper = new RankingHelper(getContext(), mPm, handler, mUsageStats, 94 new String[] {ImportanceExtractor.class.getName()}); 95 96 mNotiGroupGSortA = new Notification.Builder(getContext()) 97 .setContentTitle("A") 98 .setGroup("G") 99 .setSortKey("A") 100 .setWhen(1205) 101 .build(); 102 mRecordGroupGSortA = new NotificationRecord(getContext(), new StatusBarNotification( 103 "package", "package", getDefaultChannel(), 1, null, 0, 0, mNotiGroupGSortA, user, 104 null, System.currentTimeMillis())); 105 106 mNotiGroupGSortB = new Notification.Builder(getContext()) 107 .setContentTitle("B") 108 .setGroup("G") 109 .setSortKey("B") 110 .setWhen(1200) 111 .build(); 112 mRecordGroupGSortB = new NotificationRecord(getContext(), new StatusBarNotification( 113 "package", "package", getDefaultChannel(), 1, null, 0, 0, mNotiGroupGSortB, user, 114 null, System.currentTimeMillis())); 115 116 mNotiNoGroup = new Notification.Builder(getContext()) 117 .setContentTitle("C") 118 .setWhen(1201) 119 .build(); 120 mRecordNoGroup = new NotificationRecord(getContext(), new StatusBarNotification( 121 "package", "package", getDefaultChannel(), 1, null, 0, 0, mNotiNoGroup, user, 122 null, System.currentTimeMillis())); 123 124 mNotiNoGroup2 = new Notification.Builder(getContext()) 125 .setContentTitle("D") 126 .setWhen(1202) 127 .build(); 128 mRecordNoGroup2 = new NotificationRecord(getContext(), new StatusBarNotification( 129 "package", "package", getDefaultChannel(), 1, null, 0, 0, mNotiNoGroup2, user, 130 null, System.currentTimeMillis())); 131 132 mNotiNoGroupSortA = new Notification.Builder(getContext()) 133 .setContentTitle("E") 134 .setWhen(1201) 135 .setSortKey("A") 136 .build(); 137 mRecordNoGroupSortA = new NotificationRecord(getContext(), new StatusBarNotification( 138 "package", "package", getDefaultChannel(), 1, null, 0, 0, mNotiNoGroupSortA, user, 139 null, System.currentTimeMillis())); 140 141 final ApplicationInfo legacy = new ApplicationInfo(); 142 legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1; 143 final ApplicationInfo upgrade = new ApplicationInfo(); 144 upgrade.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1; 145 try { 146 when(mPm.getApplicationInfoAsUser(eq(pkg), anyInt(), anyInt())).thenReturn(legacy); 147 when(mPm.getApplicationInfoAsUser(eq(pkg2), anyInt(), anyInt())).thenReturn(upgrade); 148 } catch (PackageManager.NameNotFoundException e) {} 149 } 150 151 private NotificationChannel getDefaultChannel() { 152 return new NotificationChannel(NotificationChannel.DEFAULT_CHANNEL_ID, "name", 153 NotificationManager.IMPORTANCE_LOW); 154 } 155 156 private ByteArrayOutputStream writeXmlAndPurge(String pkg, int uid, String... channelIds) 157 throws Exception { 158 XmlSerializer serializer = new FastXmlSerializer(); 159 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 160 serializer.setOutput(new BufferedOutputStream(baos), "utf-8"); 161 serializer.startDocument(null, true); 162 serializer.startTag(null, "ranking"); 163 mHelper.writeXml(serializer, false); 164 serializer.endTag(null, "ranking"); 165 serializer.endDocument(); 166 serializer.flush(); 167 168 for (String channelId : channelIds) { 169 mHelper.deleteNotificationChannel(pkg, uid, channelId); 170 } 171 return baos; 172 } 173 174 private void compareChannels(NotificationChannel expected, NotificationChannel actual) { 175 assertEquals(expected.getId(), actual.getId()); 176 assertEquals(expected.getName(), actual.getName()); 177 assertEquals(expected.shouldVibrate(), actual.shouldVibrate()); 178 assertEquals(expected.shouldShowLights(), actual.shouldShowLights()); 179 assertEquals(expected.getImportance(), actual.getImportance()); 180 assertEquals(expected.getLockscreenVisibility(), actual.getLockscreenVisibility()); 181 assertEquals(expected.getSound(), actual.getSound()); 182 assertEquals(expected.canBypassDnd(), actual.canBypassDnd()); 183 assertTrue(Arrays.equals(expected.getVibrationPattern(), actual.getVibrationPattern())); 184 } 185 186 @Test 187 public void testFindAfterRankingWithASplitGroup() throws Exception { 188 ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(3); 189 notificationList.add(mRecordGroupGSortA); 190 notificationList.add(mRecordGroupGSortB); 191 notificationList.add(mRecordNoGroup); 192 notificationList.add(mRecordNoGroupSortA); 193 mHelper.sort(notificationList); 194 assertTrue(mHelper.indexOf(notificationList, mRecordGroupGSortA) >= 0); 195 assertTrue(mHelper.indexOf(notificationList, mRecordGroupGSortB) >= 0); 196 assertTrue(mHelper.indexOf(notificationList, mRecordNoGroup) >= 0); 197 assertTrue(mHelper.indexOf(notificationList, mRecordNoGroupSortA) >= 0); 198 } 199 200 @Test 201 public void testSortShouldNotThrowWithPlainNotifications() throws Exception { 202 ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(2); 203 notificationList.add(mRecordNoGroup); 204 notificationList.add(mRecordNoGroup2); 205 mHelper.sort(notificationList); 206 } 207 208 @Test 209 public void testSortShouldNotThrowOneSorted() throws Exception { 210 ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(2); 211 notificationList.add(mRecordNoGroup); 212 notificationList.add(mRecordNoGroupSortA); 213 mHelper.sort(notificationList); 214 } 215 216 @Test 217 public void testSortShouldNotThrowOneNotification() throws Exception { 218 ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(1); 219 notificationList.add(mRecordNoGroup); 220 mHelper.sort(notificationList); 221 } 222 223 @Test 224 public void testSortShouldNotThrowOneSortKey() throws Exception { 225 ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(1); 226 notificationList.add(mRecordGroupGSortB); 227 mHelper.sort(notificationList); 228 } 229 230 @Test 231 public void testSortShouldNotThrowOnEmptyList() throws Exception { 232 ArrayList<NotificationRecord> notificationList = new ArrayList<NotificationRecord>(); 233 mHelper.sort(notificationList); 234 } 235 236 @Test 237 public void testChannelXml() throws Exception { 238 NotificationChannel channel1 = 239 new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH); 240 NotificationChannel channel2 = 241 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 242 channel2.setSound(new Uri.Builder().scheme("test").build()); 243 channel2.setLights(true); 244 channel2.setBypassDnd(true); 245 channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET); 246 channel2.enableVibration(true); 247 channel2.setVibrationPattern(new long[] {100, 67, 145, 156}); 248 249 mHelper.createNotificationChannel(pkg, uid, channel1, false); 250 mHelper.createNotificationChannel(pkg, uid, channel2, false); 251 252 ByteArrayOutputStream baos = writeXmlAndPurge(pkg, uid, channel1.getId(), channel2.getId(), 253 NotificationChannel.DEFAULT_CHANNEL_ID); 254 255 mHelper.deleteNotificationChannel(pkg, uid, channel1.getId()); 256 mHelper.deleteNotificationChannel(pkg, uid, channel2.getId()); 257 mHelper.deleteNotificationChannel(pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID); 258 259 XmlPullParser parser = Xml.newPullParser(); 260 parser.setInput(new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray())), 261 null); 262 parser.nextTag(); 263 mHelper.readXml(parser, false); 264 265 assertEquals(channel1, mHelper.getNotificationChannel(pkg, uid, channel1.getId())); 266 compareChannels(channel2, mHelper.getNotificationChannel(pkg, uid, channel2.getId())); 267 assertNotNull( 268 mHelper.getNotificationChannel(pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID)); 269 } 270 271 @Test 272 public void testChannelXml_defaultChannelLegacyApp_noUserSettings() throws Exception { 273 NotificationChannel channel1 = 274 new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_DEFAULT); 275 276 mHelper.createNotificationChannel(pkg, uid, channel1, true); 277 278 ByteArrayOutputStream baos = writeXmlAndPurge(pkg, uid, channel1.getId(), 279 NotificationChannel.DEFAULT_CHANNEL_ID); 280 281 XmlPullParser parser = Xml.newPullParser(); 282 parser.setInput(new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray())), 283 null); 284 parser.nextTag(); 285 mHelper.readXml(parser, false); 286 287 final NotificationChannel updated = 288 mHelper.getNotificationChannel(pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID); 289 assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, updated.getImportance()); 290 assertFalse(updated.canBypassDnd()); 291 assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,updated.getLockscreenVisibility()); 292 assertEquals(0, updated.getUserLockedFields()); 293 } 294 295 @Test 296 public void testChannelXml_defaultChannelUpdatedApp_userSettings() throws Exception { 297 NotificationChannel channel1 = 298 new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_MIN); 299 mHelper.createNotificationChannel(pkg, uid, channel1, true); 300 301 final NotificationChannel defaultChannel = 302 mHelper.getNotificationChannel(pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID); 303 defaultChannel.setImportance(NotificationManager.IMPORTANCE_LOW); 304 mHelper.updateNotificationChannel(pkg, uid, defaultChannel); 305 306 ByteArrayOutputStream baos = writeXmlAndPurge(pkg, uid, channel1.getId(), 307 NotificationChannel.DEFAULT_CHANNEL_ID); 308 309 XmlPullParser parser = Xml.newPullParser(); 310 parser.setInput(new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray())), 311 null); 312 parser.nextTag(); 313 mHelper.readXml(parser, false); 314 315 assertEquals(NotificationManager.IMPORTANCE_LOW, mHelper.getNotificationChannel( 316 pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID).getImportance()); 317 } 318 319 @Test 320 public void testChannelXml_upgradeCreateDefaultChannel() throws Exception { 321 final String preupgradeXml = "<ranking version=\"1\">\n" 322 + "<package name=\"" + pkg + "\" importance=\"" + NotificationManager.IMPORTANCE_HIGH 323 + "\" priority=\"" + Notification.PRIORITY_MAX + "\" visibility=\"" 324 + Notification.VISIBILITY_SECRET + "\"" +" uid=\"" + uid + "\" />\n" 325 + "<package name=\"" + pkg2 + "\" uid=\"" + uid2 + "\" visibility=\"" 326 + Notification.VISIBILITY_PRIVATE + "\" />\n" 327 + "</ranking>"; 328 XmlPullParser parser = Xml.newPullParser(); 329 parser.setInput(new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())), 330 null); 331 parser.nextTag(); 332 mHelper.readXml(parser, false); 333 334 final NotificationChannel updated1 = 335 mHelper.getNotificationChannel(pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID); 336 assertEquals(NotificationManager.IMPORTANCE_HIGH, updated1.getImportance()); 337 assertTrue(updated1.canBypassDnd()); 338 assertEquals(Notification.VISIBILITY_SECRET, updated1.getLockscreenVisibility()); 339 assertEquals(NotificationChannel.USER_LOCKED_IMPORTANCE 340 | NotificationChannel.USER_LOCKED_PRIORITY 341 | NotificationChannel.USER_LOCKED_VISIBILITY, updated1.getUserLockedFields()); 342 343 final NotificationChannel updated2 = 344 mHelper.getNotificationChannel(pkg2, uid2, NotificationChannel.DEFAULT_CHANNEL_ID); 345 // clamped 346 assertEquals(NotificationManager.IMPORTANCE_LOW, updated2.getImportance()); 347 assertFalse(updated2.canBypassDnd()); 348 assertEquals(Notification.VISIBILITY_PRIVATE, updated2.getLockscreenVisibility()); 349 assertEquals(NotificationChannel.USER_LOCKED_VISIBILITY, updated2.getUserLockedFields()); 350 } 351 352 @Test 353 public void testCreateChannel_blocked() throws Exception { 354 mHelper.setImportance(pkg, uid, NotificationManager.IMPORTANCE_NONE); 355 356 try { 357 mHelper.createNotificationChannel(pkg, uid, 358 new NotificationChannel(pkg, "", NotificationManager.IMPORTANCE_LOW), true); 359 fail("Channel creation should fail"); 360 } catch (IllegalArgumentException e) { 361 // pass 362 } 363 } 364 365 @Test 366 public void testUpdate_userLockedImportance() throws Exception { 367 // all fields locked by user 368 final NotificationChannel channel = 369 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 370 channel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE); 371 372 mHelper.createNotificationChannel(pkg, uid, channel, false); 373 374 // same id, try to update 375 final NotificationChannel channel2 = 376 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 377 378 mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2); 379 380 // no fields should be changed 381 assertEquals(channel, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 382 } 383 384 @Test 385 public void testUpdate_userLockedVisibility() throws Exception { 386 // all fields locked by user 387 final NotificationChannel channel = 388 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 389 channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET); 390 channel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY); 391 392 mHelper.createNotificationChannel(pkg, uid, channel, false); 393 394 // same id, try to update 395 final NotificationChannel channel2 = 396 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 397 channel2.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); 398 399 mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2); 400 401 // no fields should be changed 402 assertEquals(channel, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 403 } 404 405 @Test 406 public void testUpdate_userLockedVibration() throws Exception { 407 // all fields locked by user 408 final NotificationChannel channel = 409 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 410 channel.setLights(false); 411 channel.lockFields(NotificationChannel.USER_LOCKED_VIBRATION); 412 413 mHelper.createNotificationChannel(pkg, uid, channel, false); 414 415 // same id, try to update 416 final NotificationChannel channel2 = 417 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 418 channel2.enableVibration(true); 419 channel2.setVibrationPattern(new long[] {100}); 420 421 mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2); 422 423 // no fields should be changed 424 assertEquals(channel, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 425 } 426 427 @Test 428 public void testUpdate_userLockedLights() throws Exception { 429 // all fields locked by user 430 final NotificationChannel channel = 431 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 432 channel.setLights(false); 433 channel.lockFields(NotificationChannel.USER_LOCKED_LIGHTS); 434 435 mHelper.createNotificationChannel(pkg, uid, channel, false); 436 437 // same id, try to update 438 final NotificationChannel channel2 = 439 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 440 channel2.setLights(true); 441 442 mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2); 443 444 // no fields should be changed 445 assertEquals(channel, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 446 } 447 448 @Test 449 public void testUpdate_userLockedPriority() throws Exception { 450 // all fields locked by user 451 final NotificationChannel channel = 452 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 453 channel.setBypassDnd(true); 454 channel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY); 455 456 mHelper.createNotificationChannel(pkg, uid, channel, false); 457 458 // same id, try to update all fields 459 final NotificationChannel channel2 = 460 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 461 channel2.setBypassDnd(false); 462 463 mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2); 464 465 // no fields should be changed 466 assertEquals(channel, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 467 } 468 469 @Test 470 public void testUpdate_userLockedRingtone() throws Exception { 471 // all fields locked by user 472 final NotificationChannel channel = 473 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 474 channel.setSound(new Uri.Builder().scheme("test").build()); 475 channel.lockFields(NotificationChannel.USER_LOCKED_SOUND); 476 477 mHelper.createNotificationChannel(pkg, uid, channel, false); 478 479 // same id, try to update all fields 480 final NotificationChannel channel2 = 481 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 482 channel2.setSound(new Uri.Builder().scheme("test2").build()); 483 484 mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2); 485 486 // no fields should be changed 487 assertEquals(channel, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 488 } 489 490 @Test 491 public void testUpdate_userLockedBadge() throws Exception { 492 final NotificationChannel channel = 493 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 494 channel.setShowBadge(true); 495 channel.lockFields(NotificationChannel.USER_LOCKED_SHOW_BADGE); 496 497 mHelper.createNotificationChannel(pkg, uid, channel, false); 498 499 final NotificationChannel channel2 = 500 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 501 channel2.setShowBadge(false); 502 503 mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2); 504 505 // no fields should be changed 506 assertEquals(channel, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 507 } 508 509 @Test 510 public void testUpdate() throws Exception { 511 // no fields locked by user 512 final NotificationChannel channel = 513 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 514 channel.setSound(new Uri.Builder().scheme("test").build()); 515 channel.setLights(true); 516 channel.setBypassDnd(true); 517 channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET); 518 519 mHelper.createNotificationChannel(pkg, uid, channel, false); 520 521 // same id, try to update all fields 522 final NotificationChannel channel2 = 523 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH); 524 channel2.setSound(new Uri.Builder().scheme("test2").build()); 525 channel2.setLights(false); 526 channel2.setBypassDnd(false); 527 channel2.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); 528 529 mHelper.updateNotificationChannel(pkg, uid, channel2); 530 531 // all fields should be changed 532 assertEquals(channel2, mHelper.getNotificationChannel(pkg, uid, channel.getId())); 533 } 534 535 @Test 536 public void testGetChannelWithFallback() throws Exception { 537 NotificationChannel channel = 538 mHelper.getNotificationChannelWithFallback(pkg, uid, "garbage"); 539 assertEquals(NotificationChannel.DEFAULT_CHANNEL_ID, channel.getId()); 540 } 541 542 @Test 543 public void testCreateChannel_CannotChangeHiddenFields() throws Exception { 544 final NotificationChannel channel = 545 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 546 channel.setSound(new Uri.Builder().scheme("test").build()); 547 channel.setLights(true); 548 channel.setBypassDnd(true); 549 channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET); 550 channel.setShowBadge(true); 551 int lockMask = 0; 552 for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) { 553 lockMask |= NotificationChannel.LOCKABLE_FIELDS[i]; 554 } 555 channel.lockFields(lockMask); 556 557 mHelper.createNotificationChannel(pkg, uid, channel, true); 558 559 NotificationChannel savedChannel = 560 mHelper.getNotificationChannel(pkg, uid, channel.getId()); 561 562 assertEquals(channel.getName(), savedChannel.getName()); 563 assertEquals(channel.shouldShowLights(), savedChannel.shouldShowLights()); 564 assertFalse(savedChannel.canBypassDnd()); 565 assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility()); 566 assertEquals(channel.canShowBadge(), savedChannel.canShowBadge()); 567 } 568 569 @Test 570 public void testCreateChannel_CannotChangeHiddenFieldsAssistant() throws Exception { 571 final NotificationChannel channel = 572 new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW); 573 channel.setSound(new Uri.Builder().scheme("test").build()); 574 channel.setLights(true); 575 channel.setBypassDnd(true); 576 channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET); 577 channel.setShowBadge(true); 578 int lockMask = 0; 579 for (int i = 0; i < NotificationChannel.LOCKABLE_FIELDS.length; i++) { 580 lockMask |= NotificationChannel.LOCKABLE_FIELDS[i]; 581 } 582 channel.lockFields(lockMask); 583 584 mHelper.createNotificationChannel(pkg, uid, channel, true); 585 586 NotificationChannel savedChannel = 587 mHelper.getNotificationChannel(pkg, uid, channel.getId()); 588 589 assertEquals(channel.getName(), savedChannel.getName()); 590 assertEquals(channel.shouldShowLights(), savedChannel.shouldShowLights()); 591 assertFalse(savedChannel.canBypassDnd()); 592 assertFalse(Notification.VISIBILITY_SECRET == savedChannel.getLockscreenVisibility()); 593 assertEquals(channel.canShowBadge(), savedChannel.canShowBadge()); 594 } 595} 596