package com.ydl.ydlcommon.utils
import com.trello.rxlifecycle2.LifecycleTransformer
import com.trello.rxlifecycle2.RxLifecycle
import com.trello.rxlifecycle2.android.ActivityEvent
import com.trello.rxlifecycle2.android.FragmentEvent
import com.trello.rxlifecycle2.android.RxLifecycleAndroid
import com.ydl.ydlcommon.base.lifecycle.IActivityLifecycleable
import com.ydl.ydlcommon.base.lifecycle.IFragmentLifecycleable
import com.ydl.ydlcommon.base.lifecycle.ILifecycleable
import com.ydl.ydlcommon.mvp.base.IView
import io.reactivex.annotations.NonNull
/**
* Created by haorui on 2019-08-22 .
* Des: Activity/Fragment RxLifecycle 特性支持类
*/
class RxLifecycleUtils private constructor() {
init {
throw IllegalStateException("you can't instantiate me!")
}
companion object {
/**
* 绑定 Activity 的指定生命周期
*
* @param view
* @param event
* @param <T>
* @return
</T> */
fun <T> bindUntilEvent(
@NonNull view: IView,
event: ActivityEvent
): LifecycleTransformer<T> {
YDLPreconditions.checkNotNull(view, "view == null")
return if (view is IActivityLifecycleable) {
bindUntilEvent(
view as IActivityLifecycleable,
event
)
} else {
throw IllegalArgumentException("view isn't IActivityLifecycleable")
}
}
/**
* 绑定 Fragment 的指定生命周期
*
* @param view
* @param event
* @param <T>
* @return
</T> */
fun <T> bindUntilEvent(
@NonNull view: IView,
event: FragmentEvent
): LifecycleTransformer<T> {
YDLPreconditions.checkNotNull(view, "view == null")
return if (view is IFragmentLifecycleable) {
bindUntilEvent(
view as IFragmentLifecycleable,
event
)
} else {
throw IllegalArgumentException("view isn't IFragmentLifecycleable")
}
}
fun <T, R> bindUntilEvent(
@NonNull lifecycleable: ILifecycleable<R>,
event: R
): LifecycleTransformer<T> {
YDLPreconditions.checkNotNull(
lifecycleable,
"lifecycleable == null"
)
return RxLifecycle.bindUntilEvent(lifecycleable.provideLifecycleSubject(), event)
}
/**
* 绑定 Activity/Fragment 的生命周期
*
* @param activity
* @param <T>
* @return
</T> */
fun <T> bindToLifecycle(@NonNull view: IView): LifecycleTransformer<T> {
YDLPreconditions.checkNotNull(view, "view == null")
return if (view is ILifecycleable<*>) {
bindToLifecycle(view as ILifecycleable<*>)
} else {
throw IllegalArgumentException("view isn't ILifecycleable")
}
}
fun <T> bindToLifecycle(@NonNull lifecycleable: ILifecycleable<*>): LifecycleTransformer<T> {
YDLPreconditions.checkNotNull(
lifecycleable,
"lifecycleable == null"
)
return if (lifecycleable is IActivityLifecycleable) {
RxLifecycleAndroid.bindActivity(lifecycleable.provideLifecycleSubject())
} else if (lifecycleable is IFragmentLifecycleable) {
RxLifecycleAndroid.bindFragment(lifecycleable.provideLifecycleSubject())
} else {
throw IllegalArgumentException("ILifecycleable not match")
}
}
}
}