summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michael Mikhail <michaelmikhil@google.com> 2024-11-27 20:16:17 +0000
committer Michael Mikhail <michaelmikhil@google.com> 2024-11-30 23:28:08 +0000
commit635693fc10c38b228d84be7a1bd508e537759283 (patch)
tree60a5e47ee30c88beaa06684d1011541c5c2321f9
parent5bf40cec7b869c1cd33a400130c59be26d0bc976 (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
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/binder/VolumeDialogRingerViewBinder.kt150
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt12
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
- }
}