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

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

Merge "Use AudioOutputInteractor for ANC and Spatial Audio." into main

parents 2030d4f8 49c2a00e
Loading
Loading
Loading
Loading
+34 −39
Original line number Diff line number Diff line
@@ -18,20 +18,13 @@ package com.android.systemui.volume.panel.component.anc.data.repository

import android.bluetooth.BluetoothDevice
import android.net.Uri
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.settingslib.bluetooth.CachedBluetoothDevice
import com.android.settingslib.media.BluetoothMediaDevice
import com.android.settingslib.media.MediaDevice
import com.android.systemui.SysuiTestCase
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.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.volume.localMediaRepository
import com.android.systemui.volume.localMediaRepositoryFactory
import com.android.systemui.volume.panel.component.anc.FakeSliceFactory
import com.android.systemui.volume.panel.component.anc.sliceViewManager
import com.google.common.truth.Truth.assertThat
@@ -41,10 +34,14 @@ 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.mock
import org.mockito.kotlin.whenever

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
class AncSliceRepositoryTest : SysuiTestCase() {

    private val kosmos = testKosmos()
@@ -57,23 +54,23 @@ class AncSliceRepositoryTest : SysuiTestCase() {
            val slice = FakeSliceFactory.createSlice(hasError = false, hasSliceItem = true)
            whenever(sliceViewManager.bindSlice(any<Uri>())).thenReturn(slice)

            underTest =
                AncSliceRepositoryImpl(
                    localMediaRepositoryFactory,
                    testScope.testScheduler,
                    testScope.testScheduler,
                    sliceViewManager,
                )
            underTest = AncSliceRepositoryImpl(testScope.testScheduler, sliceViewManager)
        }
    }

    @Test
    fun noConnectedDevice_noSlice() {
    fun connectedDevice_noUri_noSlice() {
        with(kosmos) {
            testScope.runTest {
                localMediaRepository.updateCurrentConnectedDevice(null)

                val slice by collectLastValue(underTest.ancSlice(1, false, false))
                val slice by
                    collectLastValue(
                        underTest.ancSlice(
                            device = createMediaDevice(""),
                            width = 1,
                            isCollapsed = false,
                            hideLabel = false,
                        )
                    )
                runCurrent()

                assertThat(slice).isNull()
@@ -82,12 +79,18 @@ class AncSliceRepositoryTest : SysuiTestCase() {
    }

    @Test
    fun connectedDevice_sliceReturned() {
    fun connectedDevice_hasUri_sliceReturned() {
        with(kosmos) {
            testScope.runTest {
                localMediaRepository.updateCurrentConnectedDevice(createMediaDevice())

                val slice by collectLastValue(underTest.ancSlice(1, false, false))
                val slice by
                    collectLastValue(
                        underTest.ancSlice(
                            device = createMediaDevice("content://test.slice"),
                            width = 1,
                            isCollapsed = false,
                            hideLabel = false,
                        )
                    )
                runCurrent()

                assertThat(slice).isNotNull()
@@ -95,9 +98,8 @@ class AncSliceRepositoryTest : SysuiTestCase() {
        }
    }

    private fun createMediaDevice(sliceUri: String = "content://test.slice"): MediaDevice {
        val bluetoothDevice: BluetoothDevice = mock {
            whenever(getMetadata(any()))
    private fun createMediaDevice(sliceUri: String): BluetoothDevice = mock {
        on { getMetadata(any()) }
            .thenReturn(
                ("<HEARABLE_CONTROL_SLICE_WITH_WIDTH>" +
                        sliceUri +
@@ -105,11 +107,4 @@ class AncSliceRepositoryTest : SysuiTestCase() {
                    .toByteArray()
            )
    }
        val cachedBluetoothDevice: CachedBluetoothDevice = mock {
            whenever(device).thenReturn(bluetoothDevice)
        }
        return mock<BluetoothMediaDevice> {
            whenever(cachedDevice).thenReturn(cachedBluetoothDevice)
        }
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -16,7 +16,9 @@

package com.android.systemui.volume.panel.component.anc.domain

import android.media.AudioManager
import android.net.Uri
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -26,10 +28,13 @@ import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.volume.data.repository.audioRepository
import com.android.systemui.volume.localMediaRepository
import com.android.systemui.volume.panel.component.anc.FakeSliceFactory
import com.android.systemui.volume.panel.component.anc.ancSliceInteractor
import com.android.systemui.volume.panel.component.anc.ancSliceRepository
import com.android.systemui.volume.panel.component.anc.sliceViewManager
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
@@ -41,6 +46,7 @@ import org.junit.runner.RunWith
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
class AncAvailabilityCriteriaTest : SysuiTestCase() {

    private val kosmos = testKosmos()
@@ -74,6 +80,10 @@ class AncAvailabilityCriteriaTest : SysuiTestCase() {
    fun hasSlice_available() {
        with(kosmos) {
            testScope.runTest {
                audioRepository.setMode(AudioManager.MODE_NORMAL)
                localMediaRepository.updateCurrentConnectedDevice(
                    TestMediaDevicesFactory.bluetoothMediaDevice()
                )
                ancSliceRepository.putSlice(
                    1,
                    FakeSliceFactory.createSlice(hasError = false, hasSliceItem = true)
+33 −6
Original line number Diff line number Diff line
@@ -16,15 +16,21 @@

package com.android.systemui.volume.panel.component.anc.domain.interactor

import android.media.AudioManager
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.android.systemui.volume.data.repository.audioRepository
import com.android.systemui.volume.localMediaRepository
import com.android.systemui.volume.panel.component.anc.FakeSliceFactory
import com.android.systemui.volume.panel.component.anc.ancSliceInteractor
import com.android.systemui.volume.panel.component.anc.ancSliceRepository
import com.android.systemui.volume.panel.component.anc.domain.model.AncSlices
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
@@ -36,6 +42,7 @@ import org.junit.runner.RunWith
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
class AncSliceInteractorTest : SysuiTestCase() {

    private val kosmos = testKosmos()
@@ -43,14 +50,12 @@ class AncSliceInteractorTest : SysuiTestCase() {
    private lateinit var underTest: AncSliceInteractor

    @Before
    fun setup() {
        with(kosmos) {
            underTest = AncSliceInteractor(ancSliceRepository, testScope.backgroundScope)
        }
    fun setUp() {
        underTest = kosmos.ancSliceInteractor
    }

    @Test
    fun errorSlice_returnsNull() {
    fun errorSlice_returnsUnavailable() {
        with(kosmos) {
            testScope.runTest {
                ancSliceRepository.putSlice(
@@ -67,7 +72,7 @@ class AncSliceInteractorTest : SysuiTestCase() {
    }

    @Test
    fun noSliceItem_returnsNull() {
    fun noSliceItem_returnsUnavailable() {
        with(kosmos) {
            testScope.runTest {
                ancSliceRepository.putSlice(
@@ -83,10 +88,32 @@ class AncSliceInteractorTest : SysuiTestCase() {
        }
    }

    @Test
    fun sliceItem_noError_noDevice_returnsUnavailable() {
        with(kosmos) {
            testScope.runTest {
                ancSliceRepository.putSlice(
                    1,
                    FakeSliceFactory.createSlice(hasError = false, hasSliceItem = true)
                )

                val slice by collectLastValue(underTest.ancSlices)
                runCurrent()

                assertThat(slice).isInstanceOf(AncSlices.Unavailable::class.java)
            }
        }
    }

    @Test
    fun sliceItem_noError_returnsSlice() {
        with(kosmos) {
            testScope.runTest {
                audioRepository.setMode(AudioManager.MODE_NORMAL)
                localMediaRepository.updateCurrentConnectedDevice(
                    TestMediaDevicesFactory.bluetoothMediaDevice()
                )

                ancSliceRepository.putSlice(
                    1,
                    FakeSliceFactory.createSlice(hasError = false, hasSliceItem = true)
+2 −2
Original line number Diff line number Diff line
@@ -19,13 +19,13 @@ package com.android.systemui.volume.panel.component.spatial
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testScope
import com.android.systemui.media.spatializerInteractor
import com.android.systemui.volume.mediaOutputInteractor
import com.android.systemui.volume.domain.interactor.audioOutputInteractor
import com.android.systemui.volume.panel.component.spatial.domain.interactor.SpatialAudioComponentInteractor

val Kosmos.spatialAudioComponentInteractor by
    Kosmos.Fixture {
        SpatialAudioComponentInteractor(
            mediaOutputInteractor,
            audioOutputInteractor,
            spatializerInteractor,
            testScope.backgroundScope
        )
+2 −8
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.kosmos.testScope
import com.android.systemui.media.spatializerInteractor
import com.android.systemui.media.spatializerRepository
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.mock
@@ -37,9 +36,9 @@ import com.android.systemui.util.mockito.whenever
import com.android.systemui.volume.localMediaController
import com.android.systemui.volume.localMediaRepository
import com.android.systemui.volume.mediaControllerRepository
import com.android.systemui.volume.mediaOutputInteractor
import com.android.systemui.volume.panel.component.spatial.domain.model.SpatialAudioAvailabilityModel
import com.android.systemui.volume.panel.component.spatial.domain.model.SpatialAudioEnabledModel
import com.android.systemui.volume.panel.component.spatial.spatialAudioComponentInteractor
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
@@ -76,12 +75,7 @@ class SpatialAudioComponentInteractorTest : SysuiTestCase() {

            mediaControllerRepository.setActiveSessions(listOf(localMediaController))

            underTest =
                SpatialAudioComponentInteractor(
                    mediaOutputInteractor,
                    spatializerInteractor,
                    testScope.backgroundScope,
                )
            underTest = spatialAudioComponentInteractor
        }
    }

Loading