1 /*
2  * Copyright (C) 2023 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 android.testing.TestableLooper
20 import androidx.test.ext.junit.runners.AndroidJUnit4
21 import androidx.test.filters.SmallTest
22 import com.android.systemui.RoboPilotTest
23 import com.android.systemui.SysuiTestCase
24 import com.android.systemui.dump.DumpManager
25 import com.android.systemui.plugins.statusbar.StatusBarStateController
26 import com.android.systemui.shade.ShadeExpansionChangeEvent
27 import com.android.systemui.shade.ShadeExpansionStateManager
28 import com.android.systemui.statusbar.phone.SystemUIDialogManager
29 import com.android.systemui.util.mockito.any
30 import com.android.systemui.util.mockito.whenever
31 import com.android.systemui.util.mockito.withArgCaptor
32 import org.junit.Assert.assertFalse
33 import org.junit.Before
34 import org.junit.Rule
35 import org.junit.Test
36 import org.junit.runner.RunWith
37 import org.mockito.Mock
38 import org.mockito.Mockito.verify
39 import org.mockito.junit.MockitoJUnit
40 
41 @SmallTest
42 @RoboPilotTest
43 @RunWith(AndroidJUnit4::class)
44 @TestableLooper.RunWithLooper
45 class UdfpsBpViewControllerTest : SysuiTestCase() {
46 
47     @JvmField @Rule var rule = MockitoJUnit.rule()
48 
49     @Mock lateinit var udfpsBpView: UdfpsBpView
50     @Mock lateinit var statusBarStateController: StatusBarStateController
51     @Mock lateinit var shadeExpansionStateManager: ShadeExpansionStateManager
52     @Mock lateinit var systemUIDialogManager: SystemUIDialogManager
53     @Mock lateinit var dumpManager: DumpManager
54 
55     private lateinit var udfpsBpViewController: UdfpsBpViewController
56 
57     @Before
58     fun setup() {
59         whenever(shadeExpansionStateManager.addExpansionListener(any()))
60             .thenReturn(ShadeExpansionChangeEvent(0f, false, false, 0f))
61         udfpsBpViewController =
62             UdfpsBpViewController(
63                 udfpsBpView,
64                 statusBarStateController,
65                 shadeExpansionStateManager,
66                 systemUIDialogManager,
67                 dumpManager
68             )
69     }
70 
71     @Test
72     fun testPauseAuthWhenNotificationShadeDragging() {
73         udfpsBpViewController.onViewAttached()
74         val shadeExpansionListener = withArgCaptor {
75             verify(shadeExpansionStateManager).addExpansionListener(capture())
76         }
77 
78         // When shade is tracking, should pause auth
79         shadeExpansionListener.onPanelExpansionChanged(
80             ShadeExpansionChangeEvent(
81                 fraction = 0f,
82                 expanded = false,
83                 tracking = true,
84                 dragDownPxAmount = 10f
85             )
86         )
87         assert(udfpsBpViewController.shouldPauseAuth())
88 
89         // When shade is not tracking, don't pause auth even if expanded
90         shadeExpansionListener.onPanelExpansionChanged(
91             ShadeExpansionChangeEvent(
92                 fraction = 0f,
93                 expanded = true,
94                 tracking = false,
95                 dragDownPxAmount = 10f
96             )
97         )
98         assertFalse(udfpsBpViewController.shouldPauseAuth())
99     }
100 }
101