/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġ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 Ġandroidx . paging Ċ Ċ import Ġandroidx . annotation . Restrict To Ċ import Ġcom . google . common . util . concurrent . List enable Future Ċ Ċ /** Ċ Ġ* ĠIncrement al Ġdata Ġloader Ġfor Ġpaging Ġkey ed Ġcontent , Ġwhere Ġloaded Ġcontent Ġuses Ġpreviously Ġloaded Ċ Ġ* Ġitems Ġas Ġinput Ġto Ġfuture Ġloads . Ċ Ġ* Ċ Ġ* ĠImplement Ġa ĠDataSource Ġusing ĠList enable Item Key ed DataSource Ġif Ġyou Ġneed Ġto Ġuse Ġdata Ġfrom Ġitem Ċ Ġ* Ġ` N Ġ- Ġ 1 ` Ġto Ġload Ġitem Ġ` N `. ĠThis Ġis Ġcommon , Ġfor Ġexample , Ġin Ġuniquely Ġsorted Ġdatabase Ċ Ġ* Ġqueries Ġwhere Ġattributes Ġof Ġthe Ġitem Ġsuch Ġjust Ġbefore Ġthe Ġnext Ġquery Ġdefine Ġhow Ġto Ġexecute Ġit . Ċ Ġ* Ċ Ġ* Ġ@ see ĠItem Key ed DataSource Ċ Ġ* Ċ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery ĠValue Ġtypes Ġout Ġof Ġthe ĠDataSource . Ċ Ġ* Ġ@ param ĠValue ĠType Ġof Ġitems Ġbeing Ġloaded Ġby Ġthe ĠDataSource . Ċ Ġ*/ Ċ abstract Ġclass ĠList enable Item Key ed DataSource < Key Ġ: ĠAny , ĠValue Ġ: ĠAny > Ġ: ĊĠĠĠ ĠDataSource < Key , ĠValue >( KeyType . ITEM _ KEY ED ) Ġ{ ĊĊĠĠĠ Ġ@ Suppress (" Red undant Visibility Modifier ") Ġ// ĠMet al ava Ġdoesn 't Ġinherit Ġvisibility Ġproperly . ĊĠĠĠ Ġinternal Ġfinal Ġoverride Ġfun Ġload ( params : ĠParams < Key >): ĠList enable Future < out ĠBase Result < Value >> Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( params . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . INITIAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinit Params Ġ= ĠItem Key ed DataSource . Load Initial Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . key , Ġparams . initial Load Size , Ġparams . placeholders Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload Initial ( init Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload Params Ġ= ĠItem Key ed DataSource . Load Params ( params . key !! , Ġparams . pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload Before ( load Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġload Params Ġ= ĠItem Key ed DataSource . Load Params ( params . key !! , Ġparams . pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload After ( load Params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠH older Ġobject Ġfor Ġinputs Ġto Ġ[ load Initial ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery ĠValue Ġtypes Ġout Ġof Ġthe ĠDataSource . ĊĠĠĠĠ Ġ* Ġ@ property Ġrequested Initial Key ĠLoad Ġitems Ġaround Ġthis Ġkey , Ġor Ġat Ġthe Ġbeginning Ġof Ġthe Ġdata Ġset ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ` null ` Ġis Ġpassed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNote Ġthat Ġthis Ġkey Ġis Ġgenerally Ġa Ġhint , Ġand Ġmay Ġbe Ġignored Ġif ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġyou Ġwant Ġto Ġalways Ġload Ġfrom Ġthe Ġbeginning . ĊĠĠĠĠ Ġ* Ġ@ property Ġrequested Load Size ĠRequest ed Ġnumber Ġof Ġitems Ġto Ġload . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNote Ġthat Ġthis Ġmay Ġbe Ġlarger Ġthan Ġavailable Ġdata . ĊĠĠĠĠ Ġ* Ġ@ property Ġplaceholders Enabled ĠDefines Ġwhether Ġplaceholders Ġare Ġenabled , Ġand Ġwhether Ġthe ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Ġtotal Ġcount Ġwill Ġbe Ġignored . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠLoad Initial Params < Key Ġ: ĠAny >( ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval Ġrequested Initial Key : ĠKey ?, ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval Ġrequested Load Size : ĠInt , ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field Ġval Ġplaceholders Enabled : ĠBoolean ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠH older Ġobject Ġfor Ġinputs Ġto Ġ[ load Before ] Ġand Ġ[ load After ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠKey ĠType Ġof Ġdata Ġused Ġto Ġquery ĠValue Ġtypes Ġout Ġof Ġthe ĠDataSource . ĊĠĠĠĠ Ġ* Ġ@ property Ġkey ĠLoad Ġitems Ġbefore / after Ġthis Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReturned Ġdata Ġmust Ġbegin Ġdirectly Ġadjacent Ġto Ġthis Ġposition . ĊĠĠĠĠ Ġ* Ġ@ property Ġrequested Load Size ĠRequest ed Ġnumber Ġof Ġitems Ġto Ġload . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReturned Ġpage Ġcan Ġbe Ġof Ġthis Ġsize , Ġbut Ġit Ġmay Ġbe Ġaltered Ġif Ġthat ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġeasier , Ġe . g . Ġa Ġnetwork Ġdata Ġsource Ġwhere Ġthe Ġbackend Ġdefines ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠLoad Params < Key Ġ: ĠAny >( @ Jvm Field Ġval Ġkey : ĠKey , Ġ@ Jvm Field Ġval Ġrequested Load Size : ĠInt ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġinitial Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġcalled Ġfirst Ġto Ġinitialize Ġa ĠP aged List Ġwith Ġdata . ĠIf Ġit 's Ġpossible Ġto Ġcount ĊĠĠĠĠ Ġ* Ġthe Ġitems Ġthat Ġcan Ġbe Ġloaded Ġby Ġthe ĠDataSource , Ġit 's Ġrecommended Ġto Ġpass Ġ` total Count ` ĊĠĠĠĠ Ġ* Ġto Ġthe Ġ[ Initial Result ] Ġconstructor . ĠThis Ġenables ĠP aged Lists Ġpresent ing Ġdata Ġfrom Ġthis ĊĠĠĠĠ Ġ* Ġsource Ġto Ġdisplay Ġplaceholders Ġto Ġrepresent Ġun loaded Ġitems . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ Item Key ed DataSource . Load Initial Params . requested Initial Key ] Ġand ĊĠĠĠĠ Ġ* Ġ[ Item Key ed DataSource . Load Initial Params . requested Load Size ] Ġare Ġhints , Ġnot Ġrequirements , ĊĠĠĠĠ Ġ* Ġso Ġthey Ġmay Ġbe Ġaltered Ġor Ġignored . ĠNote Ġthat Ġignoring Ġthe Ġ` requested Initial Key ` Ġcan ĊĠĠĠĠ Ġ* Ġprevent Ġsubsequent ĠP aged List / DataSource Ġpairs Ġfrom Ġinitializing Ġat Ġthe Ġsame Ġlocation . ĠIf Ġyour ĊĠĠĠĠ Ġ* ĠDataSource Ġnever Ġinvalid ates Ġ( for Ġexample , Ġloading Ġfrom Ġthe Ġnetwork Ġwithout Ġthe Ġnetwork Ġever ĊĠĠĠĠ Ġ* Ġsign all ing Ġthat Ġold Ġdata Ġmust Ġbe Ġre loaded ), Ġit 's Ġfine Ġto Ġignore Ġthe Ġ` initial Load Key ` ĊĠĠĠĠ Ġ* Ġand Ġalways Ġstart Ġfrom Ġthe Ġbeginning Ġof Ġthe Ġdata Ġset . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġinitial Ġload , Ġincluding Ġinitial Ġkey Ġand Ġrequested Ġsize . ĊĠĠĠĠ Ġ* Ġ@ return ĠList enable Future Ġof Ġthe Ġloaded Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġload Initial ( params : ĠLoad Initial Params < Key >): ĠList enable Future < Initial Result < Value >> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġlist Ġdata Ġafter Ġthe Ġkey Ġspecified Ġin ĊĠĠĠĠ Ġ* Ġ[ Load Params . key ][ Item Key ed DataSource . Load Params . key ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt 's Ġvalid Ġto Ġreturn Ġa Ġdifferent Ġlist Ġsize Ġthan Ġthe Ġpage Ġsize Ġif Ġit 's Ġeasier , Ġe . g . Ġif Ġyour ĊĠĠĠĠ Ġ* Ġbackend Ġdefines Ġpage Ġsizes . ĠIt Ġis Ġgenerally Ġpreferred Ġto Ġincrease Ġthe Ġnumber Ġloaded Ġthan ĊĠĠĠĠ Ġ* Ġreduce . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġdata Ġcannot Ġbe Ġloaded Ġ( for Ġexample , Ġif Ġthe Ġrequest Ġis Ġinvalid , Ġor Ġthe Ġdata Ġwould Ġbe Ġstale ĊĠĠĠĠ Ġ* Ġand Ġinconsistent ), Ġit Ġis Ġvalid Ġto Ġcall Ġ[ invalidate ] Ġto Ġinvalidate Ġthe Ġdata Ġsource , Ġand ĊĠĠĠĠ Ġ* Ġprevent Ġfurther Ġloading . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġthe Ġload , Ġincluding Ġthe Ġkey Ġto Ġload Ġafter , Ġand Ġrequested Ġsize . ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ List enable Future ] Ġof Ġthe Ġloaded Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġload After ( params : ĠLoad Params < Key >): ĠList enable Future < Result < Value >> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoad Ġlist Ġdata Ġafter Ġthe Ġkey Ġspecified Ġin ĊĠĠĠĠ Ġ* Ġ[ Load Params . key ][ Item Key ed DataSource . Load Params . key ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt 's Ġvalid Ġto Ġreturn Ġa Ġdifferent Ġlist Ġsize Ġthan Ġthe Ġpage Ġsize Ġif Ġit 's Ġeasier , Ġe . g . Ġif Ġyour ĊĠĠĠĠ Ġ* Ġbackend Ġdefines Ġpage Ġsizes . ĠIt Ġis Ġgenerally Ġpreferred Ġto Ġincrease Ġthe Ġnumber Ġloaded Ġthan ĊĠĠĠĠ Ġ* Ġreduce . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** Note :** ĠData Ġreturned Ġwill Ġbe Ġpre pended Ġjust Ġbefore Ġthe Ġkey ĊĠĠĠĠ Ġ* Ġpassed , Ġso Ġif Ġyou Ġdon 't Ġreturn Ġa Ġpage Ġof Ġthe Ġrequested Ġsize , Ġensure Ġthat Ġthe Ġlast Ġitem Ġis ĊĠĠĠĠ Ġ* Ġadjacent Ġto Ġthe Ġpassed Ġkey . ĊĠĠĠĠ Ġ* ĠIt 's Ġvalid Ġto Ġreturn Ġa Ġdifferent Ġlist Ġsize Ġthan Ġthe Ġpage Ġsize Ġif Ġit 's Ġeasier , Ġe . g . Ġif Ġyour ĊĠĠĠĠ Ġ* Ġbackend Ġdefines Ġpage Ġsizes . ĠIt Ġis Ġgenerally Ġpreferred Ġto Ġincrease Ġthe Ġnumber Ġloaded Ġthan ĊĠĠĠĠ Ġ* Ġreduce . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġdata Ġcannot Ġbe Ġloaded Ġ( for Ġexample , Ġif Ġthe Ġrequest Ġis Ġinvalid , Ġor Ġthe Ġdata Ġwould Ġbe Ġstale ĊĠĠĠĠ Ġ* Ġand Ġinconsistent ), Ġit Ġis Ġvalid Ġto Ġcall Ġ[ invalidate ] Ġto Ġinvalidate Ġthe Ġdata Ġsource , ĊĠĠĠĠ Ġ* Ġand Ġprevent Ġfurther Ġloading . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparams ĠParameters Ġfor Ġthe Ġload , Ġincluding Ġthe Ġkey Ġto Ġload Ġbefore , Ġand Ġrequested Ġsize . ĊĠĠĠĠ Ġ* Ġ@ return ĠList enable Future Ġof Ġthe Ġloaded Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġload Before ( params : ĠLoad Params < Key >): ĠList enable Future < Result < Value >> ĊĊĠĠĠ Ġabstract Ġfun ĠgetKey ( item : ĠValue ): ĠKey ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ hide ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Restrict To ( Restrict To . Scope . LIBRARY _ GROUP ) ĊĠĠĠ Ġfinal Ġoverride Ġfun ĠgetKey Internal ( item : ĠValue ): ĠKey Ġ= ĠgetKey ( item ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType Ġproduced Ġby Ġ[ load Initial ] Ġto Ġrepresent Ġinitially Ġloaded Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠV ĠThe Ġtype Ġof Ġthe Ġdata Ġloaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠInitial Result < V Ġ: ĠAny > Ġ: ĠBase Result < V > Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( data : ĠList < V >, Ġposition : ĠInt , Ġtotal Count : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count Ġ- Ġdata . size Ġ- Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġconstructor ( data : ĠList < V >) Ġ: Ġsuper ( data , Ġnull , Ġnull , Ġ 0 , Ġ 0 , Ġ 0 , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠType Ġproduced Ġby Ġ[ load Before ] Ġand Ġ[ load After ] Ġto Ġrepresent Ġa Ġpage Ġof Ġloaded Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠV ĠThe Ġtype Ġof Ġthe Ġdata Ġloaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠResult < V Ġ: ĠAny >( data : ĠList < V >) Ġ: ĊĠĠĠĠĠĠĠ ĠDataSource . Base Result < V >( data , Ġnull , Ġnull , Ġ 0 , Ġ 0 , Ġ 0 , Ġfalse ) Ċ } Ċ