Skip to content

Instantly share code, notes, and snippets.

@GregKluska
Created July 9, 2020 16:46
Show Gist options
  • Select an option

  • Save GregKluska/fdb95e5dfb414fe749c8ef796e1b15fd to your computer and use it in GitHub Desktop.

Select an option

Save GregKluska/fdb95e5dfb414fe749c8ef796e1b15fd to your computer and use it in GitHub Desktop.
import androidx.lifecycle.LiveData
import retrofit2.Call
import retrofit2.CallAdapter
import retrofit2.Callback
import retrofit2.Response
import java.lang.reflect.Type
import java.util.concurrent.atomic.AtomicBoolean
class LiveDataCallAdapter<R>(private val responseType: Type) :
CallAdapter<R, LiveData<GenericApiResponse<R>>> {
override fun responseType() = responseType
override fun adapt(call: Call<R>): LiveData<GenericApiResponse<R>> {
return object : LiveData<GenericApiResponse<R>>() {
private var started = AtomicBoolean(false)
override fun onActive() {
super.onActive()
if (started.compareAndSet(false, true)) {
call.enqueue(object : Callback<R> {
override fun onResponse(call: Call<R>, response: Response<R>) {
postValue(GenericApiResponse.create(response))
}
override fun onFailure(call: Call<R>, throwable: Throwable) {
postValue(GenericApiResponse.create(throwable))
}
})
}
}
}
}
}
import androidx.lifecycle.LiveData
import retrofit2.CallAdapter
import retrofit2.CallAdapter.Factory
import retrofit2.Retrofit
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
class LiveDataCallAdapterFactory : Factory() {
override fun get(
returnType: Type,
annotations: Array<Annotation>,
retrofit: Retrofit
): CallAdapter<*, *>? {
if (Factory.getRawType(returnType) != LiveData::class.java) {
return null
}
val observableType = Factory.getParameterUpperBound(0, returnType as ParameterizedType)
val rawObservableType = Factory.getRawType(observableType)
if (rawObservableType != GenericApiResponse::class.java) {
throw IllegalArgumentException("type must be a resource")
}
if (observableType !is ParameterizedType) {
throw IllegalArgumentException("resource must be parameterized")
}
val bodyType = Factory.getParameterUpperBound(0, observableType)
return LiveDataCallAdapter<Any>(bodyType)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment