/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . google . android . gnd . system . auth Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . res . Resources Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Account Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Client Ċ import Ġcom . google . android . gms . auth . api . signin . Google SignIn Options Ċ import Ġcom . google . android . gms . common . api . ApiException Ċ import Ġcom . google . android . gnd . R Ċ import Ġcom . google . android . gnd . model . User Ċ import Ġcom . google . android . gnd . rx . annotations . Hot Ċ import Ġcom . google . android . gnd . system . Activity Result Ċ import Ġcom . google . android . gnd . system . Activity Streams Ċ import Ġcom . google . android . gnd . system . auth . SignIn State Ċ import Ġcom . google . firebase . auth .* Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġio . reactivex . subjects . Subject Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ private Ġval ĠSIGN _ IN _ REQUEST _ CODE Ġ= ĠAuthentication Manager :: class . java . hashCode () Ġand Ġ 0 xffff Ċ Ċ class ĠGoogle Authentication Manager Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġresources : ĠResources , ĊĠĠĠ Ġprivate Ġval Ġactivity Streams : ĠActivity Streams Ċ ) Ġ: ĠAuthentication Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġactivity Results Subscription : ĠDis posable ĊĠĠĠ Ġprivate Ġval Ġfirebase Auth : ĠFirebase Auth Ġ= ĠFirebase Auth . getInstance () ĊĠĠĠ Ġprivate Ġval Ġgoogle SignIn Options : ĠGoogle SignIn Options ĊĊĠĠĠ Ġ// ĠTODO : ĠUpdate ĠF rag ments Ġto Ġaccess Ġvia ĠProject Repository Ġrather Ġthan Ġdirectly . ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgoogle SignIn Options Ġ= ĠGoogle SignIn Options . Builder ( Google SignIn Options . DEFAULT _ SIGN _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. requestId Token ( resources . getString ( R . string . default _ web _ client _ id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Email () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Profile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠDispose Ġthe Ġsubscription Ġwhen Ġobject Ġis Ġdestroyed ĊĠĠĠĠĠĠĠ Ġactivity Results Subscription Ġ= Ġactivity Streams . getActivity Results ( SIGN _ IN _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġon Activity Result ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsign In State : Ġ@ Hot ( replay s Ġ= Ġtrue ) ĠSubject < SignIn State > Ġ= ĠBehavior Subject . create () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrent Ġuser , Ġblocking Ġuntil Ġa Ġuser Ġlogs Ġin . ĠOnly Ġcall Ġfrom Ġcode Ġwhere Ġuser Ġis ĊĠĠĠĠ Ġ* Ġguaranteed Ġto Ġbe Ġauthenticated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval ĠcurrentUser : ĠUser ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsign In State . map ( SignIn State :: user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isPresent Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . get () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. blocking First () Ġ// ĠTODO : ĠShould Ġthis Ġbe Ġblocking ? ĊĊĠĠĠ Ġoverride Ġfun Ġinit () Ġ= Ġsign In State . onNext ( status ) ĊĊĠĠĠ Ġprivate Ġval Ġstatus : ĠSign In State ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirebase User Ġ= Ġfirebase Auth . currentUser ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( firebase User Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSign In State ( SignIn State . State . SIGNED _ OUT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSign In State ( firebase User . to User ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign In () Ġ{ ĊĠĠĠĠĠĠĠ Ġsign In State . onNext ( SignIn State ( SignIn State . State . SIGN ING _ IN )) ĊĠĠĠĠĠĠĠ Ġactivity Streams . with Activity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign In Intent Ġ= Ġget Google SignIn Client ( it ). signIn Intent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . startActivity For Result ( signIn Intent , ĠSIGN _ IN _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġfirebase Auth . sign Out () ĊĠĠĠĠĠĠĠ Ġsign In State . onNext ( SignIn State ( SignIn State . State . SIGNED _ OUT )) ĊĠĠĠĠĠĠĠ Ġactivity Streams . with Activity Ġ{ Ġget Google SignIn Client ( it ). sign Out () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Google SignIn Client ( activity : ĠActivity ): ĠGoogle SignIn Client Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠUse Ġapp Ġcontext Ġinstead Ġof Ġactivity ? ĊĠĠĠĠĠĠĠ ĠGoogle SignIn . getClient ( activity , Ġgoogle SignIn Options ) ĊĊĠĠĠ Ġprivate Ġfun Ġon Activity Result ( activity Result : ĠActivity Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe ĠTask Ġreturned Ġfrom Ġget Signed In Account From Intent Ġis Ġalways Ġcompleted , Ġso Ġno Ġneed Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġattach Ġa Ġlistener . ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoogle SignIn Task Ġ= ĠGoogle SignIn . get Signed In Account From Intent ( activity Result . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoogle SignIn Task . getResult ( ApiException :: class . java )?. let Ġ{ Ġon Google SignIn ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e , Ġ" Sign Ġin Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In State . onNext ( SignIn State ( e )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Google SignIn ( google Account : ĠGoogle SignIn Account ) Ġ= ĊĠĠĠĠĠĠĠ Ġfirebase Auth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. signIn With Credential ( get Firebase Auth Credential ( google Account )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġauth Result : ĠAuth Result Ġ-> Ġon Firebase Auth Success ( auth Result ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ Ġsign In State . onNext ( SignIn State ( it )) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Firebase Auth Success ( auth Result : ĠAuth Result ) Ġ= ĊĠĠĠ Ġ// ĠTODO : ĠStore / update Ġuser Ġprofile Ġin ĠFire store . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠStore / update Ġuser Ġprofile Ġand Ġimage Ġlocally . ĊĠĠĠĠĠĠĠ Ġsign In State . onNext ( SignIn State ( auth Result . user !!. to User ())) ĊĊĠĠĠ Ġprivate Ġfun Ġget Firebase Auth Credential ( google Account : ĠGoogle SignIn Account ): ĠAuth Credential Ġ= ĊĠĠĠĠĠĠĠ ĠGoogle Auth Provider . getC redential ( google Account . id Token , Ġnull ) ĊĊĠĠĠ Ġprivate Ġfun ĠFirebase User . to User (): ĠUser Ġ= ĊĠĠĠĠĠĠĠ ĠUser . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setId ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Email ( email ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set DisplayName ( displayName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Photo Url ( photoUrl . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ } Ċ