Loading packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt +3 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.settingslib.volume.data.repository import android.media.AudioDeviceInfo import android.media.AudioManager import android.media.AudioManager.OnCommunicationDeviceChangedListener import androidx.concurrent.futures.DirectExecutor import com.android.internal.util.ConcurrentUtils import com.android.settingslib.volume.shared.AudioManagerEventsReceiver import com.android.settingslib.volume.shared.model.AudioManagerEvent Loading Loading @@ -109,8 +108,8 @@ class AudioRepositoryImpl( callbackFlow { val listener = OnCommunicationDeviceChangedListener { trySend(Unit) } audioManager.addOnCommunicationDeviceChangedListener( DirectExecutor.INSTANCE, listener ConcurrentUtils.DIRECT_EXECUTOR, listener, ) awaitClose { audioManager.removeOnCommunicationDeviceChangedListener(listener) } Loading Loading @@ -146,7 +145,7 @@ class AudioRepositoryImpl( maxVolume = audioManager.getStreamMaxVolume(audioStream.value), volume = audioManager.getStreamVolume(audioStream.value), isAffectedByRingerMode = audioManager.isStreamAffectedByRingerMode(audioStream.value), isMuted = audioManager.isStreamMute(audioStream.value), isMuted = audioManager.isStreamMute(audioStream.value) ) } Loading packages/SettingsLib/src/com/android/settingslib/volume/domain/interactor/AudioVolumeInteractor.kt +4 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,10 @@ class AudioVolumeInteractor( } } fun isMutable(audioStream: AudioStream): Boolean = // Alarm stream doesn't support muting audioStream.value != AudioManager.STREAM_ALARM private suspend fun processVolume( audioStreamModel: AudioStreamModel, ringerMode: RingerMode, Loading packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt +37 −12 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.volume.panel.component.volume.ui.composable import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.size import androidx.compose.material3.IconButton Loading @@ -27,6 +28,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.semantics.ProgressBarRangeInfo Loading @@ -38,6 +40,7 @@ import androidx.compose.ui.semantics.setProgress import androidx.compose.ui.unit.dp import com.android.compose.PlatformSlider import com.android.compose.PlatformSliderColors import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.ui.compose.Icon import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.SliderState Loading Loading @@ -86,18 +89,11 @@ fun VolumeSlider( Text(text = state.valueText, color = LocalContentColor.current) } else { state.icon?.let { IconButton( onClick = onIconTapped, colors = IconButtonColors( contentColor = LocalContentColor.current, containerColor = Color.Transparent, disabledContentColor = LocalContentColor.current, disabledContainerColor = Color.Transparent, SliderIcon( icon = it, onIconTapped = onIconTapped, isTappable = state.isMutable, ) ) { Icon(modifier = Modifier.size(24.dp), icon = it) } } } }, Loading Loading @@ -127,3 +123,32 @@ fun VolumeSlider( } ) } @Composable private fun SliderIcon( icon: Icon, onIconTapped: () -> Unit, isTappable: Boolean, modifier: Modifier = Modifier ) { if (isTappable) { IconButton( modifier = modifier, onClick = onIconTapped, colors = IconButtonColors( contentColor = LocalContentColor.current, containerColor = Color.Transparent, disabledContentColor = LocalContentColor.current, disabledContainerColor = Color.Transparent, ), content = { Icon(modifier = Modifier.size(24.dp), icon = icon) }, ) } else { Box( modifier = modifier, contentAlignment = Alignment.Center, content = { Icon(modifier = Modifier.size(24.dp), icon = icon) }, ) } } packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt +9 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,15 @@ class AudioVolumeInteractorTest : SysuiTestCase() { } } @Test fun alarmStream_isNotMutable() { with(kosmos) { val isMutable = underTest.isMutable(AudioStream(AudioManager.STREAM_ALARM)) assertThat(isMutable).isFalse() } } private companion object { val audioStream = AudioStream(AudioManager.STREAM_SYSTEM) } Loading packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,7 @@ constructor( isEnabled = isEnabled, a11yStep = volumeRange.step, audioStreamModel = this, isMutable = audioVolumeInteractor.isMutable(audioStream), ) } Loading Loading @@ -160,6 +161,7 @@ constructor( override val disabledMessage: String?, override val isEnabled: Boolean, override val a11yStep: Int, override val isMutable: Boolean, val audioStreamModel: AudioStreamModel, ) : SliderState Loading Loading
packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt +3 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package com.android.settingslib.volume.data.repository import android.media.AudioDeviceInfo import android.media.AudioManager import android.media.AudioManager.OnCommunicationDeviceChangedListener import androidx.concurrent.futures.DirectExecutor import com.android.internal.util.ConcurrentUtils import com.android.settingslib.volume.shared.AudioManagerEventsReceiver import com.android.settingslib.volume.shared.model.AudioManagerEvent Loading Loading @@ -109,8 +108,8 @@ class AudioRepositoryImpl( callbackFlow { val listener = OnCommunicationDeviceChangedListener { trySend(Unit) } audioManager.addOnCommunicationDeviceChangedListener( DirectExecutor.INSTANCE, listener ConcurrentUtils.DIRECT_EXECUTOR, listener, ) awaitClose { audioManager.removeOnCommunicationDeviceChangedListener(listener) } Loading Loading @@ -146,7 +145,7 @@ class AudioRepositoryImpl( maxVolume = audioManager.getStreamMaxVolume(audioStream.value), volume = audioManager.getStreamVolume(audioStream.value), isAffectedByRingerMode = audioManager.isStreamAffectedByRingerMode(audioStream.value), isMuted = audioManager.isStreamMute(audioStream.value), isMuted = audioManager.isStreamMute(audioStream.value) ) } Loading
packages/SettingsLib/src/com/android/settingslib/volume/domain/interactor/AudioVolumeInteractor.kt +4 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,10 @@ class AudioVolumeInteractor( } } fun isMutable(audioStream: AudioStream): Boolean = // Alarm stream doesn't support muting audioStream.value != AudioManager.STREAM_ALARM private suspend fun processVolume( audioStreamModel: AudioStreamModel, ringerMode: RingerMode, Loading
packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt +37 −12 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.volume.panel.component.volume.ui.composable import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.size import androidx.compose.material3.IconButton Loading @@ -27,6 +28,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.semantics.ProgressBarRangeInfo Loading @@ -38,6 +40,7 @@ import androidx.compose.ui.semantics.setProgress import androidx.compose.ui.unit.dp import com.android.compose.PlatformSlider import com.android.compose.PlatformSliderColors import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.ui.compose.Icon import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.SliderState Loading Loading @@ -86,18 +89,11 @@ fun VolumeSlider( Text(text = state.valueText, color = LocalContentColor.current) } else { state.icon?.let { IconButton( onClick = onIconTapped, colors = IconButtonColors( contentColor = LocalContentColor.current, containerColor = Color.Transparent, disabledContentColor = LocalContentColor.current, disabledContainerColor = Color.Transparent, SliderIcon( icon = it, onIconTapped = onIconTapped, isTappable = state.isMutable, ) ) { Icon(modifier = Modifier.size(24.dp), icon = it) } } } }, Loading Loading @@ -127,3 +123,32 @@ fun VolumeSlider( } ) } @Composable private fun SliderIcon( icon: Icon, onIconTapped: () -> Unit, isTappable: Boolean, modifier: Modifier = Modifier ) { if (isTappable) { IconButton( modifier = modifier, onClick = onIconTapped, colors = IconButtonColors( contentColor = LocalContentColor.current, containerColor = Color.Transparent, disabledContentColor = LocalContentColor.current, disabledContainerColor = Color.Transparent, ), content = { Icon(modifier = Modifier.size(24.dp), icon = icon) }, ) } else { Box( modifier = modifier, contentAlignment = Alignment.Center, content = { Icon(modifier = Modifier.size(24.dp), icon = icon) }, ) } }
packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioVolumeInteractorTest.kt +9 −0 Original line number Diff line number Diff line Loading @@ -200,6 +200,15 @@ class AudioVolumeInteractorTest : SysuiTestCase() { } } @Test fun alarmStream_isNotMutable() { with(kosmos) { val isMutable = underTest.isMutable(AudioStream(AudioManager.STREAM_ALARM)) assertThat(isMutable).isFalse() } } private companion object { val audioStream = AudioStream(AudioManager.STREAM_SYSTEM) } Loading
packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -116,6 +116,7 @@ constructor( isEnabled = isEnabled, a11yStep = volumeRange.step, audioStreamModel = this, isMutable = audioVolumeInteractor.isMutable(audioStream), ) } Loading Loading @@ -160,6 +161,7 @@ constructor( override val disabledMessage: String?, override val isEnabled: Boolean, override val a11yStep: Int, override val isMutable: Boolean, val audioStreamModel: AudioStreamModel, ) : SliderState Loading