package Ġapp . ch int an . natur ist . ui . login Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġapp . ch int an . natur ist . model . UserProfile Ċ import Ġapp . ch int an . natur ist . model . UserRole Ċ import Ġapp . ch int an . natur ist . repository . UserRepository Ċ import Ġapp . ch int an . natur ist . util . Firebase User Manager Ċ import Ġapp . ch int an . natur ist . util . State Ċ import Ġcom . google . firebase . auth . Google Auth Provider Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠLogin ViewModel Ġ@ Inject Ġconstructor ( private Ġval Ġuser Repository : ĠUser Repository ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ firebase Auth LiveData Ġ= ĠMutable LiveData < State < String >>() ĊĠĠĠ Ġval Ġfirebase Auth LiveData : ĠLive Data < State < String >> Ġ= Ġ_ firebase Auth LiveData ĊĊĠĠĠ Ġprivate Ġval Ġ_ update UserRole LiveData Ġ= ĠMutable LiveData < State < String >>() ĊĠĠĠ Ġval Ġupdate UserRole LiveData : ĠLive Data < State < String >> Ġ= Ġ_ update UserRole LiveData ĊĊĊĠĠĠ Ġfun Ġfirebase Auth With Google ( id Token : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ firebase Auth LiveData . post Value ( State . loading ()) ĊĠĠĠĠĠĠĠ Ġval Ġcredential Ġ= ĠGoogle Auth Provider . getC redential ( id Token , Ġnull ) ĊĠĠĠĠĠĠĠ ĠFirebase User Manager . get Auth (). signIn With Credential ( credential ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener () Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSign Ġin Ġsuccess , Ġupdate ĠUI Ġwith Ġthe Ġsigned - in Ġuser 's Ġinformation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" signIn With Credential : success ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ firebase Auth LiveData . post Value ( State . success (" Account ĠVerified ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġsign Ġin Ġfails , Ġdisplay Ġa Ġmessage Ġto Ġthe Ġuser . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" signIn With Credential : failure ", Ġtask . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ firebase Auth LiveData . post Value ( State . error ( task . exception ?. message . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate UserRole ( user Role : ĠUser Role ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ update UserRole LiveData . post Value ( State . loading ()) ĊĠĠĠĠĠĠĠ ĠFirebase User Manager . getCurrent User (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Profile Ġ= ĠUser Profile () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile . uid Ġ= Ġit ?. uid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Profile . role Ġ= Ġuser Role ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . add User ( user Profile ). collect Ġ{ Ġadd User State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( add User State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add User State . data . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ update UserRole LiveData . post Value ( State . error (" Something Ġwent Ġwrong ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ update UserRole LiveData . post Value ( State . success ( add User State . data )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Error Ġ-> Ġ_ update UserRole LiveData . post Value ( State . error ( add User State . message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Loading Ġ-> Ġ_ update UserRole LiveData . post Value ( State . loading ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Login ViewModel " ĊĠĠĠ Ġ} Ċ }