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.keyguard
18 
19 import android.app.ActivityTaskManager
20 import android.content.pm.PackageManager
21 import android.os.PowerManager
22 import android.telecom.TelecomManager
23 import android.telephony.TelephonyManager
24 import android.testing.AndroidTestingRunner
25 import android.testing.TestableLooper
26 import androidx.test.filters.SmallTest
27 import com.android.internal.logging.MetricsLogger
28 import com.android.internal.widget.LockPatternUtils
29 import com.android.systemui.SysuiTestCase
30 import com.android.systemui.shade.ShadeController
31 import com.android.systemui.statusbar.policy.ConfigurationController
32 import com.android.systemui.util.concurrency.FakeExecutor
33 import com.android.systemui.util.mockito.any
34 import com.android.systemui.util.mockito.eq
35 import com.android.systemui.util.time.FakeSystemClock
36 import org.junit.Before
37 import org.junit.Test
38 import org.junit.runner.RunWith
39 import org.mockito.Mock
40 import org.mockito.Mockito
41 import org.mockito.Mockito.anyInt
42 import org.mockito.Mockito.never
43 import org.mockito.Mockito.verify
44 import org.mockito.MockitoAnnotations
45 
46 @SmallTest
47 @RunWith(AndroidTestingRunner::class)
48 @TestableLooper.RunWithLooper
49 class EmergencyButtonControllerTest : SysuiTestCase() {
50     lateinit var underTest: EmergencyButtonController
51     @Mock lateinit var emergencyButton: EmergencyButton
52     @Mock lateinit var configurationController: ConfigurationController
53     @Mock lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
54     @Mock lateinit var telephonyManager: TelephonyManager
55     @Mock lateinit var powerManager: PowerManager
56     @Mock lateinit var activityTaskManager: ActivityTaskManager
57     @Mock lateinit var shadeController: ShadeController
58     @Mock lateinit var telecomManager: TelecomManager
59     @Mock lateinit var metricsLogger: MetricsLogger
60     @Mock lateinit var lockPatternUtils: LockPatternUtils
61     @Mock lateinit var packageManager: PackageManager
62     val fakeSystemClock = FakeSystemClock()
63     val mainExecutor = FakeExecutor(fakeSystemClock)
64     val backgroundExecutor = FakeExecutor(fakeSystemClock)
65 
66     @Before
67     fun setup() {
68         MockitoAnnotations.initMocks(this)
69         underTest =
70             EmergencyButtonController(
71                 emergencyButton,
72                 configurationController,
73                 keyguardUpdateMonitor,
74                 telephonyManager,
75                 powerManager,
76                 activityTaskManager,
77                 shadeController,
78                 telecomManager,
79                 metricsLogger,
80                 lockPatternUtils,
81                 mainExecutor,
82                 backgroundExecutor
83             )
84         context.setMockPackageManager(packageManager)
85         Mockito.`when`(emergencyButton.context).thenReturn(context)
86     }
87 
88     @Test
89     fun testUpdateEmergencyButton() {
90         Mockito.`when`(telecomManager.isInCall).thenReturn(true)
91         Mockito.`when`(lockPatternUtils.isSecure(anyInt())).thenReturn(true)
92         Mockito.`when`(packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY))
93             .thenReturn(true)
94         underTest.updateEmergencyCallButton()
95         backgroundExecutor.runAllReady()
96         verify(emergencyButton, never())
97             .updateEmergencyCallButton(
98                 /* isInCall= */ any(),
99                 /* hasTelephonyRadio= */ any(),
100                 /* simLocked= */ any(),
101                 /* isSecure= */ any()
102             )
103         mainExecutor.runAllReady()
104         verify(emergencyButton)
105             .updateEmergencyCallButton(
106                 /* isInCall= */ eq(true),
107                 /* hasTelephonyRadio= */ eq(true),
108                 /* simLocked= */ any(),
109                 /* isSecure= */ eq(true)
110             )
111     }
112 }
113