blob: 63f653b0b303f41438c65153f00326a5e49e5eb4 [file] [log] [blame]
Lucas Dupinf9ca35e2018-05-16 20:41:35 -07001/*
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 Dupinf9ca35e2018-05-16 20:41:35 -070019import static org.mockito.ArgumentMatchers.anyBoolean;
Lucas Dupin71dd4842018-05-29 15:41:03 -070020import static org.mockito.ArgumentMatchers.anyFloat;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070021import static org.mockito.ArgumentMatchers.eq;
Lucas Dupin5431a922019-07-03 14:29:37 -070022import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
Lucas Dupine9e70712019-05-01 14:41:49 -070023import static org.mockito.Mockito.clearInvocations;
Lucas Dupin2e838ac2019-04-17 16:50:58 -070024import static org.mockito.Mockito.mock;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070025import static org.mockito.Mockito.never;
26import static org.mockito.Mockito.reset;
27import static org.mockito.Mockito.verify;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070028import static org.mockito.Mockito.when;
29
30import android.content.Context;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070031import android.testing.AndroidTestingRunner;
32import android.testing.TestableLooper;
Selim Cinek06c12d62019-07-01 19:44:18 -070033import android.view.View;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070034import android.view.ViewGroup;
Lucas Dupin5431a922019-07-03 14:29:37 -070035import android.view.ViewPropertyAnimator;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070036
Brett Chabot84151d92019-02-27 15:37:59 -080037import androidx.test.filters.SmallTest;
38
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070039import com.android.internal.widget.LockPatternUtils;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070040import com.android.keyguard.ViewMediatorCallback;
41import com.android.systemui.SysuiTestCase;
Dave Mankoff781ef7e2019-06-28 16:33:25 -040042import com.android.systemui.classifier.FalsingManagerFake;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070043import com.android.systemui.keyguard.DismissCallbackRegistry;
Jason Monk297c04e2018-08-23 17:16:59 -040044import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
Dave Mankoff781ef7e2019-06-28 16:33:25 -040045import com.android.systemui.plugins.FalsingManager;
Lucas Dupin2e838ac2019-04-17 16:50:58 -070046import com.android.systemui.plugins.statusbar.StatusBarStateController;
Selim Cinek06c12d62019-07-01 19:44:18 -070047import com.android.systemui.statusbar.SysuiStatusBarStateController;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070048
49import org.junit.Before;
50import org.junit.Test;
51import org.junit.runner.RunWith;
52import org.mockito.Mock;
53import org.mockito.MockitoAnnotations;
54
55@SmallTest
56@RunWith(AndroidTestingRunner.class)
57@TestableLooper.RunWithLooper
58public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
59
60 @Mock
61 private ViewMediatorCallback mViewMediatorCallback;
62 @Mock
63 private LockPatternUtils mLockPatternUtils;
64 @Mock
65 private KeyguardBouncer mBouncer;
66 @Mock
67 private StatusBar mStatusBar;
68 @Mock
69 private ViewGroup mContainer;
70 @Mock
71 private NotificationPanelView mNotificationPanelView;
72 @Mock
Gilad Brettercb51b8b2018-03-22 17:04:51 +020073 private BiometricUnlockController mBiometrucUnlockController;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070074 @Mock
75 private DismissCallbackRegistry mDismissCallbackRegistry;
Lucas Dupin2e838ac2019-04-17 16:50:58 -070076 @Mock
77 private ViewGroup mLockIconContainer;
78 @Mock
Selim Cinek06c12d62019-07-01 19:44:18 -070079 private SysuiStatusBarStateController mStatusBarStateController;
80 @Mock
81 private View mNotificationContainer;
82 @Mock
83 private KeyguardBypassController mBypassController;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070084 private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
85
86 @Before
87 public void setUp() {
88 MockitoAnnotations.initMocks(this);
Lucas Dupin1a8588d2018-08-21 12:18:47 -070089 mDependency.injectMockDependency(StatusBarWindowController.class);
Lucas Dupin2e838ac2019-04-17 16:50:58 -070090 mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
91 when(mLockIconContainer.getParent()).thenReturn(mock(ViewGroup.class));
Lucas Dupin5431a922019-07-03 14:29:37 -070092 when(mLockIconContainer.animate()).thenReturn(mock(ViewPropertyAnimator.class,
93 RETURNS_DEEP_STUBS));
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070094 mStatusBarKeyguardViewManager = new TestableStatusBarKeyguardViewManager(getContext(),
95 mViewMediatorCallback, mLockPatternUtils);
96 mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer,
Lucas Dupin2e838ac2019-04-17 16:50:58 -070097 mNotificationPanelView, mBiometrucUnlockController, mDismissCallbackRegistry,
Dave Mankoff781ef7e2019-06-28 16:33:25 -040098 mLockIconContainer, mNotificationContainer, mBypassController,
99 new FalsingManagerFake());
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700100 mStatusBarKeyguardViewManager.show(null);
101 }
102
103 @Test
104 public void dismissWithAction_AfterKeyguardGoneSetToFalse() {
Jason Monk297c04e2018-08-23 17:16:59 -0400105 OnDismissAction action = () -> false;
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700106 Runnable cancelAction = () -> {};
107 mStatusBarKeyguardViewManager.dismissWithAction(action, cancelAction,
108 false /* afterKeyguardGone */);
109 verify(mBouncer).showWithDismissAction(eq(action), eq(cancelAction));
110 }
111
112 @Test
113 public void showBouncer_onlyWhenShowing() {
114 mStatusBarKeyguardViewManager.hide(0 /* startTime */, 0 /* fadeoutDuration */);
115 mStatusBar.showBouncer(true /* scrimmed */);
116 verify(mBouncer, never()).show(anyBoolean(), anyBoolean());
117 verify(mBouncer, never()).show(anyBoolean());
118 }
119
120 @Test
121 public void showBouncer_notWhenBouncerAlreadyShowing() {
122 mStatusBarKeyguardViewManager.hide(0 /* startTime */, 0 /* fadeoutDuration */);
123 when(mBouncer.isSecure()).thenReturn(true);
124 mStatusBar.showBouncer(true /* scrimmed */);
125 verify(mBouncer, never()).show(anyBoolean(), anyBoolean());
126 verify(mBouncer, never()).show(anyBoolean());
127 }
128
129 @Test
130 public void showBouncer_showsTheBouncer() {
131 mStatusBarKeyguardViewManager.showBouncer(true /* scrimmed */);
132 verify(mBouncer).show(anyBoolean(), eq(true));
133 }
134
135 @Test
136 public void onPanelExpansionChanged_neverHidesFullscreenBouncer() {
137 // TODO: StatusBar should not be here, mBouncer.isFullscreenBouncer() should do the same.
138 when(mStatusBar.isFullScreenUserSwitcherState()).thenReturn(true);
139 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
140 true /* tracking */);
141 verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_VISIBLE));
142 }
143
144 @Test
145 public void onPanelExpansionChanged_neverHidesScrimmedBouncer() {
Lucas Dupin93f714d2019-03-26 16:49:24 -0700146 when(mBouncer.isShowing()).thenReturn(true);
147 when(mBouncer.isScrimmed()).thenReturn(true);
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700148 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
149 true /* tracking */);
150 verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_VISIBLE));
151 }
152
153 @Test
154 public void onPanelExpansionChanged_neverShowsDuringHintAnimation() {
155 when(mNotificationPanelView.isUnlockHintRunning()).thenReturn(true);
156 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
157 true /* tracking */);
158 verify(mBouncer).setExpansion(eq(KeyguardBouncer.EXPANSION_HIDDEN));
159 }
160
161 @Test
162 public void onPanelExpansionChanged_propagatesToBouncer() {
163 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
164 true /* tracking */);
165 verify(mBouncer).setExpansion(eq(0.5f));
166 }
167
168 @Test
169 public void onPanelExpansionChanged_showsBouncerWhenSwiping() {
170 when(mStatusBar.isKeyguardCurrentlySecure()).thenReturn(true);
171 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
172 true /* tracking */);
173 verify(mBouncer).show(eq(false), eq(false));
174
175 // But not when it's already visible
176 reset(mBouncer);
177 when(mBouncer.isShowing()).thenReturn(true);
178 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */, true /* tracking */);
179 verify(mBouncer, never()).show(eq(false), eq(false));
180
181 // Or animating away
182 reset(mBouncer);
183 when(mBouncer.isAnimatingAway()).thenReturn(true);
184 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */, true /* tracking */);
185 verify(mBouncer, never()).show(eq(false), eq(false));
186 }
187
Lucas Dupinaece5022018-05-21 16:44:28 -0700188 @Test
189 public void onPanelExpansionChanged_neverTranslatesBouncerWhenOccluded() {
190 mStatusBarKeyguardViewManager.setOccluded(true /* occluded */, false /* animate */);
191 mStatusBarKeyguardViewManager.onPanelExpansionChanged(0.5f /* expansion */,
192 true /* tracking */);
193 verify(mBouncer, never()).setExpansion(eq(0.5f));
194 }
195
Lucas Dupin71dd4842018-05-29 15:41:03 -0700196 @Test
197 public void onPanelExpansionChanged_neverTranslatesBouncerWhenWakeAndUnlock() {
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200198 when(mBiometrucUnlockController.getMode())
199 .thenReturn(BiometricUnlockController.MODE_WAKE_AND_UNLOCK);
Lucas Dupin71dd4842018-05-29 15:41:03 -0700200 mStatusBarKeyguardViewManager.onPanelExpansionChanged(KeyguardBouncer.EXPANSION_VISIBLE,
201 false /* tracking */);
202 verify(mBouncer, never()).setExpansion(anyFloat());
203 }
204
Lucas Dupinaaac2cb2018-06-08 14:11:41 -0700205 @Test
206 public void onPanelExpansionChanged_neverTranslatesBouncerWhenLaunchingApp() {
207 when(mStatusBar.isInLaunchTransition()).thenReturn(true);
208 mStatusBarKeyguardViewManager.onPanelExpansionChanged(KeyguardBouncer.EXPANSION_VISIBLE,
209 false /* tracking */);
210 verify(mBouncer, never()).setExpansion(anyFloat());
211 }
212
Lucas Dupine9e70712019-05-01 14:41:49 -0700213 @Test
214 public void setOccluded_animatesPanelExpansion_onlyIfBouncerHidden() {
215 mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */);
216 verify(mStatusBar).animateKeyguardUnoccluding();
217
218 when(mBouncer.isShowing()).thenReturn(true);
219 clearInvocations(mStatusBar);
220 mStatusBarKeyguardViewManager.setOccluded(false /* occluded */, true /* animated */);
221 verify(mStatusBar, never()).animateKeyguardUnoccluding();
222 }
223
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700224 private class TestableStatusBarKeyguardViewManager extends StatusBarKeyguardViewManager {
225
226 public TestableStatusBarKeyguardViewManager(Context context,
227 ViewMediatorCallback callback,
228 LockPatternUtils lockPatternUtils) {
229 super(context, callback, lockPatternUtils);
230 }
231
232 @Override
233 public void registerStatusBar(StatusBar statusBar, ViewGroup container,
234 NotificationPanelView notificationPanelView,
Gilad Brettercb51b8b2018-03-22 17:04:51 +0200235 BiometricUnlockController fingerprintUnlockController,
Lucas Dupin2e838ac2019-04-17 16:50:58 -0700236 DismissCallbackRegistry dismissCallbackRegistry,
Selim Cinek06c12d62019-07-01 19:44:18 -0700237 ViewGroup lockIconContainer, View notificationContainer,
Dave Mankoff781ef7e2019-06-28 16:33:25 -0400238 KeyguardBypassController bypassController, FalsingManager falsingManager) {
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700239 super.registerStatusBar(statusBar, container, notificationPanelView,
Selim Cinek06c12d62019-07-01 19:44:18 -0700240 fingerprintUnlockController, dismissCallbackRegistry, lockIconContainer,
Dave Mankoff781ef7e2019-06-28 16:33:25 -0400241 notificationContainer, bypassController, falsingManager);
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700242 mBouncer = StatusBarKeyguardViewManagerTest.this.mBouncer;
243 }
244 }
Dave Mankoff781ef7e2019-06-28 16:33:25 -0400245}