diff options
| author | 2024-11-27 20:16:17 +0000 | |
|---|---|---|
| committer | 2024-11-30 23:28:08 +0000 | |
| commit | 635693fc10c38b228d84be7a1bd508e537759283 (patch) | |
| tree | 60a5e47ee30c88beaa06684d1011541c5c2321f9 | |
| parent | 5bf40cec7b869c1cd33a400130c59be26d0bc976 (diff) | |
Inject repeatWhenAttached CoroutineScope to prevent leaking
Volume dialog ringer drawer edition
Flag: com.android.systemui.volume_redesign
Bug: 369995871
Test: Build.
Change-Id: Id5a7051f32c2c570bee69c0b17e996b9caad5985
2 files changed, 72 insertions, 90 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt index 82ac056fd2d4..f98ad45f30bc 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt @@ -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,95 +66,83 @@ 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) + 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) { + is RingerViewModelState.Available -> { + val uiModel = ringerState.uiModel - repeatWhenAttached { - viewModel( - traceName = "VolumeDialogRingerViewBinder", - minWindowLifecycleState = WindowLifecycleState.ATTACHED, - factory = { viewModelFactory.create() }, - ) { viewModel -> - viewModel.ringerViewModel - .onEach { ringerState -> - when (ringerState) { - is RingerViewModelState.Available -> { - val uiModel = ringerState.uiModel + // Set up view background and visibility + drawerContainer.visibility = View.VISIBLE + when (uiModel.drawerState) { + is RingerDrawerState.Initial -> { + drawerContainer.animateAndBindDrawerButtons( + viewModel, + uiModel, + selectedButtonUiModel, + unselectedButtonUiModel, + ) + drawerContainer.closeDrawer(uiModel.currentButtonIndex) + volumeDialogBackgroundView.setBackgroundResource( + R.drawable.volume_dialog_background + ) + } - // Set up view background and visibility - drawerContainer.visibility = View.VISIBLE - when (uiModel.drawerState) { - is RingerDrawerState.Initial -> { - drawerContainer.animateAndBindDrawerButtons( - viewModel, - uiModel, - selectedButtonUiModel, - unselectedButtonUiModel, - ) - drawerContainer.closeDrawer(uiModel.currentButtonIndex) - volumeDialogBackgroundView.setBackgroundResource( - R.drawable.volume_dialog_background - ) - } - is RingerDrawerState.Closed -> { - if ( - uiModel.selectedButton.ringerMode == - uiModel.drawerState.currentMode - ) { - drawerContainer.animateAndBindDrawerButtons( - viewModel, - uiModel, - selectedButtonUiModel, - unselectedButtonUiModel, - ) { - drawerContainer.closeDrawer( - uiModel.currentButtonIndex - ) - volumeDialogBackgroundView - .setBackgroundResource( - R.drawable.volume_dialog_background - ) - } - } - } - is RingerDrawerState.Open -> { - drawerContainer.animateAndBindDrawerButtons( - viewModel, - uiModel, - selectedButtonUiModel, - unselectedButtonUiModel, - ) - // Open drawer - drawerContainer.transitionToState( - R.id.volume_dialog_ringer_drawer_open - ) - if ( - uiModel.currentButtonIndex != - uiModel.availableButtons.size - 1 - ) { - volumeDialogBackgroundView.setBackgroundResource( - R.drawable.volume_dialog_background_small_radius - ) - } - } + is RingerDrawerState.Closed -> { + if ( + uiModel.selectedButton.ringerMode == + uiModel.drawerState.currentMode + ) { + drawerContainer.animateAndBindDrawerButtons( + viewModel, + uiModel, + selectedButtonUiModel, + unselectedButtonUiModel, + ) { + drawerContainer.closeDrawer(uiModel.currentButtonIndex) + volumeDialogBackgroundView.setBackgroundResource( + R.drawable.volume_dialog_background + ) } } - is RingerViewModelState.Unavailable -> { - drawerContainer.visibility = View.GONE + } + + is RingerDrawerState.Open -> { + drawerContainer.animateAndBindDrawerButtons( + viewModel, + uiModel, + selectedButtonUiModel, + unselectedButtonUiModel, + ) + // Open drawer + drawerContainer.transitionToState( + R.id.volume_dialog_ringer_drawer_open + ) + if ( + uiModel.currentButtonIndex != uiModel.availableButtons.size - 1 + ) { volumeDialogBackgroundView.setBackgroundResource( - R.drawable.volume_dialog_background + R.drawable.volume_dialog_background_small_radius ) } } } - .launchIn(this) + } + + is RingerViewModelState.Unavailable -> { + drawerContainer.visibility = View.GONE + volumeDialogBackgroundView.setBackgroundResource( + R.drawable.volume_dialog_background + ) + } } } - } + .launchIn(this) } private suspend fun MotionLayout.animateAndBindDrawerButtons( diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt index 45338e4577a7..e646636dd2a2 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt @@ -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 - } } |