package Ġnl . ent re co . g idd y app . lib auth . account . firebase Ċ Ċ import Ġandroid . app . Activity . RESULT _ OK Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġcom . firebase . ui . auth . Auth UI Ċ import Ġcom . firebase . ui . auth . ErrorCode s Ċ import Ġcom . firebase . ui . auth . Id p Response Ċ import Ġcom . firebase . ui . auth . util . Extra Constants Ċ import Ġcom . google . firebase . auth . Action Code Settings Ċ import Ġcom . google . firebase . auth . Auth Result Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . auth . Firebase User Ċ import Ġnl . ent re co . g idd y app . lib auth . Authenticator Ċ import Ġnl . ent re co . g idd y app . lib auth . Build Config Ċ import Ġnl . ent re co . g idd y app . lib auth . UserService Ċ import Ġnl . ent re co . g idd y app . lib auth . account . Account Ċ import Ġnl . ent re co . g idd y app . lib auth . account . Signup Response Ċ import Ġnl . ent re co . g idd y app . lib auth . user . User Ċ import Ġjavax . inject . Inject ĊĊ Ċ internal Ġclass ĠF b Auth Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġauth Ui : ĠAuth UI , ĊĠĠĠ Ġprivate Ġval Ġauth : ĠFirebase Auth , ĊĠĠĠ Ġprivate Ġval ĠuserService : ĠUserService Ċ ) Ġ: ĠAuth enticator Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġauth Listeners Ġ= Ġmutable Map Of < String , ĠFirebase Auth . Auth State Listener >() ĊĊĠĠĠ Ġprivate Ġval Ġemail Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠAction Code Settings . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Android PackageName ( packageName (), Ġtrue , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Handle Code In App ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Dynamic Link Domain (" g idd y . page . link / email ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Url (" https :// g idd y . ent re co . nl / email ") Ġ// ĠThis ĠURL Ġneeds Ġto Ġbe Ġwh itelisted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠpackageName () Ġ= Ġwhen Ġ( Build Config . FL AV OR ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" beta " Ġ-> Ġ" nl . ent re co . g idd y app . dev " ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" nl . ent re co . g idd y app " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġproviders Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth UI . Id p Config . Email Builder (). setAction Code Settings ( email ). enable Email Link SignIn (). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth UI . Id p Config . Phone Builder (). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth UI . Id p Config . Google Builder (). build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign in Intent ( settings : ĠF b Auth Ui Settings , Ġlink : ĠString ?): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġsettings . build () ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġauth Ui ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create SignIn Intent Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Theme ( settings . style ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Auth Method Picker Layout ( layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Available Providers ( providers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setIs Smart Lock Enabled (! Build Config . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable Anonymous Users Auto Upgrade () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set T os And Privacy Policy Urls ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// g idd y . ent re co . nl / privacy _ policy . html ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// g idd y . ent re co . nl / privacy _ policy . html " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( link ?. isNotBlank () Ġ== Ġtrue ) Ġbuilder . set Email Link ( link ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Handle ( intent : ĠIntent , Ġdone : Ġ( String ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Auth UI . can Handle Intent ( intent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġentre co Ġ- Ġ 2 0 1 9 - 0 7 - 2 6 : ĠOffic ial ĠDoc um enation Ġis Ġusing Ġlink 1 , Ġbut Ġit Ġdoes Ġnot Ġwork ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink 1 Ġ= Ġintent . extras ?. getString ( Extra Constants . EMAIL _ LINK _ SIGN _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink 2 Ġ= Ġintent . data String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone ( link 2 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlink ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ ĠresultCode : ĠInt , ĊĠĠĠĠĠĠĠ Ġdata : ĠIntent ?, ĊĠĠĠĠĠĠĠ Ġdone : Ġ( Signup Response ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠId p Response . from Result Intent ( data ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ== Ġnull Ġ-> Ġcancelled ( done ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . error ?. errorCode Ġ== ĠError Codes . AN ONY MO US _ UP GR ADE _ MERGE _ CONF LI CT Ġ-> Ġlink ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠresultCode Ġ== ĠRESULT _ OK Ġ-> Ġsuccess ( response . email Ġ?: Ġ" Linked ", Ġdone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfailed ( response . error ?. localized Message Ġ?: Ġ" F ML ", Ġdone ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsuccess ( name : ĠString , Ġdone : Ġ( Signup Response ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠuserService . create ( auth . currentUser ?. displayName Ġ?: Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone ( Signup Response . Success ( name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancelled ( done : Ġ( Signup Response ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdone ( Signup Response . Cancelled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfailed ( error : ĠString , Ġdone : Ġ( Signup Response ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdone ( Signup Response . Failed ( error , Ġ- 1 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlink ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġresponse : ĠId p Response , ĊĠĠĠĠĠĠĠ Ġdone : Ġ( Signup Response ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġentre co Ġ- Ġ 2 0 1 9 - 0 7 - 1 8 : ĠRefactor Ġ 1 ) ĠRead ability , Ġ 2 ) ĠScal ability , Ġ 3 ) ĠShould Ġbe ĠTransaction / Batch ĊĠĠĠĠĠĠĠ ĠuserService . retrieve Ġ{ Ġold Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserService . delete Ġ{ Ġdel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth Ui . delete ( context ). continue With Task Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauth . signIn With Credential ( response . credential For Link ing !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġresult . name (( old Ġas ? ĠUser . Valid )?. name Ġ?: Ġ" Linked Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserService . create ( userName ) Ġ{ Ġusr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( usr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser . Valid Ġ-> Ġdone ( Signup Response . Migrate ( usr . uid , Ġold )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser . Anonymous Ġ-> Ġdone ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSign up Response . Failed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" User Ġis Ġstill Ġanonymous ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser . Error Ġ-> Ġdone ( Signup Response . Failed ( usr . msg , Ġ- 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone ( Signup Response . Failed ( err . localized Message Ġ?: Ġ" Unknown ĠError ", Ġ- 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġerr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone ( Signup Response . Failed ( err . localized Message Ġ?: Ġ" Unknown ĠError ", Ġ- 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign in Or Anonymous ( context : ĠContext , Ġdone : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġauth . currentUser ĊĠĠĠĠĠĠĠ Ġif Ġ( user Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Ui . silent SignIn ( context , Ġproviders ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. continue With Task Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġtask ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġauth . signIn Anonymous ly () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġtask . result . name (" Authenticated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserService . create ( name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġobserve ( key : ĠString , Ġdone : Ġ( Account ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauth . add Auth State Listener Ġ{ Ġ_ auth Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserService . retrieve Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġ_ auth . currentUser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġwhen Ġ( user ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser . Valid Ġ-> Ġfill ( user , Ġaccount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser . Anonymous Ġ-> ĠAccount . An om y mous ( user . uid , Ġ" D am n Ġyou ĠAn onymous ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser . Error Ġ-> ĠAccount . Error ( user . msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill ( user : ĠUser . Valid , Ġaccount : ĠFirebase User ?): ĠAccount Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( account Ġ== Ġnull Ġ|| Ġaccount . is Anonymous ) ĠAccount . An om y mous ( user . uid , Ġuser . name ) ĊĠĠĠĠĠĠĠ Ġelse ĠAccount . Authenticated ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . uid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . email Ġ?: Ġaccount . phoneNumber Ġ?: Ġ" No Ġemail ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . photoUrl ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop Ob serving ( key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauth Listeners . remove ( key )?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth . remove Auth State Listener ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlogout ( context : ĠContext , Ġdone : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġauth Ui . sign Out ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign in Or Anonymous ( context , Ġdone ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete ( uuid : ĠString ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAuth Result ?. name ( default : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġthis ?. user ?. displayName Ġ?: Ġthis ?. user ?. provider Data ?. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . displayName ?. isNotBlank () Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ?. displayName Ġ?: Ġthis ?. additional UserInfo ?. username ĊĠĠĠĠĠĠĠ Ġ?: Ġif Ġ( this ?. user ?. is Anonymous Ġ== Ġtrue ) Ġ" Anonymous " Ġelse Ġdefault Ċ }