Skip to content

Commit 289d3cc

Browse files
author
Alex
committed
fix dialog control
close dialog when lifecycle state is DESTROYED
1 parent 9b7010d commit 289d3cc

File tree

1 file changed

+39
-26
lines changed
  • reactiveviewmodel/src/main/java/com/alexdeww/reactiveviewmodel/widget

1 file changed

+39
-26
lines changed

reactiveviewmodel/src/main/java/com/alexdeww/reactiveviewmodel/widget/DialogControl.kt

Lines changed: 39 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.alexdeww.reactiveviewmodel.widget
22

33
import android.app.Dialog
44
import androidx.lifecycle.Lifecycle
5+
import androidx.lifecycle.LifecycleOwner
56
import androidx.lifecycle.MediatorLiveData
67
import com.alexdeww.reactiveviewmodel.core.RvmViewComponent
78
import io.reactivex.rxjava3.core.Maybe
@@ -74,38 +75,50 @@ fun <T, R> DialogControl<T, R>.bindTo(
7475
rvmViewComponent: RvmViewComponent,
7576
createDialog: ActionCreateDialog<T, R>
7677
) {
77-
val mediator = object : MediatorLiveData<DialogControl.Display>() {
78-
private var dialog: Dialog? = null
79-
80-
init {
81-
addSource(displayed.liveData) {
82-
value = it
83-
when {
84-
it is DialogControl.Display.Displayed<*> -> {
85-
@Suppress("UNCHECKED_CAST")
86-
dialog = createDialog(it.data as T, DialogControlResult(this@bindTo))
87-
dialog?.setOnDismissListener { this@bindTo.dismiss() }
88-
dialog?.show()
89-
}
90-
it === DialogControl.Display.Absent -> closeDialog()
78+
val liveData = DialogLiveDataMediator(
79+
control = this,
80+
createDialog = createDialog,
81+
lifecycleOwner = rvmViewComponent.componentLifecycleOwner
82+
)
83+
rvmViewComponent.run { liveData.observe { /* empty */ } }
84+
}
85+
86+
private class DialogLiveDataMediator<T, R>(
87+
control: DialogControl<T, R>,
88+
createDialog: ActionCreateDialog<T, R>,
89+
private val lifecycleOwner: LifecycleOwner
90+
) : MediatorLiveData<DialogControl.Display>() {
91+
92+
private var dialog: Dialog? = null
93+
94+
init {
95+
addSource(control.displayed.liveData) {
96+
value = it
97+
when {
98+
it is DialogControl.Display.Displayed<*> -> {
99+
@Suppress("UNCHECKED_CAST")
100+
dialog = createDialog(it.data as T, DialogControlResult(control))
101+
dialog?.setOnDismissListener { control.dismiss() }
102+
dialog?.show()
91103
}
104+
it === DialogControl.Display.Absent -> closeDialog()
92105
}
93106
}
107+
}
94108

95-
override fun onInactive() {
96-
if (rvmViewComponent.componentLifecycleOwner.lifecycle.currentState == Lifecycle.State.DESTROYED) {
97-
closeDialog()
98-
}
99-
super.onInactive()
109+
override fun onInactive() {
110+
if (lifecycleOwner.lifecycle.currentState == Lifecycle.State.DESTROYED) {
111+
closeDialog()
100112
}
113+
super.onInactive()
114+
}
101115

102-
private fun closeDialog() {
103-
dialog?.apply {
104-
setOnDismissListener(null)
105-
dismiss()
106-
}
107-
dialog = null
116+
private fun closeDialog() {
117+
dialog?.apply {
118+
setOnDismissListener(null)
119+
dismiss()
108120
}
121+
dialog = null
109122
}
110-
rvmViewComponent.run { mediator.observe { /* empty */ } }
123+
111124
}

0 commit comments

Comments
 (0)