1 /* 2 * Copyright (C) 2024 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 */ 16 17 package com.android.internal.notification; 18 19 import static com.android.internal.notification.SystemNotificationChannels.ABUSIVE_BACKGROUND_APPS; 20 import static com.android.internal.notification.SystemNotificationChannels.ACCESSIBILITY_HEARING_DEVICE; 21 import static com.android.internal.notification.SystemNotificationChannels.ACCESSIBILITY_MAGNIFICATION; 22 import static com.android.internal.notification.SystemNotificationChannels.ACCESSIBILITY_SECURITY_POLICY; 23 import static com.android.internal.notification.SystemNotificationChannels.ACCOUNT; 24 import static com.android.internal.notification.SystemNotificationChannels.ALERTS; 25 import static com.android.internal.notification.SystemNotificationChannels.CAR_MODE; 26 import static com.android.internal.notification.SystemNotificationChannels.DEVELOPER; 27 import static com.android.internal.notification.SystemNotificationChannels.DEVELOPER_IMPORTANT; 28 import static com.android.internal.notification.SystemNotificationChannels.DEVICE_ADMIN; 29 import static com.android.internal.notification.SystemNotificationChannels.FOREGROUND_SERVICE; 30 import static com.android.internal.notification.SystemNotificationChannels.HEAVY_WEIGHT_APP; 31 import static com.android.internal.notification.SystemNotificationChannels.NETWORK_ALERTS; 32 import static com.android.internal.notification.SystemNotificationChannels.NETWORK_AVAILABLE; 33 import static com.android.internal.notification.SystemNotificationChannels.NETWORK_STATUS; 34 import static com.android.internal.notification.SystemNotificationChannels.OBSOLETE_DO_NOT_DISTURB; 35 import static com.android.internal.notification.SystemNotificationChannels.PHYSICAL_KEYBOARD; 36 import static com.android.internal.notification.SystemNotificationChannels.RETAIL_MODE; 37 import static com.android.internal.notification.SystemNotificationChannels.SECURITY; 38 import static com.android.internal.notification.SystemNotificationChannels.SYSTEM_CHANGES; 39 import static com.android.internal.notification.SystemNotificationChannels.UPDATES; 40 import static com.android.internal.notification.SystemNotificationChannels.USB; 41 import static com.android.internal.notification.SystemNotificationChannels.VPN; 42 43 import static com.google.common.truth.Truth.assertThat; 44 45 import static org.mockito.Mockito.atLeastOnce; 46 import static org.mockito.Mockito.verify; 47 48 import android.app.NotificationChannel; 49 import android.app.NotificationManager; 50 import android.testing.TestableContext; 51 52 import androidx.test.core.app.ApplicationProvider; 53 import androidx.test.ext.junit.runners.AndroidJUnit4; 54 55 import org.junit.Before; 56 import org.junit.Rule; 57 import org.junit.Test; 58 import org.junit.runner.RunWith; 59 import org.mockito.ArgumentCaptor; 60 import org.mockito.Mock; 61 import org.mockito.MockitoAnnotations; 62 63 import java.util.List; 64 65 @RunWith(AndroidJUnit4.class) 66 public class SystemNotificationChannelsTest { 67 68 @Rule public TestableContext mContext = new TestableContext( 69 ApplicationProvider.getApplicationContext()); 70 71 @Mock private NotificationManager mNm; 72 73 @Before setUp()74 public void setUp() { 75 MockitoAnnotations.initMocks(this); 76 mContext.addMockSystemService(NotificationManager.class, mNm); 77 } 78 79 @Test 80 @SuppressWarnings("unchecked") createAll_createsExpectedChannels()81 public void createAll_createsExpectedChannels() { 82 ArgumentCaptor<List<NotificationChannel>> createdChannelsCaptor = 83 ArgumentCaptor.forClass(List.class); 84 85 SystemNotificationChannels.createAll(mContext); 86 87 verify(mNm).createNotificationChannels(createdChannelsCaptor.capture()); 88 List<NotificationChannel> createdChannels = createdChannelsCaptor.getValue(); 89 assertThat(createdChannels.stream().map(NotificationChannel::getId).toList()) 90 .containsExactly(PHYSICAL_KEYBOARD, SECURITY, CAR_MODE, ACCOUNT, DEVELOPER, 91 DEVELOPER_IMPORTANT, UPDATES, NETWORK_STATUS, NETWORK_ALERTS, 92 NETWORK_AVAILABLE, VPN, DEVICE_ADMIN, ALERTS, RETAIL_MODE, USB, 93 FOREGROUND_SERVICE, HEAVY_WEIGHT_APP, SYSTEM_CHANGES, 94 ACCESSIBILITY_MAGNIFICATION, ACCESSIBILITY_HEARING_DEVICE, 95 ACCESSIBILITY_SECURITY_POLICY, ABUSIVE_BACKGROUND_APPS); 96 } 97 98 @Test createAll_deletesObsoleteChannels()99 public void createAll_deletesObsoleteChannels() { 100 ArgumentCaptor<String> deletedChannelCaptor = ArgumentCaptor.forClass(String.class); 101 102 SystemNotificationChannels.createAll(mContext); 103 104 verify(mNm, atLeastOnce()).deleteNotificationChannel(deletedChannelCaptor.capture()); 105 List<String> deletedChannels = deletedChannelCaptor.getAllValues(); 106 assertThat(deletedChannels).containsExactly(OBSOLETE_DO_NOT_DISTURB); 107 } 108 } 109