Skip to content

Instantly share code, notes, and snippets.

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

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

Select an option

Save GregKluska/ec3d6024b76af077ff07cf64af01e450 to your computer and use it in GitHub Desktop.
GenericApiResponse and LiveDataCallAdapter
import android.util.Log
import retrofit2.Response
/**
* Copied from Architecture components google sample:
* https://github.com/googlesamples/android-architecture-components/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/api/ApiResponse.kt
*/
@Suppress("unused") // T is used in extending classes
sealed class GenericApiResponse<T> {
companion object {
private val TAG: String = "AppDebug"
fun <T> create(error: Throwable): ApiErrorResponse<T> {
return ApiErrorResponse(error.message ?: "unknown error")
}
fun <T> create(response: Response<T>): GenericApiResponse<T> {
Log.d(TAG, "GenericApiResponse: response: ${response}")
Log.d(TAG, "GenericApiResponse: raw: ${response.raw()}")
Log.d(TAG, "GenericApiResponse: headers: ${response.headers()}")
Log.d(TAG, "GenericApiResponse: message: ${response.message()}")
if(response.isSuccessful){
val body = response.body()
if (body == null || response.code() == 204) {
return ApiEmptyResponse()
}
else if(response.code() == 401){
return ApiErrorResponse("401 Unauthorized. Token may be invalid.")
}
else {
return ApiSuccessResponse(body = body)
}
}
else{
val msg = response.errorBody()?.string()
val errorMsg = if (msg.isNullOrEmpty()) {
response.message()
} else {
msg
}
return ApiErrorResponse(errorMsg ?: "unknown error")
}
}
}
}
/**
* separate class for HTTP 204 responses so that we can make ApiSuccessResponse's body non-null.
*/
class ApiEmptyResponse<T> : GenericApiResponse<T>()
data class ApiSuccessResponse<T>(val body: T) : GenericApiResponse<T>() {}
data class ApiErrorResponse<T>(val errorMessage: String) : GenericApiResponse<T>()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment