blob: f94779d6d5cad9c9b99c97c2295bfabeba587c70 [file] [log] [blame]
Lucas Dupin7fc9dc12019-01-03 09:19:43 -08001/*
2 * Copyright (C) 2018 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
17package com.android.systemui.statusbar.phone;
18
Lucas Dupind61974d2019-03-29 16:09:26 -070019import static com.google.common.truth.Truth.assertThat;
20
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080021import static org.mockito.ArgumentMatchers.eq;
22import static org.mockito.Mockito.inOrder;
Selim Cinek6f0a62a2019-04-09 18:40:12 -070023import static org.mockito.Mockito.mock;
Lucas Dupin62622222019-08-29 14:46:29 -070024import static org.mockito.Mockito.never;
Lucas Dupin23964c72019-05-21 16:12:45 -070025import static org.mockito.Mockito.spy;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080026import static org.mockito.Mockito.verify;
27import static org.mockito.Mockito.when;
28
Lucas Dupin23964c72019-05-21 16:12:45 -070029import android.app.StatusBarManager;
Lucas Dupin62622222019-08-29 14:46:29 -070030import android.hardware.biometrics.BiometricSourceType;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080031import android.testing.AndroidTestingRunner;
32import android.testing.TestableLooper;
Lucas Dupind61974d2019-03-29 16:09:26 -070033import android.view.MotionEvent;
Lucas Dupin62622222019-08-29 14:46:29 -070034import android.view.View;
Lucas Dupind61974d2019-03-29 16:09:26 -070035import android.view.ViewGroup;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080036
Brett Chabot84151d92019-02-27 15:37:59 -080037import androidx.test.filters.SmallTest;
38
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080039import com.android.keyguard.KeyguardStatusView;
Lucas Dupin62622222019-08-29 14:46:29 -070040import com.android.keyguard.KeyguardUpdateMonitor;
Robert Snoebergerbe35b762019-03-15 14:33:02 -040041import com.android.systemui.SystemUIFactory;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080042import com.android.systemui.SysuiTestCase;
Dave Mankoff781ef7e2019-06-28 16:33:25 -040043import com.android.systemui.plugins.FalsingManager;
Beverly8fdb5332019-02-04 14:29:49 -050044import com.android.systemui.plugins.statusbar.StatusBarStateController;
Lucas Dupin23964c72019-05-21 16:12:45 -070045import com.android.systemui.statusbar.KeyguardAffordanceView;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080046import com.android.systemui.statusbar.NotificationLockscreenUserManager;
Lucas Dupind61974d2019-03-29 16:09:26 -070047import com.android.systemui.statusbar.NotificationShelf;
Selim Cinek34518f62019-02-28 19:41:18 -080048import com.android.systemui.statusbar.PulseExpansionHandler;
49import com.android.systemui.statusbar.StatusBarStateControllerImpl;
Beverly8fdb5332019-02-04 14:29:49 -050050import com.android.systemui.statusbar.SysuiStatusBarStateController;
Selim Cinek6f0a62a2019-04-09 18:40:12 -070051import com.android.systemui.statusbar.notification.DynamicPrivacyController;
Selim Cinek34518f62019-02-28 19:41:18 -080052import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
Selim Cinekc7e4cb52019-06-20 15:41:45 -070053import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080054import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
55import com.android.systemui.statusbar.policy.ConfigurationController;
56import com.android.systemui.statusbar.policy.ZenModeController;
Robert Snoebergerbe35b762019-03-15 14:33:02 -040057import com.android.systemui.util.InjectionInflationController;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080058
59import org.junit.Before;
60import org.junit.Test;
61import org.junit.runner.RunWith;
62import org.mockito.InOrder;
63import org.mockito.Mock;
64import org.mockito.MockitoAnnotations;
65
Lucas Dupin23964c72019-05-21 16:12:45 -070066import java.util.function.Consumer;
67
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080068@SmallTest
69@RunWith(AndroidTestingRunner.class)
70@TestableLooper.RunWithLooper
71public class NotificationPanelViewTest extends SysuiTestCase {
72
73 @Mock
Lucas Dupind61974d2019-03-29 16:09:26 -070074 private StatusBar mStatusBar;
75 @Mock
Beverly8fdb5332019-02-04 14:29:49 -050076 private SysuiStatusBarStateController mStatusBarStateController;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -080077 @Mock
78 private NotificationStackScrollLayout mNotificationStackScrollLayout;
79 @Mock
80 private KeyguardStatusView mKeyguardStatusView;
Lucas Dupinc97d88f2019-01-17 16:34:22 -080081 @Mock
Lucas Dupin07ed3df2019-03-26 21:23:59 -070082 private KeyguardBottomAreaView mKeyguardBottomArea;
83 @Mock
Lucas Dupind61974d2019-03-29 16:09:26 -070084 private KeyguardBottomAreaView mQsFrame;
85 @Mock
86 private ViewGroup mBigClockContainer;
87 @Mock
88 private ScrimController mScrimController;
89 @Mock
90 private NotificationIconAreaController mNotificationAreaController;
91 @Mock
92 private HeadsUpManagerPhone mHeadsUpManager;
93 @Mock
94 private NotificationShelf mNotificationShelf;
95 @Mock
96 private NotificationGroupManager mGroupManager;
97 @Mock
Lucas Dupinc97d88f2019-01-17 16:34:22 -080098 private KeyguardStatusBarView mKeyguardStatusBar;
Lucas Dupind61974d2019-03-29 16:09:26 -070099 @Mock
100 private HeadsUpTouchHelper.Callback mHeadsUpCallback;
101 @Mock
102 private PanelBar mPanelBar;
Lucas Dupin23964c72019-05-21 16:12:45 -0700103 @Mock
104 private KeyguardAffordanceHelper mAffordanceHelper;
Dave Mankoff781ef7e2019-06-28 16:33:25 -0400105 @Mock
Lucas Dupin62622222019-08-29 14:46:29 -0700106 private KeyguardUpdateMonitor mUpdateMonitor;
107 @Mock
Dave Mankoff781ef7e2019-06-28 16:33:25 -0400108 private FalsingManager mFalsingManager;
Lucas Dupin62622222019-08-29 14:46:29 -0700109 @Mock
110 private KeyguardBypassController mKeyguardBypassController;
Lucas Dupin7fc9dc12019-01-03 09:19:43 -0800111 private NotificationPanelView mNotificationPanelView;
112
113 @Before
114 public void setup() {
115 MockitoAnnotations.initMocks(this);
Lucas Dupind61974d2019-03-29 16:09:26 -0700116 when(mNotificationStackScrollLayout.getHeight()).thenReturn(1000);
117 when(mNotificationStackScrollLayout.getHeadsUpCallback()).thenReturn(mHeadsUpCallback);
118 when(mHeadsUpCallback.getContext()).thenReturn(mContext);
Lucas Dupin7fc9dc12019-01-03 09:19:43 -0800119 mDependency.injectTestDependency(StatusBarStateController.class,
120 mStatusBarStateController);
121 mDependency.injectMockDependency(ShadeController.class);
122 mDependency.injectMockDependency(NotificationLockscreenUserManager.class);
123 mDependency.injectMockDependency(ConfigurationController.class);
124 mDependency.injectMockDependency(ZenModeController.class);
Selim Cinek34518f62019-02-28 19:41:18 -0800125 NotificationWakeUpCoordinator coordinator =
Selim Cinek15af9762019-03-19 18:32:37 -0700126 new NotificationWakeUpCoordinator(mContext,
Selim Cinekc3fec682019-06-06 18:11:07 -0700127 mock(HeadsUpManagerPhone.class),
Selim Cinekc1d9ab22019-05-21 18:08:30 -0700128 new StatusBarStateControllerImpl(),
Lucas Dupin62622222019-08-29 14:46:29 -0700129 mKeyguardBypassController);
Selim Cinekb8cc6ef2019-06-14 16:37:53 -0700130 PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator,
Lucas Dupin62622222019-08-29 14:46:29 -0700131 mKeyguardBypassController, mHeadsUpManager,
Lucas Dupine7ff7be2019-09-17 11:19:53 -0400132 mock(NotificationRoundnessManager.class), mStatusBarStateController);
Selim Cinekc1d9ab22019-05-21 18:08:30 -0700133 mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler,
Lucas Dupin62622222019-08-29 14:46:29 -0700134 mKeyguardBypassController);
Lucas Dupind61974d2019-03-29 16:09:26 -0700135 mNotificationPanelView.setHeadsUpManager(mHeadsUpManager);
136 mNotificationPanelView.setBar(mPanelBar);
Lucas Dupin23964c72019-05-21 16:12:45 -0700137
138 when(mKeyguardBottomArea.getLeftView()).thenReturn(mock(KeyguardAffordanceView.class));
139 when(mKeyguardBottomArea.getRightView()).thenReturn(mock(KeyguardAffordanceView.class));
Lucas Dupin7fc9dc12019-01-03 09:19:43 -0800140 }
141
142 @Test
143 public void testSetDozing_notifiesNsslAndStateController() {
144 mNotificationPanelView.setDozing(true /* dozing */, true /* animate */, null /* touch */);
145 InOrder inOrder = inOrder(mNotificationStackScrollLayout, mStatusBarStateController);
Selim Cinekc1d9ab22019-05-21 18:08:30 -0700146 inOrder.verify(mNotificationStackScrollLayout).setDozing(eq(true), eq(true), eq(null));
Lucas Dupin7fc9dc12019-01-03 09:19:43 -0800147 inOrder.verify(mStatusBarStateController).setDozeAmount(eq(1f), eq(true));
148 }
149
150 @Test
Lucas Dupind61974d2019-03-29 16:09:26 -0700151 public void testSetExpandedHeight() {
152 mNotificationPanelView.setExpandedHeight(200);
153 assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200);
154 }
155
156 @Test
Lucas Dupin23964c72019-05-21 16:12:45 -0700157 public void testAffordanceLaunchingListener() {
158 Consumer<Boolean> listener = spy((showing) -> { });
159 mNotificationPanelView.setExpandedFraction(1f);
160 mNotificationPanelView.setLaunchAffordanceListener(listener);
161 mNotificationPanelView.launchCamera(false /* animate */,
162 StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP);
163 verify(listener).accept(eq(true));
164
165 mNotificationPanelView.onAffordanceLaunchEnded();
166 verify(listener).accept(eq(false));
167 }
168
169 @Test
Lucas Dupind61974d2019-03-29 16:09:26 -0700170 public void testOnTouchEvent_expansionCanBeBlocked() {
171 mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */,
172 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */,
173 0 /* metaState */));
174 mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */,
175 0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 200f /* y */,
176 0 /* metaState */));
177 assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200);
178 assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse();
179
180 mNotificationPanelView.blockExpansionForCurrentTouch();
181 mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */,
182 0L /* eventTime */, MotionEvent.ACTION_MOVE, 0f /* x */, 300f /* y */,
183 0 /* metaState */));
184 // Expansion should not have changed because it was blocked
185 assertThat((int) mNotificationPanelView.getExpandedHeight()).isEqualTo(200);
186 assertThat(mNotificationPanelView.isTrackingBlocked()).isTrue();
187
188 mNotificationPanelView.onTouchEvent(MotionEvent.obtain(0L /* downTime */,
189 0L /* eventTime */, MotionEvent.ACTION_UP, 0f /* x */, 300f /* y */,
190 0 /* metaState */));
191 assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse();
192 }
193
Lucas Dupin62622222019-08-29 14:46:29 -0700194 @Test
195 public void testKeyguardStatusBarVisibility_hiddenForBypass() {
196 when(mUpdateMonitor.shouldListenForFace()).thenReturn(true);
197 mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true,
198 BiometricSourceType.FACE);
199 verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE);
200
201 when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true);
202 mNotificationPanelView.mKeyguardUpdateCallback.onFinishedGoingToSleep(0);
203 mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true,
204 BiometricSourceType.FACE);
205 verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE);
206 }
207
Lucas Dupin7fc9dc12019-01-03 09:19:43 -0800208 private class TestableNotificationPanelView extends NotificationPanelView {
Selim Cinek34518f62019-02-28 19:41:18 -0800209 TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator,
Selim Cinekc1d9ab22019-05-21 18:08:30 -0700210 PulseExpansionHandler expansionHandler,
211 KeyguardBypassController bypassController) {
Robert Snoebergerbe35b762019-03-15 14:33:02 -0400212 super(NotificationPanelViewTest.this.mContext, null,
213 new InjectionInflationController(
214 SystemUIFactory.getInstance().getRootComponent()),
Selim Cinekc1d9ab22019-05-21 18:08:30 -0700215 coordinator, expansionHandler, mock(DynamicPrivacyController.class),
Dave Mankoff781ef7e2019-06-28 16:33:25 -0400216 bypassController,
217 mFalsingManager);
Lucas Dupin7fc9dc12019-01-03 09:19:43 -0800218 mNotificationStackScroller = mNotificationStackScrollLayout;
219 mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView;
Lucas Dupinc97d88f2019-01-17 16:34:22 -0800220 mKeyguardStatusBar = NotificationPanelViewTest.this.mKeyguardStatusBar;
Lucas Dupin07ed3df2019-03-26 21:23:59 -0700221 mKeyguardBottomArea = NotificationPanelViewTest.this.mKeyguardBottomArea;
Lucas Dupind61974d2019-03-29 16:09:26 -0700222 mBigClockContainer = NotificationPanelViewTest.this.mBigClockContainer;
223 mQsFrame = NotificationPanelViewTest.this.mQsFrame;
Lucas Dupin23964c72019-05-21 16:12:45 -0700224 mAffordanceHelper = NotificationPanelViewTest.this.mAffordanceHelper;
Lucas Dupin62622222019-08-29 14:46:29 -0700225 mUpdateMonitor = NotificationPanelViewTest.this.mUpdateMonitor;
Lucas Dupind61974d2019-03-29 16:09:26 -0700226 initDependencies(NotificationPanelViewTest.this.mStatusBar,
227 NotificationPanelViewTest.this.mGroupManager,
228 NotificationPanelViewTest.this.mNotificationShelf,
229 NotificationPanelViewTest.this.mHeadsUpManager,
230 NotificationPanelViewTest.this.mNotificationAreaController,
231 NotificationPanelViewTest.this.mScrimController);
Lucas Dupin7fc9dc12019-01-03 09:19:43 -0800232 }
233 }
234}