diff --git a/src/main/java/ru/touchin/templates/livedata/BaseLiveDataDispatcher.kt b/src/main/java/ru/touchin/templates/livedata/BaseLiveDataDispatcher.kt index 411cc2b..9d67a2c 100644 --- a/src/main/java/ru/touchin/templates/livedata/BaseLiveDataDispatcher.kt +++ b/src/main/java/ru/touchin/templates/livedata/BaseLiveDataDispatcher.kt @@ -2,17 +2,26 @@ package ru.touchin.templates.livedata import android.arch.lifecycle.MutableLiveData import io.reactivex.Completable +import io.reactivex.Flowable import io.reactivex.Maybe import io.reactivex.Observable import io.reactivex.Single import ru.touchin.roboswag.components.utils.destroyable.Destroyable -import ru.touchin.templates.viewmodel.CompletableEvent -import ru.touchin.templates.viewmodel.MaybeEvent -import ru.touchin.templates.viewmodel.ObservableEvent -import ru.touchin.templates.viewmodel.SingleEvent +import ru.touchin.templates.livedata.event.CompletableEvent +import ru.touchin.templates.livedata.event.MaybeEvent +import ru.touchin.templates.livedata.event.ObservableEvent +import ru.touchin.templates.livedata.event.SingleEvent class BaseLiveDataDispatcher(private val destroyable: Destroyable) : LiveDataDispatcher { + override fun Flowable.dispatchTo(liveData: MutableLiveData>) { + liveData.value = ObservableEvent.Loading(liveData.value?.data) + destroyable.untilDestroy(this, + { data -> liveData.value = ObservableEvent.Success(data) }, + { throwable -> liveData.value = ObservableEvent.Error(throwable, liveData.value?.data) }, + { liveData.value = ObservableEvent.Completed(liveData.value?.data) }) + } + override fun Observable.dispatchTo(liveData: MutableLiveData>) { liveData.value = ObservableEvent.Loading(liveData.value?.data) destroyable.untilDestroy(this, @@ -29,9 +38,9 @@ class BaseLiveDataDispatcher(private val destroyable: Destroyable) : LiveDataDis } override fun Completable.dispatchTo(liveData: MutableLiveData) { - liveData.value = CompletableEvent.Loading() + liveData.value = CompletableEvent.Loading destroyable.untilDestroy(this, - { liveData.value = CompletableEvent.Completed() }, + { liveData.value = CompletableEvent.Completed }, { throwable -> liveData.value = CompletableEvent.Error(throwable) }) } diff --git a/src/main/java/ru/touchin/templates/livedata/LiveDataDispatcher.kt b/src/main/java/ru/touchin/templates/livedata/LiveDataDispatcher.kt index 7d43c0f..aacc806 100644 --- a/src/main/java/ru/touchin/templates/livedata/LiveDataDispatcher.kt +++ b/src/main/java/ru/touchin/templates/livedata/LiveDataDispatcher.kt @@ -2,16 +2,19 @@ package ru.touchin.templates.livedata import android.arch.lifecycle.MutableLiveData import io.reactivex.Completable +import io.reactivex.Flowable import io.reactivex.Maybe import io.reactivex.Observable import io.reactivex.Single -import ru.touchin.templates.viewmodel.CompletableEvent -import ru.touchin.templates.viewmodel.MaybeEvent -import ru.touchin.templates.viewmodel.ObservableEvent -import ru.touchin.templates.viewmodel.SingleEvent +import ru.touchin.templates.livedata.event.CompletableEvent +import ru.touchin.templates.livedata.event.MaybeEvent +import ru.touchin.templates.livedata.event.ObservableEvent +import ru.touchin.templates.livedata.event.SingleEvent interface LiveDataDispatcher { + fun Flowable.dispatchTo(liveData: MutableLiveData>) + fun Observable.dispatchTo(liveData: MutableLiveData>) fun Single.dispatchTo(liveData: MutableLiveData>) diff --git a/src/main/java/ru/touchin/templates/livedata/SingleLiveEvent.kt b/src/main/java/ru/touchin/templates/livedata/SingleLiveEvent.kt new file mode 100644 index 0000000..27b0a1d --- /dev/null +++ b/src/main/java/ru/touchin/templates/livedata/SingleLiveEvent.kt @@ -0,0 +1,25 @@ +package ru.touchin.templates.livedata + +import android.arch.lifecycle.LifecycleOwner +import android.arch.lifecycle.MutableLiveData +import android.arch.lifecycle.Observer +import java.util.concurrent.atomic.AtomicBoolean + +class SingleLiveEvent : MutableLiveData() { + + private val pending = AtomicBoolean(false) + + override fun observe(owner: LifecycleOwner, observer: Observer) { + super.observe(owner, Observer { value -> + if (pending.compareAndSet(true, false)) { + observer.onChanged(value) + } + }) + } + + override fun setValue(value: T) { + pending.set(true) + super.setValue(value) + } + +} diff --git a/src/main/java/ru/touchin/templates/livedata/event/CompletableEvent.kt b/src/main/java/ru/touchin/templates/livedata/event/CompletableEvent.kt new file mode 100644 index 0000000..b5e59de --- /dev/null +++ b/src/main/java/ru/touchin/templates/livedata/event/CompletableEvent.kt @@ -0,0 +1,15 @@ +package ru.touchin.templates.livedata.event + +/** + * Created by Denis Karmyshakov on 14.03.18. + * Event class that emits from [io.reactivex.Completable]. + */ +sealed class CompletableEvent { + + object Loading: CompletableEvent() + + object Completed: CompletableEvent() + + data class Error(val throwable: Throwable): CompletableEvent() + +} diff --git a/src/main/java/ru/touchin/templates/viewmodel/MaybeEvent.kt b/src/main/java/ru/touchin/templates/livedata/event/MaybeEvent.kt similarity index 90% rename from src/main/java/ru/touchin/templates/viewmodel/MaybeEvent.kt rename to src/main/java/ru/touchin/templates/livedata/event/MaybeEvent.kt index 9cb944d..049752e 100644 --- a/src/main/java/ru/touchin/templates/viewmodel/MaybeEvent.kt +++ b/src/main/java/ru/touchin/templates/livedata/event/MaybeEvent.kt @@ -1,4 +1,4 @@ -package ru.touchin.templates.viewmodel +package ru.touchin.templates.livedata.event /** * Created by Denis Karmyshakov on 14.03.18. diff --git a/src/main/java/ru/touchin/templates/viewmodel/ObservableEvent.kt b/src/main/java/ru/touchin/templates/livedata/event/ObservableEvent.kt similarity index 91% rename from src/main/java/ru/touchin/templates/viewmodel/ObservableEvent.kt rename to src/main/java/ru/touchin/templates/livedata/event/ObservableEvent.kt index af82609..d293cce 100644 --- a/src/main/java/ru/touchin/templates/viewmodel/ObservableEvent.kt +++ b/src/main/java/ru/touchin/templates/livedata/event/ObservableEvent.kt @@ -1,4 +1,4 @@ -package ru.touchin.templates.viewmodel +package ru.touchin.templates.livedata.event /** * Created by Denis Karmyshakov on 14.03.18. diff --git a/src/main/java/ru/touchin/templates/viewmodel/SingleEvent.kt b/src/main/java/ru/touchin/templates/livedata/event/SingleEvent.kt similarity index 89% rename from src/main/java/ru/touchin/templates/viewmodel/SingleEvent.kt rename to src/main/java/ru/touchin/templates/livedata/event/SingleEvent.kt index 23e4193..3b133a4 100644 --- a/src/main/java/ru/touchin/templates/viewmodel/SingleEvent.kt +++ b/src/main/java/ru/touchin/templates/livedata/event/SingleEvent.kt @@ -1,4 +1,4 @@ -package ru.touchin.templates.viewmodel +package ru.touchin.templates.livedata.event /** * Created by Denis Karmyshakov on 14.03.18. diff --git a/src/main/java/ru/touchin/templates/viewmodel/CompletableEvent.kt b/src/main/java/ru/touchin/templates/viewmodel/CompletableEvent.kt deleted file mode 100644 index c1eaedc..0000000 --- a/src/main/java/ru/touchin/templates/viewmodel/CompletableEvent.kt +++ /dev/null @@ -1,15 +0,0 @@ -package ru.touchin.templates.viewmodel - -/** - * Created by Denis Karmyshakov on 14.03.18. - * Event class that emits from [io.reactivex.Completable]. - */ -sealed class CompletableEvent { - - class Loading: CompletableEvent() - - class Completed: CompletableEvent() - - class Error(val throwable: Throwable): CompletableEvent() - -}