package Ġcom . kan aw ish . libr x . firebase Ċ Ċ import Ġcom . google . firebase . auth . Email Auth Provider Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġio . reactivex . Observable Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ /** Ċ Ġ* ĠCreated Ġon Ġ 2 0 1 7 - 1 0 - 0 2 . Ċ Ġ*/ Ċ @ Singleton Ċ class ĠFirebase Auth Manager Ġ@ Inject Ġconstructor () Ġ{ ĊĠĠĠ Ġsealed Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠInitial izing Ġ: ĠState () ĊĠĠĠĠĠĠĠ Ġclass ĠAn onymous ( private Ġval Ġreg Fun : Ġ( String ) Ġ-> ĠUnit ) Ġ: ĠState () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġregister ( email : ĠString ) Ġ= Ġreg Fun ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġobject ĠRegister ing Ġ: ĠState () ĊĠĠĠĠĠĠĠ Ġobject ĠRegistered Ġ: ĠState () ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠError ( val ĠerrMsg : ĠString ) Ġ: ĠState () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstate (): ĠObservable < State > Ġ= ĠObservable . create Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġfb Ġ= ĠFirebase Auth . getInstance () ĊĊĠĠĠĠĠĠĠ Ġ// ĠMonitor s Ġongoing Ġauth Ġstate . ĊĠĠĠĠĠĠĠ Ġfun Ġpost Init Flow () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠFirebase Auth . Auth State Listener Ġ{ Ġfb Auth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentUser Ġ= Ġfb Auth . currentUser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . onNext ( State . Error (" currentUser Ġis Ġnow Ġnull . ĠUser Ġlikely Ġforce - logged Ġout .")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser . is Anonymous Ġ-> Ġe . onNext ( State . Anonymous Ġ{ Ġemail Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( email . isEmpty ()) Ġreturn @ Anonymous ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . onNext ( State . Register ing ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcredential Ġ= ĠEmail Auth Provider . getC redential ( email , ĠUUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. link With Credential ( credential ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrMsg Ġ= Ġtask . exception ?. localized Message Ġ?: Ġ" Undefined Ġerror Ġwhile Ġregistering Ġuser ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . onNext ( State . Error ( err Msg )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠIf Ġit Ġworks , Ġauth State Lister Ġwill Ġbe Ġre - triggered , Ġand Ġwe 'll Ġend Ġup Ġat Ġthe ĠRegistered Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġe . onNext ( State . Registered ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . set C ancellable Ġ{ Ġfb . remove Auth State Listener ( listener ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfb . add Auth State Listener ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġwe Ġneed Ġto Ġanonymous ly Ġsign Ġin ? ĊĠĠĠĠĠĠĠ Ġif Ġ( fb . currentUser Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . onNext ( State . Initializing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfb . signIn Anonymous ly (). add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOn Ġsuccess , Ġadd Ġthe Ġpost Ġinit Ġlistener . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful Ġ&& Ġtask . result . user Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Init Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . onNext ( State . Error (" Error Ġcall Ġto Ġfb . signIn Anonymous ly () ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġalready Ġhad Ġa Ġuser Ġon Ġhand , Ġwe Ġjump Ġstraight Ġto Ġpost Init Flow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Init Flow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }