package Ġcom . h ish am . weather . home . presentation Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . h ish am . weather . home . data . api . worker . Fetch Weather Scheduler Ċ import Ġcom . h ish am . weather . home . domain . Home State Ċ import Ġcom . h ish am . weather . home . domain . location . Location Delegate Ċ import Ġcom . h ish am . weather . home . domain . use cases . Fetch Weather UseCase Ċ import Ġcom . h ish am . weather . threading . Coroutine Dispatch ers Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠHome ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġfetch Weather UseCase : ĠFetch Weather UseCase , ĊĠĠĠ Ġprivate Ġval Ġlocation Delegate : ĠLocation Delegate , ĊĠĠĠ Ġprivate Ġval Ġfetch Weather Scheduler : ĠFetch Weather Scheduler , ĊĠĠĠ Ġprivate Ġval Ġdispatch ers : ĠCor outine Dispatch ers , Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ ui State Ġ= ĠMutable State Flow ( Home State ( loading Ġ= Ġtrue )) ĊĠĠĠ Ġval Ġui State : ĠState Flow < Home State > Ġ= Ġ_ ui State ĊĊĠĠĠ Ġprivate Ġval Ġlocation State Ġ= ĠMutable State Flow ( Pair ( 0 . 0 , Ġ 0 . 0 )) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialise () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialise () Ġ= ĠviewModel Scope . launch ( dispatch ers . main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Weather Scheduler . schedule () ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġwith Context ( dispatch ers . io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Delegate . getLocation () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation State . value Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value . build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" Failed Ġto Ġload Ġlocation " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles ĠUI Ġinteractions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġhandle Event ( event : ĠHome Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHome Event . Fetch Weather Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload () Ġ= Ġwith Context ( dispatch ers . main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value . build Ġ{ Ġloading Ġ= Ġtrue Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwith Context ( dispatch ers . io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( lat , Ġlng ) Ġ= Ġlocation State . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Weather UseCase . execute ( lat , Ġlng ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ ui State . value Ġ= Ġ_ ui State . value . build Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġresult . get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġresult . exception OrNull ()?. message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ