package Ġcom . example . f url en co task . ui . fragments Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Abs ListView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . recyclerview . widget . Simple Item Animator Ċ import Ġcom . example . f url en co task . R Ċ import Ġcom . example . f url en co task . data . constants . App Constants Ċ import Ġcom . example . f url en co task . ui . adapters . News Item Adapter Ċ import Ġcom . example . f url en co task . ui . view models . Generic ViewModel Ċ import Ġcom . example . f url en co task . ui . view models . Main ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . android . synt hetic . main . fragment _ generic _ view _ list .* Ċ Ċ interface ĠOn Item Click Ġ{ ĊĠĠĠ Ġfun ĠonClick ( url : ĠString ) Ċ } Ċ Ċ @ Android EntryPoint Ċ class ĠGeneric View List Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġparams : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠNews Item Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmanager : ĠLinearLayoutManager ĊĠĠĠ Ġprivate Ġvar Ġis Scrolling Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġon Item Click : ĠOn Item Click ĊĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠGeneric ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġval Ġactivity VM : ĠMain ViewModel Ġby Ġactivity ViewModels () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ generic _ view _ list , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ ĠLog . d (" Generic Ġfragment ", Ġ" Fragment Ġ: Ġ$ this Ġ Ġand Ġview Ġmodel Ġ: Ġ$ viewModel ") ĊĠĠĠĠĠĠĠ Ġparams Ġ= Ġarguments ?. getInt ( App Constants . REQUEST _ TYPE _ POSITION ) ĊĠĠĠĠĠĠĠ Ġinit Views () ĊĠĠĠĠĠĠĠ Ġinit Listeners () ĊĠĠĠĠĠĠĠ ĠviewModel . set RowCount ( params Ġ?: Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠNews Item Adapter ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow News ( it Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . toggle F avour ite Value ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġmanager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠ Ġrv _ news . layout Manager Ġ= Ġmanager ĊĠĠĠĠĠĠĠ Ġ( rv _ news . item Animator Ġas ĠSimple Item Animator ). supports Change Animations Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġrv _ news . adapter Ġ= Ġadapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listeners (){ ĊĠĠĠĠĠĠĠ ĠviewModel . news Results LD . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ blank _ content . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . pageNumber Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpb _ pagination . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpb _ loading . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . set Items ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . list Empty LD . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get News ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . fetch News From Local ( params Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . change F avour ite LD . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . update Item ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġactivity VM . on Changed Fav . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . update Item ( it ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġactivity VM . is Network Available . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . can Fetch Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get News ( params Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . success Msg . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġit , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . error Msg . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġit , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . rowCount Set LD . observe ( view Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . is Table Empty ( params Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ blank _ content . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġrv _ news . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠAbs ListView . On Scroll Listener . SCROLL _ STATE _ TO UCH _ SCROLL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scrolling Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Scrolling Ġ&& Ġ( manager . child Count Ġ+ Ġmanager . findFirst Visible Item Position () Ġ== Ġmanager . item Count )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scrolling Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpb _ pagination . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get News ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Reference ( on Item Click : ĠOn Item Click ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Item Click Ġ= Ġon Item Click ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow News ( news Url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Item Click . onClick ( news Url ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( position : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGeneric View List Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( App Constants . REQUEST _ TYPE _ POSITION , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }