package Ġcom . ras alex man . erb . data . source Ċ Ċ import Ġandroidx . paging . Paging Source Ċ import Ġandroidx . paging . Paging State Ċ import Ġcom . ras alex man . erb . models . Page Model Ċ import Ġkotlinx . coroutines . delay Ċ import Ġjava . io . IOException Ċ Ċ class ĠPage Remote Source ( ĊĠĠĠ Ġprivate Ġval Ġpage Service : ĠI Page Service Ċ ) Ġ: ĠP aging Source < Int , ĠPage Model >() Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠPage Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġparams . key Ġ?: ĠSTART _ PAGE _ INDEX ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepos Ġ= Ġpage Service . load Items ( position , Ġparams . load Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Key Ġ= Ġif Ġ( repos . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Position Count Ġ= Ġ( repos . size Ġ/ ĠNET WORK _ PAGE _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid Position Count Ġ= Ġnext Position Count . take If Ġ{ Ġit Ġ> Ġ 0 Ġ} Ġ?: ĠDEFAULT _ NEXT _ POSITION _ COUNT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ+ Ġvalid Position Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġrepos , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Key Ġ= Ġif Ġ( position Ġ== ĠSTART _ PAGE _ INDEX ) Ġnull Ġelse Ġposition Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ= Ġnext Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLoad Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLoad Result . Error ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠPage Model >): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġget Ġthe Ġprevious Ġkey Ġ( or Ġnext Ġkey Ġif Ġprevious Ġis Ġnull ) Ġof Ġthe Ġpage ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġwas Ġclosest Ġto Ġthe Ġmost Ġrecently Ġaccessed Ġindex . ĊĠĠĠĠĠĠĠ Ġ// ĠAnchor Ġposition Ġis Ġthe Ġmost Ġrecently Ġaccessed Ġindex ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . anchor Position ?. let Ġ{ Ġanchor Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . closest Page To Position ( anchor Position )?. prev Key ?. plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġstate . closest Page To Position ( anchor Position )?. next Key ?. minus ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ NEXT _ POSITION _ COUNT Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTART _ PAGE _ INDEX Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNET WORK _ PAGE _ SIZE Ġ= Ġ 1 0 ĊĠĠĠ Ġ} Ċ }