package Ġapp . s ram . b ik est ore . paging Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . paging . Load State Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġapp . s ram . b ik est ore . paging . core . Get Movies Rx ViewModel Ċ import Ġcom . ad rena . commerce . paging 3 . R Ċ import Ġcom . ad rena . commerce . paging 3 . databinding . Fragment Movie List Binding Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMovie Rx Remote Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdis posable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Movie List Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrv Adapter : ĠMov ies Rx Adapter ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġprovide Rx Remote ViewModel : ĠViewModel Provider . Factory ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( activity ?. application Ġas ĠApp ). app Component . inject ( this ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Movie List Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Provider ( this , Ġprovide Rx Remote ViewModel ). get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGet Movies Rx ViewModel :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrv Adapter Ġ= ĠMov ies Rx Adapter () ĊĊĠĠĠĠĠĠĠ Ġbinding . list . layout Manager Ġ= ĠGrid LayoutManager ( view . context , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġbinding . list . adapter Ġ= Ġrv Adapter ĊĠĠĠĠĠĠĠ Ġbinding . list . adapter Ġ= Ġrv Adapter . with Load State Footer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfooter Ġ= ĠLoading Grid State Adapter () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrv Adapter . add Load State Listener Ġ{ Ġload State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror State Ġ= Ġload State . source . append Ġas ? ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload State . source . prepend Ġas ? ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload State . append Ġas ? ĠLoad State . Error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġload State . prepend Ġas ? ĠLoad State . Error ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror State ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġview . context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocalized Message Ġ= Ġit . error . localized Message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Dialog ( context , Ġlocalized Message Ġ?: Ġ" empty Ġerror Ġmessage ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdis posable . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Favorite Movies (). subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Adapter . submit Data ( lifecycle , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error Dialog ( context : ĠContext , Ġlocalized Message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . cancel ) Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . retry ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv Adapter . retry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis posable . dispose () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} Ċ } Ċ