/* Ċ Ġ* Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 1 . ĠP ela ĠC rist ian Ċ Ġ* Ġ ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ċ Ġ* Ġ Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ċ Ġ* Ġ Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ċ Ġ* Ġ Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ċ Ġ* Ġ Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe Ċ Ġ* Ġ ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* Ġ ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġ Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* Ġ ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS Ċ Ġ* Ġ ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* Ġ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* Ġ ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* Ġ ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING Ċ Ġ* Ġ ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER Ċ Ġ* Ġ ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġp cf . cr sk dev . ko on splash . auth Ċ Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ Ċ /** Ċ Ġ* ĠAuth Ġcontext Ċ Ġ* Ċ Ġ* Ġ@ author ĠC rist ian ĠP ela Ċ Ġ* Ġ@ since Ġ 0 . 1 Ċ Ġ*/ Ċ internal Ġinterface ĠAuth Context Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAccess Ġkey Ġwhich Ġis Ġconstant Ġacross Ġthe Ġlib . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġaccess Key : ĠAccess Key ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġtoken Ġor Ġnull Ġif Ġtoken Ġnot Ġpresent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠAuth Token Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠgetToken (): ĠAuth Token ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAs Ġclear able Ġcontext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠClear ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġas Clear able (): ĠClear able Auth Context Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" This Ġis Ġnot Ġa ĠClear able Auth Context Ġbut Ġ$ this ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNone . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠNone ( override Ġval Ġaccess Key : ĠAccess Key ) Ġ: ĠAuth Context Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetToken (): ĠAuth Token ? Ġ= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠMakes Ġsure Ġthat Ġdoesn 't Ġhave Ġaccess Ġto ĠClear able Auth Context Ċ Ġ* Ċ Ġ*/ Ċ internal Ġfun ĠAuth Context . safe () Ġ= ĊĠĠĠ Ġif Ġ( this Ġis ĠClear able Auth Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠAuth Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġaccess Key : ĠAccess Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ safe . access Key ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetToken (): ĠAuth Token ? Ġ= Ġthis @ safe . getToken () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠClear able ĠAuth Ġcontext . Ċ Ġ* Ċ Ġ* Ġ@ author ĠC rist ian ĠP ela Ċ Ġ* Ġ@ since Ġ 0 . 1 Ċ Ġ*/ Ċ internal Ġinterface ĠClear able Auth Context Ġ: ĠAuth Context Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHas Ġtoken Ġset . ĊĠĠĠĠ Ġ* Ġ@ return ĠBoolean . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġhas Token (): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġthe Ġsaved Ġtoken . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġclear () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġa Ġnew Ġtoken . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġauth Token ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġreset ( auth Token : ĠAuth Token ) ĊĊĠĠĠ Ġoverride Ġfun Ġas Clear able (): ĠClear able Auth Context Ġ= Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠIn Ġmemory Ġcached Ġauth Ġcontext . Ċ Ġ* Ġ@ property Ġstorage ĠStorage . Ċ Ġ* Ġ@ property Ġaccess Key ĠAccess Ġkey . Ċ Ġ* Ġ@ author ĠC rist ian ĠP ela Ċ Ġ* Ġ@ since Ġ 0 . 1 Ċ Ġ*/ Ċ internal Ġclass ĠCached Auth Context ( ĊĠĠĠ Ġprivate Ġval Ġstorage : ĠAuth Token Storage , ĊĠĠĠ Ġoverride Ġval Ġaccess Key : ĠAccess Key Ċ ) Ġ: ĠClear able Auth Context Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠState . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġstate : ĠState ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠState Ġlock . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġstorage . load ()?. let Ġ{ ĠState . LoggedIn ( it ) Ġ} Ġ?: ĠState . Logged Out ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġhas Token () Ġ= Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . state Ġis ĠState . LoggedIn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠState . Logged Out ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . storage . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġreset ( auth Token : ĠAuth Token ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= ĠState . LoggedIn ( auth Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . storage . save ( auth Token ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠgetToken (): ĠAuth Token ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmutex . with Lock Ġ{ Ġthis . state Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . LoggedIn Ġ-> Ġstate . token ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . Logged Out Ġ-> Ġthrow ĠSigned Out Exception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠState ĠA DT . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġsealed Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠLog ged In ( val Ġtoken : ĠAuth Token ) Ġ: ĠState () ĊĠĠĠĠĠĠĠ Ġobject ĠLog ged Out Ġ: ĠState () ĊĠĠĠ Ġ} Ċ } Ċ