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 18 package com.android.systemui.keyguard.data.quickaffordance 19 20 import android.content.Context 21 import android.media.AudioManager 22 import androidx.test.ext.junit.runners.AndroidJUnit4 23 import androidx.test.filters.SmallTest 24 import com.android.systemui.RoboPilotTest 25 import com.android.systemui.SysuiTestCase 26 import com.android.systemui.settings.UserFileManager 27 import com.android.systemui.settings.UserTracker 28 import com.android.systemui.util.RingerModeTracker 29 import com.android.systemui.util.mockito.any 30 import com.android.systemui.util.mockito.argumentCaptor 31 import com.android.systemui.util.mockito.whenever 32 import kotlinx.coroutines.ExperimentalCoroutinesApi 33 import kotlinx.coroutines.test.StandardTestDispatcher 34 import kotlinx.coroutines.test.TestDispatcher 35 import kotlinx.coroutines.test.TestScope 36 import kotlinx.coroutines.test.runCurrent 37 import kotlinx.coroutines.test.runTest 38 import org.junit.Assert.assertEquals 39 import org.junit.Before 40 import org.junit.Test 41 import org.junit.runner.RunWith 42 import org.mockito.Mock 43 import org.mockito.Mockito.times 44 import org.mockito.Mockito.verify 45 import org.mockito.MockitoAnnotations 46 47 @OptIn(ExperimentalCoroutinesApi::class) 48 @SmallTest 49 @RoboPilotTest 50 @RunWith(AndroidJUnit4::class) 51 class MuteQuickAffordanceConfigTest : SysuiTestCase() { 52 53 private lateinit var underTest: MuteQuickAffordanceConfig 54 @Mock 55 private lateinit var ringerModeTracker: RingerModeTracker 56 @Mock 57 private lateinit var audioManager: AudioManager 58 @Mock 59 private lateinit var userTracker: UserTracker 60 @Mock 61 private lateinit var userFileManager: UserFileManager 62 63 private lateinit var testDispatcher: TestDispatcher 64 private lateinit var testScope: TestScope 65 66 @Before setUpnull67 fun setUp() { 68 MockitoAnnotations.initMocks(this) 69 70 testDispatcher = StandardTestDispatcher() 71 testScope = TestScope(testDispatcher) 72 73 whenever(userTracker.userContext).thenReturn(context) 74 whenever(userFileManager.getSharedPreferences(any(), any(), any())) 75 .thenReturn(context.getSharedPreferences("mutequickaffordancetest", Context.MODE_PRIVATE)) 76 77 underTest = MuteQuickAffordanceConfig( 78 context, 79 userTracker, 80 userFileManager, 81 ringerModeTracker, 82 audioManager, 83 testScope.backgroundScope, 84 testDispatcher, 85 testDispatcher, 86 ) 87 } 88 89 @Test <lambda>null90 fun pickerState_volumeFixed_notAvailable() = testScope.runTest { 91 //given 92 whenever(audioManager.isVolumeFixed).thenReturn(true) 93 94 //when 95 val result = underTest.getPickerScreenState() 96 97 //then 98 assertEquals(KeyguardQuickAffordanceConfig.PickerScreenState.UnavailableOnDevice, result) 99 } 100 101 @Test <lambda>null102 fun pickerState_volumeNotFixed_available() = testScope.runTest { 103 //given 104 whenever(audioManager.isVolumeFixed).thenReturn(false) 105 106 //when 107 val result = underTest.getPickerScreenState() 108 109 //then 110 assertEquals(KeyguardQuickAffordanceConfig.PickerScreenState.Default(), result) 111 } 112 113 @Test <lambda>null114 fun triggered_stateWasPreviouslyNORMAL_currentlySILENT_moveToPreviousState() = testScope.runTest { 115 //given 116 val ringerModeCapture = argumentCaptor<Int>() 117 whenever(audioManager.ringerModeInternal).thenReturn(AudioManager.RINGER_MODE_NORMAL) 118 underTest.onTriggered(null) 119 whenever(audioManager.ringerModeInternal).thenReturn(AudioManager.RINGER_MODE_SILENT) 120 121 //when 122 val result = underTest.onTriggered(null) 123 runCurrent() 124 verify(audioManager, times(2)).ringerModeInternal = ringerModeCapture.capture() 125 126 //then 127 assertEquals(KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled, result) 128 assertEquals(AudioManager.RINGER_MODE_NORMAL, ringerModeCapture.value) 129 } 130 131 @Test <lambda>null132 fun triggered_stateIsNotSILENT_moveToSILENTringer() = testScope.runTest { 133 //given 134 val ringerModeCapture = argumentCaptor<Int>() 135 whenever(audioManager.ringerModeInternal).thenReturn(AudioManager.RINGER_MODE_NORMAL) 136 137 //when 138 val result = underTest.onTriggered(null) 139 runCurrent() 140 verify(audioManager).ringerModeInternal = ringerModeCapture.capture() 141 142 //then 143 assertEquals(KeyguardQuickAffordanceConfig.OnTriggeredResult.Handled, result) 144 assertEquals(AudioManager.RINGER_MODE_SILENT, ringerModeCapture.value) 145 } 146 }