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

Commit 8a3be150 authored by Anton Potapov's avatar Anton Potapov
Browse files

Suspend when showing the Volume Dialog so that there is only one visible at a time

Flag: EXEMPT BUG FIX
Fixes: 434636586
Test: manual on foldable. Rapidly tap on the screen and physical volume button to make sure there're no volume dialog duplicates
Test: atest VolumeDialogScreenshotTest
Change-Id: Ia7fadee836482c0734e24390ac8edf5f91871407
parent 693a2ae6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ constructor(
            }
        }
        setCancelable(false)
        setCanceledOnTouchOutside(true)
        setCanceledOnTouchOutside(false)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
+7 −4
Original line number Diff line number Diff line
@@ -30,10 +30,12 @@ import com.android.systemui.volume.dialog.shared.model.VolumeDialogVisibilityMod
import com.android.systemui.volume.dialog.ui.VolumeDialogUiEvent
import javax.inject.Inject
import javax.inject.Provider
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onEach

@VolumeDialogPluginScope
class VolumeDialogPluginViewModel
@@ -51,12 +53,12 @@ constructor(

    fun launchVolumeDialog() {
        dialogVisibilityInteractor.dialogVisibility
            .mapLatest { visibilityModel ->
            .onEach { visibilityModel ->
                with(visibilityModel) {
                    if (this is VolumeDialogVisibilityModel.Visible) {
                        showDialog()
                        toVolumeDialogUiEvent()?.let(uiEventLogger::log)
                        logger.onShow(reason)
                        showDialog()
                    }
                    if (this is VolumeDialogVisibilityModel.Dismissed) {
                        toVolumeDialogUiEvent()?.let(uiEventLogger::log)
@@ -86,12 +88,13 @@ constructor(
        dialogCsdWarningInteractor.onCsdWarningDismissed()
    }

    private fun showDialog() {
    private suspend fun showDialog(): Unit = suspendCoroutine { continuation ->
        volumeDialogProvider
            .get()
            .apply {
                setOnDismissListener {
                    dialogVisibilityInteractor.dismissDialog(Events.DISMISS_REASON_UNKNOWN)
                    continuation.resume(Unit)
                }
            }
            .show()