package Ġcom . example . movie app . paging Ċ Ċ import Ġandroidx . paging . Experimental Paging Api Ċ import Ġandroidx . paging . Paging Source Ċ import Ġandroidx . paging . Paging State Ċ import Ġcom . example . movie app . api . ApiService Ċ import Ġcom . example . movie app . model . Result Ċ Ċ class ĠMovie Paging Source ( ĊĠĠĠ Ġprivate Ġval Ġapi Service : ĠApi Service , ĊĠĠĠ Ġprivate Ġval ĠapiKey : ĠString Ċ ) Ġ: ĠP aging Source < Int , ĠResult >() Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠResult > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page : ĠInt Ġ= Ġparams . key Ġ?: ĠFIRST _ PAGE _ INDEX ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi Service . get Movie List ( apiKey , Ġnext Page ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse List Ġ= Ġmutable ListOf < Result >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġresponse . results Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse List . addAll ( data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Page Ġ= Ġif Ġ( next Page Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġelse Ġnext Page Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġresponse List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Key Ġ= Ġprevious Page , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ= Ġnext Page . plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFIRST _ PAGE _ INDEX Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Paging Api ĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠResult >): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . anchor Position ?. let Ġ{ Ġanchor Position Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanchor Page Ġ= Ġstate . closest Page To Position ( anchor Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Page ?. prev Key ?. plus ( 1 ) Ġ?: Ġanchor Page ?. next Key ?. minus ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }