package Ġub b . the sis . david . data . adapters Ċ Ċ import Ġandroidx . work .* Ċ import Ġcom . google . firebase . firestore . Document Snapshot Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġcom . google . firebase . firestore . Set Options Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Maybe Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . subjects . Comp letable Subject Ċ import Ġio . reactivex . subjects . Maybe Subject Ċ import Ġio . reactivex . subjects . Single Subject Ċ import Ġub b . the sis . david . data . utils . as Data Mapping Ċ import Ġub b . the sis . david . data . utils . debug Ċ import Ġub b . the sis . david . data . utils . extract Land mark Data Ċ import Ġub b . the sis . david . data . utils . extract Session Data Ċ import Ġub b . the sis . david . data . workers . Delete Worker Ċ import Ġub b . the sis . david . data . workers . Delete Worker . Companion . ARG _ PH OTO _ ID Ċ import Ġub b . the sis . david . data . workers . Delete Worker . Companion . ARG _ USER _ ID Ċ import Ġub b . the sis . david . domain . Cloud DataSource Ċ import Ġub b . the sis . david . domain . entities . Backup Ċ import Ġub b . the sis . david . domain . entities . Discovery Ċ import Ġub b . the sis . david . domain . entities . Land mark Ċ import Ġub b . the sis . david . domain . entities . Session Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠFirebase Data Adapter Ġ: ĠCloud DataSource Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= ĠFirebase Fire store . getInstance () ĊĊĠĠĠ Ġoverride Ġfun ĠgetUser Sessions ( userId : ĠString ): ĠMaybe < List < Session >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretrieve Sessions Task : ĠMaybe Subject < List < Session >> Ġ= ĠMaybe Subject . create () ĊĊĠĠĠĠĠĠĠ Ġstorage . collection ("$ ROOT /$ userId /$ COLL _ SESSION S "). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġquery Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsessions Ġ= Ġquery Snapshot . documents . map Ġ{ Ġit . extract Session Data () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Retrie ved Ġsessions Ġ$ sessions Ġsuccessfully .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve Sessions Task . on Success ( sessions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Failed Ġto Ġretrieve Ġsessions Ġwith Ġerror Ġ${ error . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve Sessions Task . onError ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġretrieve Sessions Task ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Session Details ( userId : ĠString , ĠsessionId : ĠString ): ĠMaybe < Map < Land mark , ĠDiscovery ? >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretrieve Details Task : ĠMaybe Subject < Map < Land mark , ĠDiscovery ? >> Ġ= ĠMaybe Subject . create () ĊĊĠĠĠĠĠĠĠ Ġstorage . collection ("$ ROOT /$ userId /$ COLL _ SESSION S /$ sessionId /$ COLL _ LAND MARK S "). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġquery Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġquery Snapshot . documents . map Ġ{ Ġit . extract Land mark Data () Ġ}. toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Retrie ved Ġcloud Ġbackup Ġsuccessfully : Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve Details Task . on Success ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Failed Ġto Ġretrieve Ġsession Ġdetails Ġwith Ġerror Ġ${ error . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretrieve Details Task . onError ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġretrieve Details Task ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Session ( session : ĠSession , Ġland marks : ĠList < Land mark >): ĠSingle < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcreation Task Ġ= ĠSingle Subject . create < String >() ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Session Ref Ġ= Ġstorage . collection ("$ ROOT /${ session . userId }/ $ COLL _ SESSION S "). document () ĊĠĠĠĠĠĠĠ Ġval Ġland marks Ref Ġ= Ġnew Session Ref . collection ( COLL _ LAND MARK S ) ĊĊĠĠĠĠĠĠĠ Ġstorage . run Transaction Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . set ( new Session Ref , Ġsession . as Data Mapping ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( land mark Ġin Ġland marks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ref Ġ= Ġland marks Ref . document ( land mark . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . set ( document Ref , Ġland mark . as Data Mapping ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Session Ġ$ session Ġhas Ġbeen Ġcreated Ġsuccessfully ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Task . on Success ( new Session Ref . id ) ĊĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Session Ġcreation Ġhas Ġfailed Ġwith Ġthe Ġfollowing Ġerror : Ġ${ ex . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Task . onError ( ex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreation Task ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Session Backup ( backup : ĠBackup ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdate Task Ġ= ĠComp letable Subject . create () ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Ref Ġ= Ġstorage . document ("$ ROOT /${ backup . session . userId }/ $ COLL _ SESSION S /${ backup . session . sessionId }") ĊĠĠĠĠĠĠĠ Ġval Ġland marks Ref Ġ= Ġsession Ref . collection ( COLL _ LAND MARK S ) ĊĊĠĠĠĠĠĠĠ Ġstorage . run Transaction Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . set ( session Ref , Ġbackup . session . as Data Mapping ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( land mark Data Ġin Ġbackup . land marks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ref Ġ= Ġland marks Ref . document ( land mark Data . key . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġland mark Data . key . as Data Mapping (). also Ġ{ Ġmap Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [" found At "] Ġ= Ġland mark Data . value ?. time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [" photo Id "] Ġ= Ġland mark Data . value ?. photo Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . set ( document Ref , Ġdata , ĠSet Options . merge ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Updated Ġsession Ġsuccessfully .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Task . onComplete () ĊĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Failed Ġto Ġupdate Ġsession Ġdata Ġwith Ġerror Ġ${ error . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Task . onError ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdate Task ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġw ipe Session Backup ( userId : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġw ipe Task Ġ= ĠComp letable Subject . create () ĊĊĠĠĠĠĠĠĠ Ġstorage . collection ("$ ROOT /$ userId /$ COLL _ SESSION S "). where EqualTo (" time Finished ", Ġnull ). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġsnapshot Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . run Transaction Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot . documents . forEach Ġ{ Ġdocument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw ipe Related Data Barrier Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ipe Related Session Data ( userId , Ġdocument , Ġw ipe Related Data Barrier ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ipe Related Data Barrier . await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . delete ( document . reference ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" W ip ed Ġsession Ġdata Ġof Ġun finished Ġsessions Ġsuccessfully !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ipe Task . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Failed Ġto Ġw ipe Ġun finished Ġsessions Ġwith Ġthe Ġfollowing Ġerror : Ġ${ error . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ipe Task . onError ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Event (" Failed Ġto Ġquery Ġun finished Ġsessions Ġwith Ġthe Ġfollowing Ġerror : Ġ${ error . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw ipe Task . onError ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġw ipe Task ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġw ipe Related Session Data ( userId : ĠString , Ġsession : ĠDocument Snapshot , Ġcount DownLatch : ĠCount DownLatch ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . reference . collection ( COLL _ LAND MARK S ). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġquery Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwork Manager Ġ= ĠWork Manager . getInstance () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Snapshot . documents . filter Ġ{ Ġit [" photo Id "] Ġ!= Ġnull Ġ}. forEach Ġ{ Ġland mark Snapshot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto Id Ġ= Ġland mark Snapshot . extract Land mark Data (). first . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Manager . enqueue ( create Delete Task ( userId , Ġphoto Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Snapshot . documents . forEach Ġ{ Ġdocument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument . reference . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount DownLatch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Delete Task ( userId : ĠString , Ġphoto Id : ĠString ): ĠOne Time Work Request Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Data Ġ= Ġwork Data Of ( ARG _ USER _ ID Ġto ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠARG _ PH OTO _ ID Ġto Ġphoto Id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= ĠConstraints . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Required Network Type ( Network Type . CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠOne Time Work RequestBuilder < Delete Worker >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set InputData ( image Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Constraints ( constraints ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Backoff Criteria ( Backoff Policy . LINEAR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOne Time Work Request . DEFAULT _ BACK OFF _ DELAY _ M ILL IS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Event ( message : ĠString ) Ġ= Ġdebug ( TAG _ LOG , Ġmessage ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG _ LOG Ġ= Ġ" Firebase DataSource Logger " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠROOT Ġ= Ġ" users " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOL L _ SESSION S Ġ= Ġ" sessions " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOL L _ LAND MARK S Ġ= Ġ" land marks " ĊĠĠĠ Ġ} Ċ Ċ }