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

Commit b89a27f4 authored by Anton Potapov's avatar Anton Potapov
Browse files

Add showing the new Volume Dialog based on the VolumeDialogController callback

Flag: com.android.systemui.volume_redesign
Test: passes presubmits
Bug: 369994090
Change-Id: I6bcc80e17ec834391f4ff7ea37f467957dc60504
parent 47acb582
Loading
Loading
Loading
Loading
+23 −2
Original line number Diff line number Diff line
@@ -20,18 +20,39 @@ import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.ContextThemeWrapper
import android.view.MotionEvent
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.res.R
import com.android.systemui.volume.Events
import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibilityInteractor
import com.android.systemui.volume.dialog.ui.binder.VolumeDialogBinder
import javax.inject.Inject

class VolumeDialog
@Inject
constructor(@Application context: Context, private val dialogBinder: VolumeDialogBinder) :
    Dialog(ContextThemeWrapper(context, R.style.volume_dialog_theme)) {
constructor(
    @Application context: Context,
    private val dialogBinder: VolumeDialogBinder,
    private val visibilityInteractor: VolumeDialogVisibilityInteractor,
) : Dialog(ContextThemeWrapper(context, R.style.volume_dialog_theme)) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        dialogBinder.bind(this)
    }

    /**
     * NOTE: This will be called with ACTION_OUTSIDE MotionEvents for touches that occur outside of
     * the touchable region of the volume dialog (as returned by [.onComputeInternalInsets]) even if
     * those touches occurred within the bounds of the volume dialog.
     */
    override fun onTouchEvent(event: MotionEvent): Boolean {
        if (isShowing) {
            if (event.action == MotionEvent.ACTION_OUTSIDE) {
                visibilityInteractor.dismissDialog(Events.DISMISS_REASON_TOUCH_OUTSIDE)
                return true
            }
        }
        return false
    }
}
+2 −18
Original line number Diff line number Diff line
@@ -18,12 +18,10 @@ package com.android.systemui.volume.dialog

import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.plugins.VolumeDialog
import com.android.systemui.volume.dialog.dagger.VolumeDialogComponent
import com.android.systemui.volume.dialog.dagger.VolumeDialogPluginComponent
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch

@@ -34,29 +32,15 @@ constructor(
    private val volumeDialogPluginComponentFactory: VolumeDialogPluginComponent.Factory,
) : VolumeDialog {

    private var volumeDialogPluginComponent: VolumeDialogPluginComponent? = null
    private var job: Job? = null

    override fun init(windowType: Int, callback: VolumeDialog.Callback?) {
        job =
            applicationCoroutineScope.launch {
                coroutineScope {
                    volumeDialogPluginComponent = volumeDialogPluginComponentFactory.create(this)
                }
            }
    }
                    val component = volumeDialogPluginComponentFactory.create(this)

    private fun showDialog() {
        val volumeDialogPluginComponent =
            volumeDialogPluginComponent ?: error("Creating dialog before init was called")
        volumeDialogPluginComponent.coroutineScope().launch {
            coroutineScope {
                val volumeDialogComponent: VolumeDialogComponent =
                    volumeDialogPluginComponent.volumeDialogComponentFactory().create(this)
                with(volumeDialogComponent.volumeDialog()) {
                    setOnDismissListener { volumeDialogComponent.coroutineScope().cancel() }
                    show()
                }
                    component.viewModel().activate()
                }
            }
    }
+2 −9
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.volume.dialog.dagger
import com.android.systemui.volume.dialog.dagger.module.VolumeDialogPluginModule
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
import com.android.systemui.volume.dialog.ui.viewmodel.VolumeDialogPluginViewModel
import dagger.BindsInstance
import dagger.Subcomponent
import kotlinx.coroutines.CoroutineScope
@@ -31,15 +32,7 @@ import kotlinx.coroutines.CoroutineScope
@Subcomponent(modules = [VolumeDialogPluginModule::class])
interface VolumeDialogPluginComponent {

    /**
     * Provides a coroutine scope to use inside [VolumeDialogPluginScope].
     * [com.android.systemui.volume.dialog.VolumeDialogPlugin] manages the lifecycle of this scope.
     * It's cancelled when the dialog is disposed. This helps to free occupied resources when volume
     * dialog is not shown.
     */
    @VolumeDialogPlugin fun coroutineScope(): CoroutineScope

    fun volumeDialogComponentFactory(): VolumeDialogComponent.Factory
    fun viewModel(): VolumeDialogPluginViewModel

    @Subcomponent.Factory
    interface Factory {
+4 −3
Original line number Diff line number Diff line
@@ -20,7 +20,8 @@ import android.annotation.SuppressLint
import android.os.Handler
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.plugins.VolumeDialogController
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
import com.android.systemui.volume.dialog.domain.model.VolumeDialogEventModel
import com.android.systemui.volume.dialog.domain.model.VolumeDialogStateModel
import javax.inject.Inject
@@ -40,12 +41,12 @@ private const val BUFFER_CAPACITY = 16
 *
 * @see VolumeDialogController.Callbacks
 */
@VolumeDialog
@VolumeDialogPluginScope
class VolumeDialogCallbacksInteractor
@Inject
constructor(
    private val volumeDialogController: VolumeDialogController,
    @VolumeDialog private val coroutineScope: CoroutineScope,
    @VolumeDialogPlugin private val coroutineScope: CoroutineScope,
    @Background private val bgHandler: Handler,
) {

+4 −3
Original line number Diff line number Diff line
@@ -17,7 +17,8 @@
package com.android.systemui.volume.dialog.domain.interactor

import com.android.systemui.plugins.VolumeDialogController
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPluginScope
import com.android.systemui.volume.dialog.domain.model.VolumeDialogEventModel
import com.android.systemui.volume.dialog.domain.model.VolumeDialogStateModel
import javax.inject.Inject
@@ -35,13 +36,13 @@ import kotlinx.coroutines.flow.stateIn
 *
 * @see [VolumeDialogController]
 */
@VolumeDialog
@VolumeDialogPluginScope
class VolumeDialogStateInteractor
@Inject
constructor(
    volumeDialogCallbacksInteractor: VolumeDialogCallbacksInteractor,
    private val volumeDialogController: VolumeDialogController,
    @VolumeDialog private val coroutineScope: CoroutineScope,
    @VolumeDialogPlugin private val coroutineScope: CoroutineScope,
) {

    val volumeDialogState: Flow<VolumeDialogStateModel> =
Loading