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

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

Merge "Add ringer mode change when muting/unmuting STREAM_RING" into main

parents 1386f0fe 0c4fd214
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -73,6 +73,10 @@ interface AudioRepository {
    suspend fun setVolume(audioStream: AudioStream, volume: Int)

    suspend fun setMuted(audioStream: AudioStream, isMuted: Boolean)

    suspend fun setRingerMode(audioStream: AudioStream, mode: RingerMode)

    suspend fun isAffectedByMute(audioStream: AudioStream): Boolean
}

class AudioRepositoryImpl(
@@ -169,6 +173,16 @@ class AudioRepositoryImpl(
            )
        }

    override suspend fun setRingerMode(audioStream: AudioStream, mode: RingerMode) {
        withContext(backgroundCoroutineContext) { audioManager.ringerMode = mode.value }
    }

    override suspend fun isAffectedByMute(audioStream: AudioStream): Boolean {
        return withContext(backgroundCoroutineContext) {
            audioManager.isStreamAffectedByMute(audioStream.value)
        }
    }

    private fun getMinVolume(stream: AudioStream): Int =
        try {
            audioManager.getStreamMinVolume(stream.value)
+9 −4
Original line number Diff line number Diff line
@@ -49,8 +49,14 @@ class AudioVolumeInteractor(
    suspend fun setVolume(audioStream: AudioStream, volume: Int) =
        audioRepository.setVolume(audioStream, volume)

    suspend fun setMuted(audioStream: AudioStream, isMuted: Boolean) =
    suspend fun setMuted(audioStream: AudioStream, isMuted: Boolean) {
        if (audioStream.value == AudioManager.STREAM_RING) {
            val mode =
                if (isMuted) AudioManager.RINGER_MODE_VIBRATE else AudioManager.RINGER_MODE_NORMAL
            audioRepository.setRingerMode(audioStream, RingerMode(mode))
        }
        audioRepository.setMuted(audioStream, isMuted)
    }

    /** Checks if the volume can be changed via the UI. */
    fun canChangeVolume(audioStream: AudioStream): Flow<Boolean> {
@@ -66,9 +72,8 @@ class AudioVolumeInteractor(
        }
    }

    fun isMutable(audioStream: AudioStream): Boolean =
        // Alarm stream doesn't support muting
        audioStream.value != AudioManager.STREAM_ALARM
    suspend fun isAffectedByMute(audioStream: AudioStream): Boolean =
        audioRepository.isAffectedByMute(audioStream)

    private suspend fun processVolume(
        audioStreamModel: AudioStreamModel,
+30 −3
Original line number Diff line number Diff line
@@ -201,13 +201,40 @@ class AudioVolumeInteractorTest : SysuiTestCase() {
    }

    @Test
    fun alarmStream_isNotMutable() {
    fun streamNotAffectedByMute_isNotMutable() {
        with(kosmos) {
            val isMutable = underTest.isMutable(AudioStream(AudioManager.STREAM_ALARM))
            testScope.runTest {
                audioRepository.setIsAffectedByMute(audioStream, false)
                val isMutable = underTest.isAffectedByMute(audioStream)

                assertThat(isMutable).isFalse()
            }
        }
    }

    @Test
    fun muteRingerStream_ringerMode_vibrate() {
        with(kosmos) {
            testScope.runTest {
                val ringerMode by collectLastValue(audioRepository.ringerMode)
                underTest.setMuted(AudioStream(AudioManager.STREAM_RING), true)

                assertThat(ringerMode).isEqualTo(RingerMode(AudioManager.RINGER_MODE_VIBRATE))
            }
        }
    }

    @Test
    fun unMuteRingerStream_ringerMode_normal() {
        with(kosmos) {
            testScope.runTest {
                val ringerMode by collectLastValue(audioRepository.ringerMode)
                underTest.setMuted(AudioStream(AudioManager.STREAM_RING), false)

                assertThat(ringerMode).isEqualTo(RingerMode(AudioManager.RINGER_MODE_NORMAL))
            }
        }
    }

    private companion object {
        val audioStream = AudioStream(AudioManager.STREAM_SYSTEM)
+2 −2
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ constructor(
        }
    }

    private fun AudioStreamModel.toState(
    private suspend fun AudioStreamModel.toState(
        isEnabled: Boolean,
        ringerMode: RingerMode,
    ): State {
@@ -116,7 +116,7 @@ constructor(
            isEnabled = isEnabled,
            a11yStep = volumeRange.step,
            audioStreamModel = this,
            isMutable = audioVolumeInteractor.isMutable(audioStream),
            isMutable = audioVolumeInteractor.isAffectedByMute(audioStream),
        )
    }

+13 −0
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ class FakeAudioRepository : AudioRepository {
    private val models: MutableMap<AudioStream, MutableStateFlow<AudioStreamModel>> = mutableMapOf()
    private val lastAudibleVolumes: MutableMap<AudioStream, Int> = mutableMapOf()

    private var isAffectedByMute: MutableMap<AudioStream, Boolean> = mutableMapOf()

    private fun getAudioStreamModelState(
        audioStream: AudioStream
    ): MutableStateFlow<AudioStreamModel> =
@@ -93,4 +95,15 @@ class FakeAudioRepository : AudioRepository {
    fun setLastAudibleVolume(audioStream: AudioStream, volume: Int) {
        lastAudibleVolumes[audioStream] = volume
    }

    override suspend fun setRingerMode(audioStream: AudioStream, mode: RingerMode) {
        mutableRingerMode.value = mode
    }

    override suspend fun isAffectedByMute(audioStream: AudioStream): Boolean =
        isAffectedByMute[audioStream] ?: true

    fun setIsAffectedByMute(audioStream: AudioStream, isAffected: Boolean) {
        isAffectedByMute[audioStream] = isAffected
    }
}