1 /*
2  * Copyright (C) 2020 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 
17 package com.android.systemui.biometrics;
18 
19 import static org.mockito.ArgumentMatchers.any;
20 import static org.mockito.ArgumentMatchers.anyInt;
21 import static org.mockito.Mockito.times;
22 import static org.mockito.Mockito.verify;
23 import static org.mockito.Mockito.when;
24 
25 import android.content.Context;
26 
27 import com.android.keyguard.KeyguardUpdateMonitor;
28 import com.android.systemui.SysuiTestCase;
29 import com.android.systemui.animation.ActivityLaunchAnimator;
30 import com.android.systemui.dump.DumpManager;
31 import com.android.systemui.flags.FakeFeatureFlags;
32 import com.android.systemui.flags.Flags;
33 import com.android.systemui.keyguard.KeyguardViewMediator;
34 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
35 import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
36 import com.android.systemui.plugins.statusbar.StatusBarStateController;
37 import com.android.systemui.shade.ShadeExpansionChangeEvent;
38 import com.android.systemui.shade.ShadeExpansionListener;
39 import com.android.systemui.shade.ShadeExpansionStateManager;
40 import com.android.systemui.statusbar.LockscreenShadeTransitionController;
41 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
42 import com.android.systemui.statusbar.phone.SystemUIDialogManager;
43 import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
44 import com.android.systemui.statusbar.policy.ConfigurationController;
45 import com.android.systemui.statusbar.policy.KeyguardStateController;
46 import com.android.systemui.util.concurrency.DelayableExecutor;
47 
48 import org.junit.Before;
49 import org.mockito.ArgumentCaptor;
50 import org.mockito.Captor;
51 import org.mockito.Mock;
52 import org.mockito.MockitoAnnotations;
53 
54 import java.util.List;
55 
56 public class UdfpsKeyguardViewLegacyControllerBaseTest extends SysuiTestCase {
57     // Dependencies
58     protected @Mock UdfpsKeyguardViewLegacy mView;
59     protected @Mock Context mResourceContext;
60     protected @Mock StatusBarStateController mStatusBarStateController;
61     protected @Mock ShadeExpansionStateManager mShadeExpansionStateManager;
62     protected @Mock StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
63     protected @Mock LockscreenShadeTransitionController mLockscreenShadeTransitionController;
64     protected @Mock DumpManager mDumpManager;
65     protected @Mock DelayableExecutor mExecutor;
66     protected @Mock KeyguardUpdateMonitor mKeyguardUpdateMonitor;
67     protected @Mock KeyguardStateController mKeyguardStateController;
68     protected @Mock KeyguardViewMediator mKeyguardViewMediator;
69     protected @Mock ConfigurationController mConfigurationController;
70     protected @Mock UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
71     protected @Mock SystemUIDialogManager mDialogManager;
72     protected @Mock UdfpsController mUdfpsController;
73     protected @Mock ActivityLaunchAnimator mActivityLaunchAnimator;
74     protected @Mock PrimaryBouncerInteractor mPrimaryBouncerInteractor;
75     protected @Mock AlternateBouncerInteractor mAlternateBouncerInteractor;
76     protected @Mock UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate;
77 
78     protected FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
79 
80     protected UdfpsKeyguardViewControllerLegacy mController;
81 
82     // Capture listeners so that they can be used to send events
83     private @Captor ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerCaptor;
84     protected StatusBarStateController.StateListener mStatusBarStateListener;
85 
86     private @Captor ArgumentCaptor<ShadeExpansionListener> mExpansionListenerCaptor;
87     protected List<ShadeExpansionListener> mExpansionListeners;
88 
89     private @Captor ArgumentCaptor<KeyguardStateController.Callback>
90             mKeyguardStateControllerCallbackCaptor;
91     protected KeyguardStateController.Callback mKeyguardStateControllerCallback;
92 
93     private @Captor ArgumentCaptor<StatusBarKeyguardViewManager.KeyguardViewManagerCallback>
94             mKeyguardViewManagerCallbackArgumentCaptor;
95     protected StatusBarKeyguardViewManager.KeyguardViewManagerCallback mKeyguardViewManagerCallback;
96 
97 
98     @Before
setUp()99     public void setUp() {
100         MockitoAnnotations.initMocks(this);
101         when(mView.getContext()).thenReturn(mResourceContext);
102         when(mResourceContext.getString(anyInt())).thenReturn("test string");
103         when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
104         when(mView.getUnpausedAlpha()).thenReturn(255);
105         when(mShadeExpansionStateManager.addExpansionListener(any())).thenReturn(
106                 new ShadeExpansionChangeEvent(0, false, false, 0));
107         mController = createUdfpsKeyguardViewController();
108     }
109 
sendStatusBarStateChanged(int statusBarState)110     protected void sendStatusBarStateChanged(int statusBarState) {
111         mStatusBarStateListener.onStateChanged(statusBarState);
112     }
113 
captureStatusBarStateListeners()114     protected void captureStatusBarStateListeners() {
115         verify(mStatusBarStateController).addCallback(mStateListenerCaptor.capture());
116         mStatusBarStateListener = mStateListenerCaptor.getValue();
117     }
118 
captureStatusBarExpansionListeners()119     protected void captureStatusBarExpansionListeners() {
120         verify(mShadeExpansionStateManager, times(2))
121                 .addExpansionListener(mExpansionListenerCaptor.capture());
122         // first (index=0) is from super class, UdfpsAnimationViewController.
123         // second (index=1) is from UdfpsKeyguardViewController
124         mExpansionListeners = mExpansionListenerCaptor.getAllValues();
125     }
126 
updateStatusBarExpansion(float fraction, boolean expanded)127     protected void updateStatusBarExpansion(float fraction, boolean expanded) {
128         ShadeExpansionChangeEvent event =
129                 new ShadeExpansionChangeEvent(
130                         fraction, expanded, /* tracking= */ false, /* dragDownPxAmount= */ 0f);
131         for (ShadeExpansionListener listener : mExpansionListeners) {
132             listener.onPanelExpansionChanged(event);
133         }
134     }
135 
captureKeyguardStateControllerCallback()136     protected void captureKeyguardStateControllerCallback() {
137         verify(mKeyguardStateController).addCallback(
138                 mKeyguardStateControllerCallbackCaptor.capture());
139         mKeyguardStateControllerCallback = mKeyguardStateControllerCallbackCaptor.getValue();
140     }
141 
createUdfpsKeyguardViewController()142     public UdfpsKeyguardViewControllerLegacy createUdfpsKeyguardViewController() {
143         return createUdfpsKeyguardViewController(false, false);
144     }
145 
captureKeyGuardViewManagerCallback()146     public void captureKeyGuardViewManagerCallback() {
147         verify(mStatusBarKeyguardViewManager).addCallback(
148                 mKeyguardViewManagerCallbackArgumentCaptor.capture());
149         mKeyguardViewManagerCallback = mKeyguardViewManagerCallbackArgumentCaptor.getValue();
150     }
151 
createUdfpsKeyguardViewController( boolean useModernBouncer, boolean useExpandedOverlay)152     protected UdfpsKeyguardViewControllerLegacy createUdfpsKeyguardViewController(
153             boolean useModernBouncer, boolean useExpandedOverlay) {
154         mFeatureFlags.set(Flags.UDFPS_NEW_TOUCH_DETECTION, useExpandedOverlay);
155         UdfpsKeyguardViewControllerLegacy controller = new UdfpsKeyguardViewControllerLegacy(
156                 mView,
157                 mStatusBarStateController,
158                 mShadeExpansionStateManager,
159                 mStatusBarKeyguardViewManager,
160                 mKeyguardUpdateMonitor,
161                 mDumpManager,
162                 mLockscreenShadeTransitionController,
163                 mConfigurationController,
164                 mKeyguardStateController,
165                 mUnlockedScreenOffAnimationController,
166                 mDialogManager,
167                 mUdfpsController,
168                 mActivityLaunchAnimator,
169                 mFeatureFlags,
170                 mPrimaryBouncerInteractor,
171                 mAlternateBouncerInteractor,
172                 mUdfpsKeyguardAccessibilityDelegate);
173         return controller;
174     }
175 }
176