package Ġbr . com . g fp f medi ap layer . service Ċ Ċ import Ġokhttp 3 . Interceptor Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Response Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . adapter . rx java 2 . Rx Java 2 Call Adapter Factory Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ object ĠRet rofit Service ApiClient Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠBASE _ URL Ġ= Ġ" https :// firebase storage . googleapis . com " ĊĠĠĠ Ġconst Ġval ĠQUERY _ ALT _ KEY Ġ= Ġ" media " ĊĠĠĠ Ġconst Ġval ĠQUERY _ TOKEN _ KEY Ġ= Ġ" 9 6 4 a 3 5 bb - 5 3 d 0 - 4 5 aa - a 3 dd - ec ad 7 2 a 2 f 1 4 c " ĊĊĠĠĠ Ġprivate Ġvar Ġretrofit : ĠRet rofit ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ TIMEOUT Ġ= Ġ 1 0 ĊĠĠĠ Ġprivate Ġvar Ġok HttpClient : ĠOk HttpClient ? Ġ= Ġnull ĊĊĠĠĠ Ġfun ĠgetClient (): ĠRet rofit ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ok HttpClient Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ok Http () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ret rofit Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretrofit Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( ok HttpClient ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Call Adapter Factory ( Rx Java 2 Call Adapter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . add Call Adapter Factory ( Rx Java 2 Call Adapter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġretrofit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ok Http () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠhttpClient Ġ= ĠOk HttpClient (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. connect Timeout ( REQUEST _ TIMEOUT . to Long (), ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Timeout ( REQUEST _ TIMEOUT . to Long (), ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. write Timeout ( REQUEST _ TIMEOUT . to Long (), ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinterceptor Ġ= ĠHttp Logging Interceptor () ĊĠĠĠĠĠĠĠ Ġinterceptor . level Ġ= ĠHttp Logging Interceptor . Level . BODY ĊĊĠĠĠĠĠĠĠ ĠhttpClient . add Interceptor ( interceptor ) ĊĊĠĠĠĠĠĠĠ ĠhttpClient . add Interceptor ( object Ġ: ĠInter ceptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Request Ġ= Ġchain . request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauthentication Request Ġ= Ġoriginal Request . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" Test Header ", Ġ" fail ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorig Response Ġ= Ġchain . proceed ( authentication Request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġserver Ġshould Ġgive Ġus Ġa Ġ 4 0 3 , Ġsince Ġthe Ġheader Ġcontains Ġ' fail ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orig Response . code Ġ== Ġ 4 0 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= Ġ" abcd " Ġ// Ġyou Ġgot Ġthis Ġfrom ĠAuth 0 Ġwhen Ġlogging Ġin ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġa Ġnew Ġsynchronous Ġnetwork Ġcall Ġto ĠAuth 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġnew Id Token Ġ= Ġfetch New Id Token From Auth 0 ( refresh Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Id Token Ġ= ĠQUERY _ TOKEN _ KEY ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġa Ġnew Ġrequest Ġwith Ġthe Ġnew Ġid Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Authentication Request Ġ= Ġoriginal Request . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" Test Header ", Ġ" suc ceed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtry Ġagain ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhopefully Ġwe Ġnow Ġhave Ġa Ġstatus Ġof Ġ 2 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchain . proceed ( new Authentication Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġorig Response ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĊ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* val Ġoriginal Ġ= Ġchain . request () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Builder Ġ= Ġoriginal . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Accept ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Content - Type ", Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// . add Header (" Authorization ", Ġ" 9 6 4 a 3 5 bb - 5 3 d 0 - 4 5 aa - a 3 dd - ec ad 7 2 a 2 f 1 4 c ") */ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ================================================ ======= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdding ĠAuthorization Ġtoken Ġ( API ĠKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequests Ġwill Ġbe Ġdenied Ġwithout ĠAPI Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* if Ġ(! TextUtils . isEmpty ( Pref Utils . get ApiKey ( context ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Builder . add Header (" Authorization ", ĠPref Utils . get ApiKey ( context )); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ================================================ ======= ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* val Ġrequest Ġ= Ġrequest Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchain . proceed ( request ) */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġok HttpClient Ġ= ĠhttpClient . build () ĊĠĠĠ Ġ} Ċ }