parent
d04ded3910
commit
2f04af482d
@ -1,102 +0,0 @@ |
||||
package io.legado.app.help.http |
||||
|
||||
import kotlinx.coroutines.CompletableDeferred |
||||
import kotlinx.coroutines.Deferred |
||||
import retrofit2.* |
||||
import java.lang.reflect.ParameterizedType |
||||
import java.lang.reflect.Type |
||||
|
||||
class CoroutinesCallAdapterFactory private constructor() : CallAdapter.Factory() { |
||||
companion object { |
||||
fun create(): CoroutinesCallAdapterFactory { |
||||
return CoroutinesCallAdapterFactory() |
||||
} |
||||
} |
||||
|
||||
override fun get( |
||||
returnType: Type, |
||||
annotations: Array<out Annotation>, |
||||
retrofit: Retrofit |
||||
): CallAdapter<*, *>? { |
||||
if (Deferred::class.java != getRawType(returnType)) { |
||||
return null |
||||
} |
||||
check(returnType is ParameterizedType) { "Deferred return type must be parameterized as Deferred<Foo> or Deferred<out Foo>" } |
||||
val responseType = getParameterUpperBound(0, returnType) |
||||
|
||||
val rawDeferredType = getRawType(responseType) |
||||
return if (rawDeferredType == Response::class.java) { |
||||
check(responseType is ParameterizedType) { "Response must be parameterized as Response<Foo> or Response<out Foo>" } |
||||
ResponseCallAdapter<Any>( |
||||
getParameterUpperBound( |
||||
0, |
||||
responseType |
||||
) |
||||
) |
||||
} else { |
||||
BodyCallAdapter<Any>(responseType) |
||||
} |
||||
} |
||||
|
||||
private class BodyCallAdapter<T>( |
||||
private val responseType: Type |
||||
) : CallAdapter<T, Deferred<T>> { |
||||
|
||||
override fun responseType() = responseType |
||||
|
||||
override fun adapt(call: Call<T>): Deferred<T> { |
||||
val deferred = CompletableDeferred<T>() |
||||
|
||||
deferred.invokeOnCompletion { |
||||
if (deferred.isCancelled) { |
||||
call.cancel() |
||||
} |
||||
} |
||||
|
||||
call.enqueue(object : Callback<T> { |
||||
override fun onFailure(call: Call<T>, t: Throwable) { |
||||
deferred.completeExceptionally(t) |
||||
} |
||||
|
||||
override fun onResponse(call: Call<T>, response: Response<T>) { |
||||
if (response.isSuccessful) { |
||||
deferred.complete(response.body()!!) |
||||
} else { |
||||
deferred.completeExceptionally(HttpException(response)) |
||||
} |
||||
} |
||||
}) |
||||
|
||||
return deferred |
||||
} |
||||
} |
||||
|
||||
private class ResponseCallAdapter<T>( |
||||
private val responseType: Type |
||||
) : CallAdapter<T, Deferred<Response<T>>> { |
||||
|
||||
override fun responseType() = responseType |
||||
|
||||
override fun adapt(call: Call<T>): Deferred<Response<T>> { |
||||
val deferred = CompletableDeferred<Response<T>>() |
||||
|
||||
deferred.invokeOnCompletion { |
||||
if (deferred.isCancelled) { |
||||
call.cancel() |
||||
} |
||||
} |
||||
|
||||
call.enqueue(object : Callback<T> { |
||||
override fun onFailure(call: Call<T>, t: Throwable) { |
||||
deferred.completeExceptionally(t) |
||||
} |
||||
|
||||
override fun onResponse(call: Call<T>, response: Response<T>) { |
||||
deferred.complete(response) |
||||
} |
||||
}) |
||||
|
||||
return deferred |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue