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