package Ġcom . sh en oto . domain . services ĊĊ Ċ import Ġcom . blank j . util code . util . Toast Utils Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . sh en oto . domain . Build Config Ċ import Ġokhttp 3 . Interceptor Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Response Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ class ĠHttp Interceptor ( private Ġval Ġprefs Utils : ĠP refs Utils ) Ġ: ĠInter ceptor Ġ{ ĊĊĊĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrequest Ġ= Ġchain . request () ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġrequest . newBuilder () ĊĊĠĠĠĠĠĠĠ Ġbuilder . header (" Content - Type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠ Ġbuilder . header (" Accept ", Ġ" application / json ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( prefs Utils . get Ac cesses Token () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . header (" Authorization ", ĠString . format (" Bearer Ġ% s ", Ġprefs Utils . get Ac cesses Token ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequest Ġ= Ġbuilder . build () Ġ// overwrite Ġold Ġrequest ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġchain . proceed ( request ) Ġ// perform Ġrequest , Ġhere Ġoriginal Ġrequest Ġwill Ġbe Ġexecuted Ċ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( response . code () Ġ== ĠHttp URLConnection . HTTP _ UN AUTHORIZ ED Ġ&& Ġrequest . url (). toString () Ġ!= Ġ"${ Build Config . BASE _ URL _ API } auth / login ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// perform Ġall Ġ 4 0 1 Ġin Ġsync Ġblocks , Ġto Ġavoid Ġmultiply Ġtoken Ġupdates Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrefresh Token () Ġ/ Ġ 1 0 0 Ġ// refresh Ġtoken Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( code Ġ!= Ġ 2 ) Ġ{ Ġ// if Ġrefresh Ġtoken Ġfailed Ġfor Ġsome Ġreason Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( code Ġ== Ġ 4 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// only Ġif Ġresponse Ġis Ġ 4 0 0 , Ġ 5 0 0 Ġmight Ġmean Ġthat Ġtoken Ġwas Ġnot Ġupdated Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Utils . logout () Ġ// go Ġto Ġlogin Ġscreen Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse Ġ// if Ġtoken Ġrefresh Ġfailed Ġ- Ġshow Ġerror Ġto Ġuser Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . header (" Authorization ", ĠString . format (" Bearer Ġ% s ", Ġprefs Utils . get Ac cesses Token ())) Ċ // Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġbuilder . build () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchain . proceed ( request ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( response . code () Ġ/ Ġ 1 0 0 Ġ== Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast Utils . show Long (" Ø§Ø ´ Ú© Ø§ÙĦ ĠØ§Ø ² ĠØ³ Ùħ Øª ĠØ³ Ø± ÙĪØ± ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠ Ġprivate Ġfun Ġrefresh Token (): ĠInt Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġvar Ġcode Ġ= ĠHttp URLConnection . HTTP _ UN AUTHORIZ ED Ċ // ĠĠĠĠĠĠĠ Ġval Ġok HttpClient Ġ= Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠOk HttpClient . Builder (). connect Timeout ( 3 0 , ĠTimeUnit . SECONDS ). write Timeout ( 3 0 , ĠTimeUnit . SECONDS ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Timeout ( 3 0 , ĠTimeUnit . SECONDS ). build () Ċ // ĠĠĠĠĠĠĠ Ġval Ġretrofit Ġ= ĠRet rofit . Builder (). baseUrl ( Build Config . BASE _ URL _ API ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ( Gson ())). client ( ok HttpClient ). build () Ċ // ĠĠĠĠĠĠĠ Ġval Ġparameter Ġ= Ġmutable Map Of < String , ĠString >() Ċ // Ċ // ĠĠĠĠĠĠĠ Ġparameter [" refresh _ token "] Ġ= Ġprefs Utils . get RefreshToken () !! Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġresponse Observable Ġ= Ġretrofit . create ( ApiService :: class . java ). refresh Token ( parameter ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġexecute Ġ= Ġresponse Observable . execute () Ċ // ĠĠĠĠĠĠĠ Ġexecute . body ()?. let Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Utils . set RefreshToken ( it . refresh Token ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Utils . set Ac cesses Token ( it . accessToken ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= ĠHttp URLConnection . HTTP _ OK Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġcode Ċ // ĠĠĠ Ġ} Ċ } Ċ