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

Commit dc393b4e authored by Yiyi Shen's avatar Yiyi Shen Committed by Android (Google) Code Review
Browse files

Merge "[OutputSwitcher] Allow open output switcher in PAS with flag guarded" into main

parents feda2d42 dff2fcaf
Loading
Loading
Loading
Loading
+50 −1
Original line number Diff line number Diff line
@@ -21,11 +21,12 @@ import android.content.packageManager
import android.content.pm.PackageManager.FEATURE_PC
import android.graphics.drawable.TestStubDrawable
import android.media.AudioManager
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.media.flags.Flags;
import com.android.media.flags.Flags
import com.android.settingslib.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
@@ -156,6 +157,33 @@ class MediaOutputComponentInteractorTest : SysuiTestCase() {
        }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_PERSONAL_AUDIO_SHARING)
    fun hasSession_stateIs_MediaSession_canOpenAudioSwitcherDuringAudioSharing() =
        with(kosmos) {
            testScope.runTest {
                audioSharingRepository.setInAudioSharing(true)
                localMediaRepository.updateCurrentConnectedDevice(
                    TestMediaDevicesFactory.builtInMediaDevice()
                )
                mediaControllerRepository.setActiveSessions(listOf(localMediaController))

                val model by collectLastValue(underTest.mediaOutputModel.filterData())
                runCurrent()

                with(model as MediaOutputComponentModel.MediaSession) {
                    assertThat(session.appLabel).isEqualTo("local_media_controller_label")
                    assertThat(session.packageName).isEqualTo("local.test.pkg")
                    assertThat(session.canAdjustVolume).isTrue()
                    assertThat(device)
                        .isEqualTo(AudioOutputDevice.BuiltIn("built_in_media", testIcon))
                    assertThat(isInAudioSharing).isTrue()
                    assertThat(canOpenAudioSwitcher).isTrue()
                }
            }
        }

    @Test
    @DisableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_PERSONAL_AUDIO_SHARING)
    fun noMediaOrCall_stateIs_Idle() =
        with(kosmos) {
            testScope.runTest {
@@ -175,6 +203,27 @@ class MediaOutputComponentInteractorTest : SysuiTestCase() {
            }
        }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_OUTPUT_SWITCHER_PERSONAL_AUDIO_SHARING)
    fun noMediaOrCall_stateIs_Idle_canOpenAudioSwitcherDuringAudioSharing() =
        with(kosmos) {
            testScope.runTest {
                audioSharingRepository.setInAudioSharing(true)

                val model by collectLastValue(underTest.mediaOutputModel.filterData())
                runCurrent()

                assertThat(model)
                    .isEqualTo(
                        MediaOutputComponentModel.Idle(
                            device = AudioOutputDevice.BuiltIn("built_in_media", testIcon),
                            isInAudioSharing = true,
                            canOpenAudioSwitcher = true,
                        )
                    )
            }
        }

    private companion object {
        val testIcon = TestStubDrawable()
    }
+7 −8
Original line number Diff line number Diff line
@@ -16,8 +16,9 @@

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

import com.android.settingslib.media.PhoneMediaDevice.inputRoutingEnabledAndIsDesktop
import android.content.Context
import com.android.media.flags.Flags.enableOutputSwitcherPersonalAudioSharing
import com.android.settingslib.media.PhoneMediaDevice.inputRoutingEnabledAndIsDesktop
import com.android.settingslib.volume.domain.interactor.AudioModeInteractor
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.volume.domain.interactor.AudioOutputInteractor
@@ -69,11 +70,7 @@ constructor(
                }
            }
            .wrapInResult()
            .stateIn(
                coroutineScope,
                SharingStarted.Eagerly,
                Result.Loading(),
            )
            .stateIn(coroutineScope, SharingStarted.Eagerly, Result.Loading())

    private val currentAudioDevice: Flow<AudioOutputDevice> =
        audioOutputInteractor.currentAudioDevice.filter { it !is AudioOutputDevice.Unavailable }
@@ -98,13 +95,15 @@ constructor(
                        )
                    )
                } else {
                    val canOpenAudioSwitcherForAudioSharing: Boolean =
                        enableOutputSwitcherPersonalAudioSharing() || !isInAudioSharing
                    sessionWithPlaybackState.filterData().map { sessionWithPlaybackState ->
                        if (sessionWithPlaybackState == null) {
                            MediaOutputComponentModel.Idle(
                                device = currentAudioDevice,
                                isInAudioSharing = isInAudioSharing,
                                canOpenAudioSwitcher =
                                    !isInAudioSharing &&
                                    canOpenAudioSwitcherForAudioSharing &&
                                        currentAudioDevice !is AudioOutputDevice.Unknown,
                            )
                        } else {
@@ -114,7 +113,7 @@ constructor(
                                device = currentAudioDevice,
                                isInAudioSharing = isInAudioSharing,
                                canOpenAudioSwitcher =
                                    !isInAudioSharing &&
                                    canOpenAudioSwitcherForAudioSharing &&
                                        currentAudioDevice !is AudioOutputDevice.Unknown,
                            )
                        }