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