Loading packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorTest.kt +23 −59 Original line number Diff line number Diff line Loading @@ -18,33 +18,26 @@ package com.android.systemui.volume.domain.interactor import android.bluetooth.BluetoothDevice import android.graphics.drawable.TestStubDrawable import android.media.AudioDeviceInfo import android.media.AudioDevicePort import android.media.AudioManager import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.settingslib.R import com.android.settingslib.bluetooth.CachedBluetoothDevice import com.android.settingslib.media.BluetoothMediaDevice import com.android.settingslib.media.MediaDevice import com.android.settingslib.media.PhoneMediaDevice import com.android.systemui.SysuiTestCase import com.android.systemui.bluetooth.bluetoothAdapter import com.android.systemui.bluetooth.cachedBluetoothDeviceManager import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.volume.data.repository.TestAudioDevicesFactory import com.android.systemui.volume.data.repository.audioRepository import com.android.systemui.volume.data.repository.audioSharingRepository import com.android.systemui.volume.domain.model.AudioOutputDevice import com.android.systemui.volume.localMediaController import com.android.systemui.volume.localMediaRepository import com.android.systemui.volume.mediaControllerRepository import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.TestMediaDevicesFactory import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent Loading @@ -52,6 +45,10 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.whenever @OptIn(ExperimentalCoroutinesApi::class) @RunWith(AndroidJUnit4::class) Loading Loading @@ -84,7 +81,7 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { with(audioRepository) { setMode(AudioManager.MODE_IN_CALL) setCommunicationDevice(builtInDevice) setCommunicationDevice(TestAudioDevicesFactory.builtInDevice()) } val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -104,7 +101,7 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { with(audioRepository) { setMode(AudioManager.MODE_IN_CALL) setCommunicationDevice(wiredDevice) setCommunicationDevice(TestAudioDevicesFactory.wiredDevice()) } val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -122,17 +119,18 @@ class AudioOutputInteractorTest : SysuiTestCase() { fun inCall_bluetooth_returnsCommunicationDevice() { with(kosmos) { testScope.runTest { val btDevice = TestAudioDevicesFactory.bluetoothDevice() with(audioRepository) { setMode(AudioManager.MODE_IN_CALL) setCommunicationDevice(btDevice) } val bluetoothDevice: BluetoothDevice = mock { whenever(address).thenReturn(btDevice.address) on { address }.thenReturn(btDevice.address) } val cachedBluetoothDevice: CachedBluetoothDevice = mock { whenever(address).thenReturn(btDevice.address) whenever(name).thenReturn(btDevice.productName.toString()) whenever(isHearingAidDevice).thenReturn(true) on { address }.thenReturn(btDevice.address) on { name }.thenReturn(btDevice.productName.toString()) on { isHearingAidDevice }.thenReturn(true) } whenever(bluetoothAdapter.getRemoteDevice(eq(btDevice.address))) .thenReturn(bluetoothDevice) Loading @@ -156,7 +154,9 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) mediaControllerRepository.setActiveSessions(listOf(localMediaController)) localMediaRepository.updateCurrentConnectedDevice(builtInMediaDevice) localMediaRepository.updateCurrentConnectedDevice( TestMediaDevicesFactory.builtInMediaDevice() ) val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -175,7 +175,9 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) mediaControllerRepository.setActiveSessions(listOf(localMediaController)) localMediaRepository.updateCurrentConnectedDevice(wiredMediaDevice) localMediaRepository.updateCurrentConnectedDevice( TestMediaDevicesFactory.wiredMediaDevice() ) val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -194,7 +196,9 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) mediaControllerRepository.setActiveSessions(listOf(localMediaController)) localMediaRepository.updateCurrentConnectedDevice(bluetoothMediaDevice) localMediaRepository.updateCurrentConnectedDevice( TestMediaDevicesFactory.bluetoothMediaDevice() ) val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -208,48 +212,8 @@ class AudioOutputInteractorTest : SysuiTestCase() { } private companion object { val testIcon = TestStubDrawable() val builtInDevice = AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, "built_in", "" ) ) val wiredDevice = AudioDeviceInfo( AudioDevicePort.createForTesting(AudioDeviceInfo.TYPE_WIRED_HEADPHONES, "wired", "") ) val btDevice = AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BLE_HEADSET, "bt", "test_address" ) ) val builtInMediaDevice: MediaDevice = mock<PhoneMediaDevice> { whenever(name).thenReturn("built_in_media") whenever(icon).thenReturn(testIcon) } val wiredMediaDevice: MediaDevice = mock<PhoneMediaDevice> { whenever(deviceType) .thenReturn(MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE) whenever(name).thenReturn("wired_media") whenever(icon).thenReturn(testIcon) } val bluetoothMediaDevice: MediaDevice = mock<BluetoothMediaDevice> { whenever(name).thenReturn("bt_media") whenever(icon).thenReturn(testIcon) val cachedBluetoothDevice: CachedBluetoothDevice = mock { whenever(isHearingAidDevice).thenReturn(true) } whenever(cachedDevice).thenReturn(cachedBluetoothDevice) } } @Test Loading packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractor.kt +1 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import com.android.settingslib.volume.data.repository.AudioSharingRepository import com.android.settingslib.volume.domain.interactor.AudioModeInteractor import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.volume.domain.model.AudioOutputDevice import com.android.systemui.volume.panel.component.mediaoutput.data.repository.LocalMediaRepositoryFactory import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope import javax.inject.Inject Loading Loading @@ -58,8 +57,7 @@ constructor( private val bluetoothAdapter: BluetoothAdapter?, private val deviceIconInteractor: DeviceIconInteractor, private val mediaOutputInteractor: MediaOutputInteractor, private val localMediaRepositoryFactory: LocalMediaRepositoryFactory, private val audioSharingRepository: AudioSharingRepository, audioSharingRepository: AudioSharingRepository, ) { val currentAudioDevice: Flow<AudioOutputDevice> = Loading packages/SystemUI/tests/utils/src/android/graphics/drawable/TestStubDrawable.kt +7 −0 Original line number Diff line number Diff line Loading @@ -27,8 +27,11 @@ import android.graphics.PixelFormat class TestStubDrawable(private val name: String? = null) : Drawable() { override fun draw(canvas: Canvas) = Unit override fun setAlpha(alpha: Int) = Unit override fun setColorFilter(colorFilter: ColorFilter?) = Unit override fun getOpacity(): Int = PixelFormat.UNKNOWN override fun toString(): String { Loading @@ -38,6 +41,10 @@ class TestStubDrawable(private val name: String? = null) : Drawable() { override fun getConstantState(): ConstantState = TestStubConstantState(this, changingConfigurations) override fun equals(other: Any?): Boolean { return (other as? TestStubDrawable ?: return false).name == name } private class TestStubConstantState( private val drawable: Drawable, private val changingConfigurations: Int, Loading packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/TestAudioDevicesFactory.kt 0 → 100644 +58 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.volume.data.repository import android.annotation.SuppressLint import android.media.AudioDeviceInfo import android.media.AudioDevicePort @SuppressLint("VisibleForTests") object TestAudioDevicesFactory { fun builtInDevice(deviceName: String = "built_in"): AudioDeviceInfo { return AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, deviceName, "", ) ) } fun wiredDevice(deviceName: String = "wired"): AudioDeviceInfo { return AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_WIRED_HEADPHONES, deviceName, "", ) ) } fun bluetoothDevice( deviceName: String = "bt", deviceAddress: String = "test_address", ): AudioDeviceInfo { return AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BLE_HEADSET, deviceName, deviceAddress, ) ) } } packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorKosmos.kt +0 −2 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.volume.data.repository.audioRepository import com.android.systemui.volume.data.repository.audioSharingRepository import com.android.systemui.volume.localMediaRepositoryFactory import com.android.systemui.volume.mediaOutputInteractor val Kosmos.audioOutputInteractor by Loading @@ -36,7 +35,6 @@ val Kosmos.audioOutputInteractor by bluetoothAdapter, deviceIconInteractor, mediaOutputInteractor, localMediaRepositoryFactory, audioSharingRepository, ) } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorTest.kt +23 −59 Original line number Diff line number Diff line Loading @@ -18,33 +18,26 @@ package com.android.systemui.volume.domain.interactor import android.bluetooth.BluetoothDevice import android.graphics.drawable.TestStubDrawable import android.media.AudioDeviceInfo import android.media.AudioDevicePort import android.media.AudioManager import android.testing.TestableLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.settingslib.R import com.android.settingslib.bluetooth.CachedBluetoothDevice import com.android.settingslib.media.BluetoothMediaDevice import com.android.settingslib.media.MediaDevice import com.android.settingslib.media.PhoneMediaDevice import com.android.systemui.SysuiTestCase import com.android.systemui.bluetooth.bluetoothAdapter import com.android.systemui.bluetooth.cachedBluetoothDeviceManager import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.volume.data.repository.TestAudioDevicesFactory import com.android.systemui.volume.data.repository.audioRepository import com.android.systemui.volume.data.repository.audioSharingRepository import com.android.systemui.volume.domain.model.AudioOutputDevice import com.android.systemui.volume.localMediaController import com.android.systemui.volume.localMediaRepository import com.android.systemui.volume.mediaControllerRepository import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.TestMediaDevicesFactory import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent Loading @@ -52,6 +45,10 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.whenever @OptIn(ExperimentalCoroutinesApi::class) @RunWith(AndroidJUnit4::class) Loading Loading @@ -84,7 +81,7 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { with(audioRepository) { setMode(AudioManager.MODE_IN_CALL) setCommunicationDevice(builtInDevice) setCommunicationDevice(TestAudioDevicesFactory.builtInDevice()) } val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -104,7 +101,7 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { with(audioRepository) { setMode(AudioManager.MODE_IN_CALL) setCommunicationDevice(wiredDevice) setCommunicationDevice(TestAudioDevicesFactory.wiredDevice()) } val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -122,17 +119,18 @@ class AudioOutputInteractorTest : SysuiTestCase() { fun inCall_bluetooth_returnsCommunicationDevice() { with(kosmos) { testScope.runTest { val btDevice = TestAudioDevicesFactory.bluetoothDevice() with(audioRepository) { setMode(AudioManager.MODE_IN_CALL) setCommunicationDevice(btDevice) } val bluetoothDevice: BluetoothDevice = mock { whenever(address).thenReturn(btDevice.address) on { address }.thenReturn(btDevice.address) } val cachedBluetoothDevice: CachedBluetoothDevice = mock { whenever(address).thenReturn(btDevice.address) whenever(name).thenReturn(btDevice.productName.toString()) whenever(isHearingAidDevice).thenReturn(true) on { address }.thenReturn(btDevice.address) on { name }.thenReturn(btDevice.productName.toString()) on { isHearingAidDevice }.thenReturn(true) } whenever(bluetoothAdapter.getRemoteDevice(eq(btDevice.address))) .thenReturn(bluetoothDevice) Loading @@ -156,7 +154,9 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) mediaControllerRepository.setActiveSessions(listOf(localMediaController)) localMediaRepository.updateCurrentConnectedDevice(builtInMediaDevice) localMediaRepository.updateCurrentConnectedDevice( TestMediaDevicesFactory.builtInMediaDevice() ) val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -175,7 +175,9 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) mediaControllerRepository.setActiveSessions(listOf(localMediaController)) localMediaRepository.updateCurrentConnectedDevice(wiredMediaDevice) localMediaRepository.updateCurrentConnectedDevice( TestMediaDevicesFactory.wiredMediaDevice() ) val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -194,7 +196,9 @@ class AudioOutputInteractorTest : SysuiTestCase() { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) mediaControllerRepository.setActiveSessions(listOf(localMediaController)) localMediaRepository.updateCurrentConnectedDevice(bluetoothMediaDevice) localMediaRepository.updateCurrentConnectedDevice( TestMediaDevicesFactory.bluetoothMediaDevice() ) val device by collectLastValue(underTest.currentAudioDevice) Loading @@ -208,48 +212,8 @@ class AudioOutputInteractorTest : SysuiTestCase() { } private companion object { val testIcon = TestStubDrawable() val builtInDevice = AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, "built_in", "" ) ) val wiredDevice = AudioDeviceInfo( AudioDevicePort.createForTesting(AudioDeviceInfo.TYPE_WIRED_HEADPHONES, "wired", "") ) val btDevice = AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BLE_HEADSET, "bt", "test_address" ) ) val builtInMediaDevice: MediaDevice = mock<PhoneMediaDevice> { whenever(name).thenReturn("built_in_media") whenever(icon).thenReturn(testIcon) } val wiredMediaDevice: MediaDevice = mock<PhoneMediaDevice> { whenever(deviceType) .thenReturn(MediaDevice.MediaDeviceType.TYPE_3POINT5_MM_AUDIO_DEVICE) whenever(name).thenReturn("wired_media") whenever(icon).thenReturn(testIcon) } val bluetoothMediaDevice: MediaDevice = mock<BluetoothMediaDevice> { whenever(name).thenReturn("bt_media") whenever(icon).thenReturn(testIcon) val cachedBluetoothDevice: CachedBluetoothDevice = mock { whenever(isHearingAidDevice).thenReturn(true) } whenever(cachedDevice).thenReturn(cachedBluetoothDevice) } } @Test Loading
packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractor.kt +1 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import com.android.settingslib.volume.data.repository.AudioSharingRepository import com.android.settingslib.volume.domain.interactor.AudioModeInteractor import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.volume.domain.model.AudioOutputDevice import com.android.systemui.volume.panel.component.mediaoutput.data.repository.LocalMediaRepositoryFactory import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope import javax.inject.Inject Loading Loading @@ -58,8 +57,7 @@ constructor( private val bluetoothAdapter: BluetoothAdapter?, private val deviceIconInteractor: DeviceIconInteractor, private val mediaOutputInteractor: MediaOutputInteractor, private val localMediaRepositoryFactory: LocalMediaRepositoryFactory, private val audioSharingRepository: AudioSharingRepository, audioSharingRepository: AudioSharingRepository, ) { val currentAudioDevice: Flow<AudioOutputDevice> = Loading
packages/SystemUI/tests/utils/src/android/graphics/drawable/TestStubDrawable.kt +7 −0 Original line number Diff line number Diff line Loading @@ -27,8 +27,11 @@ import android.graphics.PixelFormat class TestStubDrawable(private val name: String? = null) : Drawable() { override fun draw(canvas: Canvas) = Unit override fun setAlpha(alpha: Int) = Unit override fun setColorFilter(colorFilter: ColorFilter?) = Unit override fun getOpacity(): Int = PixelFormat.UNKNOWN override fun toString(): String { Loading @@ -38,6 +41,10 @@ class TestStubDrawable(private val name: String? = null) : Drawable() { override fun getConstantState(): ConstantState = TestStubConstantState(this, changingConfigurations) override fun equals(other: Any?): Boolean { return (other as? TestStubDrawable ?: return false).name == name } private class TestStubConstantState( private val drawable: Drawable, private val changingConfigurations: Int, Loading
packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/TestAudioDevicesFactory.kt 0 → 100644 +58 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.volume.data.repository import android.annotation.SuppressLint import android.media.AudioDeviceInfo import android.media.AudioDevicePort @SuppressLint("VisibleForTests") object TestAudioDevicesFactory { fun builtInDevice(deviceName: String = "built_in"): AudioDeviceInfo { return AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, deviceName, "", ) ) } fun wiredDevice(deviceName: String = "wired"): AudioDeviceInfo { return AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_WIRED_HEADPHONES, deviceName, "", ) ) } fun bluetoothDevice( deviceName: String = "bt", deviceAddress: String = "test_address", ): AudioDeviceInfo { return AudioDeviceInfo( AudioDevicePort.createForTesting( AudioDeviceInfo.TYPE_BLE_HEADSET, deviceName, deviceAddress, ) ) } }
packages/SystemUI/tests/utils/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorKosmos.kt +0 −2 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.volume.data.repository.audioRepository import com.android.systemui.volume.data.repository.audioSharingRepository import com.android.systemui.volume.localMediaRepositoryFactory import com.android.systemui.volume.mediaOutputInteractor val Kosmos.audioOutputInteractor by Loading @@ -36,7 +35,6 @@ val Kosmos.audioOutputInteractor by bluetoothAdapter, deviceIconInteractor, mediaOutputInteractor, localMediaRepositoryFactory, audioSharingRepository, ) }