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.QsEventLogger 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 MicrophoneToggleTileTest : SysuiTestCase() { 49 companion object { 50 /* isBlocked */ 51 const val MICROPHONE_TOGGLE_ENABLED: Boolean = false 52 const val MICROPHONE_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: QsEventLogger 71 72 private lateinit var testableLooper: TestableLooper 73 private lateinit var tile: MicrophoneToggleTile 74 75 76 @Before 77 fun setUp() { 78 MockitoAnnotations.initMocks(this) 79 testableLooper = TestableLooper.get(this) 80 whenever(host.context).thenReturn(mContext) 81 82 tile = MicrophoneToggleTile( 83 host, 84 uiEventLogger, 85 testableLooper.looper, 86 Handler(testableLooper.looper), 87 metricsLogger, 88 FalsingManagerFake(), 89 statusBarStateController, 90 activityStarter, 91 qsLogger, 92 privacyController, 93 keyguardStateController) 94 } 95 96 @After 97 fun tearDown() { 98 tile.destroy() 99 testableLooper.processAllMessages() 100 } 101 102 @Test 103 fun testIcon_whenMicrophoneAccessEnabled_isOnState() { 104 val state = QSTile.BooleanState() 105 106 tile.handleUpdateState(state, MICROPHONE_TOGGLE_ENABLED) 107 108 assertThat(state.icon).isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_mic_access_on)) 109 } 110 111 @Test 112 fun testIcon_whenMicrophoneAccessDisabled_isOffState() { 113 val state = QSTile.BooleanState() 114 115 tile.handleUpdateState(state, MICROPHONE_TOGGLE_DISABLED) 116 117 assertThat(state.icon).isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_mic_access_off)) 118 } 119 } 120