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

Commit da78bd4f authored by Michael Mikhail's avatar Michael Mikhail
Browse files

Reuse sound policy interactor in volume ringer architecture

Flag: com.android.systemui.volume_redesign
Bug: 369993851
Test: atest SystemUiRoboTests:VolumeDialogRingerInteractorTest
Test: atest SystemUiRoboTests:VolumeDialogRingerDrawerViewModelTest
Change-Id: Ief6a4f9f8d09d88d80ce307ae614f6c48ebb2491
parent b7bb3ab4
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.media.AudioManager
import android.media.AudioManager.RINGER_MODE_NORMAL
import android.media.AudioManager.RINGER_MODE_SILENT
import android.media.AudioManager.RINGER_MODE_VIBRATE
import android.provider.Settings
import com.android.settingslib.volume.data.repository.AudioSystemRepository
import com.android.settingslib.volume.shared.model.RingerMode
import com.android.systemui.plugins.VolumeDialogController
@@ -66,11 +65,6 @@ constructor(
                            }
                        },
                currentRingerMode = RingerMode(state.ringerModeInternal),
                isEnabled =
                    !(state.zenMode == Settings.Global.ZEN_MODE_ALARMS ||
                        state.zenMode == Settings.Global.ZEN_MODE_NO_INTERRUPTIONS ||
                        (state.zenMode == Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS &&
                            state.disallowRinger)),
                isMuted = it.level == 0 || it.muted,
                level = it.level,
                levelMax = it.levelMax,
+0 −2
Original line number Diff line number Diff line
@@ -23,8 +23,6 @@ data class VolumeDialogRingerModel(
    val availableModes: List<RingerMode>,
    /** Current ringer mode internal */
    val currentRingerMode: RingerMode,
    /** whether the ringer is allowed given the current ZenMode */
    val isEnabled: Boolean,
    /** Whether the current ring stream level is zero or the controller state is muted */
    val isMuted: Boolean,
    /** Ring stream level */
+22 −11
Original line number Diff line number Diff line
@@ -21,10 +21,13 @@ import android.media.AudioAttributes
import android.media.AudioManager.RINGER_MODE_NORMAL
import android.media.AudioManager.RINGER_MODE_SILENT
import android.media.AudioManager.RINGER_MODE_VIBRATE
import android.media.AudioManager.STREAM_RING
import android.os.VibrationEffect
import android.widget.Toast
import com.android.internal.R as internalR
import com.android.settingslib.Utils
import com.android.settingslib.notification.domain.interactor.NotificationsSoundPolicyInteractor
import com.android.settingslib.volume.shared.model.AudioStream
import com.android.settingslib.volume.shared.model.RingerMode
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
@@ -57,7 +60,8 @@ constructor(
    @Application private val applicationContext: Context,
    @VolumeDialog private val coroutineScope: CoroutineScope,
    @Background private val backgroundDispatcher: CoroutineDispatcher,
    private val interactor: VolumeDialogRingerInteractor,
    soundPolicyInteractor: NotificationsSoundPolicyInteractor,
    private val ringerInteractor: VolumeDialogRingerInteractor,
    private val vibrator: VibratorHelper,
    private val volumeDialogLogger: VolumeDialogLogger,
    private val visibilityInteractor: VolumeDialogVisibilityInteractor,
@@ -66,10 +70,14 @@ constructor(
    private val drawerState = MutableStateFlow<RingerDrawerState>(RingerDrawerState.Initial)

    val ringerViewModel: StateFlow<RingerViewModelState> =
        combine(interactor.ringerModel, drawerState) { ringerModel, state ->
        combine(
                soundPolicyInteractor.isZenMuted(AudioStream(STREAM_RING)),
                ringerInteractor.ringerModel,
                drawerState,
            ) { isZenMuted, ringerModel, state ->
                level = ringerModel.level
                levelMax = ringerModel.levelMax
                ringerModel.toViewModel(state)
                ringerModel.toViewModel(state, isZenMuted)
            }
            .flowOn(backgroundDispatcher)
            .stateIn(coroutineScope, SharingStarted.Eagerly, RingerViewModelState.Unavailable)
@@ -90,7 +98,7 @@ constructor(
            Events.writeEvent(Events.EVENT_RINGER_TOGGLE, ringerMode.value)
            provideTouchFeedback(ringerMode)
            maybeShowToast(ringerMode)
            interactor.setRingerMode(ringerMode)
            ringerInteractor.setRingerMode(ringerMode)
        }
        visibilityInteractor.resetDismissTimeout()
        drawerState.value =
@@ -113,7 +121,7 @@ constructor(
    private fun provideTouchFeedback(ringerMode: RingerMode) {
        when (ringerMode.value) {
            RINGER_MODE_NORMAL -> {
                interactor.scheduleTouchFeedback()
                ringerInteractor.scheduleTouchFeedback()
                null
            }
            RINGER_MODE_SILENT -> VibrationEffect.get(VibrationEffect.EFFECT_CLICK)
@@ -123,7 +131,8 @@ constructor(
    }

    private fun VolumeDialogRingerModel.toViewModel(
        drawerState: RingerDrawerState
        drawerState: RingerDrawerState,
        isZenMuted: Boolean,
    ): RingerViewModelState {
        val currentIndex = availableModes.indexOf(currentRingerMode)
        if (currentIndex == -1) {
@@ -132,10 +141,11 @@ constructor(
        return if (currentIndex == -1 || isSingleVolume) {
            RingerViewModelState.Unavailable
        } else {
            toButtonViewModel(currentRingerMode, isSelectedButton = true)?.let {
            toButtonViewModel(currentRingerMode, isZenMuted, isSelectedButton = true)?.let {
                RingerViewModelState.Available(
                    RingerViewModel(
                        availableButtons = availableModes.map { mode -> toButtonViewModel(mode) },
                        availableButtons =
                            availableModes.map { mode -> toButtonViewModel(mode, isZenMuted) },
                        currentButtonIndex = currentIndex,
                        selectedButton = it,
                        drawerState = drawerState,
@@ -147,6 +157,7 @@ constructor(

    private fun VolumeDialogRingerModel.toButtonViewModel(
        ringerMode: RingerMode,
        isZenMuted: Boolean,
        isSelectedButton: Boolean = false,
    ): RingerButtonViewModel? {
        return when (ringerMode.value) {
@@ -176,7 +187,7 @@ constructor(
                )
            RINGER_MODE_NORMAL ->
                when {
                    isMuted && isEnabled ->
                    isMuted && !isZenMuted ->
                        RingerButtonViewModel(
                            imageResId =
                                if (isSelectedButton) {
@@ -226,7 +237,7 @@ constructor(

    private fun maybeShowToast(ringerMode: RingerMode) {
        coroutineScope.launch {
            val seenToastCount = interactor.getToastCount()
            val seenToastCount = ringerInteractor.getToastCount()
            if (seenToastCount > SHOW_RINGER_TOAST_COUNT) {
                return@launch
            }
@@ -260,7 +271,7 @@ constructor(
                        )
                }
            toastText?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_SHORT).show() }
            interactor.updateToastCount(seenToastCount)
            ringerInteractor.updateToastCount(seenToastCount)
        }
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import com.android.systemui.haptics.vibratorHelper
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.statusbar.notification.domain.interactor.notificationsSoundPolicyInteractor
import com.android.systemui.volume.dialog.domain.interactor.volumeDialogVisibilityInteractor
import com.android.systemui.volume.dialog.ringer.domain.volumeDialogRingerInteractor
import com.android.systemui.volume.dialog.shared.volumeDialogLogger
@@ -31,7 +32,8 @@ val Kosmos.volumeDialogRingerDrawerViewModel by
            applicationContext = applicationContext,
            backgroundDispatcher = testDispatcher,
            coroutineScope = applicationCoroutineScope,
            interactor = volumeDialogRingerInteractor,
            soundPolicyInteractor = notificationsSoundPolicyInteractor,
            ringerInteractor = volumeDialogRingerInteractor,
            vibrator = vibratorHelper,
            volumeDialogLogger = volumeDialogLogger,
            visibilityInteractor = volumeDialogVisibilityInteractor,