• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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