Skip to content

Commit 06c6819

Browse files
author
Alex
committed
update DialogControl.kt
1 parent 6d4b6fd commit 06c6819

4 files changed

Lines changed: 51 additions & 51 deletions

File tree

build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ buildscript {
55
min_sdk_version = 17
66
sdk_version = 31
77

8-
kotlin_version = '1.6.0'
8+
kotlin_version = '1.7.0'
99
rxjava_version = '3.1.2'
1010
rxandroid_version = '3.0.0'
1111
archx_version = '2.2.0'
12-
appcompatx_version = '1.4.1'
13-
material_version = '1.5.0'
14-
androidx_core = '1.7.0'
12+
appcompatx_version = '1.4.2'
13+
material_version = '1.6.1'
14+
androidx_core = '1.8.0'
1515
}
1616
repositories {
1717
google()

reactiveviewmodel/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ afterEvaluate {
4545
release(MavenPublication) {
4646
from components.release
4747
groupId = 'com.alexdeww.reactiveviewmodel'
48-
version = '2.4.9'
48+
version = '2.5.0'
4949
}
5050
}
5151
}

reactiveviewmodel/src/main/java/com/alexdeww/reactiveviewmodel/core/RvmViewComponent.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ interface RvmViewComponent {
6464
)
6565

6666
fun <T : Any, R : Any> DialogControl<T, R>.bindTo(
67-
dialogFactory: DialogFactory<T, R, Dialog>
67+
dialogCreator: DialogCreator<T, R, Dialog>
6868
) = bindTo(
6969
rvmViewComponent = this@RvmViewComponent,
70-
dialogFactory = dialogFactory
70+
dialogCreator = dialogCreator
7171
)
7272

7373
fun InputControl.bindTo(

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

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.alexdeww.reactiveviewmodel.widget
22

33
import android.app.Dialog
4-
import androidx.lifecycle.LiveData
54
import androidx.lifecycle.MediatorLiveData
6-
import androidx.lifecycle.Observer
75
import com.alexdeww.reactiveviewmodel.core.RvmViewComponent
86
import io.reactivex.rxjava3.core.Maybe
97

@@ -72,82 +70,84 @@ fun <T : Any, R : Any> dialogControl(): DialogControl<T, R> = DialogControl()
7270

7371
fun <T : Any> dialogControlWithResult(): DialogControl<T, DialogResult> = DialogControl()
7472

75-
fun interface DialogFactory<in T : Any, R : Any, out D : Any> {
76-
fun createDialog(data: T, dc: DialogControlResult<R>): D
73+
typealias DialogCreator<T, R, D> = (data: T, dc: DialogControlResult<R>) -> D
74+
75+
interface DialogHandlerListener<D> {
76+
77+
fun onSetupOnDismiss(dialog: D, dismissAction: () -> Unit)
78+
79+
fun onShowDialog(dialog: D)
80+
81+
fun onCloseDialog(dialog: D)
82+
83+
fun onDialogUnbind(dialog: D) {
84+
onCloseDialog(dialog)
85+
}
86+
7787
}
7888

7989
fun <T : Any, R : Any, D : Any> DialogControl<T, R>.bindToEx(
8090
rvmViewComponent: RvmViewComponent,
81-
dialogFactory: DialogFactory<T, R, D>,
82-
dialogLiveDataProvider: (control: DialogControl<T, R>, dialogFactory: DialogFactory<T, R, D>) -> DialogLiveDataMediator<T, R, D>
91+
dialogCreator: DialogCreator<T, R, D>,
92+
dialogHandlerListener: DialogHandlerListener<D>
8393
) {
84-
val liveData = dialogLiveDataProvider(this, dialogFactory)
94+
val liveData = DialogLiveDataMediator(this, dialogCreator, dialogHandlerListener)
8595
rvmViewComponent.run { liveData.observe { /* empty */ } }
8696
}
8797

8898
fun <T : Any, R : Any> DialogControl<T, R>.bindTo(
8999
rvmViewComponent: RvmViewComponent,
90-
dialogFactory: DialogFactory<T, R, Dialog>
91-
) = bindToEx(rvmViewComponent, dialogFactory, ::DialogLiveDataMediatorDialog)
100+
dialogCreator: DialogCreator<T, R, Dialog>
101+
) = bindToEx(rvmViewComponent, dialogCreator, OrdinaryDialogHandlerListener())
92102

93-
abstract class DialogLiveDataMediator<T : Any, R : Any, D : Any>(
94-
control: DialogControl<T, R>,
95-
dialogFactory: DialogFactory<T, R, D>
96-
) : MediatorLiveData<DialogControl.Display<T>>() {
103+
private class DialogLiveDataMediator<T : Any, R : Any, D : Any>(
104+
private val control: DialogControl<T, R>,
105+
private val dialogCreator: DialogCreator<T, R, D>,
106+
private val dialogHandlerListener: DialogHandlerListener<D>
107+
) : MediatorLiveData<DialogControl.Display<T>>(),
108+
DialogHandlerListener<D> by dialogHandlerListener {
97109

98110
private var dialog: D? = null
99111

100-
init {
112+
override fun onActive() {
113+
super.onActive()
101114
addSource(control.displayed.liveData) { displayData ->
102115
value = displayData
103116
when (displayData) {
104117
is DialogControl.Display.Displayed -> {
105-
dialog = dialogFactory
106-
.createDialog(
107-
data = displayData.data,
108-
dc = DialogControlResult(control)
109-
).also {
110-
setupOnDismiss(it) { control.dismiss() }
111-
showDialog(it)
112-
}
118+
dialog = dialogCreator(displayData.data, DialogControlResult(control)).also {
119+
onSetupOnDismiss(it) { control.dismiss() }
120+
onShowDialog(it)
121+
}
122+
}
123+
DialogControl.Display.Absent -> {
124+
dialog?.let { onCloseDialog(it) }
125+
releaseDialog()
113126
}
114-
DialogControl.Display.Absent -> closeDialog()
115127
}
116128
}
117129
}
118130

119-
final override fun <S : Any?> addSource(source: LiveData<S>, onChanged: Observer<in S>) {
120-
super.addSource(source, onChanged)
121-
}
122-
123-
final override fun removeObserver(observer: Observer<in DialogControl.Display<T>>) {
124-
super.removeObserver(observer)
125-
closeDialog()
131+
override fun onInactive() {
132+
super.onInactive()
133+
removeSource(control.displayed.liveData)
134+
dialog?.let { onDialogUnbind(it) }
135+
releaseDialog()
126136
}
127137

128-
protected abstract fun setupOnDismiss(dialog: D, dismissAction: () -> Unit)
129-
130-
protected abstract fun showDialog(dialog: D)
131-
132-
protected abstract fun onCloseDialog(dialog: D)
133-
134-
private fun closeDialog() {
135-
dialog?.let { onCloseDialog(it) }
138+
private fun releaseDialog() {
136139
dialog = null
137140
}
138141

139142
}
140143

141-
private class DialogLiveDataMediatorDialog<T : Any, R : Any>(
142-
control: DialogControl<T, R>,
143-
dialogFactory: DialogFactory<T, R, Dialog>
144-
) : DialogLiveDataMediator<T, R, Dialog>(control, dialogFactory) {
144+
private class OrdinaryDialogHandlerListener : DialogHandlerListener<Dialog> {
145145

146-
override fun setupOnDismiss(dialog: Dialog, dismissAction: () -> Unit) {
146+
override fun onSetupOnDismiss(dialog: Dialog, dismissAction: () -> Unit) {
147147
dialog.setOnDismissListener { dismissAction() }
148148
}
149149

150-
override fun showDialog(dialog: Dialog) {
150+
override fun onShowDialog(dialog: Dialog) {
151151
dialog.show()
152152
}
153153

0 commit comments

Comments
 (0)