@@ -2,6 +2,7 @@ package com.alexdeww.reactiveviewmodel.widget
22
33import android.app.Dialog
44import androidx.lifecycle.Lifecycle
5+ import androidx.lifecycle.LifecycleOwner
56import androidx.lifecycle.MediatorLiveData
67import com.alexdeww.reactiveviewmodel.core.RvmViewComponent
78import 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