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

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

Merge "Make device icon always show the connected device." into main

parents 794e76db 9697dc6e
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)
    }
}