package Ġcom . mult ith read . coco on . presentation . top stories Ċ Ċ import Ġandroidx . swiper ef resh layout . widget . Swipe Refresh Layout Ċ import Ġcom . mult ith read . coco on . base . ui . ViewModel Error Success Fragment Ċ import Ġcom . mult ith read . coco on . extension . show Ċ import Ġcom . mult ith read . coco on . presentation . list . Top St ories Adapter Ċ import Ġcom . mult ith read . coco on . presentation . main . Detail Activity Ċ import Ġkotlinx . android . synt hetic . main . fragment _ top _ stories .* Ċ import Ġkotlinx . coroutines . Flow Preview Ċ Ċ class ĠTop St ories Fragment Ġ: ĊĠĠĠ ĠViewModel Error Success Fragment < Top St ories State , ĠTop St ories Event , ĠTop St ories ViewModel >(), ĊĠĠĠ ĠSw ipe Refresh Layout . On Refresh Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstories Adapter Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠTop St ories Adapter ( story Callback , Ġimage Loader ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Flow Preview ĊĠĠĠ Ġprivate Ġval Ġstory Callback : Ġ( item : ĠCallback Param ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCallback Param . Like Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . handle Event ( Top St ories Event . AddTo Favorite ( it . data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCallback Param . Dis like Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . handle Event ( Top St ories Event . Remove From Favorite ( it . data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCallback Param . Click Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Detail Activity . newInstance ( require Context (), Ġit . data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ViewModel Class (): ĠClass < Top St ories ViewModel > Ġ= ĠTop St ories ViewModel :: class . java ĊĊĠĠĠ Ġoverride Ġval Ġcontent ResourceId : ĠInt Ġ= Ġcom . mult ith read . coco on . R . layout . fragment _ top _ stories ĊĊĠĠĠ Ġ@ Flow Preview ĊĠĠĠ Ġoverride Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init View () ĊĠĠĠĠĠĠĠ Ġtop St ories Swipe Refresh . setOn Refresh Listener ( this ) ĊĠĠĠĠĠĠĠ Ġtop St ories List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġstories Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . handle Event ( Top St ories Event . Get Top St ories ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġshow Loading Spinner ( loading : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtop St ories ProgressBar . show ( loading ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender State ( state : ĠTop St ories State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . render State ( state ) ĊĠĠĠĠĠĠĠ Ġwhen ( state . data ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTop St ories State . Data . Top St ories Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Data Received ( state . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTop St ories State . Data . No Data Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon No Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Data Received ( data : ĠTop St ories State . Data . Top St ories ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtop St ories List . show ( true ) ĊĠĠĠĠĠĠĠ Ġtop St ories Swipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstories Adapter . item List Ġ= Ġdata . story . results ĊĠĠĠĠĠĠĠ Ġtop St ories Empty TextView . show ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon No Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġtop St ories Swipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstories Adapter . item List . isEmpty (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop St ories List . show ( this . not ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop St ories Empty TextView . show ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Flow Preview ĊĠĠĠ Ġoverride Ġfun Ġon Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġtop St ories Swipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠviewModel . handle Event ( Top St ories Event . Get Top St ories ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance () Ġ= ĠTop St ories Fragment () ĊĠĠĠ Ġ} Ċ Ċ }