package Ġorg . cc ci . g to . android . common . api . okhttp 3 . interceptor Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . annotation . Call Super Ċ import Ġjava . io . IOException Ċ import Ġokhttp 3 . Interceptor Ċ import Ġokhttp 3 . Interceptor . Chain Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġorg . cc ci . g to . android . common . api . Session Ċ import Ġorg . cc ci . g to . android . common . api . okhttp 3 . Est ablish Session ApiException Ċ import Ġorg . cc ci . g to . android . common . api . okhttp 3 . Invalid Session ApiException Ċ Ċ private Ġconst Ġval ĠDEFAULT _ RETURN _ INVALID _ SESSION _ RESPONSE S Ġ= Ġfalse Ċ Ċ abstract Ġclass ĠSession Interceptor < S Ġ: ĠSession > Ġ@ Jvm Over loads Ġprotected Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġreturn Invalid Session Responses : ĠBoolean Ġ= ĠDEFAULT _ RETURN _ INVALID _ SESSION _ RESPONSE S , ĊĠĠĠ Ġpref File : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠInter ceptor Ġ{ ĊĠĠĠ Ġprotected Ġval Ġcontext : ĠContext Ġ= Ġcontext . application Context ĊĠĠĠ Ġprotected Ġval Ġprefs Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . context . get SharedPreferences ( pref File Ġ?: Ġjava Class . simple Name , ĠContext . MODE _ PRIVATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġlock Session Ġ= ĠAny () ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġ@ Deprecated (" Since Ġv 3 . 1 0 . 0 , Ġuse Ġlock Session Ġproperty Ġinstead ", ĠReplace With (" lock Session ")) ĊĠĠĠ Ġprotected Ġval Ġm Lock Session Ġ= Ġlock Session ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġ@ Deprecated (" Since Ġv 3 . 1 0 . 0 , Ġuse Ġcontext Ġproperty Ġinstead ", ĠReplace With (" context ")) ĊĠĠĠ Ġprotected Ġval ĠmContext Ġ= Ġthis . context ĊĊĠĠĠ Ġ@ Deprecated (" Since Ġv 3 . 1 0 . 0 , Ġuse Ġnamed Ġparameters Ġfor Ġthe Ġconstructor Ġinstead .") ĊĠĠĠ Ġprotected Ġconstructor ( context : ĠContext , Ġpref File : ĠString ?) Ġ: ĊĠĠĠĠĠĠĠ Ġthis ( context , ĠDEFAULT _ RETURN _ INVALID _ SESSION _ RESPONSE S , Ġpref File ) ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠChain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġsynchronized ( lock Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġload Ġa Ġvalid Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Session ()?. take If Ġ{ Ġit . isValid Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġtry Ġestablish ing Ġa Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġestablish Session ()?. take If Ġ{ Ġit . isValid Ġ} ?. also Ġ{ Ġsave Session ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠEst ablish Session ApiException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠInvalid Session ApiException () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprocess Response ( chain . proceed ( attach Session ( chain . request (), Ġsession )), Ġsession ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġattach Session ( request : ĠRequest , Ġsession : ĠS ): ĠRequest ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprotected Ġopen Ġfun Ġprocess Response ( response : ĠResponse , Ġsession : ĠS ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Session Invalid ( response )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreset Ġthe Ġsession Ġif Ġthis Ġis Ġstill Ġthe Ġsame Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( lock Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Session ()?. take If Ġ{ Ġit Ġ== Ġsession Ġ} ?. apply Ġ{ Ġdelete Session ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! return Invalid Session Responses ) Ġthrow ĠInvalid Session ApiException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġis Session Invalid ( response : ĠResponse ) Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġload Session () Ġ= Ġsynchronized ( lock Session ) Ġ{ Ġload Session ( prefs ) Ġ} ?. take If Ġ{ Ġit . isValid Ġ} ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġload Session ( prefs : ĠSharedPreferences ): ĠS ? ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprotected Ġopen Ġfun Ġestablish Session (): ĠS ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġsave Session ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġprefs . edit (). apply Ġ{ Ġsession . save ( this ) Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock Session ) Ġ{ Ġchanges . apply () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Session ( session : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġprefs . edit (). apply Ġ{ Ġsession . delete ( this ) Ġ} ĊĠĠĠĠĠĠĠ Ġsynchronized ( lock Session ) Ġ{ Ġchanges . apply () Ġ} ĊĠĠĠ Ġ} Ċ } Ċ