package Ġcom . sun il son . fire note . data Ċ Ċ import Ġandroid . util . Log Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . database .* Ċ import Ġcom . sun il son . fire note . data . models . Change Type Ċ import Ġcom . sun il son . fire note . data . models . Checklist Element Ċ import Ġcom . sun il son . fire note . data . models . Element Ċ import Ġcom . sun il son . fire note . data . models . Firebase Element Ċ import Ġcom . sun il son . fire note . presentation . shared . parse Firebase Element Ċ import Ġcom . sun il son . fire note . presentation . shared . store Element Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ interface ĠI Repository Ġ{ ĊĠĠĠ Ġfun Ġload Elements ( userId : ĠString , Ġelement ID : ĠString ? Ġ= Ġnull ): ĠFlow able < Pair < Change Type , ĠElement > ?> ĊĠĠĠ Ġfun Ġload Bin Elements ( userId : ĠString , Ġelement ID : ĠString ? Ġ= Ġnull ): ĠFlow able < Pair < Change Type , ĠElement > ?> ĊĠĠĠ Ġfun Ġload All Elements ( userId : ĠString ): ĠSingle < List < Element >> ĊĠĠĠ Ġfun Ġload Element ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ? Ġ= Ġnull ): ĠFlow able < Element ?> ĊĠĠĠ Ġfun Ġlock Element ( userId : ĠString , Ġid : ĠString , Ġlocked : ĠBoolean , Ġparent : ĠString ? Ġ= Ġnull ): ĠComp letable ĊĠĠĠ Ġfun Ġload Note Content ( userId : ĠString , Ġid : ĠString ): ĠFlow able < String > ĊĊĠĠĠ Ġfun Ġload Checklist Elements ( userId : ĠString , Ġid : ĠString ): ĠFlow able < Pair < Change Type , ĠChecklist Element >> ĊĠĠĠ Ġfun Ġadd Checklist Element ( userId : ĠString , Ġelement ID : ĠString , Ġchecklist Element : ĠChecklist Element ): ĠComp letable ĊĠĠĠ Ġfun Ġupdate Checklist Element ( userId : ĠString , Ġelement ID : ĠString , Ġchecklist Element : ĠChecklist Element ): ĠComp letable ĊĠĠĠ Ġfun Ġremove Checklist Element ( userId : ĠString , Ġelement ID : ĠString , Ġchecklist Element : ĠChecklist Element ): ĠComp letable ĊĊĠĠĠ Ġfun Ġstore Note Text ( userId : ĠString , Ġid : ĠString , Ġtext : ĠString ): ĠComp letable ĊĠĠĠ Ġfun Ġstore Element ( userId : ĠString , Ġelement : ĠElement ): ĠComp letable ĊĠĠĠ Ġfun Ġdelete Element ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ? Ġ= Ġnull ): ĠComp letable ĊĠĠĠ Ġfun Ġrestore Element ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ? Ġ= Ġnull ): ĠComp letable ĊĠĠĠ Ġfun Ġclear Bin ( userId : ĠString , Ġparent : ĠString ? Ġ= Ġnull ): ĠComp letable ĊĠĠĠ Ġfun Ġdelete Bin Element ( userId : ĠString , Ġelement ID : ĠString , Ġparent : ĠString ? Ġ= Ġnull ): ĠComp letable ĊĠĠĠ Ġfun Ġupdate Element ( userId : ĠString , Ġelement : ĠElement ): ĠComp letable ĊĠĠĠ Ġfun Ġelement Was Deleted ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ? Ġ= Ġnull ): ĠComp letable ĊĊĠĠĠ Ġfun Ġcheck Master Password Set ( userId : ĠString ): ĠSingle < Boolean > Ċ } Ċ Ċ @ Singleton Ċ class ĠFirebase Repository Ġ@ Inject Ġconstructor () Ġ: ĠI Repository Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġstore Note Text ( userId : ĠString , Ġid : ĠString , Ġtext : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Comp letable From Task ( Firebase Database . getInstance (). reference . child (" users "). child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" contents ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( text )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Element ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ?): ĠFlow able < Element ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" elements ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( parent ). child ( id ) ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" main "). child ( id ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Flow able Value From Query ( ref ) Ġ{ Ġsnapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirebase Element Ġ= Ġsnapshot . getValue ( Firebase Element :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Element ?. element ID Ġ= Ġsnapshot . key !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Element ?. parse Element () ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload All Elements ( userId : ĠString ): ĠSingle < List < Element >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" elements "). child (" main ") ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Single From Query ( ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Element >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . children . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( it . parse Firebase Element (). parse Element ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Lin us ", Ġresult . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Bin Elements ( userId : ĠString , Ġelement ID : ĠString ?): ĠFlow able < Pair < Change Type , ĠElement > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" bin ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( element ID Ġ!= Ġnull ) Ġref . child (" bundles "). child ( element ID ) ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" main ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Flow able From Query ( ref ) Ġ{ Ġsnapshot , Ġchange Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Event Ġ= Ġsnapshot . getValue ( Firebase Element :: class . java ) !!. parse Element () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Event . element ID Ġ= Ġsnapshot . key !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Event . deleted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ create Flow able From Query ĠPair ( change Type , Ġtemp Event ) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Note Content ( userId : ĠString , Ġid : ĠString ): ĠFlow able < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" contents "). child ( id ). child (" text ") ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Flow able Value From Query ( ref ) Ġ{ Ġdata Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Snapshot . getValue ( String :: class . java ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlock Element ( userId : ĠString , Ġid : ĠString , Ġlocked : ĠBoolean , Ġparent : ĠString ?): ĠComp letable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Database . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" settings ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" master Password ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 0 . value Ġ== Ġnull ) Ġemitter . onError ( Error ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" elements ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( parent ). child ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġref . child (" main "). child ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . child (" locked "). setValue ( locked ). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore Element ( userId : ĠString , Ġelement : ĠElement ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" elements ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( element . parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( element . parent !! ) ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" main ") ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Comp letable From Task ( ref . push (). store Element ( element )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Element ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ?): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" elements ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( parent ). child ( id ) ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" main "). child ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Comp letable From Task ( ref . remove Value ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġelement Was Deleted ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ?): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" bin ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( parent ). child ( id ) ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" main "). child ( id ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġref . add Value EventListener ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( p 0 . to Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 0 . value Ġ!= Ġnull Ġ&& Ġp 0 . child (" note Type "). value Ġ!= Ġnull ) Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . set C ancellable Ġ{ Ġref . removeEventListener ( listener ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore Element ( userId : ĠString , Ġid : ĠString , Ġparent : ĠString ?): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" bin ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( parent ). child ( id ) ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" main "). child ( id ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( p 0 . to Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 0 . child (" note Type "). value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Event Ġ= Ġp 0 . parse Firebase Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . remove Value (). add On Failure Listener Ġ{ Ġemitter . onError ( it ) Ġ}. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Ref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" elements ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġnew Ref . child (" bundles "). child ( parent ). child ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnew Ref . child (" main "). child ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ref . setValue ( temp Event ). add On Failure Listener Ġ{ Ġemitter . onError ( it ) Ġ}. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġemitter . onError ( Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Bin ( userId : ĠString , Ġparent : ĠString ?): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" bin ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġref . child (" main ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp 0 . children . forEach Ġ{ Ġids . add ( it . key !! ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . remove Value (). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġids . forEach Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" contents "). child ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ref . remove Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Bin Element ( userId : ĠString , Ġelement ID : ĠString , Ġparent : ĠString ?): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" bin ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( parent ). child ( element ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġref . child (" main "). child ( element ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . remove Value (). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" contents "). child ( element ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ref . remove Value (). add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Element ( userId : ĠString , Ġelement : ĠElement ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users "). child ( userId ). child (" elements ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( element . parent Ġ!= Ġnull ) Ġref . child (" bundles "). child ( element . parent !! ). child ( element . element ID ) ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" main "). child ( element . element ID ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Comp letable From Task ( ref . store Element ( element )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Checklist Elements ( userId : ĠString , Ġid : ĠString ): ĠFlow able < Pair < Change Type , ĠChecklist Element >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" contents ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" elements ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Flow able From Query ( ref ) Ġ{ Ġdata Snapshot , Ġchange Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdata Snapshot . getValue ( Checklist Element :: class . java ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . id Ġ= Ġdata Snapshot . key ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( change Type , Ġresult ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Checklist Element ( userId : ĠString , Ġelement ID : ĠString , Ġchecklist Element : ĠChecklist Element ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" contents ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( element ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" elements ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. push () ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Comp letable From Task ( ref . setValue ( checklist Element )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Checklist Element ( userId : ĠString , Ġelement ID : ĠString , Ġchecklist Element : ĠChecklist Element ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" contents ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( element ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" elements ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( checklist Element . id !! ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Comp letable From Task ( ref . setValue ( checklist Element )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Checklist Element ( userId : ĠString , Ġelement ID : ĠString , Ġchecklist Element : ĠChecklist Element ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠFirebase Database . getInstance (). reference . child (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" contents ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( element ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" elements ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( checklist Element . id !! ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Comp letable From Task ( ref . remove Value ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Elements ( userId : ĠString , Ġelement ID : ĠString ?): ĠFlow able < Pair < Change Type , ĠElement > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġref Ġ= ĠFirebase Database . getInstance (). reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" elements ") ĊĠĠĠĠĠĠĠ Ġref Ġ= Ġif Ġ( element ID Ġ== Ġnull ) Ġref . child (" main ") ĊĠĠĠĠĠĠĠ Ġelse Ġref . child (" bundles "). child ( element ID ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Flow able From Query ( ref ) Ġ{ Ġsnapshot , Ġchange Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Event Ġ= Ġsnapshot . getValue ( Firebase Element :: class . java ) !!. parse Element () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Event . element ID Ġ= Ġsnapshot . key !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element ID Ġ!= Ġnull ) Ġtemp Event . parent Ġ= Ġelement ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ create Flow able From Query ĠPair ( change Type , Ġtemp Event ) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcheck Master Password Set ( userId : ĠString ): ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . create < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFirebase Database ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" users ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" settings ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" master Password ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p 0 . value Ġ== Ġnull ) Ġit . on Success ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . on Success ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Comp letable From Task ( task : ĠTask < *> ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġif Ġ(! emitter . is Disposed ) Ġemitter . onError ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġif Ġ(! emitter . is Disposed ) Ġemitter . onComplete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġcreate Single From Query ( ref : ĠDatabase Reference , Ġconverter : Ġ( Data Snapshot ) Ġ-> ĠT ): ĠSingle < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . create < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Disposed ) Ġref . removeEventListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Disposed ) Ġref . removeEventListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Success ( converter ( p 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . addListener For Single Value Event ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()). observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġcreate Flow able From Query ( ref : ĠDatabase Reference , Ġconverter : Ġ( Data Snapshot , ĠChange Type ) Ġ-> ĠT ): ĠFlow able < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFlow able . create ({ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠChild EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Moved ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Changed ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ= Ġemitter . onNext ( converter ( p 0 , ĠChange Type . CHANGED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Added ( p 0 : ĠData Snapshot , Ġp 1 : ĠString ?) Ġ= Ġemitter . onNext ( converter ( p 0 , ĠChange Type . AD DED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child Removed ( p 0 : ĠData Snapshot ) Ġ= Ġemitter . onNext ( converter ( p 0 , ĠChange Type . RE MOVED )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . set C ancellable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! emitter . is Cancelled ) Ġref . removeEventListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . addChild EventListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠBack pressure Strategy . BUFFER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T > Ġcreate Flow able Value From Query ( ref : ĠDatabase Reference , Ġconverter : Ġ( Data Snapshot ) Ġ-> ĠT ): ĠFlow able < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFlow able . create ({ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( p 0 : ĠDatabase Error ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( p 0 : ĠData Snapshot ) Ġ= Ġemitter . onNext ( converter ( p 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . set C ancellable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! emitter . is Cancelled ) Ġref . removeEventListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . add Value EventListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠBack pressure Strategy . BUFFER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }