blob: ea1b498801ec8fb31ad25ab38f1acdd7acbd6519 [file] [log] [blame]
Selim Cineka7d4f822016-12-06 14:34:47 -08001/*
Selim Cineka7679b62017-05-10 16:33:25 -07002 * Copyright (C) 2017 The Android Open Source Project
Selim Cineka7d4f822016-12-06 14:34:47 -08003 *
Selim Cineka7679b62017-05-10 16:33:25 -07004 * 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
Selim Cineka7d4f822016-12-06 14:34:47 -08007 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
Selim Cineka7679b62017-05-10 16:33:25 -070010 * 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
Selim Cineka7d4f822016-12-06 14:34:47 -080015 */
16
Selim Cineka7679b62017-05-10 16:33:25 -070017package com.android.systemui.statusbar.notification;
Selim Cineka7d4f822016-12-06 14:34:47 -080018
Ned Burns9512e0c2019-05-30 19:36:04 -040019import static org.junit.Assert.assertFalse;
20import static org.junit.Assert.assertTrue;
21import static org.mockito.ArgumentMatchers.any;
Gus Prevas5b9098dc2018-12-21 17:07:15 -050022import static org.mockito.Mockito.mock;
Ned Burns9512e0c2019-05-30 19:36:04 -040023import static org.mockito.Mockito.never;
Selim Cinek0260c752020-05-11 16:03:52 -070024import static org.mockito.Mockito.times;
Gus Prevas5b9098dc2018-12-21 17:07:15 -050025import static org.mockito.Mockito.verify;
26import static org.mockito.Mockito.when;
27
Ned Burns9512e0c2019-05-30 19:36:04 -040028import android.os.Handler;
Ned Burns9512e0c2019-05-30 19:36:04 -040029import android.testing.AndroidTestingRunner;
30import android.testing.TestableLooper;
Selim Cineka7d4f822016-12-06 14:34:47 -080031
Ned Burns9512e0c2019-05-30 19:36:04 -040032import androidx.test.filters.SmallTest;
Brett Chabot84151d92019-02-27 15:37:59 -080033
Jason Monkfba8faf2017-05-23 10:42:59 -040034import com.android.systemui.SysuiTestCase;
Gus Prevas5b9098dc2018-12-21 17:07:15 -050035import com.android.systemui.statusbar.NotificationPresenter;
Ned Burnsf81c4c42019-01-07 14:10:43 -050036import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Beverly79c89ec2019-12-13 10:33:01 -050037import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
Rohan Shah20790b82018-07-02 17:21:04 -070038import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
Selim Cineka7d4f822016-12-06 14:34:47 -080039
40import org.junit.Before;
41import org.junit.Test;
42import org.junit.runner.RunWith;
43
Selim Cineka7d4f822016-12-06 14:34:47 -080044@SmallTest
Ned Burns9512e0c2019-05-30 19:36:04 -040045@RunWith(AndroidTestingRunner.class)
46@TestableLooper.RunWithLooper()
Jason Monkfba8faf2017-05-23 10:42:59 -040047public class VisualStabilityManagerTest extends SysuiTestCase {
Selim Cineka7d4f822016-12-06 14:34:47 -080048
Ned Burns9512e0c2019-05-30 19:36:04 -040049 private TestableLooper mTestableLooper;
50
51 private VisualStabilityManager mVisualStabilityManager;
Selim Cineka7d4f822016-12-06 14:34:47 -080052 private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
53 private VisibilityLocationProvider mLocationProvider = mock(VisibilityLocationProvider.class);
54 private ExpandableNotificationRow mRow = mock(ExpandableNotificationRow.class);
Ned Burnsf81c4c42019-01-07 14:10:43 -050055 private NotificationEntry mEntry;
Selim Cineka7d4f822016-12-06 14:34:47 -080056
57 @Before
58 public void setUp() {
Ned Burns9512e0c2019-05-30 19:36:04 -040059 mTestableLooper = TestableLooper.get(this);
60 mVisualStabilityManager = new VisualStabilityManager(
61 mock(NotificationEntryManager.class),
62 new Handler(mTestableLooper.getLooper()));
63
Gus Prevas5b9098dc2018-12-21 17:07:15 -050064 mVisualStabilityManager.setUpWithPresenter(mock(NotificationPresenter.class));
Selim Cineka7d4f822016-12-06 14:34:47 -080065 mVisualStabilityManager.setVisibilityLocationProvider(mLocationProvider);
Ned Burns636c3792019-09-11 16:59:07 -040066 mEntry = new NotificationEntryBuilder().build();
Evan Laird94492852018-10-25 13:43:01 -040067 mEntry.setRow(mRow);
Ned Burns9512e0c2019-05-30 19:36:04 -040068
69 when(mRow.getEntry()).thenReturn(mEntry);
Selim Cineka7d4f822016-12-06 14:34:47 -080070 }
71
72 @Test
73 public void testPanelExpansion() {
74 mVisualStabilityManager.setPanelExpanded(true);
75 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -040076 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080077 mVisualStabilityManager.setPanelExpanded(false);
Ned Burns9512e0c2019-05-30 19:36:04 -040078 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080079 }
80
81 @Test
82 public void testScreenOn() {
83 mVisualStabilityManager.setPanelExpanded(true);
84 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -040085 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080086 mVisualStabilityManager.setScreenOn(false);
Ned Burns9512e0c2019-05-30 19:36:04 -040087 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080088 }
89
90 @Test
91 public void testReorderingAllowedChangesScreenOn() {
92 mVisualStabilityManager.setPanelExpanded(true);
93 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -040094 assertFalse(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -080095 mVisualStabilityManager.setScreenOn(false);
Ned Burns9512e0c2019-05-30 19:36:04 -040096 assertTrue(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -080097 }
98
99 @Test
100 public void testReorderingAllowedChangesPanel() {
101 mVisualStabilityManager.setPanelExpanded(true);
102 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400103 assertFalse(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -0800104 mVisualStabilityManager.setPanelExpanded(false);
Ned Burns9512e0c2019-05-30 19:36:04 -0400105 assertTrue(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -0800106 }
107
108 @Test
109 public void testCallBackCalledScreenOn() {
110 mVisualStabilityManager.setPanelExpanded(true);
111 mVisualStabilityManager.setScreenOn(true);
Selim Cinek0260c752020-05-11 16:03:52 -0700112 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, false /* persistent */);
Selim Cineka7d4f822016-12-06 14:34:47 -0800113 mVisualStabilityManager.setScreenOn(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700114 verify(mCallback).onChangeAllowed();
Selim Cineka7d4f822016-12-06 14:34:47 -0800115 }
116
117 @Test
118 public void testCallBackCalledPanelExpanded() {
119 mVisualStabilityManager.setPanelExpanded(true);
120 mVisualStabilityManager.setScreenOn(true);
Selim Cinek0260c752020-05-11 16:03:52 -0700121 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, false /* persistent */);
Selim Cineka7d4f822016-12-06 14:34:47 -0800122 mVisualStabilityManager.setPanelExpanded(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700123 verify(mCallback).onChangeAllowed();
Selim Cineka7d4f822016-12-06 14:34:47 -0800124 }
125
126 @Test
127 public void testCallBackExactlyOnce() {
128 mVisualStabilityManager.setPanelExpanded(true);
129 mVisualStabilityManager.setScreenOn(true);
Selim Cinek0260c752020-05-11 16:03:52 -0700130 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, false /* persistent */);
Selim Cineka7d4f822016-12-06 14:34:47 -0800131 mVisualStabilityManager.setScreenOn(false);
132 mVisualStabilityManager.setScreenOn(true);
133 mVisualStabilityManager.setScreenOn(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700134 verify(mCallback).onChangeAllowed();
Selim Cineka7d4f822016-12-06 14:34:47 -0800135 }
136
137 @Test
Selim Cinek0260c752020-05-11 16:03:52 -0700138 public void testCallBackCalledContinuouslyWhenRequested() {
139 mVisualStabilityManager.setPanelExpanded(true);
140 mVisualStabilityManager.setScreenOn(true);
141 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, true /* persistent */);
142 mVisualStabilityManager.setScreenOn(false);
143 mVisualStabilityManager.setScreenOn(true);
144 mVisualStabilityManager.setScreenOn(false);
145 verify(mCallback, times(2)).onChangeAllowed();
146 }
147
148 @Test
Selim Cineka7d4f822016-12-06 14:34:47 -0800149 public void testAddedCanReorder() {
150 mVisualStabilityManager.setPanelExpanded(true);
151 mVisualStabilityManager.setScreenOn(true);
152 mVisualStabilityManager.notifyViewAddition(mRow);
Ned Burns9512e0c2019-05-30 19:36:04 -0400153 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800154 }
155
156 @Test
157 public void testReorderingVisibleHeadsUpNotAllowed() {
158 mVisualStabilityManager.setPanelExpanded(true);
159 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400160 when(mLocationProvider.isInVisibleLocation(any(NotificationEntry.class))).thenReturn(true);
Selim Cineka7d4f822016-12-06 14:34:47 -0800161 mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400162 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800163 }
164
165 @Test
166 public void testReorderingVisibleHeadsUpAllowed() {
167 mVisualStabilityManager.setPanelExpanded(true);
168 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400169 when(mLocationProvider.isInVisibleLocation(any(NotificationEntry.class))).thenReturn(false);
Selim Cineka7d4f822016-12-06 14:34:47 -0800170 mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400171 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800172 }
173
174 @Test
175 public void testReorderingVisibleHeadsUpAllowedOnce() {
176 mVisualStabilityManager.setPanelExpanded(true);
177 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400178 when(mLocationProvider.isInVisibleLocation(any(NotificationEntry.class))).thenReturn(false);
Selim Cineka7d4f822016-12-06 14:34:47 -0800179 mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true);
180 mVisualStabilityManager.onReorderingFinished();
Ned Burns9512e0c2019-05-30 19:36:04 -0400181 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800182 }
Adrian Roos4b820e42017-01-13 17:40:43 -0800183
184 @Test
185 public void testPulsing() {
186 mVisualStabilityManager.setPulsing(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400187 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Adrian Roos4b820e42017-01-13 17:40:43 -0800188 mVisualStabilityManager.setPulsing(false);
Ned Burns9512e0c2019-05-30 19:36:04 -0400189 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Adrian Roos4b820e42017-01-13 17:40:43 -0800190 }
191
192 @Test
193 public void testReorderingAllowedChanges_Pulsing() {
194 mVisualStabilityManager.setPulsing(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400195 assertFalse(mVisualStabilityManager.isReorderingAllowed());
Adrian Roos4b820e42017-01-13 17:40:43 -0800196 mVisualStabilityManager.setPulsing(false);
Ned Burns9512e0c2019-05-30 19:36:04 -0400197 assertTrue(mVisualStabilityManager.isReorderingAllowed());
Adrian Roos4b820e42017-01-13 17:40:43 -0800198 }
199
200 @Test
201 public void testCallBackCalled_Pulsing() {
202 mVisualStabilityManager.setPulsing(true);
Selim Cinek0260c752020-05-11 16:03:52 -0700203 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, false /* persistent */);
Adrian Roos4b820e42017-01-13 17:40:43 -0800204 mVisualStabilityManager.setPulsing(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700205 verify(mCallback).onChangeAllowed();
Adrian Roos4b820e42017-01-13 17:40:43 -0800206 }
Ned Burns9512e0c2019-05-30 19:36:04 -0400207
208 @Test
209 public void testTemporarilyAllowReorderingNotifiesCallbacks() {
210 // GIVEN having the panel open (which would block reordering)
211 mVisualStabilityManager.setScreenOn(true);
212 mVisualStabilityManager.setPanelExpanded(true);
Selim Cinek0260c752020-05-11 16:03:52 -0700213 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, false /* persistent */);
Ned Burns9512e0c2019-05-30 19:36:04 -0400214
215 // WHEN we temprarily allow reordering
216 mVisualStabilityManager.temporarilyAllowReordering();
217
218 // THEN callbacks are notified that reordering is allowed
Selim Cinekba069ae2020-04-01 19:45:16 -0700219 verify(mCallback).onChangeAllowed();
Ned Burns9512e0c2019-05-30 19:36:04 -0400220 assertTrue(mVisualStabilityManager.isReorderingAllowed());
221 }
222
223 @Test
224 public void testTemporarilyAllowReorderingDoesntOverridePulsing() {
225 // GIVEN we are in a pulsing state
226 mVisualStabilityManager.setPulsing(true);
Selim Cinek0260c752020-05-11 16:03:52 -0700227 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, false /* persistent */);
Ned Burns9512e0c2019-05-30 19:36:04 -0400228
229 // WHEN we temprarily allow reordering
230 mVisualStabilityManager.temporarilyAllowReordering();
231
232 // THEN reordering is still not allowed
Selim Cinekba069ae2020-04-01 19:45:16 -0700233 verify(mCallback, never()).onChangeAllowed();
Ned Burns9512e0c2019-05-30 19:36:04 -0400234 assertFalse(mVisualStabilityManager.isReorderingAllowed());
235 }
236
237 @Test
238 public void testTemporarilyAllowReorderingExpires() {
239 // GIVEN having the panel open (which would block reordering)
240 mVisualStabilityManager.setScreenOn(true);
241 mVisualStabilityManager.setPanelExpanded(true);
Selim Cinek0260c752020-05-11 16:03:52 -0700242 mVisualStabilityManager.addReorderingAllowedCallback(mCallback, false /* persistent */);
Ned Burns9512e0c2019-05-30 19:36:04 -0400243
244 // WHEN we temprarily allow reordering and then wait until the window expires
245 mVisualStabilityManager.temporarilyAllowReordering();
246 assertTrue(mVisualStabilityManager.isReorderingAllowed());
247 mTestableLooper.processMessages(1);
248
249 // THEN reordering is no longer allowed
250 assertFalse(mVisualStabilityManager.isReorderingAllowed());
251 }
Selim Cineka7d4f822016-12-06 14:34:47 -0800252}