blob: 3d06c57cac37a484ad545a2ecb664ad70ad77f87 [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;
Gus Prevas5b9098dc2018-12-21 17:07:15 -050024import static org.mockito.Mockito.verify;
25import static org.mockito.Mockito.when;
26
Ned Burns9512e0c2019-05-30 19:36:04 -040027import android.os.Handler;
Ned Burns9512e0c2019-05-30 19:36:04 -040028import android.testing.AndroidTestingRunner;
29import android.testing.TestableLooper;
Selim Cineka7d4f822016-12-06 14:34:47 -080030
Ned Burns9512e0c2019-05-30 19:36:04 -040031import androidx.test.filters.SmallTest;
Brett Chabot84151d92019-02-27 15:37:59 -080032
Jason Monkfba8faf2017-05-23 10:42:59 -040033import com.android.systemui.SysuiTestCase;
Gus Prevas5b9098dc2018-12-21 17:07:15 -050034import com.android.systemui.statusbar.NotificationPresenter;
Ned Burnsf81c4c42019-01-07 14:10:43 -050035import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Beverly79c89ec2019-12-13 10:33:01 -050036import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
Rohan Shah20790b82018-07-02 17:21:04 -070037import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
Selim Cineka7d4f822016-12-06 14:34:47 -080038
39import org.junit.Before;
40import org.junit.Test;
41import org.junit.runner.RunWith;
42
Selim Cineka7d4f822016-12-06 14:34:47 -080043@SmallTest
Ned Burns9512e0c2019-05-30 19:36:04 -040044@RunWith(AndroidTestingRunner.class)
45@TestableLooper.RunWithLooper()
Jason Monkfba8faf2017-05-23 10:42:59 -040046public class VisualStabilityManagerTest extends SysuiTestCase {
Selim Cineka7d4f822016-12-06 14:34:47 -080047
Ned Burns9512e0c2019-05-30 19:36:04 -040048 private TestableLooper mTestableLooper;
49
50 private VisualStabilityManager mVisualStabilityManager;
Selim Cineka7d4f822016-12-06 14:34:47 -080051 private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
52 private VisibilityLocationProvider mLocationProvider = mock(VisibilityLocationProvider.class);
53 private ExpandableNotificationRow mRow = mock(ExpandableNotificationRow.class);
Ned Burnsf81c4c42019-01-07 14:10:43 -050054 private NotificationEntry mEntry;
Selim Cineka7d4f822016-12-06 14:34:47 -080055
56 @Before
57 public void setUp() {
Ned Burns9512e0c2019-05-30 19:36:04 -040058 mTestableLooper = TestableLooper.get(this);
59 mVisualStabilityManager = new VisualStabilityManager(
60 mock(NotificationEntryManager.class),
61 new Handler(mTestableLooper.getLooper()));
62
Gus Prevas5b9098dc2018-12-21 17:07:15 -050063 mVisualStabilityManager.setUpWithPresenter(mock(NotificationPresenter.class));
Selim Cineka7d4f822016-12-06 14:34:47 -080064 mVisualStabilityManager.setVisibilityLocationProvider(mLocationProvider);
Ned Burns636c3792019-09-11 16:59:07 -040065 mEntry = new NotificationEntryBuilder().build();
Evan Laird94492852018-10-25 13:43:01 -040066 mEntry.setRow(mRow);
Ned Burns9512e0c2019-05-30 19:36:04 -040067
68 when(mRow.getEntry()).thenReturn(mEntry);
Selim Cineka7d4f822016-12-06 14:34:47 -080069 }
70
71 @Test
72 public void testPanelExpansion() {
73 mVisualStabilityManager.setPanelExpanded(true);
74 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -040075 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080076 mVisualStabilityManager.setPanelExpanded(false);
Ned Burns9512e0c2019-05-30 19:36:04 -040077 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080078 }
79
80 @Test
81 public void testScreenOn() {
82 mVisualStabilityManager.setPanelExpanded(true);
83 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -040084 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080085 mVisualStabilityManager.setScreenOn(false);
Ned Burns9512e0c2019-05-30 19:36:04 -040086 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -080087 }
88
89 @Test
90 public void testReorderingAllowedChangesScreenOn() {
91 mVisualStabilityManager.setPanelExpanded(true);
92 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -040093 assertFalse(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -080094 mVisualStabilityManager.setScreenOn(false);
Ned Burns9512e0c2019-05-30 19:36:04 -040095 assertTrue(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -080096 }
97
98 @Test
99 public void testReorderingAllowedChangesPanel() {
100 mVisualStabilityManager.setPanelExpanded(true);
101 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400102 assertFalse(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -0800103 mVisualStabilityManager.setPanelExpanded(false);
Ned Burns9512e0c2019-05-30 19:36:04 -0400104 assertTrue(mVisualStabilityManager.isReorderingAllowed());
Selim Cineka7d4f822016-12-06 14:34:47 -0800105 }
106
107 @Test
108 public void testCallBackCalledScreenOn() {
109 mVisualStabilityManager.setPanelExpanded(true);
110 mVisualStabilityManager.setScreenOn(true);
111 mVisualStabilityManager.addReorderingAllowedCallback(mCallback);
112 mVisualStabilityManager.setScreenOn(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700113 verify(mCallback).onChangeAllowed();
Selim Cineka7d4f822016-12-06 14:34:47 -0800114 }
115
116 @Test
117 public void testCallBackCalledPanelExpanded() {
118 mVisualStabilityManager.setPanelExpanded(true);
119 mVisualStabilityManager.setScreenOn(true);
120 mVisualStabilityManager.addReorderingAllowedCallback(mCallback);
121 mVisualStabilityManager.setPanelExpanded(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700122 verify(mCallback).onChangeAllowed();
Selim Cineka7d4f822016-12-06 14:34:47 -0800123 }
124
125 @Test
126 public void testCallBackExactlyOnce() {
127 mVisualStabilityManager.setPanelExpanded(true);
128 mVisualStabilityManager.setScreenOn(true);
129 mVisualStabilityManager.addReorderingAllowedCallback(mCallback);
130 mVisualStabilityManager.setScreenOn(false);
131 mVisualStabilityManager.setScreenOn(true);
132 mVisualStabilityManager.setScreenOn(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700133 verify(mCallback).onChangeAllowed();
Selim Cineka7d4f822016-12-06 14:34:47 -0800134 }
135
136 @Test
137 public void testAddedCanReorder() {
138 mVisualStabilityManager.setPanelExpanded(true);
139 mVisualStabilityManager.setScreenOn(true);
140 mVisualStabilityManager.notifyViewAddition(mRow);
Ned Burns9512e0c2019-05-30 19:36:04 -0400141 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800142 }
143
144 @Test
145 public void testReorderingVisibleHeadsUpNotAllowed() {
146 mVisualStabilityManager.setPanelExpanded(true);
147 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400148 when(mLocationProvider.isInVisibleLocation(any(NotificationEntry.class))).thenReturn(true);
Selim Cineka7d4f822016-12-06 14:34:47 -0800149 mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400150 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800151 }
152
153 @Test
154 public void testReorderingVisibleHeadsUpAllowed() {
155 mVisualStabilityManager.setPanelExpanded(true);
156 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400157 when(mLocationProvider.isInVisibleLocation(any(NotificationEntry.class))).thenReturn(false);
Selim Cineka7d4f822016-12-06 14:34:47 -0800158 mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400159 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800160 }
161
162 @Test
163 public void testReorderingVisibleHeadsUpAllowedOnce() {
164 mVisualStabilityManager.setPanelExpanded(true);
165 mVisualStabilityManager.setScreenOn(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400166 when(mLocationProvider.isInVisibleLocation(any(NotificationEntry.class))).thenReturn(false);
Selim Cineka7d4f822016-12-06 14:34:47 -0800167 mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true);
168 mVisualStabilityManager.onReorderingFinished();
Ned Burns9512e0c2019-05-30 19:36:04 -0400169 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Selim Cineka7d4f822016-12-06 14:34:47 -0800170 }
Adrian Roos4b820e42017-01-13 17:40:43 -0800171
172 @Test
173 public void testPulsing() {
174 mVisualStabilityManager.setPulsing(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400175 assertFalse(mVisualStabilityManager.canReorderNotification(mRow));
Adrian Roos4b820e42017-01-13 17:40:43 -0800176 mVisualStabilityManager.setPulsing(false);
Ned Burns9512e0c2019-05-30 19:36:04 -0400177 assertTrue(mVisualStabilityManager.canReorderNotification(mRow));
Adrian Roos4b820e42017-01-13 17:40:43 -0800178 }
179
180 @Test
181 public void testReorderingAllowedChanges_Pulsing() {
182 mVisualStabilityManager.setPulsing(true);
Ned Burns9512e0c2019-05-30 19:36:04 -0400183 assertFalse(mVisualStabilityManager.isReorderingAllowed());
Adrian Roos4b820e42017-01-13 17:40:43 -0800184 mVisualStabilityManager.setPulsing(false);
Ned Burns9512e0c2019-05-30 19:36:04 -0400185 assertTrue(mVisualStabilityManager.isReorderingAllowed());
Adrian Roos4b820e42017-01-13 17:40:43 -0800186 }
187
188 @Test
189 public void testCallBackCalled_Pulsing() {
190 mVisualStabilityManager.setPulsing(true);
191 mVisualStabilityManager.addReorderingAllowedCallback(mCallback);
192 mVisualStabilityManager.setPulsing(false);
Selim Cinekba069ae2020-04-01 19:45:16 -0700193 verify(mCallback).onChangeAllowed();
Adrian Roos4b820e42017-01-13 17:40:43 -0800194 }
Ned Burns9512e0c2019-05-30 19:36:04 -0400195
196 @Test
197 public void testTemporarilyAllowReorderingNotifiesCallbacks() {
198 // GIVEN having the panel open (which would block reordering)
199 mVisualStabilityManager.setScreenOn(true);
200 mVisualStabilityManager.setPanelExpanded(true);
201 mVisualStabilityManager.addReorderingAllowedCallback(mCallback);
202
203 // WHEN we temprarily allow reordering
204 mVisualStabilityManager.temporarilyAllowReordering();
205
206 // THEN callbacks are notified that reordering is allowed
Selim Cinekba069ae2020-04-01 19:45:16 -0700207 verify(mCallback).onChangeAllowed();
Ned Burns9512e0c2019-05-30 19:36:04 -0400208 assertTrue(mVisualStabilityManager.isReorderingAllowed());
209 }
210
211 @Test
212 public void testTemporarilyAllowReorderingDoesntOverridePulsing() {
213 // GIVEN we are in a pulsing state
214 mVisualStabilityManager.setPulsing(true);
215 mVisualStabilityManager.addReorderingAllowedCallback(mCallback);
216
217 // WHEN we temprarily allow reordering
218 mVisualStabilityManager.temporarilyAllowReordering();
219
220 // THEN reordering is still not allowed
Selim Cinekba069ae2020-04-01 19:45:16 -0700221 verify(mCallback, never()).onChangeAllowed();
Ned Burns9512e0c2019-05-30 19:36:04 -0400222 assertFalse(mVisualStabilityManager.isReorderingAllowed());
223 }
224
225 @Test
226 public void testTemporarilyAllowReorderingExpires() {
227 // GIVEN having the panel open (which would block reordering)
228 mVisualStabilityManager.setScreenOn(true);
229 mVisualStabilityManager.setPanelExpanded(true);
230 mVisualStabilityManager.addReorderingAllowedCallback(mCallback);
231
232 // WHEN we temprarily allow reordering and then wait until the window expires
233 mVisualStabilityManager.temporarilyAllowReordering();
234 assertTrue(mVisualStabilityManager.isReorderingAllowed());
235 mTestableLooper.processMessages(1);
236
237 // THEN reordering is no longer allowed
238 assertFalse(mVisualStabilityManager.isReorderingAllowed());
239 }
Selim Cineka7d4f822016-12-06 14:34:47 -0800240}