package Ġcom . ek al ips . ca h sc rowd . data . action . local Ċ Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mediator LiveData Ċ import Ġandroid . arch . lifecycle . Transform ations Ċ import Ġcom . ek al ips . base . stuff . if Then Ċ import Ġcom . ek al ips . ca h sc rowd . data . action . Action Ċ import Ġcom . ek al ips . ca h sc rowd . data . db . Cash DB Ċ import Ġcom . ek al ips . ca h sc rowd . data . user . local . Local User Dao Ċ import Ġcom . ek al ips . ca h sc rowd . data . user . local . model . Local Base User Ċ import Ġcom . ek al ips . ca h sc rowd . data . user . model . Base User Ċ import Ġio . reactivex . Observable Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠLocal Actions DataSource Ġ@ Inject Ġconstructor ( private Ġval Ġcash DB : ĠCash DB , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġusers Dao : ĠLocal User Dao , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġactions Dao : ĠLocal Actions Dao ) Ġ{ ĊĊĠĠĠ Ġfun Ġget Actions For Event ( eventId : ĠString ): ĠObservable < List < Action >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . from Callable Ġ{ Ġactions Dao . get Actions For Event ( eventId ) Ġ} Ġas ĠObservable < List < Action >> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Actions For Event ( eventId : ĠString , Ġvar arg Ġactions : ĠAction , Ġclear : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapped Actions Ġ= Ġactions . map Ġ{ Ġit . to Local () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġusers Dao . getAll Users () ĊĠĠĠĠĠĠĠ Ġval Ġabsent User Ids Ġ= ĠHashSet < String >( users . size ) ĊĠĠĠĠĠĠĠ Ġactions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers . find Ġ{ Ġlocal Ġ-> Ġit . userId Ġ== Ġlocal . id Ġ} Ġ?: Ġabsent User Ids . add ( it . userId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcash DB . run In Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear . if Then Ġ{ Ġactions Dao . delete Event Actions ( eventId ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions Dao . insert (* mapped Actions . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers Dao . insert (* abs ent User Ids . map Ġ{ ĠLocal Base User ( it , Ġ"", Ġnull , Ġfalse ) Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Actions For Event LiveData ( eventId : ĠString ): ĠLive Data < List < Action >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactions LiveData Ġ= Ġactions Dao . get Actions For Event LiveData ( eventId ) ĊĠĠĠĠĠĠĠ Ġval Ġusers LiveData Ġ= ĠTransform ations . switch Map ( actions LiveData , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ids Ġ= Ġit . map Ġ{ Ġit . userId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers Dao . get Users (* user Ids . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠMed iator LiveData < List < Action >>() ĊĊĠĠĠĠĠĠĠ Ġfun Ġmap Users To Actions ( actions : ĠList < Action > ?, Ġusers : ĠList < Base User >? ): ĠList < Action >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( actions Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactions . forEach Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . user Ġ= Ġusers ?. find Ġ{ Ġit . id Ġ== Ġaction . userId Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresult . add Source ( actions LiveData , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . post Value ( map Users To Actions ( actions LiveData . value , Ġusers LiveData . value )) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġresult . add Source ( users LiveData , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . post Value ( map Users To Actions ( actions LiveData . value , Ġusers LiveData . value )) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊ Ċ }