Last active
July 9, 2020 16:46
-
-
Save GregKluska/ec3d6024b76af077ff07cf64af01e450 to your computer and use it in GitHub Desktop.
GenericApiResponse and LiveDataCallAdapter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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