package Ġcom . re curs ia . popular movies . data . repositories Ċ Ċ import Ġandroid . net . Uri Ċ import Ġcom . google . android . gms . tasks . On Success Listener Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . database . Data Snapshot Ċ import Ġcom . google . firebase . database . Database Error Ċ import Ġcom . google . firebase . database . Firebase Database Ċ import Ġcom . google . firebase . database . Value EventListener Ċ import Ġcom . google . firebase . storage . Firebase Storage Ċ import Ġcom . google . firebase . storage . Upload Task Ċ import Ġcom . re curs ia . popular movies . domain . Account Repository Ċ import Ġcom . re curs ia . popular movies . domain . models . Movie Ċ import Ġcom . re curs ia . popular movies . domain . models . User Ċ import Ġcom . re curs ia . popular movies . domain . models . enums . Movie Status Ċ import Ġio . reactivex .* Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ Ċ class ĠAccount Repository Impl Ġ: ĠAccount Repository Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠgetUser Info (): ĠMaybe < User > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMaybe . create < User > Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirebase User Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . username Ġ= Ġfirebase User ?. uid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . email Ġ= Ġfirebase User ?. email ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠImage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Ref Ġ= ĠFirebase Storage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. child (" images /${ firebase User ?. uid }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ref . download Url . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . profile Image Path Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset UserProfile Image ( image Path : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Ref Ġ= ĠFirebase Storage . getInstance (). reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ref Ġ= Ġstorage Ref . child (" images /${ user ?. uid }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( image Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ref . put File ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOn Success Listener < Upload Task . Task Snapshot > Ġ{ Ġemitter . onComplete () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset UserInfo ( user : ĠUser ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġimplement ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . complete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Movie ById ( movie Id : ĠInt ): ĠMaybe < Movie > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMaybe . create < Movie > Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠFirebase Database . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġdatabase . getReference (" movies /${ user ?. uid }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . addListener For Single Value Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( error : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( error . to Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( snapshot : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovie Ġ= Ġfind Movie ( movie Id , Ġsnapshot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( movie Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( movie . getValue ( Movie :: class . java ) Ġas ĠMovie ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Movie Status ( movie : ĠMovie ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠFirebase Database . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġdatabase . getReference (" movies /${ user ?. uid }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . add Value EventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( error : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( error . to Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( snapshot : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisted Movie Ġ= Ġfind Movie ( movie . id , Ġsnapshot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exist ed Movie Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref . push (). setValue ( movie ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġupdate Ġchild Ġif Ġexisted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Movie ( movie Id : ĠInt , Ġsnapshot : ĠData Snapshot ): ĠData Snapshot ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsnapshot . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġ( it . getValue ( Movie :: class . java ) Ġas ĠMovie ). id Ġ== Ġmovie Id Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Movies With Status ( status : ĠMovie Status , Ġsnapshot : ĠData Snapshot ): ĠList < Data Snapshot > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsnapshot . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( it . getValue ( Movie :: class . java ) Ġas ĠMovie ). status Ġ== Ġstatus Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetUser Movies With Status ( status : ĠMovie Status ): ĠFlow able < List < Movie >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . create < List < Movie >> Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠFirebase Database . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġdatabase . getReference (" movies /${ user ?. uid }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . add Value EventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠValue EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( error : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( error . to Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( snapshot : ĠData Snapshot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovies Ġ= Ġfind Movies With Status ( status , Ġsnapshot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onNext ( movies . map Ġ{ Ġit . getValue ( Movie :: class . java ) Ġas ĠMovie Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. to Flow able ( Back pressure Strategy . LATE ST ). subscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} Ċ } Ċ