package Ġcom . sch ib st ed . account . persistence Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . sch ib st ed . account . common . util . Logger Ċ import Ġcom . sch ib st ed . account . engine . integration . Result Callback Ċ import Ġcom . sch ib st ed . account . model . User Token Ċ import Ġcom . sch ib st ed . account . model . error . Client Error Ċ import Ġcom . sch ib st ed . account . model . error . Client Error . ErrorType . SESSION _ NOT _ FOUND Ċ import Ġcom . sch ib st ed . account . session . User Ċ import Ġcom . sch ib st ed . account . util . KeyValue Store Ċ Ċ /** Ċ Ġ* ĠHandles Ġpers isting Ġand Ġres uming Ġuser 's Ġsessions . ĠThis Ġsupports Ġmultiple Ġusers , Ċ Ġ* Ġso Ġyou Ġcan Ġresume Ġa Ġspecific Ġuser 's Ġsession Ġif Ġrequired . Ċ Ġ*/ Ċ internal Ġclass ĠUser Persistence ( session Storage : ĠSession Storage Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġresume Delegate : ĠResume Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġk vs : ĠLegacy KeyValue Store ) Ġ{ ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSession Storage Delegate ( context , ĠP REFERENCE _ FILENAME ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResume Delegate ( context ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLegacy KeyValue Store ( KeyValue Store ( context )) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġinternal Ġdata Ġclass ĠSession ( val Ġlast Active : ĠLong , Ġval ĠuserId : ĠString , Ġval Ġtoken : ĠUser Token ) ĊĊĠĠĠ Ġprivate Ġvar Ġsessions : ĠList < Session > Ġby Ġsession Storage ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġa Ġuser Ġsession Ġfrom Ġpersistence . ĠUse Ġthis Ġto Ġallow Ġusers Ġto Ġbe Ġforgot ten . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId ĠThe Ġuser ĠID Ġto Ġremove ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( userId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsessions Ġ= Ġsessions . filter Not Ġ{ Ġit . userId Ġ== ĠuserId Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthe Ġoldest Ġactive Ġuser Ġsession . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove Last () Ġ{ ĊĠĠĠĠĠĠĠ Ġsessions Ġ= Ġsessions . sorted By Descending Ġ{ Ġit . last Active Ġ}. drop Last ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġpersisted Ġsessions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove All () Ġ{ ĊĠĠĠĠĠĠĠ Ġsessions Ġ= Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPers ist Ġa Ġuser Ġsession Ġso Ġthat Ġit Ġcan Ġbe Ġres umed Ġat Ġa Ġlater Ġpoint . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuser ĠThe Ġuser Ġto Ġpersist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpersist ( user : ĠUser ) Ġ{ ĊĠĠĠĠĠĠĠ Ġk vs . clear Token () ĊĠĠĠĠĠĠĠ Ġval Ġtoken : ĠUser Token ? Ġ= Ġuser . token ?. take If Ġ{ Ġit . isValid Token () Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ== Ġnull Ġ-> ĠLogger . warn (" At tempting Ġto Ġpersist Ġsession , Ġbut Ġthe Ġuser Ġwas Ġlogged Ġout ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! user . is Persist able Ġ-> ĠLogger . warn (" At tempting Ġto Ġpersist Ġsession , Ġbut Ġthe Ġuser Ġis Ġnot Ġflag ged Ġas Ġpersist able ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠSession ( System . currentTimeMillis (), Ġuser . userId . id , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsessions Ġ= Ġsessions . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . userId Ġ== Ġuser . userId . id Ġ} Ġ// Ġskip Ġcurrent Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus Element ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġit . last Active Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( MAX _ SESSION S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠResume Ġa Ġspecific Ġuser 's Ġsession . ĠThe Ġsession Ġwill Ġbe Ġres umed Ġand ĊĠĠĠĠ Ġ* Ġthe Ġrequired Ġchecks Ġwill Ġbe Ġdone Ġbefore Ġa Ġuser Ġobject Ġis Ġreturned Ġthrough Ġthe Ġcontract . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠuserId ĠThe Ġuser ĠID Ġof Ġthe Ġsession Ġto Ġresume ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠThe Ġcallback Ġto Ġwhich Ġht e Ġuser Ġis Ġprovided ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġuser Ġobject Ġof Ġthe Ġres umed Ġsession . ĠCan Ġbe Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresume ( userId : ĠString , Ġcallback : ĠResult Callback < User >) Ġ{ ĊĠĠĠĠĠĠĠ Ġclean Invalid Tokens () ĊĠĠĠĠĠĠĠ Ġval Ġtoken : ĠUser Token ? Ġ= Ġsessions . find Ġ{ Ġit . userId Ġ== ĠuserId Ġ} Ġ? . token ĊĠĠĠĠĠĠĠ Ġresume Session ( token , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠResume Ġthe Ġmost Ġrecently Ġactive Ġuser Ġsession . ĠThe Ġsession Ġwill Ġbe Ġres umed Ġand ĊĠĠĠĠ Ġ* Ġthe Ġrequired Ġchecks Ġwill Ġbe Ġdone Ġbefore Ġa Ġuser Ġobject Ġis Ġreturned Ġthrough Ġthe Ġcontract . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠThe Ġcallback Ġto Ġwhich Ġht e Ġuser Ġis Ġprovided ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġuser Ġobject Ġof Ġthe Ġres umed Ġsession . ĠCan Ġbe Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresume Last ( callback : ĠResult Callback < User >) Ġ{ ĊĠĠĠĠĠĠĠ Ġclean Invalid Tokens () ĊĠĠĠĠĠĠĠ Ġval Ġtoken : ĠUser Token ? Ġ= Ġsessions . max By Ġ{ Ġit . last Active Ġ} Ġ? . token Ġ?: Ġk vs . read Token () ĊĠĠĠĠĠĠĠ Ġresume Session ( token , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresume Session ( token : ĠUser Token ?, Ġcallback : ĠResult Callback < User >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( token Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġ{ Ġuser : ĠUser Ġ-> Ġcallback . on Success ( user ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailure Ġ= Ġ{ Ġerror : ĠClient Error Ġ-> Ġcallback . onError ( error ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresume Delegate . proceed ( token , Ġsuccess , Ġfailure ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠClient Error ( SESSION _ NOT _ FOUND , Ġ" Could Ġnot Ġfind Ġa Ġsession Ġto Ġresume ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . onError ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean Invalid Tokens () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( valid , Ġinvalid ) Ġ= Ġsessions . partition Ġ{ Ġit . token . isValid Token () Ġ} ĊĠĠĠĠĠĠĠ Ġsessions Ġ= Ġvalid ĊĠĠĠĠĠĠĠ Ġinvalid . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . warn (" Found Ġinvalid Ġsession Ġfor Ġuser Ġ${ it . userId }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REFERENCE _ FILENAME Ġ= Ġ" IDENTITY _ PREFER ENCES " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ SESSION S Ġ= Ġ 1 0 ĊĠĠĠ Ġ} Ċ } Ċ