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

Commit 49c2a00e authored by Anton Potapov's avatar Anton Potapov
Browse files

Use AudioOutputInteractor for ANC and Spatial Audio.

Flag: com.android.systemui.new_volume_panel
Test: atest AncSliceRepositoryTest
Test: atest AncSliceInteractorTest
Test: atest SpatialAudioComponentInteractorTest
Test: manual on the phone with a connected headset
Fixes: 330107223
Change-Id: I35a22f3a5c74db4975e11e254ca02af12970ebf2
parent 555e853a
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