package Ġcom . on ir ut la . github user . data . source Ċ Ċ import Ġandroidx . paging . Experimental Paging Api Ċ import Ġandroidx . paging . Load Type Ċ import Ġandroidx . paging . Paging State Ċ import Ġandroidx . paging . Remote Mediator Ċ import Ġandroidx . room . with Transaction Ċ import Ġcom . on ir ut la . github user . data . source . local . db . Github User Database Ċ import Ġcom . on ir ut la . github user . data . source . local . entity . User Entity Ċ import Ġcom . on ir ut la . github user . data . source . local . entity . User Remote Key Ċ import Ġcom . on ir ut la . github user . data . source . remote . Response Ċ import Ġcom . on ir ut la . github user . data . source . remote . response . User Response Ċ import Ġcom . on ir ut la . github user . data . source . remote . response . to Entity Ċ import Ġok io . IOException Ċ import Ġretrofit 2 . HttpException Ċ Ċ @ Experimental Paging Api Ċ class ĠUser Remote Mediator ( ĊĠĠĠ Ġprivate Ġval Ġdb : ĠGithub User Database , ĊĠĠĠ Ġprivate Ġinline Ġval Ġapi Service : Ġsuspend Ġ( position : ĠInt ) Ġ-> ĠResponse < List < User Response >>, Ċ ) Ġ: ĠRemote Mediator < Int , ĠUser Entity >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġuser Dao Ġ= Ġdb . user Dao ĊĠĠĠ Ġprivate Ġval Ġremote Key Dao Ġ= Ġdb . user Remote Key Dao ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( ĊĠĠĠĠĠĠĠ Ġload Type : ĠLoad Type , ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠUser Entity > ĊĠĠĠ Ġ): ĠMed iator Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcurrentPage Ġ= Ġwhen Ġ( load Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . REFRESH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Keys Ġ= Ġget Remote Key Closest To Current Position ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Keys ?. next Page ?. minus ( 1 ) Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . PRE PEND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Keys Ġ= Ġget Remote Key For First Item ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Page Ġ= Ġremote Keys ?. prev Page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġremote Keys Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . APPEND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Keys Ġ= Ġget Remote Key For Last Item ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page Ġ= Ġremote Keys ?. next Page Ġ?: Ġreturn ĠMed iator Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Of Pagination Reached Ġ= Ġremote Keys Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġwhen Ġ( val Ġresponse Ġ= Ġapi Service ( currentPage )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResponse . Error Ġ-> Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResponse . Success Ġ-> Ġresponse . body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġusers . map Ġ{ Ġit . to Entity () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Of Pagination Reached Ġ= Ġentity . isNull OrEmpty () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Page Ġ= Ġif Ġ( currentPage Ġ== Ġ 1 ) Ġnull Ġelse ĠcurrentPage . minus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page Ġ= Ġif Ġ( end Of Pagination Reached ) Ġnull Ġelse ĠcurrentPage . plus ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . with Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Type Ġ== ĠLoad Type . REFRESH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Dao . clear Users () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Key Dao . clear Remote Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġentity . map Ġ{ Ġuser Entity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Remote Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Entity . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Page , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Key Dao . addAll Remote Keys ( keys ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Dao . insert Users ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠMed iator Result . Success ( end Of Pagination Reached ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMed iator Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMed iator Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMed iator Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key For Last Item ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠUser Entity > ĊĠĠĠ Ġ): ĠUser Remote Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . pages . last OrNull Ġ{ Ġit . data . isNotEmpty () Ġ} ?. data ?. last OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġun splash Image Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Key Dao . get Remote Keys ( id Ġ= Ġun splash Image . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key For First Item ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠUser Entity > ĊĠĠĠ Ġ): ĠUser Remote Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . pages . first OrNull Ġ{ Ġit . data . isNotEmpty () Ġ} ?. data ?. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġuser Entity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Key Dao . get Remote Keys ( id Ġ= Ġuser Entity . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key Closest To Current Position ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠUser Entity > ĊĠĠĠ Ġ): ĠUser Remote Key ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstate . anchor Position ?. let Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . closest Item To Position ( position )?. id ?. let Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Key Dao . get Remote Keys ( id Ġ= Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }