18f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds/* 28f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * Copyright (C) 2016 The Android Open Source Project 38f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * 48f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * Licensed under the Apache License, Version 2.0 (the "License"); 58f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * you may not use this file except in compliance with the License. 68f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * You may obtain a copy of the License at 78f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * 88f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * http://www.apache.org/licenses/LICENSE-2.0 98f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * 108f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * Unless required by applicable law or agreed to in writing, software 118f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * distributed under the License is distributed on an "AS IS" BASIS, 128f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * See the License for the specific language governing permissions and 148f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds * limitations under the License. 158f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds */ 168f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldspackage com.android.server.notification; 178f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 18a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynoldsimport static junit.framework.Assert.assertEquals; 19a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynoldsimport static junit.framework.Assert.assertNotNull; 20a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds 218f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport static org.mockito.Matchers.anyInt; 228f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport static org.mockito.Matchers.anyString; 238f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport static org.mockito.Matchers.eq; 248f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport static org.mockito.Mockito.never; 258f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport static org.mockito.Mockito.times; 268f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport static org.mockito.Mockito.verify; 278f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 288f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport org.junit.Before; 298f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport org.junit.Test; 308f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport org.junit.runner.RunWith; 318f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport org.mockito.Mock; 32f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynoldsimport org.mockito.Mockito; 338f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport org.mockito.MockitoAnnotations; 348f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 358f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport android.app.Notification; 368f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport android.os.UserHandle; 378f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport android.service.notification.StatusBarNotification; 388f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport android.support.test.runner.AndroidJUnit4; 398f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport android.test.suitebuilder.annotation.SmallTest; 408f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 4174f5e36f49b32baef90bf31bbbaf487c18002944Jason Monkimport com.android.server.UiServiceTestCase; 4274f5e36f49b32baef90bf31bbbaf487c18002944Jason Monk 438f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport java.util.ArrayList; 44a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynoldsimport java.util.LinkedHashSet; 458f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynoldsimport java.util.List; 46a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynoldsimport java.util.Map; 478f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 488f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds@SmallTest 498f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds@RunWith(AndroidJUnit4.class) 5074f5e36f49b32baef90bf31bbbaf487c18002944Jason Monkpublic class GroupHelperTest extends UiServiceTestCase { 518f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds private @Mock GroupHelper.Callback mCallback; 528f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 538f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds private GroupHelper mGroupHelper; 548f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 558f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds @Before 568f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds public void setUp() { 578f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds MockitoAnnotations.initMocks(this); 588f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 598f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds mGroupHelper = new GroupHelper(mCallback); 608f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 618f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 628f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds private StatusBarNotification getSbn(String pkg, int id, String tag, 638f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds UserHandle user, String groupKey) { 64af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch Notification.Builder nb = new Notification.Builder(getContext(), "test_channel_id") 658f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds .setContentTitle("A") 668f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds .setWhen(1205); 678f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds if (groupKey != null) { 688f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds nb.setGroup(groupKey); 698f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 70924eed1ca6d3fec5dae7eb0f9c11b8f23f628697Julia Reynolds return new StatusBarNotification(pkg, pkg, id, tag, 0, 0, nb.build(), user, null, 71423b9fc83d736326b8ddadbfcd6fd5f181bf9fecJulia Reynolds System.currentTimeMillis()); 728f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 738f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 748f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds private StatusBarNotification getSbn(String pkg, int id, String tag, 758f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds UserHandle user) { 768f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds return getSbn(pkg, id, tag, user, null); 778f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 788f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 798f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds @Test 808f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds public void testNoGroup_postingUnderLimit() throws Exception { 818f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final String pkg = "package"; 828f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) { 83a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM), 84a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds false); 858f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 868f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroupSummary( 878f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds eq(UserHandle.USER_SYSTEM), eq(pkg), anyString()); 888f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroup(anyString()); 898f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 908f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 918f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 928f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 938f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds @Test 948f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds public void testNoGroup_multiPackage() throws Exception { 958f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final String pkg = "package"; 968f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final String pkg2 = "package2"; 978f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) { 98a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM), 99a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds false); 1008f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1018f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds mGroupHelper.onNotificationPosted( 102a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds getSbn(pkg2, GroupHelper.AUTOGROUP_AT_COUNT, "four", UserHandle.SYSTEM), false); 1038f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroupSummary( 1048f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds eq(UserHandle.USER_SYSTEM), eq(pkg), anyString()); 1058f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroup(anyString()); 1068f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 1078f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 1088f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1098f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 1108f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds @Test 1118f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds public void testNoGroup_multiUser() throws Exception { 1128f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final String pkg = "package"; 1138f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) { 114a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM), 115a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds false); 1168f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1178f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds mGroupHelper.onNotificationPosted( 118a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds getSbn(pkg, GroupHelper.AUTOGROUP_AT_COUNT, "four", UserHandle.ALL), 119a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds false); 1208f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroupSummary(anyInt(), eq(pkg), anyString()); 1218f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroup(anyString()); 1228f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 1238f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 1248f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1258f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 1268f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds @Test 1278f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds public void testNoGroup_someAreGrouped() throws Exception { 1288f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final String pkg = "package"; 1298f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) { 130a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted( 131a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM), false); 1328f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1338f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds mGroupHelper.onNotificationPosted( 134a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds getSbn(pkg, GroupHelper.AUTOGROUP_AT_COUNT, "four", UserHandle.SYSTEM, "a"), 135a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds false); 1368f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroupSummary( 1378f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds eq(UserHandle.USER_SYSTEM), eq(pkg), anyString()); 1388f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).addAutoGroup(anyString()); 1398f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 1408f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 1418f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1428f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 1438f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 1448f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds @Test 1458f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds public void testPostingOverLimit() throws Exception { 1468f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final String pkg = "package"; 1478f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) { 148a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted( 149a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM), false); 1508f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1518f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString()); 1528f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString()); 1538f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 1548f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 1558f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 1568f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds 1578f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds @Test 158f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds public void testDropToZeroRemoveGroup() throws Exception { 1598f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final String pkg = "package"; 1608f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds List<StatusBarNotification> posted = new ArrayList<>(); 1618f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) { 1628f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds final StatusBarNotification sbn = getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM); 1638f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds posted.add(sbn); 164a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(sbn, false); 1658f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 166f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString()); 167f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString()); 168f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 169f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 170f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds Mockito.reset(mCallback); 171f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds 172f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 1; i++) { 173f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds mGroupHelper.onNotificationRemoved(posted.remove(0)); 174f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds } 175f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 176f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 177f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds Mockito.reset(mCallback); 178f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds 1798f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds mGroupHelper.onNotificationRemoved(posted.remove(0)); 180f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 181f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, times(1)).removeAutoGroupSummary(anyInt(), anyString()); 182f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds } 183f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds 184f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds @Test 185f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds public void testAppStartsGrouping() throws Exception { 186f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds final String pkg = "package"; 187f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds List<StatusBarNotification> posted = new ArrayList<>(); 188f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) { 189f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds final StatusBarNotification sbn = getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM); 190f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds posted.add(sbn); 191a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(sbn, false); 192f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds } 1938f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString()); 1948f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString()); 195f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 196f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 197f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds Mockito.reset(mCallback); 198f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds 199f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds int i = 0; 200f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds for (i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT - 2; i++) { 201f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds final StatusBarNotification sbn = 202f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM, "app group"); 203a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(sbn, false); 204f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds } 205f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT - 2)).removeAutoGroup(anyString()); 206f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 207f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds Mockito.reset(mCallback); 208f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds 209f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds for (; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) { 210f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds final StatusBarNotification sbn = 211f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM, "app group"); 212a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(sbn, false); 213f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds } 214f4af65bbd6ccd9cf6951e26da12c2789ab14c42aJulia Reynolds verify(mCallback, times(2)).removeAutoGroup(anyString()); 2158f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds verify(mCallback, times(1)).removeAutoGroupSummary(anyInt(), anyString()); 2168f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds } 217a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds 218a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds @Test 219a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds public void testNewNotificationsAddedToAutogroup_ifOriginalNotificationsCanceled() 220a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds throws Exception { 221a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds final String pkg = "package"; 222a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds List<StatusBarNotification> posted = new ArrayList<>(); 223a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds for (int i = 0; i < GroupHelper.AUTOGROUP_AT_COUNT; i++) { 224a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds final StatusBarNotification sbn = getSbn(pkg, i, String.valueOf(i), UserHandle.SYSTEM); 225a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds posted.add(sbn); 226a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(sbn, false); 227a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds } 228a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, times(1)).addAutoGroupSummary(anyInt(), eq(pkg), anyString()); 229a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, times(GroupHelper.AUTOGROUP_AT_COUNT)).addAutoGroup(anyString()); 230a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 231a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 232a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds Mockito.reset(mCallback); 233a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds 234a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds for (int i = posted.size() - 2; i >= 0; i--) { 235a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationRemoved(posted.remove(i)); 236a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds } 237a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 238a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 239a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds Mockito.reset(mCallback); 240a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds 241a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds // only one child remains 242a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds Map<String, LinkedHashSet<String>> ungroupedForUser = 243a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.mUngroupedNotifications.get(UserHandle.USER_SYSTEM); 244a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds assertNotNull(ungroupedForUser); 245a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds assertEquals(1, ungroupedForUser.get(pkg).size()); 246a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds 247a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds // Add new notification; it should be autogrouped even though the total count is 248a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds // < AUTOGROUP_AT_COUNT 249a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds final StatusBarNotification sbn = getSbn(pkg, 5, String.valueOf(5), UserHandle.SYSTEM); 250a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds posted.add(sbn); 251a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds mGroupHelper.onNotificationPosted(sbn, true); 252a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, times(posted.size())).addAutoGroup(anyString()); 253a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, never()).removeAutoGroup(anyString()); 254a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds verify(mCallback, never()).removeAutoGroupSummary(anyInt(), anyString()); 255a13b3e257418b722282b1c4b5aaef316503bc127Julia Reynolds } 2568f488d3f2f754bc6e8f4e87f40031a3f6a0b00dbJulia Reynolds} 257