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

Commit ac4498fe authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Inject repeatWhenAttached CoroutineScope to prevent leaking" into main

parents 7ea2db7f 635693fc
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
    }
}