package Ġcom . private gallery . ak sc orp . private gallery android . Adapters Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context Wrapper Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . recyclerview . widget . Grid LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . private gallery . ak sc orp . private gallery android . Ess entials . Image Ċ import Ġcom . private gallery . ak sc orp . private gallery android . R Ċ import Ġcom . private gallery . ak sc orp . private gallery android . SPAN _ PRE VIEW _ RV _ COUNT Ċ import Ġcom . private gallery . ak sc orp . private gallery android . Utilities . Utilities Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . new Fixed ThreadPool Context Ċ Ċ var Ġholder Width Ġ= Ġ 1 0 0 Ċ Ċ abstract Ġclass ĠFast Gallery Scroll Adapter < T Ġ: ĠRecyclerView . ViewHolder ? >( open Ġval Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠ Ġopen Ġval Ġimages : ĠList < Image >) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . Adapter < T >() Ġ{ ĊĠĠĠ Ġval ĠPRE LOAD _ I MAGES _ COUNT Ġ= Ġ 2 5 ĊĊĠĠĠ Ġopen Ġvar Ġlast End Visible Position Ġ= Ġ 0 ĊĠĠĠ Ġopen Ġvar Ġlast Start Visible Position Ġ= Ġ 0 ĊĊĠĠĠ Ġopen Ġvar Ġis Image Est ablish Enable Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To RecyclerView ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To RecyclerView ( re cyclerView ) ĊĊĠĠĠĠĠĠĠ ĠUtilities . notify When Measured ( re cyclerView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder Width Ġ= Ġre cyclerView . meas ured Width Ġ/ ĠSP AN _ PRE VIEW _ RV _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġre cyclerView . item Animator Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġlayout Manager Ġ= Ġ( re cyclerView . layout Manager Ġas ĠGrid LayoutManager ) ĊĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( re cyclerView : ĠRecyclerView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Scroll StateChanged ( re cyclerView , ĠnewState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( newState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ IDLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( images . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Image Est ablish Enable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Visible Position Ġ= Ġlayout Manager . findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Visible Position Ġ= Ġlayout Manager . find Last Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġstart Visible Position .. end Visible Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġimages [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Name Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" image _" Ġ+ Ġimage . album Id . toString () Ġ+ Ġ"_" Ġ+ Ġimage . id . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Image Into ImageView ( image , Ġimage Name , Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Ġ= Ġlayout Manager . find View By Position ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( img Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg . findViewById < ImageView >( R . id . preview _ iv )?. setImage Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre views [ image Name ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ DR AG GING Ġ-> Ġis Image Est ablish Enable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView . SCROLL _ STATE _ SET TL ING Ġ-> Ġis Image Est ablish Enable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmax Thread Count Ġ= ĠRuntime . get Runtime (). available Processors () ĊĊĠĠĠ Ġval ĠBackground Ġ= Ġnew Fixed ThreadPool Context ( 4 , Ġ" bg ") ĊĊĠĠĠ Ġprotected Ġfun Ġload Image Into ImageView ( image : ĠImage , Ġimage Name : ĠString , Ġaction : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( pre views [ image Name ] Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Background ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbm Options Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbm Options . in Sample Size Ġ= ĠUtilities (). calculate In Sample Size ( image . width !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . height !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder Width ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap Factory . decode File ( getImage Path ( image )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre views . put ( image Name , Ġbitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun ĠgetImage Path ( image : ĠImage ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Wrapper ( context ). files Dir . path Ġ+ Ġ"/ Cover s /${ image . id }.${ image . extension }" Ċ Ċ }