Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ab712cb authored by Anton Potapov's avatar Anton Potapov Committed by Android (Google) Code Review
Browse files

Merge "Introduce screenshot tests for the Volume Panel" into main

parents 4bdd9afd 0eea801c
Loading
Loading
Loading
Loading
+23 −59
Original line number Diff line number Diff line
@@ -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
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)

@@ -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)

@@ -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)

@@ -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
+1 −3
Original line number Diff line number Diff line
@@ -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
@@ -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> =
+7 −0
Original line number Diff line number Diff line
@@ -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 {
@@ -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,
+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,
            )
        )
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -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
@@ -36,7 +35,6 @@ val Kosmos.audioOutputInteractor by
            bluetoothAdapter,
            deviceIconInteractor,
            mediaOutputInteractor,
            localMediaRepositoryFactory,
            audioSharingRepository,
        )
    }
Loading