package Ġorg . tom curr an . s me ed av iation . challenges . ui . main Ċ Ċ import Ġandroid . app . Application Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġnet . openid . app auth . Authorization Exception Ċ import Ġnet . openid . app auth . Authorization Service Ċ import Ġnet . openid . app auth . Token Response Ċ import Ġokhttp 3 . Authenticator Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġokhttp 3 . Route Ċ import Ġorg . tom curr an . s me ed av iation . challenges . Build Config Ċ import Ġorg . tom curr an . s me ed av iation . challenges . util . Auth StateManager Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ class ĠToken Authenticator ( private Ġval Ġapplication : ĠApplication ) Ġ: ĠAuth enticator Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġauthenticate ( route : ĠRoute ?, Ġresponse : ĠResponse ): ĠRequest ? Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauth StateManager Ġ= ĠAuth StateManager . getInstance ( application ) ĊĊĠĠĠĠĠĠĠ Ġvar ĠaccessToken Ġ= Ġauth StateManager . current . accessToken ĊĠĠĠĠĠĠĠ Ġvar Ġauthorization Header Ġ= Ġresponse . request . headers [" Authorization "] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( accessToken Ġ!= Ġnull Ġ&& Ġauthorization Header Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġauthorization Header . contains ( accessToken ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Service Ġ= ĠAuthorization Service ( application ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Request Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth StateManager . current . create Token Refresh Request ( map Of (" client _ secret " Ġto ĠBuild Config . STR AVA _ API _ CLIENT _ SECRET )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( token Response , Ġtoken Ex ) Ġ= Ġsuspend Coroutine < Pair < Token Response ?, ĠAuthorization Exception ? >> Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Service . perform Token Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Request , Ġauth StateManager . current . client Authentication ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġtoken Response , Ġtoken Ex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation ?. resume ( Pair ( token Response , Ġtoken Ex )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth StateManager . update After Token Response ( token Response , Ġtoken Ex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ex Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠaccessToken Ġ= Ġauth StateManager . current . accessToken ĊĠĠĠĠĠĠĠ Ġauthorization Header Ġ= Ġresponse . request . headers [" Authorization "] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( accessToken Ġ== Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( authorization Header Ġ!= Ġnull Ġ&& Ġauthorization Header . contains ( accessToken )) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Blocking Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ run Blocking Ġresponse . request . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header (" Authorization ", Ġ" Bearer Ġ${ auth StateManager . current . accessToken } Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (); ĊĠĠĠ Ġ} Ċ }