package Ġmedia . pix i . app kit . data . auth Ċ Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . auth . Firebase User Ċ import Ġcom . google . firebase . firestore . Document Snapshot Ċ import Ġcom . google . firebase . firestore . Firebase Fire store Ċ import Ġdur din apps . r xf ire base 2 . R xF ire base Auth Ċ import Ġdur din apps . r xf ire base 2 . R xF ire base User Ċ import Ġdur din apps . r xf ire base 2 . R xF ire store Ċ import Ġio . reactivex . Back pressure Strategy Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ class ĠFirebase Auth Provider : ĠAuth Provider Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogin Subject : ĠPublish Subject < Boolean > Ġ= ĠPublish Subject . create () ĊĠĠĠ Ġprivate Ġval Ġauth : ĠFirebase Auth Ġ= ĠFirebase Auth . getInstance () ĊĠĠĠ Ġprivate Ġval Ġfire store Ġ= ĠFirebase Fire store . getInstance () ĊĊĠĠĠ Ġoverride Ġfun Ġget UserId (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Auth . getInstance (). currentUser ?. uid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Signed In (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠĠĠĠĠ Ġreturn Ġuser Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign Out () Ġ{ ĊĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). sign Out () ĊĠĠĠĠĠĠĠ Ġthis . login Subject . onNext ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserver Auth State (): ĠFlow able < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . observe Auth State ( Firebase Auth . getInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġauth Ġ-> Ġauth . currentUser Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able ( Back pressure Strategy . LATE ST ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserver LoggedIn User (): ĠFlow able < Auth User Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . observe Auth State ( Firebase Auth . getInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . currentUser Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able ( Back pressure Strategy . BUFFER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat Map Ġ{ Ġauth Ġ-> Ġobserver LoggedIn User ( auth . currentUser !! ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserver LoggedIn User ( firebase User : ĠFirebase User ): ĠFlow able < Auth User Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġfirebase User . uid ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġfire store . collection ( PE OP LE ). document ( uid ) ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire store . observe Document Ref ( ref ). map Ġ{ Ġthis . to User Model ( firebase User , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign In ( email : ĠString , Ġpassword : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . signIn With Email And Password ( auth , Ġemail , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġbug Ġwith Ġcompletion Ġbefore Ġsigned Ġin Ġuser Ġactually Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( SIGN IN _ DELAY _ SECONDS , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Element () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign Up ( email : ĠString , Ġpassword : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . createUser With Email And Password ( auth , Ġemail , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġbug Ġwith Ġcompletion Ġbefore Ġsigned Ġin Ġuser Ġactually Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( SIGN IN _ DELAY _ SECONDS , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. ignore Element () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Email ( email : ĠString , Ġpassword : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getUser () Ġ== Ġnull ) Ġreturn ĠComp letable . error ( IllegalArgumentException (" No ĠUser ")) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . signIn With Email And Password ( auth , ĠgetUser () !!. email !! , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ ĠR xF ire base User . update Email ( it . user !! , Ġemail ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Password ( new Password : ĠString , Ġold Password : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( getUser () Ġ== Ġnull ) Ġreturn ĠComp letable . error ( IllegalArgumentException (" No ĠUser ")) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . signIn With Email And Password ( auth , ĠgetUser () !!. email !! , Ġold Password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ ĠR xF ire base User . update Password ( it . user !! , Ġnew Password ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Username ( name : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġauth . currentUser ?. uid Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( uid . isEmpty ()) Ġreturn ĠComp letable . error ( IllegalArgumentException (" No ĠUser ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġfire store . collection ( PE OP LE ). document ( uid ) ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire store . update Document ( ref , ĠUSER NAME , Ġname ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate FirstName ( name : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġauth . currentUser ?. uid Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( uid . isEmpty ()) Ġreturn ĠComp letable . error ( IllegalArgumentException (" No ĠUser ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġfire store . collection ( PE OP LE ). document ( uid ) ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire store . update Document ( ref , ĠFIRST NAME , Ġname ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate LastName ( name : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġauth . currentUser ?. uid Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( uid . isEmpty ()) Ġreturn ĠComp letable . error ( IllegalArgumentException (" No ĠUser ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġfire store . collection ( PE OP LE ). document ( uid ) ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire store . update Document ( ref , ĠLAST NAME , Ġname ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Profile Image ( url : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuid Ġ= Ġauth . currentUser ?. uid Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( uid . isEmpty ()) Ġreturn ĠComp letable . error ( IllegalArgumentException (" No ĠUser ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġfire store . collection ( PE OP LE ). document ( uid ) ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire store . update Document ( ref , ĠIMAGE _ URL , Ġurl ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Email Verification (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġauth . currentUser ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base User . send Email Verification ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . error ( IllegalArgumentException (" No ĠUser ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Password Reset Email ( email : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . send Password Reset Email ( auth , Ġemail ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Account ( password : ĠString ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtodo Ġhandle Ġnon - email Ġaccounts ĊĠĠĠĠĠĠĠ Ġreturn ĠR xF ire base Auth . signIn With Email And Password ( auth , ĠgetUser () !!. email !! , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ ĠR xF ire base User . delete ( it . user !! ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetUser (): ĠFirebase User ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFirebase Auth . getInstance (). currentUser ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto User Model ( firebase User : ĠFirebase User , Ġsnapshot : ĠDocument Snapshot ): ĠAuth User Model Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠAuth User Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġfirebase User . uid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= Ġfirebase User . email Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġsnapshot . get ( USERNAME ) Ġas ĠString ? Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfirstName Ġ= Ġsnapshot . get ( FIRST NAME ) Ġas ĠString ? Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlastName Ġ= Ġsnapshot . get ( LAST NAME ) Ġas ĠString ? Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageUrl Ġ= Ġsnapshot . get ( IMAGE _ URL ) Ġas ĠString ? Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠphoneNumber Ġ= Ġfirebase User . phoneNumber Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverified Email Ġ= Ġfirebase User . is Email Verified ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPE OP LE Ġ= Ġ" people " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFIRST NAME Ġ= Ġ" firstname " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLAST NAME Ġ= Ġ" lastname " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUSER NAME Ġ= Ġ" username " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠIMAGE _ URL Ġ= Ġ" imageUrl " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSIGN IN _ DELAY _ SECONDS Ġ= Ġ 2 L ĊĠĠĠ Ġ} Ċ } Ċ