Loading packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/ui/composable/MediaOutputComponent.kt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -167,6 +167,7 @@ constructor( ) { ) { Icon( Icon( icon = it.icon, icon = it.icon, tint = it.iconColor.toColor(), modifier = Modifier.padding(12.dp).fillMaxSize(), modifier = Modifier.padding(12.dp).fillMaxSize(), ) ) } } Loading packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt +4 −36 Original line number Original line Diff line number Diff line Loading @@ -17,8 +17,6 @@ package com.android.systemui.volume.panel.component.mediaoutput.domain package com.android.systemui.volume.panel.component.mediaoutput.domain import android.media.AudioManager import android.media.AudioManager import android.media.session.MediaSession import android.media.session.PlaybackState import android.testing.TestableLooper.RunWithLooper import android.testing.TestableLooper.RunWithLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest Loading @@ -26,14 +24,8 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos 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.audioModeInteractor import com.android.systemui.volume.audioRepository 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 com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runCurrent Loading @@ -54,23 +46,14 @@ class MediaOutputAvailabilityCriteriaTest : SysuiTestCase() { @Before @Before fun setup() { fun setup() { with(kosmos) { underTest = MediaOutputAvailabilityCriteria(kosmos.audioModeInteractor) 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) } } } @Test @Test fun notInCallAndHasDevices_isAvailable_true() { fun notInCall_isAvailable_true() { with(kosmos) { with(kosmos) { testScope.runTest { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) audioRepository.setMode(AudioManager.MODE_NORMAL) localMediaRepository.updateMediaDevices(listOf(mock {})) val isAvailable by collectLastValue(underTest.isAvailable()) val isAvailable by collectLastValue(underTest.isAvailable()) runCurrent() runCurrent() Loading @@ -79,27 +62,12 @@ class MediaOutputAvailabilityCriteriaTest : SysuiTestCase() { } } } } } } @Test fun inCallAndHasDevices_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 @Test fun notInCallAndHasDevices_isAvailable_false() { fun inCall_isAvailable_false() { with(kosmos) { with(kosmos) { testScope.runTest { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) audioRepository.setMode(AudioManager.MODE_IN_CALL) localMediaRepository.updateMediaDevices(emptyList()) val isAvailable by collectLastValue(underTest.isAvailable()) val isAvailable by collectLastValue(underTest.isAvailable()) runCurrent() runCurrent() Loading packages/SystemUI/res/values/styles.xml +5 −2 Original line number Original line Diff line number Diff line Loading @@ -953,8 +953,11 @@ <item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item> <item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item> </style> </style> <style name="Theme.VolumePanelActivity" <style name="Theme.VolumePanelActivity" parent="@android:style/Theme.DeviceDefault.DayNight"> parent="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen"> <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:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimEnabled">true</item> Loading packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt +2 −10 Original line number Original line Diff line number Diff line Loading @@ -17,27 +17,19 @@ package com.android.systemui.volume.panel.component.mediaoutput.domain package com.android.systemui.volume.panel.component.mediaoutput.domain import com.android.settingslib.volume.domain.interactor.AudioModeInteractor 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.dagger.scope.VolumePanelScope import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria import javax.inject.Inject import javax.inject.Inject import kotlinx.coroutines.flow.Flow 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. */ /** Determines if the Media Output Volume Panel component is available. */ @VolumePanelScope @VolumePanelScope class MediaOutputAvailabilityCriteria class MediaOutputAvailabilityCriteria @Inject @Inject constructor( constructor( private val mediaOutputInteractor: MediaOutputInteractor, private val audioModeInteractor: AudioModeInteractor, private val audioModeInteractor: AudioModeInteractor, ) : ComponentAvailabilityCriteria { ) : ComponentAvailabilityCriteria { override fun isAvailable(): Flow<Boolean> { override fun isAvailable(): Flow<Boolean> = audioModeInteractor.isOngoingCall.map { !it } return combine(mediaOutputInteractor.mediaDevices, audioModeInteractor.isOngoingCall) { devices, isOngoingCall -> !isOngoingCall && devices.isNotEmpty() } } } } packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt +0 −4 Original line number Original line Diff line number Diff line Loading @@ -95,10 +95,6 @@ constructor( val currentConnectedDevice: Flow<MediaDevice?> = val currentConnectedDevice: Flow<MediaDevice?> = localMediaRepository.flatMapLatest { it.currentConnectedDevice } 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? { private suspend fun getApplicationLabel(packageName: String): CharSequence? { return try { return try { withContext(backgroundCoroutineContext) { withContext(backgroundCoroutineContext) { Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/mediaoutput/ui/composable/MediaOutputComponent.kt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -167,6 +167,7 @@ constructor( ) { ) { Icon( Icon( icon = it.icon, icon = it.icon, tint = it.iconColor.toColor(), modifier = Modifier.padding(12.dp).fillMaxSize(), modifier = Modifier.padding(12.dp).fillMaxSize(), ) ) } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteriaTest.kt +4 −36 Original line number Original line Diff line number Diff line Loading @@ -17,8 +17,6 @@ package com.android.systemui.volume.panel.component.mediaoutput.domain package com.android.systemui.volume.panel.component.mediaoutput.domain import android.media.AudioManager import android.media.AudioManager import android.media.session.MediaSession import android.media.session.PlaybackState import android.testing.TestableLooper.RunWithLooper import android.testing.TestableLooper.RunWithLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest Loading @@ -26,14 +24,8 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos 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.audioModeInteractor import com.android.systemui.volume.audioRepository 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 com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runCurrent Loading @@ -54,23 +46,14 @@ class MediaOutputAvailabilityCriteriaTest : SysuiTestCase() { @Before @Before fun setup() { fun setup() { with(kosmos) { underTest = MediaOutputAvailabilityCriteria(kosmos.audioModeInteractor) 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) } } } @Test @Test fun notInCallAndHasDevices_isAvailable_true() { fun notInCall_isAvailable_true() { with(kosmos) { with(kosmos) { testScope.runTest { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) audioRepository.setMode(AudioManager.MODE_NORMAL) localMediaRepository.updateMediaDevices(listOf(mock {})) val isAvailable by collectLastValue(underTest.isAvailable()) val isAvailable by collectLastValue(underTest.isAvailable()) runCurrent() runCurrent() Loading @@ -79,27 +62,12 @@ class MediaOutputAvailabilityCriteriaTest : SysuiTestCase() { } } } } } } @Test fun inCallAndHasDevices_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 @Test fun notInCallAndHasDevices_isAvailable_false() { fun inCall_isAvailable_false() { with(kosmos) { with(kosmos) { testScope.runTest { testScope.runTest { audioRepository.setMode(AudioManager.MODE_NORMAL) audioRepository.setMode(AudioManager.MODE_IN_CALL) localMediaRepository.updateMediaDevices(emptyList()) val isAvailable by collectLastValue(underTest.isAvailable()) val isAvailable by collectLastValue(underTest.isAvailable()) runCurrent() runCurrent() Loading
packages/SystemUI/res/values/styles.xml +5 −2 Original line number Original line Diff line number Diff line Loading @@ -953,8 +953,11 @@ <item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item> <item name="wallpaperTextColor">@*android:color/primary_text_material_dark</item> </style> </style> <style name="Theme.VolumePanelActivity" <style name="Theme.VolumePanelActivity" parent="@android:style/Theme.DeviceDefault.DayNight"> parent="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen"> <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:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimEnabled">true</item> Loading
packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/MediaOutputAvailabilityCriteria.kt +2 −10 Original line number Original line Diff line number Diff line Loading @@ -17,27 +17,19 @@ package com.android.systemui.volume.panel.component.mediaoutput.domain package com.android.systemui.volume.panel.component.mediaoutput.domain import com.android.settingslib.volume.domain.interactor.AudioModeInteractor 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.dagger.scope.VolumePanelScope import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria import com.android.systemui.volume.panel.domain.ComponentAvailabilityCriteria import javax.inject.Inject import javax.inject.Inject import kotlinx.coroutines.flow.Flow 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. */ /** Determines if the Media Output Volume Panel component is available. */ @VolumePanelScope @VolumePanelScope class MediaOutputAvailabilityCriteria class MediaOutputAvailabilityCriteria @Inject @Inject constructor( constructor( private val mediaOutputInteractor: MediaOutputInteractor, private val audioModeInteractor: AudioModeInteractor, private val audioModeInteractor: AudioModeInteractor, ) : ComponentAvailabilityCriteria { ) : ComponentAvailabilityCriteria { override fun isAvailable(): Flow<Boolean> { override fun isAvailable(): Flow<Boolean> = audioModeInteractor.isOngoingCall.map { !it } return combine(mediaOutputInteractor.mediaDevices, audioModeInteractor.isOngoingCall) { devices, isOngoingCall -> !isOngoingCall && devices.isNotEmpty() } } } }
packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputInteractor.kt +0 −4 Original line number Original line Diff line number Diff line Loading @@ -95,10 +95,6 @@ constructor( val currentConnectedDevice: Flow<MediaDevice?> = val currentConnectedDevice: Flow<MediaDevice?> = localMediaRepository.flatMapLatest { it.currentConnectedDevice } 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? { private suspend fun getApplicationLabel(packageName: String): CharSequence? { return try { return try { withContext(backgroundCoroutineContext) { withContext(backgroundCoroutineContext) { Loading