package Ġme . e zz at th ar wat . breaking bad . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġme . e zz at th ar wat . breaking bad . R Ċ import Ġme . e zz at th ar wat . breaking bad . domain . Characters Response Item Ċ import Ġme . e zz at th ar wat . breaking bad . util .* Ċ import Ġjavax . inject . Inject ĊĊ Ċ @ Android EntryPoint Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmain ViewModel Ġ: ĠMain ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġcharacters Adapter : ĠChar acters Adapter ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġobserve ViewModel () ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġmain ViewModel . get Characters List () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView (){ ĊĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= ĠGrid LayoutManager ( this , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcharacters RV . layout Manager Ġ= Ġlayout Manager ĊĠĠĠĠĠĠĠ Ġcharacters RV . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠ Ġcharacters RV . adapter Ġ= Ġcharacters Adapter ĊĊĠĠĠĠĠĠĠ Ġcharacters RV . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dy Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . fetch More Characters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible ItemCount Ġ= Ġlayout Manager . child Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Visible Item Position Ġ= Ġlayout Manager . find Last Visible Item Position (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal ItemCount Ġ= Ġlayout Manager . item Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve On Characters List ( resource Ġ: Ġme . e zz at th ar wat . breaking bad . core _ utils . util . Resource < List < Characters Response Item >> ){ ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( resource . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme . e zz at th ar wat . breaking bad . core _ utils . util . Status . LOADING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters RV . adapter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . item Count Ġ== Ġ 0 Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters PB . to Visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme . e zz at th ar wat . breaking bad . core _ utils . util . Status . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters PB . to G one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource . data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters RV . to Visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Adapter . submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty TV . to Visible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters RV . to G one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġme . e zz at th ar wat . breaking bad . core _ utils . util . Status . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters PB . to G one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters RV . to G one () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhome Root . show Snackbar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ IN DEFIN ITE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . get Characters List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve ( main ViewModel . characters LiveData , Ġ:: observe On Characters List ) ĊĠĠĠ Ġ} Ċ } Ċ