package Ġcom . memory a . presentation . fragment . play Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroidx . activity . result . Activity Result Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . memory a . Constants Ċ import Ġcom . memory a . framework . Inter actors Ċ import Ġcom . memory a . framework . room . entities . Category Entity Ċ import Ġcom . memory a . framework . room . entities . User Entity Ċ import Ġcom . memory a . framework . room . entities . Vocab ulary Item Entity Ċ 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 Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . random . Random Ċ Ċ @ H ilt ViewModel Ċ class ĠPlay Fragment ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġval Ġsign In Client : ĠGoogle SignIn Client , ĊĠĠĠ Ġprivate Ġvar Ġ_ last Signed In Account : ĠGoogle SignIn Account ?, ĊĠĠĠ Ġprivate Ġval Ġ_ inter actors : ĠInter actors Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ categoryId Ġ= ĠConstants . default CategoryId ĊĠĠĠ Ġprivate Ġvar Ġ_ set Play Word Timer : ĠTimer ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġvocabulary List Ġ= ĊĠĠĠĠĠĠĠ Ġ_ inter actors . get Vocab ulary Items As LiveData () Ġas ĠLive Data < List < Vocab ulary Item Entity >> ĊĠĠĠ Ġval Ġtranslation Text Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġval Ġcategories Ġ= ĊĠĠĠĠĠĠĠ Ġ_ inter actors . get NotEmpty Categories As LiveData () Ġas ĠLive Data < List < Category Entity >> ĊĊĠĠĠ Ġprivate Ġvar Ġ_ correct Attempts Ġ= Ġ 0 ĊĠĠĠ Ġval Ġcorrect Attempts : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ correct Attempts ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Authenticated Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġval Ġis Authenticated : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Authenticated ĊĊĠĠĠ Ġprivate Ġval Ġ_ all Attempts Ġ= ĠMutable LiveData ( 0 ) ĊĠĠĠ Ġval Ġall Attempts : ĠLive Data < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ all Attempts ĊĊĠĠĠ Ġprivate Ġval Ġ_ vocabulary Item Ġ= ĠMutable LiveData < Vocab ulary Item Entity >() ĊĠĠĠ Ġval Ġvocabulary Item : ĠLive Data < Vocab ulary Item Entity > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ vocabulary Item ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Translation Ok Ġ= ĠMutable LiveData < Boolean >() ĊĠĠĠ Ġval Ġis Translation Ok : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ is Translation Ok ĊĊĠĠĠ Ġprivate Ġval Ġ_ isLoading Completed Ġ= ĠMutable LiveData ( false ) ĊĠĠĠ Ġval ĠisLoading Completed : ĠLive Data < Boolean > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ isLoading Completed ĊĊĠĠĠ Ġfun Ġset Play Word ( after Correct Translation : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġaction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vocabulary List . value Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vocabulary List . value !!. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter edList Ġ= Ġif Ġ(_ categoryId Ġ== ĠConstants . default CategoryId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvocabulary List . value !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvocabulary List . value !!. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . category Ġ== Ġ_ categoryId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Index Ġ= ĠRandom . nextInt ( filter edList . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ vocabulary Item . post Value ( filter edList [ random Index ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ vocabulary Item . post Value ( Vocab ulary Item Entity ("", Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading Completed . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( after Correct Translation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Task Ġ= Ġobject Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isLoading Completed . post Value ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ set Play Word Timer ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ set Play Word Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ set Play Word Timer ?. schedule ( timer Task , Ġ 8 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Check Translation Button Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ is Translation Ok . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslation Text . value !!. equals (_ vocabulary Item . value !!. it Word , Ġignore Case Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(_ is Translation Ok . value !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ correct Attempts ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Play Word ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslation Text . value Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ all Attempts . value Ġ= Ġ_ all Attempts . value ?. plus ( 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Game Play ( category Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset CategoryId ( category Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Recent Attempts () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Play Word () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmanage Auth Result ( activity Result : ĠActivity Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( activity Result . result Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity . RESULT _ OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgoogle SignIn Account Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle SignIn . get Signed In Account From Intent ( activity Result . data ). result ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( google SignIn Account . id . isNull OrEmpty ()) Ġreturn @ launch ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ inter actors . add User ( User Entity ( google SignIn Account . id !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ inter actors . fetch Cloud Db () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Authenticated . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" AUTH : Ġauthentication Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Authenticated () Ġ= Ġ_ last Signed In Account Ġ!= Ġnull ĊĊĠĠĠ Ġfun Ġon Authentication Ok () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ inter actors . fetch Cloud Db () ĊĠĠĠĠĠĠĠ Ġ_ is Authenticated . value Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsign Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġsign In Client . sign Out () ĊĠĠĠĠĠĠĠ Ġ_ last Signed In Account Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ_ is Authenticated . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ inter actors . removeAll Users () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġset CategoryId ( category Name : ĠString ) Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ categoryId Ġ= Ġcategories . value ?. find Ġ{ Ġc Ġ-> Ġc . category Ġ== Ġcategory Name Ġ} ?. id !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Recent Attempts () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ correct Attempts Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ_ all Attempts . value Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ }