/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 ĠAlex ey ĠS ht ank o Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġme . s ht ank o . collection Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġme . s ht ank o . collection . di . Collection Component Ċ import Ġme . s ht ank o . common . extensions . observe Ċ import Ġme . s ht ank o . common . extensions . viewModel Ċ import Ġme . s ht ank o . common . ui . Base Fragment Ċ import Ġme . s ht ank o . core . Logger Ċ import Ġme . s ht ank o . core . app Component Ċ import Ġme . s ht ank o . model . Hit Item Ċ import Ġjavax . inject . Inject Ċ Ċ fun ĠCollection Fragment . provide Injection () Ġ{ ĊĠĠĠ ĠCollection Component . Initializer . init ( app Component ) ĊĠĠĠĠĠĠĠ Ġ. inject ( this ) Ċ } Ċ Ċ class ĠCollection Fragment Ġ: ĠBase Fragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠCollection Fragment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġlogger : ĠLogger ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠViewModel Provider . Factory ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcollection ViewModel : ĠCollection ViewModel ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcollection Adapter : ĠCollection Adapter ĊĊĠĠĠ Ġprivate Ġvar Ġcategories : ĠRecyclerView ? Ġ= Ġnull ĊĊĊĠĠĠ Ġprivate Ġvar Ġloading Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġpage Number Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġlast Visible Item Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtotal ItemCount Ġ= Ġ 0 ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġprovide Injection () ĊĠĠĠĠĠĠĠ Ġcollection ViewModel Ġ= ĠviewModel ( viewModel Factory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( data , Ġ:: handle Run ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( items , Ġ:: handle Items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserve ( isLoading , Ġ:: handle Loading ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Loading ( isLoading : ĠBoolean ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠisLoading ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . loading Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Items ( items : ĠList < Hit Item > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . d (" items : Ġ", Ġitems ?. size , Ġitems ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġitems ?. map ( Hit Item :: large Image URL ) ĊĠĠĠĠĠĠĠ Ġlist ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollection Adapter . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// collection Adapter . categories Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Run ( command : ĠCollection ViewModel . Command ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcommand ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . d (" command : Ġ", Ġcommand , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLayoutInflater . from ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . fragment _ collection , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġcollection Adapter Ġ= ĠCollection Adapter ( activity ) ĊĠĠĠĠĠĠĠ Ġcollection ViewModel . getItems () ĊĊĠĠĠĠĠĠĠ Ġcategories Ġ= Ġactivity ?. findViewById < RecyclerView >( R . id . collection ) ĊĠĠĠĠĠĠĠ Ġcategories ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout Manager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// it . set Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . adapter Ġ= Ġcollection Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsubscribe To Load More () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe To Load More () Ġ{ ĊĠĠĠĠĠĠĠ Ġcategories ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . 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 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġit . layout Manager Ġas ĠLinearLayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal ItemCount Ġ= Ġlayout Manager . item Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Visible Item Ġ= Ġlayout Manager . find Last Visible Item Position () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . d (" add On Scroll Listener : Ġ", Ġloading , Ġpage Number , Ġtotal ItemCount , Ġlast Visible Item ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! loading Ġ&& Ġtotal ItemCount Ġ<= Ġ( last Visible Item Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Number ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollection ViewModel . onNext Page ( pageNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġcollection ViewModel . on Destroy () ĊĠĠĠ Ġ} Ċ }