package Ġcom . duc cn v . clean mov ied b . data . remote . auth Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . duc cn v . clean mov ied b . data . Authentication Ċ import Ġcom . duc cn v . clean mov ied b . data . model . Token Ċ import Ġcom . duc cn v . clean mov ied b . data . remote . api . OAuth Api Ċ import Ġcom . duc cn v . clean mov ied b . data . remote . builder . Ret rofit Builder Ċ import Ġokhttp 3 .* Ċ import Ġretrofit 2 . Call Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . lang . Exception Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠO auth Refresh Authenticator Ġ@ Inject Ġconstructor ( private Ġval Ġcontext : ĠContext ) Ġ: ĠAuth enticator Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġauthenticate ( route : ĠRoute , Ġresponse : ĠResponse ): ĠRequest ? Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Authentication Ġerror : Ġ${ response . code ()} Ġbase Ġon Ġ${ response . request ()?. url () }") ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( has Bearer ( response )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Not Ġfound Ġbe arer Ġto Ġrefresh Ġauthentication ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Authentication Ġexpired Ġor Ġbad Ġrequest ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Authentication ( response . request (), Ġretry Count ( response ) Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġprivate Ġfun Ġrefresh Authentication ( request : ĠRequest ?, Ġretry Count : ĠInt ): ĠRequest ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( retry Count Ġ> ĠAuthentication . MAX _ RETRY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Retry Ġcount Ġmaximum ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġauth Api Ġ= ĠRet rofit Builder ( context ). build (). create ( OAuth Api :: class . java ) ĊĠĠĠĠĠĠĠ Ġauth Api . refresh Token (" refresh _ token ", Ġ" mobile "). enqueue ( object Ġ: Ġretrofit 2 . Callback < Token > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Token >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Refresh Ġtoken Ġfailed , Ġby Ġ$ t ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Token >, Ġresponse : Ġretrofit 2 . Response < Token >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Refresh Ġaccess Ġtoken Ġsuccessful !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġresponse . body ()?. let Ġ{ Ġre Call Request ( request , Ġretry Count , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Bearer ( response : ĠResponse ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse . request ()?. header ( AUTH )?. startsWith ( BE AR ER ) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretry Count ( response : ĠResponse ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretry Ġ= Ġresponse . request ()?. header ( RETRY ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretry ?. toInt OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre Call Request ( request : ĠRequest ?, Ġretry Count : ĠInt , Ġtoken : ĠToken ): ĠRequest ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest ?. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . header ( RETRY , Ġretry Count . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . header ( AUTH , Ġ"$ BE AR ER Ġ${ token . token }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAUTH Ġ= Ġ" Authorization " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRET RY Ġ= Ġ" Authorization _ retry _ count " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBE AR ER Ġ= Ġ" Bearer " ĊĠĠĠ Ġ} Ċ }