package Ġbg . d alex ie v . bg H istr ory R ss . article Ċ Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Media Controller Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Navigation Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġbg . d alex ie v . bg H istr ory R ss . App Ċ import Ġbg . d alex ie v . bg H istr ory R ss . R Ċ import Ġbg . d alex ie v . bg H istr ory R ss . core . State Ċ import Ġbg . d alex ie v . bg H istr ory R ss . data . entity . Article Preview Ċ import Ġbg . d alex ie v . bg H istr ory R ss . databinding . Fragment Article List Binding Ċ Ċ class ĠArticle List Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Data Binding : ĠFragment Article List Binding ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Adapter : ĠArticle ListAdapter ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Nav Controller : ĠNav Controller ĊĊĠĠĠ Ġprivate Ġval Ġm ViewModel Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠViewModel Providers . of ( activity !! , Ġ( context !!. application Context Ġas ĠApp ). viewModel Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Article List ViewModel :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?) Ġ= ĊĠĠĠĠĠĠĠ ĠData Binding Util . inflate < Fragment Article List Binding >( in flater , ĠR . layout . fragment _ article _ list , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġm Data Binding Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit . root Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġm Adapter Ġ= ĠArticle ListAdapter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Share ItemClickListener Ġ= Ġ{ Ġm ViewModel . on Share Article Clicked ( this @ Article List Fragment . activity !! , Ġit ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon F avour ite ItemClickListener Ġ= Ġ{ Ġposition : ĠInt , Ġarticle : ĠArticle Preview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ViewModel . on Toggle Article Clicked ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarticle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon ItemClickListener Ġ= Ġ{ Ġm ViewModel . on Article Clicked ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm Data Binding . article List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( Item Offset Decoration ( resources . get Dimension Pixel Size ( R . dim en . article _ list _ item _ margin ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġm Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Data Binding . swipe Refresh . setOn Refresh Listener Ġ{ Ġm ViewModel . sync () Ġ} ĊĊĠĠĠĠĠĠĠ Ġm ViewModel . articles . observe ( this , ĠObserver Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Loading Ġ-> Ġm Data Binding . swipe Refresh . is Refresh ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Binding . swipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter . submit List ( state . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Failure Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Data Binding . swipe Refresh . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Article List Fragment . context , Ġ" Error Ġwhile Ġloading Ġarticles ", ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġm ViewModel . shared Article . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. getContent IfNot Handled ()?. let Ġ{ Ġintent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . resolve Activity ( this @ Article List Fragment . activity !!. package Manager )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġm ViewModel . updated Article . observe ( this , ĠObserver Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Success Ġ-> Ġm Adapter . update Item ( state . value . first , Ġstate . value . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠState . Failure Ġ-> ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Article List Fragment . context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġupdate Ġarticle ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġm ViewModel . selected Article . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. getContent IfNot Handled ()?. let Ġ{ Ġarticle Preview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠBundle (). apply Ġ{ Ġput String ( Article Details Fragment . EXTRA _ ARTIC LE _ GUID , Ġarticle Preview . guid ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Nav Controller ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. navigate ( R . id . action _ article List Fragment _ to _ article Details Fragment , Ġargs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġm Nav Controller Ġ= ĠNavigation . find Nav Controller ( activity !! , ĠR . id . nav _ host _ fragment ); ĊĊĠĠĠĠĠĠĠ Ġm ViewModel . load Articles () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠItem Offset Decoration ( private Ġval Ġmargin In Pixels : ĠInt ) Ġ: ĠRecyclerView . Item Decoration () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Offsets ( out Rect : ĠRect , Ġview : ĠView , Ġparent : ĠRecyclerView , Ġstate : ĠRecyclerView . State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparent . getChild Adapter Position ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ== Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Rect . top Ġ= Ġmargin In Pixels ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }