/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 Ġ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 . room . paging . rx java 3 Ċ Ċ import Ġandroid . database . Cursor Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . annotation . Restrict To Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . paging . Paging State Ċ import Ġandroidx . paging . rx java 3 . Rx Paging Source Ċ import Ġandroidx . room . Room Database Ċ import Ġandroidx . room . Room SQLite Query Ċ import Ġandroidx . room . paging . util . INITIAL _ ITEM _ COUNT Ċ import Ġandroidx . room . paging . util . INVALID Ċ import Ġandroidx . room . paging . util . Thread Safe Invalid ation Observer Ċ import Ġandroidx . room . paging . util . getC lipped Refresh Key Ċ import Ġandroidx . room . paging . util . query Database Ċ import Ġandroidx . room . paging . util . query ItemCount Ċ import Ġandroidx . room . rx java 3 . Rx Room . create Single Ċ import Ġandroidx . sqlite . db . Support SQLite Query Ċ import Ġio . reactivex . rx java 3 . core . Single Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġjava . util . concurrent . Callable Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ Ċ @ Restrict To ( Restrict To . Scope . LIBRARY _ GROUP ) Ċ abstract Ġclass ĠLimit Offset Rx Paging Source < Value Ġ: ĠAny >( ĊĠĠĠ Ġprivate Ġval Ġsource Query : ĠRoom SQLite Query , ĊĠĠĠ Ġprivate Ġval Ġdb : ĠRoom Database , ĊĠĠĠ Ġvar arg Ġtables : ĠString , Ċ ) Ġ: ĠRx Paging Source < Int , ĠValue >() Ġ{ ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġsupport SQLite Query : ĠSupport SQLite Query , ĊĠĠĠĠĠĠĠ Ġdb : ĠRoom Database , ĊĠĠĠĠĠĠĠ Ġvar arg Ġtables : ĠString ĊĠĠĠ Ġ) Ġ: Ġthis Ġ( ĊĠĠĠĠĠĠĠ Ġsource Query Ġ= ĠRoom SQLite Query . copyFrom ( support SQLite Query ), ĊĠĠĠĠĠĠĠ Ġdb Ġ= Ġdb , ĊĠĠĠĠĠĠĠ Ġtables Ġ= Ġtables ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġval Ġitem Count : ĠAtomicInteger Ġ= ĠAtomicInteger ( INITIAL _ ITEM _ COUNT ) ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġval Ġobserver Ġ= ĠThread Safe Invalid ation Observer ( tables Ġ= Ġtables ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Single ( params : ĠLoad Params < Int >): ĠSingle < Load Result < Int , ĠValue >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscheduler Ġ= ĠS chedulers . from ( db . query Executor ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . register If Ne cessary ( db ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Count Ġ= Ġitem Count . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temp Count Ġ== ĠINITIAL _ ITEM _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Load ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Initial Load ( params , Ġtemp Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( scheduler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitial Load ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠValue > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb . run In Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Count Ġ= Ġquery ItemCount ( source Query , Ġdb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count . set ( temp Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Database ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Query Ġ= Ġsource Query , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ġ= Ġdb , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count Ġ= Ġtemp Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Rows Ġ= Ġ:: convert Rows ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnon Initial Load ( params : ĠLoad Params < Int >, Ġtemp Count : ĠInt ): ĠLoad Result < Int , ĠValue > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġquery Database ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġparams , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Query Ġ= Ġsource Query , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Ġ= Ġdb , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Count Ġ= Ġtemp Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Rows Ġ= Ġ:: convert Rows ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġmanually Ġcheck Ġif Ġdatabase Ġhas Ġbeen Ġupdated . ĠIf Ġso , Ġthe Ġobserver 's ĊĠĠĠĠĠĠĠ Ġ// Ġinvalid ation Ġcallback Ġwill Ġinvalidate Ġthis Ġpaging Ġsource ĊĠĠĠĠĠĠĠ Ġdb . invalid ation Tracker . refresh Versions Sync () ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( invalid ) ĠINVALID Ġas ĠLoad Result . Invalid < Int , ĠValue > Ġelse Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ NonNull ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġconvert Rows ( cursor : ĠCursor ): ĠList < Value > ĊĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠValue >): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . getC lipped Refresh Key () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġjump ing Supported : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtrue Ċ } Ċ