1 /*
2  * Copyright (C) 2022 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.qs.tiles
18 
19 import android.os.Handler
20 import android.testing.AndroidTestingRunner
21 import android.testing.TestableLooper
22 import androidx.test.filters.SmallTest
23 import com.android.internal.logging.MetricsLogger
24 import com.android.systemui.R
25 import com.android.systemui.SysuiTestCase
26 import com.android.systemui.classifier.FalsingManagerFake
27 import com.android.systemui.plugins.ActivityStarter
28 import com.android.systemui.plugins.qs.QSTile
29 import com.android.systemui.plugins.statusbar.StatusBarStateController
30 import com.android.systemui.qs.QSHost
31 import com.android.systemui.qs.QsEventLoggerFake
32 import com.android.systemui.qs.logging.QSLogger
33 import com.android.systemui.qs.tileimpl.QSTileImpl
34 import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController
35 import com.android.systemui.statusbar.policy.KeyguardStateController
36 import com.google.common.truth.Truth.assertThat
37 import org.junit.After
38 import org.junit.Before
39 import org.junit.Test
40 import org.junit.runner.RunWith
41 import org.mockito.Mock
42 import org.mockito.MockitoAnnotations
43 import org.mockito.Mockito.`when` as whenever
44 
45 @RunWith(AndroidTestingRunner::class)
46 @TestableLooper.RunWithLooper(setAsMainLooper = true)
47 @SmallTest
48 class CameraToggleTileTest : SysuiTestCase() {
49     companion object {
50         /* isBlocked */
51         const val CAMERA_TOGGLE_ENABLED: Boolean = false
52         const val CAMERA_TOGGLE_DISABLED: Boolean = true
53     }
54 
55     @Mock
56     private lateinit var host: QSHost
57     @Mock
58     private lateinit var metricsLogger: MetricsLogger
59     @Mock
60     private lateinit var statusBarStateController: StatusBarStateController
61     @Mock
62     private lateinit var activityStarter: ActivityStarter
63     @Mock
64     private lateinit var qsLogger: QSLogger
65     @Mock
66     private lateinit var privacyController: IndividualSensorPrivacyController
67     @Mock
68     private lateinit var keyguardStateController: KeyguardStateController
69     @Mock
70     private lateinit var uiEventLogger: QsEventLoggerFake
71 
72     private lateinit var testableLooper: TestableLooper
73     private lateinit var tile: CameraToggleTile
74 
75     @Before
76     fun setUp() {
77         MockitoAnnotations.initMocks(this)
78         testableLooper = TestableLooper.get(this)
79         whenever(host.context).thenReturn(mContext)
80 
81         tile = CameraToggleTile(
82                 host,
83                 uiEventLogger,
84                 testableLooper.looper,
85                 Handler(testableLooper.looper),
86                 metricsLogger,
87                 FalsingManagerFake(),
88                 statusBarStateController,
89                 activityStarter,
90                 qsLogger,
91                 privacyController,
92                 keyguardStateController)
93     }
94 
95     @After
96     fun tearDown() {
97         tile.destroy()
98         testableLooper.processAllMessages()
99     }
100 
101     @Test
102     fun testIcon_whenCameraAccessEnabled_isOnState() {
103         val state = QSTile.BooleanState()
104 
105         tile.handleUpdateState(state, CAMERA_TOGGLE_ENABLED)
106 
107         assertThat(state.icon)
108                 .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_camera_access_icon_on))
109     }
110 
111     @Test
112     fun testIcon_whenCameraAccessDisabled_isOffState() {
113         val state = QSTile.BooleanState()
114 
115         tile.handleUpdateState(state, CAMERA_TOGGLE_DISABLED)
116 
117         assertThat(state.icon)
118                 .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_camera_access_icon_off))
119     }
120 }
121