package Ġcom . dark min st rel . po cket dict . ui . act _ main Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . dark min st rel . po cket dict . Text ToS peech Manager Ċ import Ġcom . dark min st rel . po cket dict . data . Parsed Translation Ċ import Ġcom . dark min st rel . po cket dict . data . ViewState Translate Ċ import Ġcom . dark min st rel . po cket dict . use cases . Use case Translate Ċ import Ġkotlinx . coroutines .* Ċ Ċ class ĠAct Main VM ( private Ġval Ġuse case : ĠUse case Translate , Ġval Ġt ts Manager : ĠText ToS peech Manager ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġlive Data Favorite Keys Ġ= Ġuse case . live Data Favorite Keys ĊĠĠĠ Ġsuspend Ġfun Ġget Favorite ( key : String ) Ġ= Ġuse case . get Favorite ( key ) ĊĊĠĠĠ Ġprivate Ġval Ġld ViewState Ġ= ĠMutable LiveData < ViewState Translate ?> (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġlive Data ViewState Ġ= Ġld ViewState Ġas ĠLive Data < ViewState Translate ?> ĊĊĠĠĠ Ġprivate Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġtry Reset (): Boolean { ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif ( ld ViewState . value != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġld ViewState . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Query Changed ( query Trim med : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġshould Show Suggestion Ġ= Ġquery Trim med . isEmpty () Ġ|| Ġlive Data Favorite Keys . value ?. any Ġ{ Ġit != query Trim med Ġ&& Ġit . contains ( query Trim med ) Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġif ( should Show Suggestion ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġld ViewState . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġload ( query Trim med ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Query Submit ( query Trim med : ĠString ){ ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġload ( query Trim med ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload ( query Trim med : ĠString ): Job Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġld ViewState . value Ġ= ĠView State Translate . Progress ĊĠĠĠĠĠĠĠ Ġval Ġtranslation Ġ= Ġuse case . get Translation ( query Trim med ) ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġensure Active () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġld ViewState . value Ġ= Ġtranslation ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Open Details ( translation : ĠParsed Translation ){ ĊĠĠĠĠĠĠĠ Ġld ViewState . value Ġ= ĠView State Translate . Data ( translation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonChange Favorite Status ( translation : ĠParsed Translation , Ġis Favorite : Boolean ){ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse case . set Favorite ( translation , Ġis Favorite ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠĠĠĠĠ Ġjob Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} Ċ Ċ }