package Ġbe . hog ent . fa ith . storage . online Ċ Ċ import Ġandroid . net . Uri Ċ import Ġbe . hog ent . fa ith . domain . models . Details Container Ċ import Ġbe . hog ent . fa ith . domain . models . Event Ċ import Ġbe . hog ent . fa ith . domain . models . detail . Detail Ċ import Ġbe . hog ent . fa ith . domain . models . detail . Y outube Video Detail Ċ import Ġbe . hog ent . fa ith . service . encryption . Encrypted Detail Ċ import Ġbe . hog ent . fa ith . service . encryption . Encrypted Event Ċ import Ġbe . hog ent . fa ith . storage . Storage Path Provider Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġio . reactivex . rx java 3 . core . Comp letable Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . kotlin . to Flow able Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ Ċ class ĠFirebase Storage Repository ( ĊĠĠĠ Ġprivate Ġval Ġpath Provider : ĠStorage Path Provider , ĊĠĠĠ Ġprivate Ġval Ġfire storage : ĠFirebase Storage , ĊĠĠĠ Ġprivate Ġval Ġr xF ire base Storage : ĠIR xF ire Base Storage Ċ ) Ġ: ĠI Online File Storage Repository Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġstorage Ref Ġ= Ġfire storage . reference ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS aves Ġall Ġfiles Ġassociated Ġwith Ġan ĠEn crypted Event Entity Ġ( detail Ġfiles , Ġemotion avatar ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġsave Event Files ( encrypted Event : ĠEn crypted Event ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdo Ġall Ġthe Ġdownloading Ġin Ġparallel Ġusing Ġmerge Ġinstead Ġof Ġconcat ĊĠĠĠĠĠĠĠ Ġreturn Ġsave Event Em otion Avatar ( encrypted Event ) Ġ// Ġsave Ġavatar Ġin Ġfire storage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat With ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Event . details . to Flow able () Ġ// Ġsave Ġall Ġdetail Ġfiles Ġin Ġfire storage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat Map Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Detail File ( encrypted Event , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUp loads Ġthe Ġemotion Ġavatar Ġfile Ġto Ġ[ fire storage ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Event Em otion Avatar ( encrypted Event : ĠEn crypted Event ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( encrypted Event . emotion Avatar Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ ĠTim ber . i (" No Ġemotion Avatar Ġto Ġsave Ġonline Ġfor Ġ${ encrypted Event . uuid }") Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr xF ire base Storage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . child ( path Provider . emotion Avatar Path ( encrypted Event ). path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" file ://${ encrypted Event . emotion Avatar !!. path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ ĠTim ber . i (" Saved Ġemotion avatar Ġonline Ġfor Ġ${ encrypted Event . uuid }") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUp loads Ġthe Ġdetail Ġfile Ġto Ġ[ fire storage ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsave Detail File ( event : ĠEn crypted Event , Ġdetail : ĠEn crypted Detail ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠY outube Video Details Ġdon 't Ġhave Ġa Ġ" real " Ġfile ĊĠĠĠĠĠĠĠ Ġif Ġ( detail . youtube Video ID . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr xF ire base Storage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . child ( path Provider . detail Path ( detail , Ġevent ). path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" file ://${ detail . file . path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ ĠTim ber . i (" Saved Ġdetails Ġonline Ġfor Ġevent Ġ${ event . uuid }") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDown loads Ġa Ġdetail 's Ġfile Ġfrom Ġ[ fire storage ] Ġand Ġstores Ġit Ġinto Ġthe Ġpath Ġprovided Ġfor Ġit Ġby Ġthe ĊĠĠĠĠ Ġ* Ġ[ path Provider ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdownload Detail ( detail : ĠDetail , Ġevent : ĠEvent ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠY outube Video Details Ġdon 't Ġhave Ġa Ġ" real " Ġfile ĊĠĠĠĠĠĠĠ Ġif Ġ( detail Ġis ĠY outube Video Detail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Destination File : ĠFile Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( path Provider ) Ġ{ ĠlocalStorage ( detail Path ( detail , Ġevent )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Destination File . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Single ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr xF ire base Storage . getFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . child ( path Provider . detail Path ( detail , Ġevent ). path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Destination File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġ" Downloaded Ġfile Ġfor Ġdetail Ġ${ detail . uuid } Ġin Ġevent Ġ${ event . uuid }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĠTim ber . e (" Error Ġwhile Ġdownloading Ġdetail Ġ${ detail . uuid } Ġin Ġevent Ġ${ event . uuid }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail . file Ġ= Ġlocal Destination File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDown loads Ġa Ġdetail 's Ġfile Ġfrom Ġ[ fire storage ] Ġand Ġstores Ġit Ġinto Ġthe Ġpath Ġprovided Ġfor Ġit Ġby Ġthe ĊĠĠĠĠ Ġ* Ġ[ path Provider ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdownload Detail ( detail : ĠDetail , Ġcontainer : ĠDetails Container ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠY outube Video Details Ġdon 't Ġhave Ġa Ġ" real " Ġfile ĊĠĠĠĠĠĠĠ Ġif Ġ( detail Ġis ĠY outube Video Detail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Destination File : ĠFile Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( path Provider ) Ġ{ ĠlocalStorage ( detail Path ( detail , Ġcontainer )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Destination File . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Single ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr xF ire base Storage . getFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . child ( path Provider . detail Path ( detail , Ġcontainer ). path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Destination File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Comp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail . file Ġ= Ġlocal Destination File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ Ġ" Downloaded Ġfile Ġfor Ġdetail Ġ${ detail . uuid } Ġin Ġ${ container . java Class }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġemotion Ġavatar Ġfile Ġfrom Ġ[ fire storage ] Ġand Ġstores Ġit Ġinto Ġthe Ġpath Ġprovided Ġfor Ġit ĊĠĠĠĠ Ġ* Ġby Ġthe Ġ[ path Provider ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġdownload Em otion Avatar ( event : ĠEvent ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . emotion Avatar Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Destination File Ġ= Ġwith ( path Provider ) Ġ{ ĠlocalStorage ( emotion Avatar Path ( event )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Destination File . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr xF ire base Storage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . child ( path Provider . emotion Avatar Path ( event ). path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Destination File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ ĠTim ber . e (" Error Ġwhile Ġdownloading Ġemotion Avatar Ġfor Ġevent Ġ${ event . uuid }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . from Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . emotion Avatar Ġ= Ġlocal Destination File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ Ġ" Downloaded Ġemotion Avatar Ġfor Ġevent Ġ${ event . uuid }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Detail Files ( ĊĠĠĠĠĠĠĠ Ġencrypted Detail : ĠEn crypted Detail , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠDetails Container ĊĠĠĠ Ġ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠY outube Video Details Ġdon 't Ġhave Ġa Ġ" real " Ġfile ĊĠĠĠĠĠĠĠ Ġif Ġ( encrypted Detail . youtube Video ID . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr xF ire base Storage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . child ( path Provider . detail Path ( encrypted Detail , Ġcontainer ). path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" file ://${ encrypted Detail . file . path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ Ġ" Saved Ġdetail Ġfiles Ġfor Ġ${ encrypted Detail . uuid } Ġin Ġ${ container . java Class }" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Files ( event : ĠEvent ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCan 't Ġjust Ġdelete Ġthe Ġdirectory Ġbecause Ġfirebase storage Ġdoesn 't Ġ_ really _ Ġuse Ġdirectories , ĊĠĠĠĠĠĠĠ Ġ// Ġjust Ġpaths . ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . from Iterable ( event . details ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġdetail Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr xF ire base Storage . delete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . child ( path Provider . detail Path ( detail , Ġevent ). path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). do On Complete Ġ{ ĠTim ber . i (" Deleted Ġdetail Ġ${ detail . uuid } Ġfrom Ġevent ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Files ( detail : ĠDetail , Ġcontainer : ĠDetails Container ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref ToFile Ġ= Ġstorage Ref . child ( path Provider . detail Path ( detail , Ġcontainer ). path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġr xF ire base Storage . delete ( ref ToFile ) ĊĠĠĠ Ġ} Ċ } Ċ