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

Commit c4936066 authored by Yiyi Shen's avatar Yiyi Shen
Browse files

[Audiosharing] Move inAudioSharing from AudioOutputInteractor to AudioSharingInteractor

Test: atest
Bug: 336716411
Flag: com.android.settingslib.flags.volume_dialog_audio_sharing_fix
Change-Id: I446cdb0c5eeb1b0572d7078700aa0c66b5fb3c38
parent 60f42b09
Loading
Loading
Loading
Loading
+0 −29
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
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
@@ -222,32 +221,4 @@ class AudioOutputInteractorTest : SysuiTestCase() {

        val testIcon = TestStubDrawable()
    }

    @Test
    fun inAudioSharing_returnTrue() {
        with(kosmos) {
            testScope.runTest {
                audioSharingRepository.setInAudioSharing(true)

                val inAudioSharing by collectLastValue(underTest.isInAudioSharing)
                runCurrent()

                assertThat(inAudioSharing).isTrue()
            }
        }
    }

    @Test
    fun notInAudioSharing_returnFalse() {
        with(kosmos) {
            testScope.runTest {
                audioSharingRepository.setInAudioSharing(false)

                val inAudioSharing by collectLastValue(underTest.isInAudioSharing)
                runCurrent()

                assertThat(inAudioSharing).isFalse()
            }
        }
    }
}
+18 −0
Original line number Diff line number Diff line
@@ -48,6 +48,24 @@ class AudioSharingInteractorTest : SysuiTestCase() {
        }
    }

    @Test
    fun handleInAudioSharingChange() {
        with(kosmos) {
            testScope.runTest {
                with(audioSharingRepository) { setInAudioSharing(true) }
                val inAudioSharing by collectLastValue(underTest.isInAudioSharing)
                runCurrent()

                Truth.assertThat(inAudioSharing).isEqualTo(true)

                with(audioSharingRepository) { setInAudioSharing(false) }
                runCurrent()

                Truth.assertThat(inAudioSharing).isEqualTo(false)
            }
        }
    }

    @Test
    fun handlePrimaryGroupChange_nullVolume() {
        with(kosmos) {
+0 −6
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import com.android.settingslib.media.MediaDevice
import com.android.settingslib.media.MediaDevice.MediaDeviceType
import com.android.settingslib.media.PhoneMediaDevice
import com.android.settingslib.volume.data.repository.AudioRepository
import com.android.settingslib.volume.data.repository.AudioSharingRepository
import com.android.settingslib.volume.domain.interactor.AudioModeInteractor
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
@@ -37,7 +36,6 @@ import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.flatMapLatest
@@ -60,7 +58,6 @@ constructor(
    private val bluetoothAdapter: BluetoothAdapter?,
    private val deviceIconInteractor: DeviceIconInteractor,
    private val mediaOutputInteractor: MediaOutputInteractor,
    audioSharingRepository: AudioSharingRepository,
) {

    val currentAudioDevice: StateFlow<AudioOutputDevice> =
@@ -80,9 +77,6 @@ constructor(
            .flowOn(backgroundCoroutineContext)
            .stateIn(scope, SharingStarted.Eagerly, AudioOutputDevice.Unknown)

    /** Whether the device is in audio sharing */
    val isInAudioSharing: Flow<Boolean> = audioSharingRepository.inAudioSharing

    private fun AudioDeviceInfo.toAudioOutputDevice(): AudioOutputDevice {
        if (
            BluetoothAdapter.checkBluetoothAddress(address) &&
+6 −1
Original line number Diff line number Diff line
@@ -36,11 +36,15 @@ import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

interface AudioSharingInteractor {
    /** Audio sharing state on the device. */
    val isInAudioSharing: Flow<Boolean>

    /** Audio sharing secondary headset volume changes. */
    val volume: Flow<Int?>

@@ -76,6 +80,7 @@ constructor(
    private val audioVolumeInteractor: AudioVolumeInteractor,
    private val audioSharingRepository: AudioSharingRepository
) : AudioSharingInteractor {
    override val isInAudioSharing: Flow<Boolean> = audioSharingRepository.inAudioSharing

    override val volume: Flow<Int?> =
        combine(audioSharingRepository.secondaryGroupId, audioSharingRepository.volumeMap) {
@@ -125,13 +130,13 @@ constructor(
    }

    private companion object {
        const val TAG = "AudioSharingInteractor"
        const val DEFAULT_VOLUME = 20
    }
}

@SysUISingleton
class AudioSharingInteractorEmptyImpl @Inject constructor() : AudioSharingInteractor {
    override val isInAudioSharing: Flow<Boolean> = flowOf(false)
    override val volume: Flow<Int?> = emptyFlow()
    override val volumeMin: Int = EMPTY_VOLUME
    override val volumeMax: Int = EMPTY_VOLUME
+5 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.volume.panel.component.mediaoutput.domain.interacto

import com.android.settingslib.volume.domain.interactor.AudioModeInteractor
import com.android.systemui.volume.domain.interactor.AudioOutputInteractor
import com.android.systemui.volume.domain.interactor.AudioSharingInteractor
import com.android.systemui.volume.domain.model.AudioOutputDevice
import com.android.systemui.volume.panel.component.mediaoutput.domain.model.MediaOutputComponentModel
import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlaybackState
@@ -49,11 +50,12 @@ constructor(
    private val mediaDeviceSessionInteractor: MediaDeviceSessionInteractor,
    audioOutputInteractor: AudioOutputInteractor,
    audioModeInteractor: AudioModeInteractor,
    interactor: MediaOutputInteractor,
    mediaOutputInteractor: MediaOutputInteractor,
    audioSharingInteractor: AudioSharingInteractor,
) {

    private val sessionWithPlaybackState: StateFlow<Result<SessionWithPlaybackState?>> =
        interactor.defaultActiveMediaSession
        mediaOutputInteractor.defaultActiveMediaSession
            .filterData()
            .flatMapLatest { session ->
                if (session == null) {
@@ -77,7 +79,7 @@ constructor(
    val mediaOutputModel: StateFlow<Result<MediaOutputComponentModel>> =
        audioModeInteractor.isOngoingCall
            .flatMapLatest { isOngoingCall ->
                audioOutputInteractor.isInAudioSharing.flatMapLatest { isInAudioSharing ->
                audioSharingInteractor.isInAudioSharing.flatMapLatest { isInAudioSharing ->
                    if (isOngoingCall) {
                        currentAudioDevice.map {
                            MediaOutputComponentModel.Calling(it, isInAudioSharing)
Loading