Hovhannes
07/20/2021, 2:11 PMclass TokenAuthenticator (
context: Context,
private val tokenApi: TokenRefreshApi
) : Authenticator, BaseRepository(tokenApi) {
private val appContext = context.applicationContext
private val userPreferences = UserPreferences(appContext)
override fun authenticate(route: Route?, response: Response): Request? {
return runBlocking {
when (val tokenResponse = getUpdatedToken()) {
is Resource.Success -> {
userPreferences.saveAccessTokens(
tokenResponse.value.access_token!!,
tokenResponse.value.refresh_token!!
)
response.request.newBuilder()
.header("Authorization", "Bearer ${tokenResponse.value.access_token}")
.build()
}
else -> null
}
}
}
private suspend fun getUpdatedToken(): Resource<TokenResponse> {
val refreshToken = userPreferences.refreshToken.first()
return safeApiCall { tokenApi.refreshAccessToken(refreshToken) }
}
}