/* čĊ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 ĠOle ks and r ĠBe z ush ko čĊ Ġ* čĊ Ġ* Ġ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 Ġcom . ins iders er . android . movies . glide čĊč Ċ import Ġandroid . app . Activity Manager č Ċ import Ġandroid . graphics . drawable . Drawable č Ċ import Ġandroidx . core . content . Context Compat č Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager č Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager č Ċ import Ġandroidx . recyclerview . widget . RecyclerView č Ċ import Ġjava . lang . ref . Weak Reference č Ċ import Ġjava . util . Weak HashMap č Ċ import Ġkotlin . math . max č Ċ import Ġkotlin . math . min čĊč Ċ class ĠG lide Image Pre loader < T Ġ: ĠAny > Ġprivate Ġconstructor ( private Ġval Ġsource : ĠSource < T >, čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġimage Width : ĠInt , Ġprivate Ġval Ġimage Height : ĠInt , čĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactivity Manager : ĠActivity Manager ) Ġ: čĊĠĠĠĠĠĠĠ ĠRecyclerView . On Scroll Listener () Ġ{ čĊĠĠĠĠčĊĠĠĠ Ġprivate Ġvar Ġlast Visible Image Position : ĠInt Ġ= Ġ- Ġ 1 čĊĠĠĠ Ġprivate Ġvar Ġlast Loaded Image Position Full : ĠInt Ġ= Ġ- Ġ 1 čĊĠĠĠĠčĊĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġcheck ( layout Manager Ġis ĠLinearLayoutManager ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Layout Ġmanagers Ġother Ġthan ĠLinearLayoutManager Ġaren 't Ġsupported ; Ġ" Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" your Ġwas Ġ${ layout Manager ?. java Class ?. name }" čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġcurrent Last Visible Item Position Ġ= Ġlayout Manager . find Last Visible Item Position () čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġmax Pre load Ġ= Ġcalculate Max Pre load ( re cyclerView ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġif ( current Last Visible Item Position Ġ> Ġlast Visible Image Position ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Pre load From Ġ= Ġmax ( current Last Visible Item Position Ġ+ Ġ 1 , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Loaded Image Position Full ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Pre load To Ġ= Ġmin ( current Last Visible Item Position Ġ+ Ġmax Pre load , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . image Count Ġ- Ġ 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreload ( full Pre load From , Ġfull Pre load To ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Loaded Image Position Full Ġ= Ġmax ( last Loaded Image Position Full , Ġfull Pre load To ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġlast Visible Image Position Ġ= Ġcurrent Last Visible Item Position čĊĠĠĠ Ġ} čĊĠĠĠĠčĊĠĠĠ Ġprivate Ġfun Ġpreload ( from : ĠInt , Ġto : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġfor ( position Ġin Ġfrom .. to ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreload ( position ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊĠĠĠĠčĊĠĠĠ Ġprivate Ġfun Ġpreload ( position : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġsource . getItem For Position ( position ) Ġ?: Ġreturn čĊĠĠĠĠĠĠĠ Ġval Ġg lide Request Ġ= Ġsource . get G lide Request ( item ) čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġg lide Request . preload ( image Width , Ġimage Height ) čĊĠĠĠ Ġ} čĊĠĠĠĠčĊĠĠĠ Ġprivate Ġfun Ġcalculate Max Pre load ( re cyclerView : ĠRecyclerView ): ĠInt Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġre cyclerView . layout Manager čĊĠĠĠĠĠĠĠ Ġval Ġspan Count Ġ= Ġif ( layout Manager Ġis ĠGrid LayoutManager ) Ġlayout Manager . span Count Ġelse Ġ 1 čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġitems Per Span Ġ= Ġif ( is Device Low On Memory ) ĠITE MS _ PER _ SPAN _ LOW _ MEMORY Ġelse ĠITE MS _ PER _ SPAN čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġreturn Ġspan Count Ġ* Ġitems Per Span čĊĠĠĠ Ġ} čĊĠĠĠĠčĊĠĠĠ Ġprivate Ġval Ġis Device Low On Memory : ĠBoolean čĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠActivity Manager . Memory Info (). also Ġ{ Ġmemory Info Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Manager . get Memory Info ( memory Info ) čĊĠĠĠĠĠĠĠ Ġ}. low Memory čĊĠĠĠĠčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠITE MS _ PER _ SPAN Ġ= Ġ 3 čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠITE MS _ PER _ SPAN _ LOW _ MEMORY Ġ= Ġ 1 čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpreload ers : ĠMutable Map < RecyclerView , ĠWeak Reference < G lide Image Pre loader <* >>> Ġ= ĠWeak HashMap () čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ@ Jvm Static čĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Replace Put With Assignment ") čĊĠĠĠĠĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġattach ( source : ĠSource < T >, Ġre cyclerView : ĠRecyclerView , Ġimage Width : ĠInt , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Height : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Manager Ġ= ĠContext Compat . getSystem Service ( re cyclerView . context , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Manager :: class . java ) Ġ!! čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre loader Ġ= ĠG lide Image Pre loader ( source , Ġimage Width , Ġimage Height , Ġactivity Manager ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( pre loader ) čĊĠĠĠĠĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreload ers . put ( re cyclerView , ĠWeak Reference ( pre loader )) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġ@ Jvm Static čĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Replace Get Or Set ") čĊĠĠĠĠĠĠĠ Ġfun Ġdetach ( re cyclerView : ĠRecyclerView ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreload ers . get ( re cyclerView )?. get ()?. let Ġ{ Ġpre loader Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . remove On Scroll Listener ( pre loader ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreload ers . remove ( re cyclerView ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊĠĠĠĠčĊĠĠĠ Ġinterface ĠSource < T Ġ: ĠAny > Ġ{ čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġval Ġimage Count : ĠInt čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġfun ĠgetItem For Position ( position : ĠInt ): ĠT ? čĊĠĠĠĠĠĠĠĠčĊĠĠĠĠĠĠĠ Ġfun Ġget G lide Request ( item : ĠT ): ĠG lide Request < Drawable > čĊĠĠĠ Ġ} č Ċ }