parent
260f6a8de5
commit
7095135a4d
@ -1,239 +0,0 @@ |
||||
package com.android.base.app.aac |
||||
|
||||
import androidx.lifecycle.LiveData |
||||
import androidx.lifecycle.MutableLiveData |
||||
import com.android.base.data.Resource |
||||
import com.android.base.rx.subscribeIgnoreError |
||||
import com.github.dmstocking.optional.java.util.Optional |
||||
import io.reactivex.* |
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------- |
||||
|
||||
fun <T> Observable<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Observable<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T) -> R) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(map(it))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Observable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Observable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
val value = map(it.orElse(null)) |
||||
liveData.postValue(Resource.success(value)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Flowable<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Flowable<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T) -> R) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(map(it))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Flowable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Flowable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
val value = map(it.orElse(null)) |
||||
liveData.postValue(Resource.success(value)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun Completable.subscribeWithLiveData(liveData: MutableLiveData<Resource<Any>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success()) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Completable.subscribeWithLiveData(liveData: MutableLiveData<Resource<T>>, provider: () -> T) { |
||||
liveData.postValue(Resource.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(provider())) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------------------- |
||||
|
||||
fun <T> Observable<T>.toResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it)) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> Observable<Optional<T>>.optionalToResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> Flowable<T>.toResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it)) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> Flowable<Optional<T>>.optionalToResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun Completable.toResourceLiveData(): LiveData<Resource<Any>> { |
||||
val mutableLiveData = MutableLiveData<Resource<Any>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success()) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------------------- |
||||
|
||||
fun <T> Observable<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
||||
|
||||
fun <T> Flowable<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
||||
|
||||
fun <T> Single<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
||||
|
||||
fun <T> Maybe<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
@ -1,42 +0,0 @@ |
||||
package com.android.base.app.ui |
||||
|
||||
import com.android.base.app.Sword |
||||
import timber.log.Timber |
||||
|
||||
fun <T> RefreshStateLayout.handleResultWithStatus(t: T?, onResult: ((T) -> Unit)) { |
||||
if (isRefreshing) { |
||||
refreshCompleted() |
||||
} |
||||
if (t == null || (t is Collection<*> && t.isEmpty()) || (t is Map<*, *> && t.isEmpty())) { |
||||
showEmptyLayout() |
||||
} else { |
||||
onResult.invoke(t) |
||||
showContentLayout() |
||||
} |
||||
} |
||||
|
||||
fun RefreshStateLayout.handleErrorWithStatus(throwable: Throwable?) { |
||||
if (throwable == null) { |
||||
Timber.d("processErrorWithStatus called, but throwable is null") |
||||
return |
||||
} |
||||
if (isRefreshing) { |
||||
refreshCompleted() |
||||
} |
||||
val errorTypeClassifier = Sword.get().errorClassifier() |
||||
if (errorTypeClassifier != null) { |
||||
when { |
||||
errorTypeClassifier.isNetworkError(throwable) -> { |
||||
Timber.d("isNetworkError showNetErrorLayout") |
||||
showNetErrorLayout() |
||||
} |
||||
errorTypeClassifier.isServerError(throwable) -> { |
||||
Timber.d("isServerError showServerErrorLayout") |
||||
showServerErrorLayout() |
||||
} |
||||
else -> showErrorLayout() |
||||
} |
||||
} else { |
||||
showErrorLayout() |
||||
} |
||||
} |
@ -1,172 +0,0 @@ |
||||
package com.android.base.data |
||||
|
||||
|
||||
/** |
||||
* @author Ztiany |
||||
* Email: ztiany3@gmail.com |
||||
* Date : 2018-05-15 16:23 |
||||
*/ |
||||
class Resource<T> private constructor( |
||||
private val error: Throwable?, |
||||
//data or default data |
||||
private val data: T?, |
||||
private val status: Status |
||||
) { |
||||
|
||||
val isSuccess: Boolean |
||||
get() = status == Status.SUCCESS |
||||
|
||||
val isNoChange: Boolean |
||||
get() = status == Status.NOT_CHANGED |
||||
|
||||
val isLoading: Boolean |
||||
get() = status == Status.LOADING |
||||
|
||||
val isError: Boolean |
||||
get() = status == Status.ERROR |
||||
|
||||
fun hasData(): Boolean { |
||||
return data != null |
||||
} |
||||
|
||||
/** |
||||
* 获取 Resource 中保存的数据,只有在 success 状态并且存在数据时下才能调用此方法,否则将抛出异常。 |
||||
* |
||||
* @return Resource 中保存的数据。 |
||||
* @throws UnsupportedOperationException 非 success 状态调用此方法。 |
||||
* @throws NullPointerException Resource 中没有保存数据时调用此方法。 |
||||
*/ |
||||
fun data(): T { |
||||
if (isError || isLoading || isNoChange) { |
||||
throw UnsupportedOperationException("This method can only be called when the is state success") |
||||
} |
||||
if (data == null) { |
||||
throw NullPointerException("Data is null") |
||||
} |
||||
return data |
||||
} |
||||
|
||||
/** |
||||
* 获取 Resource 中保存的数据,如果不存在数据则返回 defaultData 所设置的默认数据,在不同状态下获取的数据具有不同的意义: |
||||
* |
||||
* * success 状态下,返回一个成功操作所产生的数据 |
||||
* * error 状态下,返回一个默认的数据,如果存在的话 |
||||
* * loading 状态下,返回一个默认的数据,如果存在的话 |
||||
* |
||||
* @param defaultData 如果不存在数据则返回 defaultData 所设置的默认数据。 |
||||
* @return Resource 中保存的数据。 |
||||
*/ |
||||
fun orElse(defaultData: T?): T? { |
||||
return data ?: defaultData |
||||
} |
||||
|
||||
/** |
||||
* 获取 Resource 中保存的数据,在不同状态下获取的数据具有不同的意义: |
||||
* |
||||
* * success 状态下,返回一个成功操作所产生的数据 |
||||
* * error 状态下,返回一个默认的数据,如果存在的话 |
||||
* * loading 状态下,返回一个默认的数据,如果存在的话 |
||||
* |
||||
* @return Resource 中保存的数据。 |
||||
*/ |
||||
fun get(): T? { |
||||
return data |
||||
} |
||||
|
||||
fun error(): Throwable { |
||||
return error ?: throw NullPointerException("This method can only be called when the state is error") |
||||
} |
||||
|
||||
override fun toString(): String { |
||||
return "Resource{" + |
||||
"mError=" + error + |
||||
", mStatus=" + status + |
||||
", mData=" + data + |
||||
'}'.toString() |
||||
} |
||||
|
||||
companion object { |
||||
|
||||
fun <T> success(): Resource<T> { |
||||
return Resource(null, null, Status.SUCCESS) |
||||
} |
||||
|
||||
fun <T> success(data: T?): Resource<T> { |
||||
return Resource(null, data, Status.SUCCESS) |
||||
} |
||||
|
||||
fun <T> error(error: Throwable): Resource<T> { |
||||
return error(error, null) |
||||
} |
||||
|
||||
/** |
||||
* 创建一个 error 状态,且设置一个默认的数据 |
||||
*/ |
||||
fun <T> error(error: Throwable, defaultValue: T?): Resource<T> { |
||||
return Resource(error, defaultValue, Status.ERROR) |
||||
} |
||||
|
||||
fun <T> loading(): Resource<T> { |
||||
return loading(null) |
||||
} |
||||
|
||||
/** |
||||
* 创建一个 loading 状态,且设置一个默认的数据 |
||||
*/ |
||||
fun <T> loading(defaultValue: T?): Resource<T> { |
||||
return Resource(null, defaultValue, Status.LOADING) |
||||
} |
||||
|
||||
/** |
||||
* 如果数据源(比如 Repository)缓存了上一次请求的数据,然后对其当前请求返回的数据,发现数据是一样的,可以使用此状态表示 |
||||
* |
||||
* @return Resource |
||||
*/ |
||||
fun <T> noChange(): Resource<T> { |
||||
return Resource(null, null, Status.NOT_CHANGED) |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
/**when in loading*/ |
||||
inline fun <T> Resource<T>.onLoading(onLoading: () -> Unit): Resource<T> { |
||||
if (this.isLoading) { |
||||
onLoading() |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when error occurred*/ |
||||
inline fun <T> Resource<T>.onError(onError: (error: Throwable) -> Unit): Resource<T> { |
||||
if (this.isError) { |
||||
onError(error()) |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when no change*/ |
||||
inline fun <T> Resource<T>.onNoChange(onNoChange: () -> Unit): Resource<T> { |
||||
if (this.isNoChange) { |
||||
onNoChange() |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when succeeded*/ |
||||
inline fun <T> Resource<T>.onSuccess(onSuccess: (data: T?) -> Unit): Resource<T> { |
||||
if (this.isSuccess) { |
||||
onSuccess(this.orElse(null)) |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when succeeded and has data*/ |
||||
inline fun <T> Resource<T>.onSuccessWithData(onSuccess: (data: T) -> Unit): Resource<T> { |
||||
val t = this.get() |
||||
if (this.isSuccess && t != null) { |
||||
onSuccess(t) |
||||
} |
||||
return this |
||||
} |
@ -0,0 +1,203 @@ |
||||
package com.android.base.data |
||||
|
||||
|
||||
/** |
||||
* @author Ztiany |
||||
* Email: ztiany3@gmail.com |
||||
* Date : 2018-05-15 16:23 |
||||
*/ |
||||
class State<T> private constructor( |
||||
private val error: Throwable?, |
||||
//data or default data |
||||
private val data: T?, |
||||
private val status: Int |
||||
) { |
||||
|
||||
val isSuccess: Boolean |
||||
get() = status == SUCCESS |
||||
|
||||
val isNoChange: Boolean |
||||
get() = status == NOT_CHANGED |
||||
|
||||
val isLoading: Boolean |
||||
get() = status == LOADING |
||||
|
||||
val isError: Boolean |
||||
get() = status == ERROR |
||||
|
||||
fun hasData(): Boolean { |
||||
return data != null |
||||
} |
||||
|
||||
/** |
||||
* 获取 State 中保存的数据,只有在 success 状态并且存在数据时下才能调用此方法,否则将抛出异常。 |
||||
* |
||||
* @return State 中保存的数据。 |
||||
* @throws UnsupportedOperationException 非 success 状态调用此方法。 |
||||
* @throws NullPointerException State 中没有保存数据时调用此方法。 |
||||
*/ |
||||
fun data(): T { |
||||
if (isError || isLoading || isNoChange) { |
||||
throw UnsupportedOperationException("This method can only be called when the is state success") |
||||
} |
||||
if (data == null) { |
||||
throw NullPointerException("Data is null") |
||||
} |
||||
return data |
||||
} |
||||
|
||||
/** |
||||
* 获取 State 中保存的数据,如果不存在数据则返回 defaultData 所设置的默认数据,在不同状态下获取的数据具有不同的意义: |
||||
* |
||||
* * success 状态下,返回一个成功操作所产生的数据 |
||||
* * error 状态下,返回一个默认的数据,如果存在的话 |
||||
* * loading 状态下,返回一个默认的数据,如果存在的话 |
||||
* |
||||
* @param defaultData 如果不存在数据则返回 defaultData 所设置的默认数据。 |
||||
* @return State 中保存的数据。 |
||||
*/ |
||||
fun orElse(defaultData: T?): T? { |
||||
return data ?: defaultData |
||||
} |
||||
|
||||
/** |
||||
* 获取 State 中保存的数据,在不同状态下获取的数据具有不同的意义: |
||||
* |
||||
* * success 状态下,返回一个成功操作所产生的数据 |
||||
* * error 状态下,返回一个默认的数据,如果存在的话 |
||||
* * loading 状态下,返回一个默认的数据,如果存在的话 |
||||
* |
||||
* @return State 中保存的数据。 |
||||
*/ |
||||
fun get(): T? { |
||||
return data |
||||
} |
||||
|
||||
fun error(): Throwable { |
||||
return error |
||||
?: throw NullPointerException("This method can only be called when the state is error") |
||||
} |
||||
|
||||
override fun toString(): String { |
||||
return "State{" + |
||||
"mError=" + error + |
||||
", mStatus=" + status + |
||||
", mData=" + data + |
||||
'}'.toString() |
||||
} |
||||
|
||||
companion object { |
||||
|
||||
private const val LOADING = 1 |
||||
private const val ERROR = 2 |
||||
private const val SUCCESS = 3 |
||||
private const val NOT_CHANGED = 4 |
||||
|
||||
fun <T> success(): State<T> { |
||||
return State(null, null, SUCCESS) |
||||
} |
||||
|
||||
fun <T> success(data: T?): State<T> { |
||||
return State(null, data, SUCCESS) |
||||
} |
||||
|
||||
fun <T> error(error: Throwable): State<T> { |
||||
return error(error, null) |
||||
} |
||||
|
||||
/** |
||||
* 创建一个 error 状态,且设置一个默认的数据 |
||||
*/ |
||||
fun <T> error(error: Throwable, defaultValue: T?): State<T> { |
||||
return State(error, defaultValue, ERROR) |
||||
} |
||||
|
||||
fun <T> loading(): State<T> { |
||||
return loading(null) |
||||
} |
||||
|
||||
/** |
||||
* 创建一个 loading 状态,且设置一个默认的数据 |
||||
*/ |
||||
fun <T> loading(defaultValue: T?): State<T> { |
||||
return State(null, defaultValue, LOADING) |
||||
} |
||||
|
||||
/** |
||||
* 如果数据源(比如 Repository)缓存了上一次请求的数据,然后对其当前请求返回的数据,发现数据是一样的,可以使用此状态表示 |
||||
* |
||||
* @return State |
||||
*/ |
||||
fun <T> noChange(): State<T> { |
||||
return State(null, null, NOT_CHANGED) |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
class StateHandler<T> { |
||||
var onError: ((Throwable) -> Unit)? = null |
||||
var onLoading: (() -> Unit)? = null |
||||
var onSuccess: ((T?) -> Unit)? = null |
||||
var onSuccessWithData: ((T) -> Unit)? = null |
||||
var onEmpty: (() -> Unit)? = null |
||||
} |
||||
|
||||
/**handle all state*/ |
||||
inline fun <T> State<T>.handleState(handler: StateHandler<T>.() -> Unit) { |
||||
val stateHandler = StateHandler<T>() |
||||
handler(stateHandler) |
||||
when { |
||||
isError -> stateHandler.onError?.invoke(error()) |
||||
isLoading -> stateHandler.onLoading?.invoke() |
||||
isSuccess -> { |
||||
stateHandler.onSuccess?.invoke(get()) |
||||
if (hasData()) { |
||||
stateHandler.onSuccessWithData?.invoke(data()) |
||||
} else { |
||||
stateHandler.onEmpty?.invoke() |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/**when in loading*/ |
||||
inline fun <T> State<T>.onLoading(onLoading: () -> Unit): State<T> { |
||||
if (this.isLoading) { |
||||
onLoading() |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when error occurred*/ |
||||
inline fun <T> State<T>.onError(onError: (error: Throwable) -> Unit): State<T> { |
||||
if (this.isError) { |
||||
onError(error()) |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when no change*/ |
||||
inline fun <T> State<T>.onNoChange(onNoChange: () -> Unit): State<T> { |
||||
if (this.isNoChange) { |
||||
onNoChange() |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when succeeded*/ |
||||
inline fun <T> State<T>.onSuccess(onSuccess: (data: T?) -> Unit): State<T> { |
||||
if (this.isSuccess) { |
||||
onSuccess(this.orElse(null)) |
||||
} |
||||
return this |
||||
} |
||||
|
||||
/**when succeeded and has data*/ |
||||
inline fun <T> State<T>.onSuccessWithData(onSuccess: (data: T) -> Unit): State<T> { |
||||
val t = this.get() |
||||
if (this.isSuccess && t != null) { |
||||
onSuccess(t) |
||||
} |
||||
return this |
||||
} |
@ -1,15 +0,0 @@ |
||||
package com.android.base.data |
||||
|
||||
/** |
||||
* 用于表示各种状态 |
||||
* |
||||
* @author Ztiany |
||||
* Email: ztiany3@gmail.com |
||||
* Date : 2019-02-18 11:49 |
||||
*/ |
||||
enum class Status { |
||||
LOADING, |
||||
ERROR, |
||||
SUCCESS, |
||||
NOT_CHANGED |
||||
} |
@ -0,0 +1,207 @@ |
||||
package com.android.base.rx |
||||
|
||||
import androidx.lifecycle.LiveData |
||||
import androidx.lifecycle.MutableLiveData |
||||
import com.android.base.data.State |
||||
import com.github.dmstocking.optional.java.util.Optional |
||||
import io.reactivex.Completable |
||||
import io.reactivex.Flowable |
||||
import io.reactivex.Observable |
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------- |
||||
fun <T> Observable<T>.subscribeWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Observable<T>.subscribeWithLiveData(liveData: MutableLiveData<State<R>>, map: (T) -> R) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success(map(it))) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Observable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Observable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
val value = map(it.orElse(null)) |
||||
liveData.postValue(State.success(value)) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Flowable<T>.subscribeWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Flowable<T>.subscribeWithLiveData(liveData: MutableLiveData<State<R>>, map: (T) -> R) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success(map(it))) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Flowable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> Flowable<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
val value = map(it.orElse(null)) |
||||
liveData.postValue(State.success(value)) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun Completable.subscribeWithLiveData(liveData: MutableLiveData<State<Any>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success()) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> Completable.subscribeWithLiveData(liveData: MutableLiveData<State<T>>, provider: () -> T) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(State.success(provider())) |
||||
}, |
||||
{ |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------------------- |
||||
|
||||
fun <T> Observable<T>.toResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> Observable<Optional<T>>.optionalToResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> Flowable<T>.toResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> Flowable<Optional<T>>.optionalToResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun Completable.toResourceLiveData(): LiveData<State<Any>> { |
||||
val mutableLiveData = MutableLiveData<State<Any>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(State.success()) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------------------- |
@ -0,0 +1,40 @@ |
||||
package com.android.base.rx |
||||
|
||||
import androidx.lifecycle.LiveData |
||||
import androidx.lifecycle.MutableLiveData |
||||
import io.reactivex.Flowable |
||||
import io.reactivex.Maybe |
||||
import io.reactivex.Observable |
||||
import io.reactivex.Single |
||||
|
||||
fun <T> Observable<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
||||
|
||||
fun <T> Flowable<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
||||
|
||||
fun <T> Single<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
||||
|
||||
fun <T> Maybe<T>.toLiveData(): LiveData<T> { |
||||
val liveData = MutableLiveData<T>() |
||||
this.subscribeIgnoreError { |
||||
liveData.postValue(it) |
||||
} |
||||
return liveData |
||||
} |
@ -1,204 +1,203 @@ |
||||
package com.android.base.app.aac |
||||
package com.android.base.rx.autodispose |
||||
|
||||
import androidx.lifecycle.LiveData |
||||
import androidx.lifecycle.MutableLiveData |
||||
import com.android.base.data.Resource |
||||
import com.android.base.rx.subscribeIgnoreError |
||||
import com.android.base.data.State |
||||
import com.github.dmstocking.optional.java.util.Optional |
||||
import com.uber.autodispose.* |
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------- |
||||
|
||||
fun <T> ObservableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T> ObservableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it)) |
||||
liveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> ObservableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T) -> R) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T, R> ObservableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<State<R>>, map: (T) -> R) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(map(it))) |
||||
liveData.postValue(State.success(map(it))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> ObservableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T> ObservableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it.orElse(null))) |
||||
liveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> ObservableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T, R> ObservableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
val value = map(it.orElse(null)) |
||||
liveData.postValue(Resource.success(value)) |
||||
liveData.postValue(State.success(value)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> FlowableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T> FlowableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it)) |
||||
liveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> FlowableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T) -> R) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T, R> FlowableSubscribeProxy<T>.subscribeWithLiveData(liveData: MutableLiveData<State<R>>, map: (T) -> R) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(map(it))) |
||||
liveData.postValue(State.success(map(it))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> FlowableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<T>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T> FlowableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<T>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(it.orElse(null))) |
||||
liveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T, R> FlowableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<Resource<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T, R> FlowableSubscribeProxy<Optional<T>>.subscribeOptionalWithLiveData(liveData: MutableLiveData<State<R>>, map: (T?) -> R?) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
val value = map(it.orElse(null)) |
||||
liveData.postValue(Resource.success(value)) |
||||
liveData.postValue(State.success(value)) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun CompletableSubscribeProxy.subscribeWithLiveData(liveData: MutableLiveData<Resource<Any>>) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun CompletableSubscribeProxy.subscribeWithLiveData(liveData: MutableLiveData<State<Any>>) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success()) |
||||
liveData.postValue(State.success()) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
fun <T> CompletableSubscribeProxy.subscribeWithLiveData(liveData: MutableLiveData<Resource<T>>, provider: () -> T) { |
||||
liveData.postValue(Resource.loading()) |
||||
fun <T> CompletableSubscribeProxy.subscribeWithLiveData(liveData: MutableLiveData<State<T>>, provider: () -> T) { |
||||
liveData.postValue(State.loading()) |
||||
this.subscribe( |
||||
{ |
||||
liveData.postValue(Resource.success(provider())) |
||||
liveData.postValue(State.success(provider())) |
||||
}, |
||||
{ |
||||
liveData.postValue(Resource.error(it)) |
||||
liveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------------------- |
||||
|
||||
fun <T> ObservableSubscribeProxy<T>.toResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
fun <T> ObservableSubscribeProxy<T>.toResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it)) |
||||
mutableLiveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> ObservableSubscribeProxy<Optional<T>>.optionalToResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
fun <T> ObservableSubscribeProxy<Optional<T>>.optionalToResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it.orElse(null))) |
||||
mutableLiveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> FlowableSubscribeProxy<T>.toResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
fun <T> FlowableSubscribeProxy<T>.toResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it)) |
||||
mutableLiveData.postValue(State.success(it)) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun <T> FlowableSubscribeProxy<Optional<T>>.optionalToResourceLiveData(): LiveData<Resource<T>> { |
||||
val mutableLiveData = MutableLiveData<Resource<T>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
fun <T> FlowableSubscribeProxy<Optional<T>>.optionalToResourceLiveData(): LiveData<State<T>> { |
||||
val mutableLiveData = MutableLiveData<State<T>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success(it.orElse(null))) |
||||
mutableLiveData.postValue(State.success(it.orElse(null))) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
||||
} |
||||
|
||||
fun CompletableSubscribeProxy.toResourceLiveData(): LiveData<Resource<Any>> { |
||||
val mutableLiveData = MutableLiveData<Resource<Any>>() |
||||
mutableLiveData.value = Resource.loading() |
||||
fun CompletableSubscribeProxy.toResourceLiveData(): LiveData<State<Any>> { |
||||
val mutableLiveData = MutableLiveData<State<Any>>() |
||||
mutableLiveData.value = State.loading() |
||||
subscribe( |
||||
{ |
||||
mutableLiveData.postValue(Resource.success()) |
||||
mutableLiveData.postValue(State.success()) |
||||
}, |
||||
{ |
||||
mutableLiveData.postValue(Resource.error(it)) |
||||
mutableLiveData.postValue(State.error(it)) |
||||
} |
||||
) |
||||
return mutableLiveData |
@ -0,0 +1,12 @@ |
||||
package com.android.base.utils.security |
||||
|
||||
import android.annotation.SuppressLint |
||||
|
||||
fun md5(content: String): String { |
||||
return MD5Utils.md5(content) |
||||
} |
||||
|
||||
@SuppressLint("DefaultLocale") |
||||
fun md5UpperCase(content: String): String { |
||||
return MD5Utils.md5(content).toUpperCase() |
||||
} |
Loading…
Reference in new issue