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

Commit 0eea801c authored by Anton Potapov's avatar Anton Potapov
Browse files

Introduce screenshot tests for the Volume Panel

Flag: com.android.systemui.new_volume_panel
Test: atest VolumePanelViewModelTest
Test: atest VolumePanelScreenshotTest
Fixes: 338223243
Change-Id: I757e83179ede61335835664efcf9c581d07f814c
parent 7f1b8edc
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