Here is the complete code which I used in one project:
packageone.projectname.sdk.networkimportkotlinx.coroutines.delayimportkotlinx.coroutines.runBlockingimportokhttp3.Authenticatorimportokhttp3.Requestimportokhttp3.Responseimportokhttp3.Route/**
* Created by Mohit Rajput on 09/03/22.
*/classTokenAuthenticator(privatevaltokenManager:TokenManager):Authenticator{overridefunauthenticate(route:Route?,response:Response):Request{synchronized(this){valsessionData=if(isRefreshNeeded(response)){runBlocking{getUpdatedSessionData()}}else{getExistingSessionData()}returnresponse.request.newBuilder().header(HeaderKeys.SESSION_ID,sessionData.sessionId).header(HeaderKeys.REFRESH_ID,sessionData.refreshId).build()}}privatefunisRefreshNeeded(response:Response):Boolean{valoldSessionId=response.request.header(HeaderKeys.SESSION_ID)valoldRefreshId=response.request.header(HeaderKeys.REFRESH_ID)valupdatedSessionId=tokenManager.getSessionId()valupdatedRefreshId=tokenManager.getRefreshId()return(oldSessionId==updatedSessionId&&oldRefreshId==updatedRefreshId)}privatefungetExistingSessionData():ApiResponse.SessionData{valupdatedSessionId=tokenManager.getSessionId()valupdatedRefreshId=tokenManager.getRefreshId()returnApiResponse.SessionData(sessionId=updatedSessionId,refreshId=updatedRefreshId)}privatesuspendfungetUpdatedSessionData():ApiResponse.SessionData{valrefreshTokenRequest=ApiResponse.RefreshSessionRequest(tokenManager.getRefreshId())returnwhen(valresult=getResult{userApiService().refreshSession(refreshTokenRequest)}){isApiResult.Success->{valsessionData=result.data.datatokenManager.saveSessionId(sessionData.sessionId)tokenManager.saveRefreshId(sessionData.refreshId)delay(50)sessionData}isApiResult.Error->{MySdk.instance().mySdkListeners?.onSessionExpired()returnApiResponse.SessionData()}}}privateclassCustomNetworkStateChecker:NetworkStateChecker{overridefunisNetworkAvailable()=true}privatefunuserApiService():UserApiService{valretrofit=RetrofitHelper.provideRetrofit(RetrofitHelper.provideOkHttpClient(CustomNetworkStateChecker(),tokenManager))returnretrofit.create(UserApiService::class.java)}}
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Here is the complete code which I used in one project: