package Ġcom . example . re stop ass . login Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . example . re stop ass . R Ċ import Ġcom . example . re stop ass . common . App Preferences Ċ import Ġcom . example . re stop ass . login . domain . Login Response Ċ import Ġcom . example . re stop ass . login . signin . Forgot Password Fragment Ċ import Ġcom . example . re stop ass . login . signin . SignIn Fragment Ċ import Ġcom . example . re stop ass . login . signup . SignUp Step One Fragment Ċ import Ġcom . example . re stop ass . login . signup . SignUp Step Two Fragment Ċ import Ġcom . example . re stop ass . main . MainActivity Ċ import Ġcom . example . re stop ass . main . common . AlertDialog Ċ import Ġcom . example . re stop ass . service . Login Service Ċ 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 . gms . tasks . Task Ċ import Ġcom . google . firebase . messaging . Firebase Messaging Ċ import Ġkotlinx . android . synt hetic . main . activity _ login .* Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber ĊĊ Ċ class ĠLogin Activity Ġ: ĠAppCompatActivity (), ĊĠĠĠ ĠLogin Fragment . On Fragment Interaction Listener , ĊĠĠĠ ĠSign In Fragment . On Fragment Interaction Listener , ĊĠĠĠ ĠSign Up Step One Fragment . On Fragment Interaction Listener , ĊĠĠĠ ĠSign Up Step Two Fragment . On Fragment Interaction Listener , ĊĠĠĠ ĠF orgot Password Fragment . On Fragment Interaction Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope Ġ= ĠCor outine Scope ( job Ġ+ ĠDispatch ers . Main ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtouch ables : ĠList < View > ĊĊĠĠĠ Ġlateinit Ġvar Ġm Google SignIn Client : ĠGoogle SignIn Client ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠApp Preferences . setup ( this ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( user Is Logged ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Main Act icity () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġsign In Options Ġ= ĠGoogle SignIn Options . Builder ( Google SignIn Options . DEFAULT _ SIGN _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. requestId Token ( SERVER _ CLIENT _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. request Email () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġm Google SignIn Client Ġ= ĠGoogle SignIn . getClient ( this , Ġsign In Options ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ login ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . fragment Container , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogin Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Google SignIn Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Google SignIn Client . sign Out () ĊĠĠĠĠĠĠĠ Ġval Ġsign In Intent Ġ= Ġm 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 Client . get SignIn Intent (... ); ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRC _ SIGN _ IN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask : ĠTask < Google SignIn Account > Ġ= ĠGoogle SignIn . get Signed In Account From Intent ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle SignIn Result ( task ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle SignIn Result ( completed Task : ĠTask < Google SignIn Account >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġcompleted Task . getResult ( ApiException :: class . java ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount ?. id Token ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoogle SignIn ( it , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe ĠApiException Ġstatus Ġcode Ġindicates Ġthe Ġdetailed Ġfailure Ġreason . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPlease Ġrefer Ġto Ġthe ĠGoogle SignIn StatusCode s Ġclass Ġreference Ġfor Ġmore Ġinformation . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w (" signIn Result : failed Ġcode =${ e . statusCode }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgoogle SignIn ( token : ĠString , Ġactivity : ĠLogin Activity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtoggle Buttons () ĊĠĠĠĠĠĠĠ Ġlogin Loader . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠLogin Service . google SignIn ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon SignIn ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Buttons () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Loader . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . get AlertDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Inflater . inflate ( R . layout . alert _ dialog _ title , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Buttons () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuttons . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < View >( it ). isEnabled Ġ= Ġ! findViewById < View >( it ). isEnabled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Fragment ( fragment : ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . fragment Container , Ġfragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchange Toolbar ( fragment Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtoolbar . title Ġ= Ġfragment Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsign Up ( login Response : ĠLogin Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattach Information ( login Response ) ĊĠĠĠĠĠĠĠ Ġstart Main Act icity ( login Response . creation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon SignIn ( login Response : ĠLogin Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġattach Information ( login Response ) ĊĠĠĠĠĠĠĠ Ġstart Main Act icity ( login Response . creation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġattach Information ( login Response : ĠLogin Response ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApp Preferences . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= Ġlogin Response . x AuthToken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Token Ġ= Ġlogin Response . x RefreshToken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Ġ= Ġlogin Response . user ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠFirebase Messaging . getInstance (). subscribe To Topic ( login Response . user . firebase Topic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġlogin Response . user . email ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" The Ġuser Ġ$ email Ġcould Ġnot Ġbe Ġsubscribed Ġto Ġown Ġtopic ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" The Ġuser Ġ$ email Ġwas Ġsuccessfully Ġsubscribed Ġto Ġown Ġtopic ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Main Act icity ( sign Up : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sign Up ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" sign Up ", Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġuser Is Logged (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠApp Preferences . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠaccessToken Ġ= Ġthis . accessToken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrefresh Token Ġ= Ġthis . refresh Token ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠaccessToken Ġ!= Ġnull Ġ&& Ġrefresh Token Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRC _ SIGN _ IN Ġ= Ġ 1 0 0 ; ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSERVER _ CLIENT _ ID Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 6 6 1 0 1 0 5 7 2 1 4 - 5 br 7 9 m 1 t uv gf ud rr man mp o 5 l 4 se 6 7 q 6 s . apps . googleusercontent . com " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbuttons Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( R . id . google SignIn Button , ĠR . id . rest o Pass SignIn Button , ĠR . id . sign Up Button ) ĊĠĠĠ Ġ} Ċ } Ċ