package Ġcom . example . chat app Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . icu . util . TimeUnit . values Ċ import Ġandroid . n fc . Tag Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġcom . example . chat app . Da os . User Dao Ċ 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 . SignIn Button Ċ import Ġcom . google . android . gms . common . api . ApiException Ċ import Ġcom . google . android . gms . tasks . Task Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcom . google . firebase . auth . Firebase User Ċ import Ġcom . google . firebase . auth . Google Auth Provider Ċ import Ġcom . google . firebase . auth . k tx . auth Ċ import Ġcom . google . firebase . firestore . auth . User Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġkotlinx . android . synt hetic . main . activity _ sign _ in .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . tasks . await Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . time . chrono . J apanese E ra . values Ċ Ċ class ĠSign In Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠRC _ SIGN _ IN : ĠInt = Ġ 1 2 3 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgoogle SignIn Client : ĠGoogle SignIn Client ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġauth : ĠFirebase Auth ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ sign _ in ) ĊĠĠĠĠĠĠĠ Ġ// ĠConfigure ĠGoogle ĠSign ĠIn ĊĠĠĠĠĠĠĠ Ġval Ġg so Ġ= ĠGoogle SignIn Options . Builder ( Google SignIn Options . DEFAULT _ SIGN _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. requestId Token ( getString ( R . string . default _ web _ client _ id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Email () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġauth Ġ= ĠFirebase . auth ĊĠĠĠĠĠĠĠ Ġgoogle SignIn Client Ġ= ĠGoogle SignIn . getClient ( this , Ġg so ) ĊĠĠĠĠĠĠĠ Ġsign In Button . setOnClickListener { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġval ĠcurrentUser Ġ= Ġauth . currentUser ĊĠĠĠĠĠĠĠ Ġupdate UI ( currentUser ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġsign In () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsign In Intent Ġ= Ġgoogle SignIn Client . signIn Intent ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( signIn Intent , ĠRC _ SIGN _ IN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠResult Ġreturned Ġfrom Ġlaunch ing Ġthe ĠIntent Ġfrom ĠGoogle SignIn Api . get SignIn Intent (... ); ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRC _ SIGN _ IN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠGoogle SignIn . get Signed In Account From Intent ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" TAG "," Task Ġfound : Ġ$ task ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle SignIn Result ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle SignIn Result ( task : ĠTask < Google SignIn Account > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGoogle ĠSign ĠIn Ġwas Ġsuccessful , Ġauthenticate Ġwith ĠFirebase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġtask ?. getResult ( ApiException :: class . java ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" TAG ", Ġ" firebase Auth With Google :" Ġ+ Ġaccount . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirebase Auth With Google ( account . id Token !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGoogle ĠSign ĠIn Ġfailed , Ġupdate ĠUI Ġappropriately ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" TAG ", Ġ" Google Ġsign Ġin Ġfailed ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġfirebase Auth With Google ( id Token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcredentials Ġ= ĠGoogle Auth Provider . getC redential ( id Token , null ) ĊĠĠĠĠĠĠĠ Ġsign In Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauth Ġ= Ġauth . signIn With Credential ( credentials ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfire Base User Ġ= Ġauth . user ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI ( fire Base User ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( fire Base User : ĠFirebase User ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( fire Base User != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġcom . example . chat app . models . User ( fire Base User . uid , fire Base User . displayName , fire Base User . photoUrl . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Dao = ĠUser Dao () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers Dao . add User ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Activity Intent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( main Activity Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign In Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }