Fix media output component appearance
The new media output component is always visible and displays the
current media output (either phone or a connected device)
Fixed icon colors to match MaterialTheme ones
Flag: aconfig new_volume_panel DISABLED
Test: atest MediaOutputAvailabilityCriteriaTest
Fixes: 325669613
Change-Id: Ia3039084a5b2562b9d3ae96777513882755c1bad
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/ui/composable/MediaOutputComponent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/ui/composable/MediaOutputComponent.kt
index 8ad6fdf..d49fed5 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/ui/composable/MediaOutputComponent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/ui/composable/MediaOutputComponent.kt
@@ -167,6 +167,7 @@
) {
Icon(
icon = it.icon,
+ tint = it.iconColor.toColor(),
modifier = Modifier.padding(12.dp).fillMaxSize(),
)
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt
index ec37925..ec55c75 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt
@@ -17,8 +17,6 @@
package com.android.systemui.volume.panel.component.mediaoutput.domain
import android.media.AudioManager
-import android.media.session.MediaSession
-import android.media.session.PlaybackState
import android.testing.TestableLooper.RunWithLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -26,14 +24,8 @@
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
-import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
import com.android.systemui.volume.audioModeInteractor
import com.android.systemui.volume.audioRepository
-import com.android.systemui.volume.localMediaRepository
-import com.android.systemui.volume.mediaController
-import com.android.systemui.volume.mediaControllerRepository
-import com.android.systemui.volume.mediaOutputInteractor
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
@@ -54,23 +46,14 @@
@Before
fun setup() {
- with(kosmos) {
- whenever(mediaController.packageName).thenReturn("test.pkg")
- whenever(mediaController.sessionToken).thenReturn(MediaSession.Token(0, mock {}))
- whenever(mediaController.playbackState).thenReturn(PlaybackState.Builder().build())
-
- mediaControllerRepository.setActiveLocalMediaController(mediaController)
-
- underTest = MediaOutputAvailabilityCriteria(mediaOutputInteractor, audioModeInteractor)
- }
+ underTest = MediaOutputAvailabilityCriteria(kosmos.audioModeInteractor)
}
@Test
- fun notInCallAndHasDevices_isAvailable_true() {
+ fun notInCall_isAvailable_true() {
with(kosmos) {
testScope.runTest {
audioRepository.setMode(AudioManager.MODE_NORMAL)
- localMediaRepository.updateMediaDevices(listOf(mock {}))
val isAvailable by collectLastValue(underTest.isAvailable())
runCurrent()
@@ -79,27 +62,12 @@
}
}
}
+
@Test
- fun inCallAndHasDevices_isAvailable_false() {
+ fun inCall_isAvailable_false() {
with(kosmos) {
testScope.runTest {
audioRepository.setMode(AudioManager.MODE_IN_CALL)
- localMediaRepository.updateMediaDevices(listOf(mock {}))
-
- val isAvailable by collectLastValue(underTest.isAvailable())
- runCurrent()
-
- assertThat(isAvailable).isFalse()
- }
- }
- }
-
- @Test
- fun notInCallAndHasDevices_isAvailable_false() {
- with(kosmos) {
- testScope.runTest {
- audioRepository.setMode(AudioManager.MODE_NORMAL)
- localMediaRepository.updateMediaDevices(emptyList())
val isAvailable by collectLastValue(underTest.isAvailable())
runCurrent()
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index f1d4d71..0054994d 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -953,8 +953,11 @@
<item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item>
</style>
- <style name="Theme.VolumePanelActivity"
- parent="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen">
+ <style name="Theme.VolumePanelActivity" parent="@android:style/Theme.DeviceDefault.DayNight">
+ <item name="android:windowFullscreen">true</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowActionBar">false</item>
+ <item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt
index 020ec64..bac7d15 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt
@@ -17,27 +17,19 @@
package com.android.systemui.volume.panel.component.mediaoutput.domain
import com.android.settingslib.volume.domain.interactor.AudioModeInteractor
-import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
import com.android.systemui.volume.panel.dagger.scope.VolumePanelScope
import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
/** Determines if the Media Output Volume Panel component is available. */
@VolumePanelScope
class MediaOutputAvailabilityCriteria
@Inject
constructor(
- private val mediaOutputInteractor: MediaOutputInteractor,
private val audioModeInteractor: AudioModeInteractor,
) : ComponentAvailabilityCriteria {
- override fun isAvailable(): Flow<Boolean> {
- return combine(mediaOutputInteractor.mediaDevices, audioModeInteractor.isOngoingCall) {
- devices,
- isOngoingCall ->
- !isOngoingCall && devices.isNotEmpty()
- }
- }
+ override fun isAvailable(): Flow<Boolean> = audioModeInteractor.isOngoingCall.map { !it }
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
index 24cc29d..0f53437 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt
@@ -95,10 +95,6 @@
val currentConnectedDevice: Flow<MediaDevice?> =
localMediaRepository.flatMapLatest { it.currentConnectedDevice }
- /** A list of available [MediaDevice]s. */
- val mediaDevices: Flow<Collection<MediaDevice>> =
- localMediaRepository.flatMapLatest { it.mediaDevices }
-
private suspend fun getApplicationLabel(packageName: String): CharSequence? {
return try {
withContext(backgroundCoroutineContext) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/DeviceIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/DeviceIconViewModel.kt
index e0718ac..e518ed0 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/DeviceIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/DeviceIconViewModel.kt
@@ -23,15 +23,18 @@
sealed interface DeviceIconViewModel {
val icon: Icon
+ val iconColor: Color
val backgroundColor: Color
class IsPlaying(
override val icon: Icon,
+ override val iconColor: Color,
override val backgroundColor: Color,
) : DeviceIconViewModel
class IsNotPlaying(
override val icon: Icon,
+ override val iconColor: Color,
override val backgroundColor: Color,
) : DeviceIconViewModel
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
index d148992..85d6c9e 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/ui/viewmodel/MediaOutputViewModel.kt
@@ -86,13 +86,21 @@
null
)
DeviceIconViewModel.IsPlaying(
- icon,
- Color.Attribute(com.android.internal.R.attr.materialColorSecondary),
+ icon = icon,
+ iconColor =
+ Color.Attribute(com.android.internal.R.attr.materialColorSurface),
+ backgroundColor =
+ Color.Attribute(com.android.internal.R.attr.materialColorSecondary),
)
} else {
DeviceIconViewModel.IsNotPlaying(
- Icon.Resource(R.drawable.ic_media_home_devices, null),
- Color.Attribute(com.android.internal.R.attr.materialColorSurface),
+ icon = Icon.Resource(R.drawable.ic_media_home_devices, null),
+ iconColor =
+ Color.Attribute(
+ com.android.internal.R.attr.materialColorOnSurfaceVariant
+ ),
+ backgroundColor =
+ Color.Attribute(com.android.internal.R.attr.materialColorSurface),
)
}
}