package Ġcom . de ver ick . mar velo ush ero es . ui . fragments Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Abs ListView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . ui . AppBar Configuration Ċ import Ġandroidx . navigation . ui . setup With Nav Controller Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . de ver ick . mar velo ush ero es . databinding . Fragment Characters Binding Ċ import Ġcom . de ver ick . mar velo ush ero es . ui . adapters . Characters Adapter Ċ import Ġcom . de ver ick . mar velo ush ero es . utils . Resource Ċ import Ġcom . de ver ick . mar velo ush ero es . view models . Characters ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ Ċ @ Android EntryPoint Ċ class ĠChar acters Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Characters Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcharacters Adapter : ĠChar acters Adapter ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠChar acters ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Characters Binding . inflate ( layout Inflater ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Navigation () ĊĠĠĠĠĠĠĠ Ġsetup RecyclerView () ĊĊĠĠĠĠĠĠĠ Ġcharacters Adapter . setOn ItemClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChar acters Fragment Directions . action Characters Fragment To Details Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . btn Retry . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Characters () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . search Icon . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChar acters Fragment Directions . action Characters Fragment To Search Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . characters . observe ( view Lifecycle Owner , Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ErrorMessage () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . data ?. let Ġ{ Ġmar vel Response Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( binding . rv Characters . adapter Ġas ĠChar acters Adapter ). differ . submit List ( mar vel Response . data . results . toList ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Pages Ġ= Ġmar vel Response . data . total ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Last Page Ġ= ĠviewModel . characters Page Ġ== Ġtotal Pages . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResource . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide ProgressBar () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . message ?. let Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , Ġ" An Ġerror Ġoccurred : Ġ$ message ", ĠToast . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow ErrorMessage ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġhide ProgressBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . pagination ProgressBar . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow ProgressBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . pagination ProgressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide ErrorMessage () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . text ErrorMessage . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġis Error Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow ErrorMessage ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . text ErrorMessage . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġbinding . text ErrorMessage . text Ġ= Ġmessage ĊĊĠĠĠĠĠĠĠ Ġis Error Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġis Error Ġ= Ġfalse ĊĠĠĠ Ġvar ĠisLoading Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Last Page Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Scrolling Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġ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 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager Ġas ĠGrid LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Visible Item Position Ġ= Ġlayout Manager . findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisible ItemCount Ġ= Ġlayout Manager . child Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal ItemCount Ġ= Ġlayout Manager . item Count ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis No Errors Ġ= Ġ! isError ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Not Loading And Not Last Page Ġ= Ġ! isLoading Ġ&& Ġ! is Last Page ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis At Last Item Ġ= Ġfirst Visible Item Position Ġ+ Ġvisible ItemCount Ġ>= Ġtotal ItemCount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Not At Beginning Ġ= Ġfirst Visible Item Position Ġ>= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Total More Than Visible Ġ= Ġtotal ItemCount Ġ>= Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Pag inate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis No Errors Ġ&& Ġis Not Loading And Not Last Page Ġ&& Ġis At Last Item Ġ&& Ġis Not At Beginning Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Total More Than Visible Ġ&& Ġis Scrolling ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Pag inate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Characters () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scrolling Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ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 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Navigation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav Controller Ġ= Ġfind Nav Controller () ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠApp Bar Configuration ( nav Controller . graph , Ġbinding . drawer Layout ) ĊĊĠĠĠĠĠĠĠ Ġbinding . drawer View . setup With Nav Controller ( nav Controller ) ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . setup With Nav Controller ( nav Controller , Ġconfiguration ) ĊĠĠĠĠĠĠĠ Ġbinding . toolbar . title Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġcharacters Adapter Ġ= ĠChar acters Adapter () ĊĊĠĠĠĠĠĠĠ Ġcharacters Adapter . set Has Stable Ids ( true ) ĊĊĠĠĠĠĠĠĠ Ġbinding . rv Characters . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġcharacters Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠGrid LayoutManager ( activity , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( scroll Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ