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

Commit 9697dc6e authored by Anton Potapov's avatar Anton Potapov
Browse files

Make device icon always show the connected device.

Flag: aconfig new_volume_panel NEXT_FOOD
Test: manual on the phone
Fixes: 333961783
Change-Id: I4c972d68c34fabf4c28d8e114f5a8e27dcafbdfb
parent 86d6ae67
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ import com.android.systemui.animation.DialogCuj
import com.android.systemui.animation.DialogTransitionAnimator
import com.android.systemui.animation.Expandable
import com.android.systemui.media.dialog.MediaOutputDialogManager
import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlayback
import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlaybackState
import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
import javax.inject.Inject

@@ -33,10 +33,10 @@ constructor(
    private val mediaOutputDialogManager: MediaOutputDialogManager,
) {

    fun onBarClick(sessionWithPlayback: SessionWithPlayback?, expandable: Expandable) {
        if (sessionWithPlayback?.playback?.isActive == true) {
    fun onBarClick(sessionWithPlaybackState: SessionWithPlaybackState?, expandable: Expandable) {
        if (sessionWithPlaybackState?.isPlaybackActive == true) {
            mediaOutputDialogManager.createAndShowWithController(
                sessionWithPlayback.session.packageName,
                sessionWithPlaybackState.session.packageName,
                false,
                expandable.dialogController()
            )
+1 −1
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ constructor(

    /** Currently connected [MediaDevice]. */
    val currentConnectedDevice: Flow<MediaDevice?> =
        localMediaRepository.flatMapLatest { it.currentConnectedDevice }
        localMediaRepository.flatMapLatest { it.currentConnectedDevice }.distinctUntilChanged()

    private suspend fun getApplicationLabel(packageName: String): CharSequence? {
        return try {
+2 −4
Original line number Diff line number Diff line
@@ -16,9 +16,7 @@

package com.android.systemui.volume.panel.component.mediaoutput.shared.model

import android.media.session.PlaybackState

data class SessionWithPlayback(
data class SessionWithPlaybackState(
    val session: MediaDeviceSession,
    val playback: PlaybackState,
    val isPlaybackActive: Boolean,
)
+19 −24
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import com.android.systemui.res.R
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputActionsInteractor
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlayback
import com.android.systemui.volume.panel.component.mediaoutput.shared.model.SessionWithPlaybackState
import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
import com.android.systemui.volume.panel.shared.model.Result
import com.android.systemui.volume.panel.ui.VolumePanelUiEvent
@@ -35,10 +35,9 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.stateIn

/** Models the UI of the Media Output Volume Panel component. */
@@ -55,20 +54,19 @@ constructor(
    private val uiEventLogger: UiEventLogger,
) {

    private val sessionWithPlayback: StateFlow<Result<SessionWithPlayback?>> =
    private val sessionWithPlaybackState: StateFlow<Result<SessionWithPlaybackState?>> =
        interactor.defaultActiveMediaSession
            .flatMapLatest { session ->
                if (session == null) {
                    flowOf(Result.Data<SessionWithPlayback?>(null))
                    flowOf(Result.Data<SessionWithPlaybackState?>(null))
                } else {
                    mediaDeviceSessionInteractor
                        .playbackState(session)
                        .map { playback ->
                    mediaDeviceSessionInteractor.playbackState(session).mapNotNull { playback ->
                        playback?.let {
                                Result.Data<SessionWithPlayback?>(SessionWithPlayback(session, it))
                            Result.Data<SessionWithPlaybackState?>(
                                SessionWithPlaybackState(session, playback.isActive())
                            )
                        }
                    }
                        .filterNotNull()
                }
            }
            .stateIn(
@@ -78,14 +76,14 @@ constructor(
            )

    val connectedDeviceViewModel: StateFlow<ConnectedDeviceViewModel?> =
        combine(sessionWithPlayback, interactor.currentConnectedDevice) {
        combine(sessionWithPlaybackState, interactor.currentConnectedDevice) {
                mediaDeviceSession,
                currentConnectedDevice ->
                if (mediaDeviceSession !is Result.Data) {
                    return@combine null
                }
                ConnectedDeviceViewModel(
                    if (mediaDeviceSession.data?.playback?.isActive == true) {
                    if (mediaDeviceSession.data?.isPlaybackActive == true) {
                        context.getString(
                            R.string.media_output_label_title,
                            mediaDeviceSession.data.session.appLabel
@@ -103,19 +101,16 @@ constructor(
            )

    val deviceIconViewModel: StateFlow<DeviceIconViewModel?> =
        combine(sessionWithPlayback, interactor.currentConnectedDevice) {
        combine(sessionWithPlaybackState, interactor.currentConnectedDevice) {
                mediaDeviceSession,
                currentConnectedDevice ->
                if (mediaDeviceSession !is Result.Data) {
                    return@combine null
                }
                if (mediaDeviceSession.data?.playback?.isActive == true) {
                    val icon =
                val icon: Icon =
                    currentConnectedDevice?.icon?.let { Icon.Loaded(it, null) }
                            ?: Icon.Resource(
                                com.android.internal.R.drawable.ic_bt_headphones_a2dp,
                                null
                            )
                        ?: Icon.Resource(R.drawable.ic_media_home_devices, null)
                if (mediaDeviceSession.data?.isPlaybackActive == true) {
                    DeviceIconViewModel.IsPlaying(
                        icon = icon,
                        iconColor =
@@ -125,7 +120,7 @@ constructor(
                    )
                } else {
                    DeviceIconViewModel.IsNotPlaying(
                        icon = Icon.Resource(R.drawable.ic_media_home_devices, null),
                        icon = icon,
                        iconColor =
                            Color.Attribute(
                                com.android.internal.R.attr.materialColorOnSurfaceVariant
@@ -143,7 +138,7 @@ constructor(

    fun onBarClick(expandable: Expandable) {
        uiEventLogger.log(VolumePanelUiEvent.VOLUME_PANEL_MEDIA_OUTPUT_CLICKED)
        val result = sessionWithPlayback.value
        val result = sessionWithPlaybackState.value
        actionsInteractor.onBarClick((result as? Result.Data)?.data, expandable)
    }
}