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

Commit 635693fc authored by Michael Mikhail's avatar Michael Mikhail
Browse files

Inject repeatWhenAttached CoroutineScope to prevent leaking

Volume dialog ringer drawer edition

Flag: com.android.systemui.volume_redesign
Bug: 369995871
Test: Build.
Change-Id: Id5a7051f32c2c570bee69c0b17e996b9caad5985
parent 5bf40cec
Loading
Loading
Loading
Loading
+68 −82
Original line number Diff line number Diff line
@@ -31,9 +31,6 @@ import androidx.dynamicanimation.animation.SpringAnimation
import androidx.dynamicanimation.animation.SpringForce
import com.android.internal.R as internalR
import com.android.settingslib.Utils
import com.android.systemui.lifecycle.WindowLifecycleState
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.lifecycle.viewModel
import com.android.systemui.res.R
import com.android.systemui.util.children
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
@@ -45,6 +42,7 @@ import com.android.systemui.volume.dialog.ringer.ui.viewmodel.RingerViewModelSta
import com.android.systemui.volume.dialog.ringer.ui.viewmodel.VolumeDialogRingerDrawerViewModel
import com.android.systemui.volume.dialog.ui.utils.suspendAnimate
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@@ -55,7 +53,7 @@ private const val CLOSE_DRAWER_DELAY = 300L
@VolumeDialogScope
class VolumeDialogRingerViewBinder
@Inject
constructor(private val viewModelFactory: VolumeDialogRingerDrawerViewModel.Factory) {
constructor(private val viewModel: VolumeDialogRingerDrawerViewModel) {
    private val roundnessSpringForce =
        SpringForce(0F).apply {
            stiffness = 800F
@@ -68,19 +66,11 @@ constructor(private val viewModelFactory: VolumeDialogRingerDrawerViewModel.Fact
        }
    private val rgbEvaluator = ArgbEvaluator()

    fun bind(view: View) {
        with(view) {
            val volumeDialogBackgroundView = requireViewById<View>(R.id.volume_dialog_background)
            val drawerContainer = requireViewById<MotionLayout>(R.id.volume_ringer_drawer)
            val unselectedButtonUiModel = RingerButtonUiModel.getUnselectedButton(context)
            val selectedButtonUiModel = RingerButtonUiModel.getSelectedButton(context)

            repeatWhenAttached {
                viewModel(
                    traceName = "VolumeDialogRingerViewBinder",
                    minWindowLifecycleState = WindowLifecycleState.ATTACHED,
                    factory = { viewModelFactory.create() },
                ) { viewModel ->
    fun CoroutineScope.bind(view: View) {
        val volumeDialogBackgroundView = view.requireViewById<View>(R.id.volume_dialog_background)
        val drawerContainer = view.requireViewById<MotionLayout>(R.id.volume_ringer_drawer)
        val unselectedButtonUiModel = RingerButtonUiModel.getUnselectedButton(view.context)
        val selectedButtonUiModel = RingerButtonUiModel.getSelectedButton(view.context)
        viewModel.ringerViewModel
            .onEach { ringerState ->
                when (ringerState) {
@@ -102,6 +92,7 @@ constructor(private val viewModelFactory: VolumeDialogRingerDrawerViewModel.Fact
                                    R.drawable.volume_dialog_background
                                )
                            }

                            is RingerDrawerState.Closed -> {
                                if (
                                    uiModel.selectedButton.ringerMode ==
@@ -113,16 +104,14 @@ constructor(private val viewModelFactory: VolumeDialogRingerDrawerViewModel.Fact
                                        selectedButtonUiModel,
                                        unselectedButtonUiModel,
                                    ) {
                                                    drawerContainer.closeDrawer(
                                                        uiModel.currentButtonIndex
                                                    )
                                                    volumeDialogBackgroundView
                                                        .setBackgroundResource(
                                        drawerContainer.closeDrawer(uiModel.currentButtonIndex)
                                        volumeDialogBackgroundView.setBackgroundResource(
                                            R.drawable.volume_dialog_background
                                        )
                                    }
                                }
                            }

                            is RingerDrawerState.Open -> {
                                drawerContainer.animateAndBindDrawerButtons(
                                    viewModel,
@@ -135,8 +124,7 @@ constructor(private val viewModelFactory: VolumeDialogRingerDrawerViewModel.Fact
                                    R.id.volume_dialog_ringer_drawer_open
                                )
                                if (
                                                uiModel.currentButtonIndex !=
                                                    uiModel.availableButtons.size - 1
                                    uiModel.currentButtonIndex != uiModel.availableButtons.size - 1
                                ) {
                                    volumeDialogBackgroundView.setBackgroundResource(
                                        R.drawable.volume_dialog_background_small_radius
@@ -145,6 +133,7 @@ constructor(private val viewModelFactory: VolumeDialogRingerDrawerViewModel.Fact
                            }
                        }
                    }

                    is RingerViewModelState.Unavailable -> {
                        drawerContainer.visibility = View.GONE
                        volumeDialogBackgroundView.setBackgroundResource(
@@ -155,9 +144,6 @@ constructor(private val viewModelFactory: VolumeDialogRingerDrawerViewModel.Fact
            }
            .launchIn(this)
    }
            }
        }
    }

    private suspend fun MotionLayout.animateAndBindDrawerButtons(
        viewModel: VolumeDialogRingerDrawerViewModel,
+4 −8
Original line number Diff line number Diff line
@@ -32,12 +32,12 @@ import com.android.systemui.res.R
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.volume.Events
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope
import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibilityInteractor
import com.android.systemui.volume.dialog.ringer.domain.VolumeDialogRingerInteractor
import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel
import com.android.systemui.volume.dialog.shared.VolumeDialogLogger
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
@@ -50,8 +50,9 @@ import kotlinx.coroutines.launch

private const val SHOW_RINGER_TOAST_COUNT = 12

@VolumeDialogScope
class VolumeDialogRingerDrawerViewModel
@AssistedInject
@Inject
constructor(
    @Application private val applicationContext: Context,
    @VolumeDialog private val coroutineScope: CoroutineScope,
@@ -262,9 +263,4 @@ constructor(
            interactor.updateToastCount(seenToastCount)
        }
    }

    @AssistedFactory
    interface Factory {
        fun create(): VolumeDialogRingerDrawerViewModel
    }
}