package Ġcom . oz ans an . san ews . main Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . oz ans an . san ews . data . models . News Ċ import Ġcom . oz ans an . san ews . util . Dispatcher Provider Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠMain ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠMain Repository , ĊĠĠĠ Ġprivate Ġval Ġdispatch ers : ĠDispatcher Provider Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġexception Handler Ġ= ĠCor outine ExceptionHandler Ġ{ Ġ_, Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠ ĠonError (" Exception Ġhandled : Ġ${ throwable . localized Message Ġ?: Ġ" UNKNOWN "} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠNews Event Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠSuccess ( val Ġresults : ĠList < News >): ĠNews Event () ĊĠĠĠĠĠĠĠ Ġclass ĠFailure ( val Ġerror Text : ĠString ): ĠNews Event () ĊĠĠĠĠĠĠĠ Ġobject ĠLoading Ġ: ĠNews Event () ĊĠĠĠĠĠĠĠ Ġobject ĠEmpty : ĠNews Event () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ top St ories . value Ġ= ĠNews Event . Failure ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ top St ories Ġ= ĠMutable State Flow < News Event >( News Event . Empty ) ĊĠĠĠ Ġval Ġtop St ories : ĠState Flow < News Event > Ġ= Ġ_ top St ories ĊĊĠĠĠ Ġprivate Ġval Ġ_ is Refresh ing Ġ= ĠMutable State Flow < Boolean >( true ) ĊĠĠĠ Ġval Ġis Refresh ing : ĠState Flow < Boolean > Ġ= Ġ_ is Refresh ing ĊĊĠĠĠ Ġfun ĠgetAll St ories () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Refresh ing . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= ĠCor outine Scope ( dispatch ers . io Ġ+ Ġexception Handler ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . get Top Story IDs () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( dispatch ers . main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( dispatch ers . io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnews List Ġ= Ġmutable ListOf < News >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop 2 0 items Ġ= Ġresponse . body () !!. take ( 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( itemId Ġin Ġtop 2 0 items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( dispatch ers . io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnews Response Ġ= Ġrepository . get Story ( itemId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( news Response . is Successful Ġ&& Ġnews Response . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnews List . add ( news Response . body () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top St ories . value Ġ= ĠNews Event . Success ( news List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Refresh ing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top St ories . value Ġ= ĠNews Event . Failure (" Null Ġbody Ġreturned !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Refresh ing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ top St ories . value Ġ= ĠNews Event . Failure ( response . message ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ is Refresh ing . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġjob ?. cancel () ĊĠĠĠ Ġ} Ċ Ċ }