/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . example . android . content provider paging Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Content Provider Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . loader . app . Loader Manager Ċ import Ġandroidx . loader . content . Cursor Loader Ċ import Ġandroidx . loader . content . Loader Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . example . android . content provider paging . Image Adapter . Image Document Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ /** Ċ Ġ* ĠFragment Ġthat Ġworks Ġas Ġa Ġclient Ġfor Ġaccessing Ġthe ĠDocuments Provider Ċ Ġ* Ġ([ Image Provider ]. Ċ Ġ*/ Ċ class ĠImage Client Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Image Adapter ] Ġ( custom Ġ[ RecyclerView . Adapter ] Ġof Ġ[ ImageView Holder ] Ġobjects ) Ġwhich Ġfeeds ĊĠĠĠĠ Ġ* Ġviews Ġto Ġour Ġ[ RecyclerView ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Adapter : ĠImage Adapter ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Linear LayoutManager ] Ġused Ġby Ġour Ġ[ RecyclerView ] Ġas Ġits Ġ[ RecyclerView . LayoutManager ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm LayoutManager : ĠLinearLayoutManager ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Loader Manager . Loader Callbacks ] Ġcallback Ġinterface Ġwe Ġuse Ġto Ġinteract Ġwith Ġthe Ġmanager . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Loader Callback Ġ= ĠLoader Callback () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġoffset Ġposition Ġfor Ġthe Ġ[ Content Provider ] Ġto Ġuse Ġas Ġthe Ġstarting Ġposition Ġto Ġfetch ĊĠĠĠĠ Ġ* Ġthe Ġimages Ġfrom . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Offset Ġ= ĠAtomicInteger ( 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġto Ġhave Ġthe Ġfragment Ġinstantiate Ġits Ġuser Ġinterface Ġview . ĠThis Ġwill Ġbe Ġcalled Ġbetween ĊĠĠĠĠ Ġ* Ġ[ onCreate ] Ġand Ġ[ on View Created ]. ĠIt Ġis Ġrecommended Ġto Ġonly Ġinf late Ġthe Ġlayout Ġin Ġthis Ġmethod ĊĠĠĠĠ Ġ* Ġand Ġmove Ġlogic Ġthat Ġoper ates Ġon Ġthe Ġreturned Ġ[ View ] Ġto Ġ[ on View Created ]. ĠWe Ġreturn Ġthe Ġ[ View ] ĊĠĠĠĠ Ġ* Ġthat Ġour Ġ[ LayoutInflater ] Ġparameter Ġ[ in flater ] Ġinfl ates Ġfrom Ġthe Ġlayout Ġfile Ġwith Ġresource ĠID ĊĠĠĠĠ Ġ* Ġ[ R . layout . fragment _ image _ client ] Ġusing Ġour Ġ[ ViewGroup ] Ġparameter Ġ[ container ] Ġfor Ġ` LayoutParams ` ĊĠĠĠĠ Ġ* Ġwithout Ġatt aching Ġto Ġit . ĠThis Ġlayout Ġfile Ġconsists Ġof Ġa Ġvertical Ġ` LinearLayout ` Ġholding Ġa ĊĠĠĠĠ Ġ* Ġ[ Button ] Ġwith Ġthe Ġlabel Ġ" Show Ġimages " Ġabove Ġa Ġ[ RecyclerView ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinflater ĠThe Ġ[ LayoutInflater ] Ġobject Ġthat Ġcan Ġbe Ġused Ġto Ġinf late ĊĠĠĠĠ Ġ* Ġany Ġviews Ġin Ġthe Ġfragment , ĊĠĠĠĠ Ġ* Ġ@ param Ġcontainer ĠIf Ġnon - ` null `, Ġthis Ġis Ġthe Ġparent Ġview Ġthat Ġthe Ġfragment 's ĊĠĠĠĠ Ġ* ĠUI Ġwill Ġbe Ġattached Ġto . ĠThe Ġfragment Ġshould Ġnot Ġadd Ġthe Ġview Ġitself , ĊĠĠĠĠ Ġ* Ġbut Ġthis Ġcan Ġbe Ġused Ġto Ġgenerate Ġthe Ġ` LayoutParams ` Ġof Ġthe Ġview . ĊĠĠĠĠ Ġ* Ġ@ param ĠsavedInstanceState ĠIf Ġnon - ` null `, Ġthis Ġfragment Ġis Ġbeing Ġre - construct ed ĊĠĠĠĠ Ġ* Ġfrom Ġa Ġprevious Ġsaved Ġstate Ġas Ġgiven Ġhere . ĊĠĠĠĠ Ġ* Ġ@ return ĠReturn Ġthe ĠView Ġfor Ġthe Ġfragment 's ĠUI , Ġor Ġnull . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ image _ client , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġimmediately Ġafter Ġ[ onCreate View ] Ġhas Ġreturned , Ġbut Ġbefore Ġany Ġsaved Ġstate Ġhas Ġbeen ĊĠĠĠĠ Ġ* Ġrestored Ġin Ġto Ġthe Ġview . ĠFirst Ġwe Ġcall Ġour Ġsuper 's Ġimplementation Ġof Ġ` on View Created `. ĠWe ĊĠĠĠĠ Ġ* Ġinitialize Ġour Ġ[ Activity ] Ġvariable Ġ` val Ġactivity ` Ġto Ġthe Ġ[ Fragment Activity ] Ġthis Ġfragment ĊĠĠĠĠ Ġ* Ġis Ġcurrently Ġassociated Ġwith , Ġand Ġwe Ġinitialize Ġour Ġ[ RecyclerView ] Ġvariable Ġ` val Ġre cyclerView ` ĊĠĠĠĠ Ġ* Ġto Ġthe Ġ[ View ] Ġwith ĠID Ġ[ R . id . recyclerview ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġour Ġ[ Linear LayoutManager ] Ġfield Ġ[ m LayoutManager ] Ġis Ġ` null ` Ġwe Ġfirst Ġinitialize Ġit Ġto Ġa ĊĠĠĠĠ Ġ* Ġnew Ġinstance Ġof Ġ[ Linear LayoutManager ] Ġbefore Ġsetting Ġthe Ġ[ RecyclerView . LayoutManager ] Ġthat ĊĠĠĠĠ Ġ* Ġ` re cyclerView ` Ġwill Ġuse Ġto Ġ[ m LayoutManager ]. ĠIf Ġour Ġ[ Image Adapter ] Ġfield Ġ[ m Adapter ] Ġis Ġ` null ` ĊĠĠĠĠ Ġ* Ġwe Ġfirst Ġinitialize Ġit Ġto Ġa Ġnew Ġinstance Ġof Ġ[ Image Adapter ] Ġbefore Ġsetting Ġthe ĊĠĠĠĠ Ġ* Ġ[ RecyclerView . Adapter ] Ġof Ġ` re cyclerView ` Ġthat Ġwill Ġprovide Ġchild Ġviews Ġon Ġdemand Ġto ĊĠĠĠĠ Ġ* Ġ[ m Adapter ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNext Ġwe Ġadd Ġan Ġanonymous Ġ[ RecyclerView . On Scroll Listener ] Ġto Ġ` re cyclerView ` Ġwhose Ġ` on Sc rolled ` ĊĠĠĠĠ Ġ* Ġoverride Ġwill : ĊĠĠĠĠ Ġ* Ġ Ġ- ĠInitialize Ġits Ġ[ Int ] Ġvariable Ġ` val Ġlast Visible Position ` Ġto Ġthe Ġadapter Ġposition Ġof Ġthe ĊĠĠĠĠ Ġ* Ġ Ġlast Ġvisible Ġview Ġthat Ġthe Ġ[ Linear LayoutManager . find Last Visible Item Position ] Ġmethod Ġof ĊĠĠĠĠ Ġ* Ġ Ġ[ m LayoutManager ] Ġreturns . ĊĠĠĠĠ Ġ* Ġ Ġ- ĠIf Ġ` last Visible Position ` Ġis Ġgreater Ġthan Ġor Ġequal Ġto Ġthe Ġnumber Ġof Ġimages Ġalready Ġfetched ĊĠĠĠĠ Ġ* Ġ Ġand Ġadded Ġto Ġthe Ġadapter Ġ[ m Adapter ] Ġthat Ġits Ġ` Image Adapter . f etched ItemCount ` Ġreturns Ġwe : ĊĠĠĠĠ Ġ* ĠĠĠ Ġ- ĠInitialize Ġour Ġ[ Int ] Ġvariable Ġ` val Ġpage Id ` Ġto Ġ` last Visible Position ` Ġdivided Ġby Ġ[ LIMIT ] Ġ( 1 0 ) ĊĠĠĠĠ Ġ* ĠĠĠ Ġ- ĠUse Ġan Ġinstance Ġof Ġ[ Loader Manager ] Ġto Ġstart Ġor Ġrestart Ġa Ġnew Ġ[ Loader ] Ġwhose ĠID Ġis Ġ` page Id ` ĊĠĠĠĠ Ġ* ĠĠĠ Ġwith Ġ` null ` Ġfor Ġits Ġargs , Ġand Ġ[ m Loader Callback ] Ġfor Ġits Ġ[ Loader Manager . Loader Callbacks ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNext Ġwe Ġinitialize Ġour Ġ[ Button ] Ġvariable Ġ` val Ġshow Button ` Ġto Ġthe Ġview Ġin Ġour Ġ[ View ] Ġparameter ĊĠĠĠĠ Ġ* Ġ[ root View ] Ġwith Ġresource ĠID Ġ[ R . id . button _ show ] Ġ( labeled Ġ" Show Ġimages ") Ġand Ġthen Ġset Ġits ĊĠĠĠĠ Ġ* Ġ[ View . OnClickListener ] Ġto Ġa Ġlambda Ġwhich Ġuses Ġan Ġinstance Ġof Ġ[ Loader Manager ] Ġto Ġstart Ġor ĊĠĠĠĠ Ġ* Ġrestart Ġa Ġnew Ġ[ Loader ] Ġwhose ĠID Ġis Ġ 0 , Ġwith Ġ` null ` Ġfor Ġits Ġargs , Ġand Ġ[ m Loader Callback ] Ġfor Ġits ĊĠĠĠĠ Ġ* Ġ[ Loader Manager . Loader Callbacks ], Ġand Ġthen Ġsets Ġthe Ġvisibility Ġof Ġ` show Button ` Ġto ĠG ONE . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġroot View ĠThe Ġ[ View ] Ġreturned Ġby Ġ[ onCreate View ]. ĊĠĠĠĠ Ġ* Ġ@ param ĠsavedInstanceState ĠIf Ġnon - ` null `, Ġthis Ġfragment Ġis Ġbeing Ġre - construct ed ĊĠĠĠĠ Ġ* Ġfrom Ġa Ġprevious Ġsaved Ġstate Ġas Ġgiven Ġhere . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon View Created ( root View : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( root View , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval Ġactivity : ĠActivity ? Ġ= Ġactivity ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= Ġactivity !!. findViewById < View >( R . id . recyclerview ) Ġas ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġif Ġ( m LayoutManager Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm LayoutManager Ġ= ĠLinearLayoutManager ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= Ġm LayoutManager ĊĠĠĠĠĠĠĠ Ġif Ġ( m Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter Ġ= ĠImage Adapter ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġm Adapter ĊĠĠĠĠĠĠĠ Ġre cyclerView . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Visible Position Ġ= Ġm LayoutManager !!. find Last Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Visible Position Ġ>= Ġm Adapter !!. f etched ItemCount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Fetch Ġnew Ġimages . ĠLast Visible Position : Ġ" Ġ+ Ġlast Visible Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ", ĠNon Empty ItemCount : Ġ" Ġ+ Ġm Adapter !!. f etched ItemCount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Id Ġ= Ġlast Visible Position Ġ/ ĠLIMIT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFetch Ġnew Ġimages Ġonce Ġthe Ġlast Ġfetched Ġitem Ġbecomes Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoader Manager . getInstance ( this @ Image Client Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. restart Loader ( page Id , Ġnull , Ġm Loader Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġshow Button Ġ= Ġroot View . findViewById < Button >( R . id . button _ show ) ĊĠĠĠĠĠĠĠ Ġshow Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoader Manager . getInstance ( this ). restart Loader ( 0 , Ġnull , Ġm Loader Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Button . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcustom Ġ[ Loader Manager . Loader Callbacks ] Ġclass Ġwe Ġuse Ġfor Ġour Ġfield Ġ[ m Loader Callback ]. ĠIt ĊĠĠĠĠ Ġ* Ġis Ġused Ġas Ġthe Ġcallback Ġof Ġthe Ġ[ Loader ] Ġused Ġto Ġread Ġimages Ġfrom Ġour Ġ[ Image Provider ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠLoader Callback Ġ: ĠLoader Manager . Loader Callbacks < Cursor > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠInstantiate Ġand Ġreturn Ġa Ġnew Ġ[ Loader ] Ġfor Ġthe Ġgiven ĠID . ĠThis Ġwill Ġalways Ġbe Ġcalled Ġfrom ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġprocess 's Ġmain Ġthread . ĠWe Ġinitialize Ġour Ġ[ Activity ] Ġvariable Ġ` val Ġactivity ` Ġto Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Fragment Activity ] Ġthis Ġ[ Image Client Fragment ] Ġfragment Ġis Ġcurrently Ġassociated Ġwith . ĠThen ĊĠĠĠĠĠĠĠĠ Ġ* Ġwe Ġreturn Ġan Ġanonymous Ġ[ Cursor Loader ] Ġwhose Ġ[ Cursor Loader . load In Background ] Ġoverride : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠInitializes Ġits Ġ[ Bundle ] Ġvariable Ġ` val Ġbundle ` Ġto Ġa Ġnew Ġinstance . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠStores Ġour Ġ[ m Offset ] Ġfield Ġunder Ġthe Ġkey Ġ[ Content Resolver . QUERY _ ARG _ OFFSET ] Ġin Ġ` bundle ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠStores Ġour Ġ[ LIMIT ] Ġconstant Ġ( 1 0 ) Ġunder Ġthe Ġkey Ġ[ Content Resolver . QUERY _ ARG _ LIMIT ] Ġin Ġ` bundle ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠRetrieves Ġa Ġ[ Content Resolver ] Ġinstance Ġfor Ġour Ġapplication 's Ġpackage Ġand Ġcalls Ġits ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ[ Content Resolver . query ] Ġmethod Ġwith Ġ[ Image Contract . CONTENT _ URI ] Ġas Ġthe Ġ[ Uri ] Ġto Ġretrieve ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ(" content :// com . example . android . content provider paging . documents / images " Ġwhich Ġour Ġprovider ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ[ Image Provider ] Ġis Ġconfigured Ġto Ġhandle Ġin Ġour ĠAndroid Manifest . xml ), Ġwith Ġ` null ` Ġas Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġprojection Ġ( will Ġreturn Ġall Ġcolumns ), Ġ` bundle ` Ġas Ġthe Ġquery Ġarguments , Ġand Ġ` null ` Ġas Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġsignal Ġto Ġcancel Ġthe Ġoperation Ġin Ġprogress . ĠFinally Ġwe Ġreturn Ġthe Ġ[ Cursor ] Ġreturned Ġby ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġthe Ġ[ Content Resolver . query ] Ġmethod Ġto Ġthe Ġcaller . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġid ĠThe ĠID Ġwhose Ġloader Ġis Ġto Ġbe Ġcreated . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġargs ĠAny Ġarguments Ġsupplied Ġby Ġthe Ġcaller . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠReturn Ġa Ġnew Ġ[ Loader ] Ġinstance Ġthat Ġis Ġready Ġto Ġstart Ġloading . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Loader ( id : ĠInt , Ġargs : ĠBundle ?): ĠLoader < Cursor > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity : ĠActivity ? Ġ= Ġthis @ Image Client Fragment . activity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠCursor Loader ( activity Ġas ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġon Ġa Ġworker Ġthread Ġto Ġperform Ġthe Ġactual Ġload Ġand Ġto Ġreturn Ġthe Ġresult Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġload Ġoperation . ĠImplement ations Ġshould Ġnot Ġdeliver Ġthe Ġresult Ġdirectly , Ġbut ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġshould Ġreturn Ġthem Ġfrom Ġthis Ġmethod , Ġwhich Ġwill Ġeventually Ġend Ġup Ġcalling ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ Loader . deliver Result ] Ġon Ġthe ĠUI Ġthread . ĠIf Ġimplementations Ġneed Ġto Ġprocess Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġresults Ġon Ġthe ĠUI Ġthread Ġthey Ġmay Ġoverride Ġ[ Loader . deliver Result ] Ġand Ġdo Ġso ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthere . ĠTo Ġsupport Ġcancellation , Ġthis Ġmethod Ġshould Ġperiodically Ġcheck Ġthe Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġof Ġ` is Load In Background Canceled ` Ġand Ġterminate Ġwhen Ġit Ġreturns Ġtrue . ĠSub classes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġmay Ġalso Ġoverride Ġ[ Cursor Loader . cancel Load In Background ] Ġto Ġinterrupt Ġthe Ġload ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġdirectly Ġinstead Ġof Ġpolling Ġ` is Load In Background Canceled `. ĠWhen Ġthe Ġload Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġcanceled , Ġthis Ġmethod Ġmay Ġeither Ġreturn Ġnormally Ġor Ġthrow Ġ` Operation Canceled Exception `. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġeither Ġcase , Ġthe ĠLoader Ġwill Ġcall Ġ` on Canceled ` Ġto Ġperform Ġpost - c ancellation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġcleanup Ġand Ġto Ġdispose Ġof Ġthe Ġresult Ġobject , Ġif Ġany . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġinitialize Ġour Ġ[ Bundle ] Ġvariable Ġ` val Ġbundle ` Ġto Ġa Ġnew Ġinstance , Ġstore Ġour ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ[ m Offset ] Ġfield Ġunder Ġthe Ġkey Ġ[ Content Resolver . QUERY _ ARG _ OFFSET ] Ġin Ġ` bundle `, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġand Ġour Ġ[ LIMIT ] Ġconstant Ġ( 1 0 ) Ġunder Ġthe Ġkey Ġ[ Content Resolver . QUERY _ ARG _ LIMIT ] Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ` bundle `. ĠFinally Ġwe Ġretrieve Ġa Ġ[ Content Resolver ] Ġinstance Ġfor Ġour Ġapplication 's ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġpackage Ġand Ġcalls Ġits Ġ[ Content Resolver . query ] Ġmethod Ġwith Ġ[ Image Contract . CONTENT _ URI ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġas Ġthe Ġ[ Uri ] Ġto Ġretrieve Ġ(" content :// com . example . android . content provider paging . documents / images " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhich Ġour Ġprovider Ġ[ Image Provider ] Ġis Ġconfigured Ġto Ġhandle Ġin Ġour ĠAndroid Manifest . xml ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwith Ġ` null ` Ġas Ġthe Ġprojection Ġ( will Ġreturn Ġall Ġcolumns ), Ġ` bundle ` Ġas Ġthe Ġquery ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġarguments , Ġand Ġ` null ` Ġas Ġthe Ġsignal Ġto Ġcancel Ġthe Ġoperation Ġin Ġprogress , Ġand Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġreturn Ġthe Ġ[ Cursor ] Ġreturned Ġby Ġthe Ġ[ Content Resolver . query ] Ġmethod Ġto Ġthe Ġcaller . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠThe Ġresult Ġof Ġthe Ġload Ġoperation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload In Background (): ĠCursor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . put Int ( Content Resolver . QUERY _ ARG _ OFFSET , Ġm Offset . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . put Int ( Content Resolver . QUERY _ ARG _ LIMIT , ĠLIMIT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġactivity !!. content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. query ( Image Contract . CONTENT _ URI , Ġnull , Ġbundle , Ġnull ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġpreviously Ġcreated Ġloader Ġhas Ġfinished Ġits Ġload . ĠNote Ġthat Ġnormally Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġapplication Ġis Ġnot Ġallowed Ġto Ġcommit Ġfragment Ġtransactions Ġwhile Ġin Ġthis Ġcall , Ġsince Ġit ĊĠĠĠĠĠĠĠĠ Ġ* Ġcan Ġhappen Ġafter Ġan Ġactivity 's Ġstate Ġis Ġsaved . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġguaranteed Ġto Ġbe Ġcalled Ġprior Ġto Ġthe Ġrelease Ġof Ġthe Ġlast Ġdata Ġthat Ġwas ĊĠĠĠĠĠĠĠĠ Ġ* Ġsupplied Ġfor Ġthis ĠLoader . ĠAt Ġthis Ġpoint Ġyou Ġshould Ġremove Ġall Ġuse Ġof Ġthe Ġold Ġdata Ġ( since ĊĠĠĠĠĠĠĠĠ Ġ* Ġit Ġwill Ġbe Ġreleased Ġsoon ), Ġbut Ġshould Ġnot Ġdo Ġyour Ġown Ġrelease Ġof Ġthe Ġdata Ġsince Ġits ĠLoader ĊĠĠĠĠĠĠĠĠ Ġ* Ġowns Ġit Ġand Ġwill Ġtake Ġcare Ġof Ġthat . ĠThe Ġ[ Loader ] Ġwill Ġtake Ġcare Ġof Ġmanagement Ġof Ġits Ġdata ĊĠĠĠĠĠĠĠĠ Ġ* Ġso Ġyou Ġdon 't Ġhave Ġto . ĠIn Ġparticular : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠThe ĠLoader Ġwill Ġmonitor Ġfor Ġchanges Ġto Ġthe Ġdata , Ġand Ġreport Ġthem Ġto Ġyou Ġthrough Ġnew ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġcalls Ġhere . ĠYou Ġshould Ġnot Ġmonitor Ġthe Ġdata Ġyourself . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠThe ĠLoader Ġwill Ġrelease Ġthe Ġdata Ġonce Ġit Ġknows Ġthe Ġapplication Ġis Ġno Ġlonger Ġusing Ġit . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ ĠFor Ġexample , Ġif Ġthe Ġdata Ġis Ġ[ Cursor ] Ġfrom Ġa Ġ[ Cursor Loader ], Ġyou Ġshould Ġnot Ġcall ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ[ Cursor . close ] Ġon Ġit Ġyourself . ĠIf Ġthe Ġ[ Cursor ] Ġis Ġbeing Ġplaced Ġin Ġa Ġ` Cursor Adapter `, ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġyou Ġshould Ġuse Ġthe Ġ` Cursor Adapter . swap Cursor ` Ġmethod Ġso Ġthat Ġthe Ġold Ġ[ Cursor ] Ġis Ġnot ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġclosed . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġwill Ġalways Ġbe Ġcalled Ġfrom Ġthe Ġprocess 's Ġmain Ġthread . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFirst Ġwe Ġinitialize Ġour Ġ[ Bundle ] Ġvariable Ġ` val Ġextras ` Ġto Ġthe Ġcontents Ġof Ġthe Ġ` extras ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġproperty Ġof Ġour Ġ[ Cursor ] Ġparameter Ġ[ cursor ] Ġ( extra Ġvalues Ġare Ġan Ġoptional Ġway Ġfor Ġcurs ors ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġprovide Ġout - of - band Ġmetadata Ġto Ġtheir Ġusers ). ĠNext Ġwe Ġinitialize Ġour Ġ[ Int ] Ġvariable ĊĠĠĠĠĠĠĠĠ Ġ* Ġ` val Ġtotal Size ` Ġto Ġthe Ġvalue Ġstored Ġunder Ġthe Ġkey Ġ[ Content Resolver . EXTRA _ SIZE ] Ġin Ġ` extras `. ĊĠĠĠĠĠĠĠĠ Ġ* ĠOur Ġ[ Image Provider ] Ġuses Ġthis Ġextra Ġto Ġstore Ġthe Ġtotal Ġnumber Ġof Ġdummy Ġfiles Ġthat Ġit Ġhas ĊĠĠĠĠĠĠĠĠ Ġ* Ġcreated Ġfrom Ġthe Ġ 1 3 Ġj pe gs Ġin Ġour Ġraw Ġresources Ġand Ġwritten Ġto Ġthe Ġinternal Ġstorage Ġ( in Ġour ĊĠĠĠĠĠĠĠĠ Ġ* Ġcase Ġ 1 3 0 ). ĠNote : ĠThere Ġare Ġa Ġmaximum Ġof Ġ[ LIMIT ] Ġ( 1 0 ) Ġrows Ġin Ġthe Ġ[ Cursor ] Ġparameter Ġ[ cursor ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġas Ġwe Ġspecified Ġin Ġthe Ġvalue Ġstored Ġunder Ġthe Ġkey Ġ[ Content Resolver . QUERY _ ARG _ LIMIT ] Ġin Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġargs Ġ[ Bundle ] Ġpassed Ġto Ġ[ Content Resolver . query ] Ġfrom Ġwhich Ġwe Ġcan Ġconstruct Ġ[ Image Document ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġobjects . ĠWe Ġthen Ġcall Ġthe Ġ[ Image Adapter . set Total Size ] Ġmethod Ġof Ġour Ġ[ m Adapter ] Ġfield Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġhave Ġit Ġset Ġthe Ġtotal Ġnumber Ġof Ġimages Ġthat Ġcan Ġbe Ġdisplayed Ġ( the Ġvalue Ġreturned Ġby Ġits ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Image Adapter . getItem Count ] Ġoverride ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠNext Ġwe Ġinitialize Ġour Ġ[ Int ] Ġvariable Ġ` val Ġbefore Count ` Ġto Ġthe Ġnumber Ġof Ġimages Ġalready ĊĠĠĠĠĠĠĠĠ Ġ* Ġfetched Ġand Ġadded Ġto Ġ[ m Adapter ] Ġthat Ġits Ġ` Image Adapter . f etched ItemCount ` Ġmethod Ġreturns ĊĠĠĠĠĠĠĠĠ Ġ* Ġ( aka Ġkotlin Ġ` f etched ItemCount ` Ġproperty ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġnow Ġloop Ġwhile Ġthe Ġ[ Cursor . moveTo Next ] Ġmethod Ġof Ġ[ cursor ] Ġreturns Ġ` true ` Ġ( it Ġwill ĊĠĠĠĠĠĠĠĠ Ġ* Ġreturn Ġfalse Ġif Ġthe Ġcursor Ġis Ġalready Ġpast Ġthe Ġlast Ġentry Ġin Ġthe Ġresult Ġset ) Ġmoving Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġcursor Ġto Ġthe Ġnext Ġrow : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠWe Ġinitialize Ġour Ġ[ String ] Ġvariable Ġ` val ĠdisplayName ` Ġto Ġthe Ġcontents Ġof Ġthe Ġcolumn ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ[ Image Contract . Columns . DISPLAY _ NAME ] Ġ(" display _ name ") Ġof Ġ[ cursor ] Ġ( the Ġname Ġof Ġthe Ġfile ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠWe Ġinitialize Ġour Ġ[ String ] Ġvariable Ġ` val Ġabsolute Path ` Ġto Ġthe Ġcontents Ġof Ġthe Ġcolumn ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ[ Image Contract . Columns . AB SOL UTE _ PATH ] Ġ(" absolute _ path ") Ġof Ġ[ cursor ] Ġ( the Ġabsolute Ġpath ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġof Ġthe Ġfile ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠWe Ġinitialize Ġour Ġ[ Image Document ] Ġvariable Ġ` val Ġimage Document ` Ġto Ġa Ġnew Ġinstance . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠWe Ġset Ġthe Ġ[ Image Document . m AbsolutePath ] Ġfield Ġof Ġ` image Document ` Ġto Ġ` absolute Path ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġand Ġthe Ġ[ Image Document . m DisplayName ] Ġfield Ġof Ġ` image Document ` Ġto Ġ` displayName ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠWe Ġcall Ġthe Ġ[ Image Adapter . add ] Ġmethod Ġof Ġ[ m Adapter ] Ġto Ġadd Ġ` image Document ` Ġto Ġthe Ġend ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġof Ġits Ġdataset . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠOnce Ġdone Ġlooping Ġthrough Ġthe Ġcontents Ġof Ġ[ cursor ] Ġwe Ġinitialize Ġour Ġ[ Int ] Ġvariable ĊĠĠĠĠĠĠĠĠ Ġ* Ġ` val Ġcursor Count ` Ġto Ġthe Ġnumbers Ġof Ġrows Ġin Ġ[ cursor ], Ġand Ġif Ġthis Ġis Ġ 0 Ġwe Ġreturn . ĊĠĠĠĠĠĠĠĠ Ġ* ĠOtherwise Ġwe Ġinitialize Ġour Ġ[ Activity ] Ġvariable Ġ` val Ġactivity ` Ġto Ġthe ĠFragment Activity ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġ[ Image Client Fragment ] Ġfragment Ġis Ġcurrently Ġassociated Ġwith . ĠThen Ġwe Ġcall Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Image Adapter . notify Item Range Changed ] Ġmethod Ġof Ġ[ m Adapter ] Ġto Ġnotify Ġany Ġregistered ĊĠĠĠĠĠĠĠĠ Ġ* Ġob servers Ġthat Ġthe Ġ` cursor Count ` Ġitems Ġstarting Ġat Ġposition Ġ` before Count ` Ġhave Ġchanged . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠLast ly Ġwe Ġwant Ġto Ġtoast Ġto Ġthe Ġuser Ġthe Ġrange Ġof Ġdata Ġobjects Ġwe Ġjust Ġfetched Ġso Ġwe : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠInitialize Ġour Ġ[ Int ] Ġvariable Ġ` val Ġoffset Snap Shot ` Ġwith Ġthe Ġcurrent Ġvalue Ġof Ġour ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ[ Atomic Integer ] Ġfield Ġ[ m Offset ] Ġ( the Ġoffset Ġposition Ġthe Ġ[ Content Provider ] Ġused Ġas Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġstarting Ġposition Ġto Ġfetch Ġthe Ġimages Ġfrom ). ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠInitialize Ġour Ġ[ String ] Ġvariable Ġ` val Ġmessage ` Ġto Ġa Ġformatted Ġstring Ġwhich Ġcontains ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġthe Ġstring Ġ" F etched Ġfrom " Ġconcaten ated Ġto Ġthe Ġstring Ġvalue Ġof Ġ` offset Snap Shot ` Ġplus Ġ 1 , ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġconcaten ated Ġto Ġthe Ġstring Ġ" Ġto Ġ", Ġconcaten ated Ġto Ġthe Ġstring Ġvalue Ġof Ġ` offset Snap Shot ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġplus Ġ` cursor Count `, Ġconcaten ated Ġto Ġthe Ġstring Ġ" images Ġout Ġof ", Ġconcaten ated Ġto Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġstring Ġvalue Ġof Ġ` total Size `. Ġconcaten ated Ġto Ġthe Ġstring Ġ" in Ġtotal ." ĠPro ducing Ġa Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġlike : Ġ" F etched Ġfrom Ġ 1 Ġto Ġ 1 0 Ġimages Ġout Ġof Ġ 1 3 0 Ġin Ġtotal ." ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠWe Ġcall Ġthe Ġ[ Atomic Integer . add AndGet ] Ġmethod Ġof Ġ[ m Offset ] Ġto ĠAtom ically Ġadd Ġ` cursor Count ` ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġto Ġthe Ġcurrent Ġvalue Ġof Ġ[ m Offset ] Ġto Ġupdate Ġthe Ġstarting Ġposition Ġto Ġfetch Ġimages Ġfrom ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġfor Ġthe Ġnext Ġquery . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ- ĠFinally Ġwe Ġtoast Ġ` message ` Ġto Ġthe Ġuser . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġloader ĠThe ĠLoader Ġthat Ġhas Ġfinished . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcursor ĠThe Ġdata Ġgenerated Ġby Ġthe ĠLoader . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad Finished ( loader : ĠLoader < Cursor >, Ġcursor : ĠCursor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġcursor . extras ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Size : ĠInt Ġ= Ġextras . getInt ( Content Resolver . EXTRA _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter !!. set Total Size ( total Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Count : ĠInt Ġ= Ġm Adapter !!. f etched ItemCount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName : ĠString Ġ= Ġcursor . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex OrThrow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Contract . Columns . DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabsolute Path : ĠString Ġ= Ġcursor . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex OrThrow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImage Contract . Columns . AB SOL UTE _ PATH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Document Ġ= ĠImage Document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Document . m AbsolutePath Ġ= Ġabsolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Document . m DisplayName Ġ= ĠdisplayName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter !!. add ( image Document ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Count : ĠInt Ġ= Ġcursor . count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity : ĠActivity ? Ġ= Ġthis @ Image Client Fragment . activity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter !!. notify Item Range Changed ( before Count , Ġcursor Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Snap Shot : ĠInt Ġ= Ġm Offset . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġactivity !!. resources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . f etched _ images _ out _ of , Ġoffset Snap Shot Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Snap Shot Ġ+ Ġcursor Count , Ġtotal Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Offset . add AndGet ( cursor Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , Ġmessage , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġpreviously Ġcreated Ġ[ Loader ] Ġparameter Ġ[ loader ] Ġis Ġbeing Ġreset , Ġand Ġthus ĊĠĠĠĠĠĠĠĠ Ġ* Ġmaking Ġits Ġdata Ġunavailable . ĠThe Ġapplication Ġshould Ġat Ġthis Ġpoint Ġremove Ġany Ġreferences ĊĠĠĠĠĠĠĠĠ Ġ* Ġit Ġhas Ġto Ġthe Ġ[ Loader ]' s Ġdata . ĠThis Ġwill Ġalways Ġbe Ġcalled Ġfrom Ġthe Ġprocess 's Ġmain Ġthread . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠWe Ġignore . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġloader ĠThe ĠLoader Ġthat Ġis Ġbeing Ġreset . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Loader Reset ( loader : ĠLoader < Cursor >) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠTAG Ġused Ġfor Ġlogging . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Image Client Fragment " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġfetched Ġimages Ġin Ġa Ġsingle Ġquery Ġto Ġthe Ġ` Documents Provider `. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLIMIT Ġ= Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFactory Ġmethod Ġto Ġconstruct Ġa Ġnew Ġinstance Ġof Ġ[ Image Client Fragment ]. ĠWe Ġinitialize Ġour ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Bundle ] Ġvariable Ġ` val Ġargs ` Ġto Ġa Ġnew Ġinstance Ġand Ġour Ġ[ Image Client Fragment ] Ġvariable ĊĠĠĠĠĠĠĠĠ Ġ* Ġ` val Ġfragment ` Ġto Ġa Ġnew Ġinstance , Ġset Ġthe Ġconstruction Ġarguments Ġfor Ġ` fragment ` Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġ` args `, Ġand Ġreturn Ġ` fragment ` Ġto Ġthe Ġcaller . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġinstance Ġof Ġ[ Image Client Fragment ] Ġwith Ġan Ġempty Ġarguments Ġ[ Bundle ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠImage Client Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠImage Client Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . arguments Ġ= Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragment ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }