package Ġdev . mf az io . abl . players Ċ Ċ 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 Ġdev . mf az io . abl . api . services . Android Base ball League Service Ċ import Ġdev . mf az io . abl . data . Base ball Database Ċ import Ġdev . mf az io . abl . util . convertTo Players Ċ import Ġjava . io . Invalid Object Exception Ċ Ċ @ Experimental Paging Api Ċ class ĠPlayer List Remote Mediator ( ĊĠĠĠ Ġprivate Ġval Ġapi Service : ĠAndroid Base ball League Service , ĊĠĠĠ Ġprivate Ġval Ġbase ball Database : ĠBase ball Database , ĊĠĠĠ Ġprivate Ġval Ġteam Id : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġname Query : ĠString ? Ġ= Ġnull Ċ ) Ġ: ĠRemote Mediator < Int , ĠPlayer ListItem >() Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( ĊĠĠĠĠĠĠĠ Ġload Type : ĠLoad Type , ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠPlayer ListItem > ĊĠĠĠ Ġ): ĠMed iator Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġwhen Ġ( load Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . PRE PEND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġload Keys For First Player ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠMed iator Result . Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvalid Object Exception (" Keys Ġshould Ġnot Ġbe Ġnull Ġfor Ġ$ load Type .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys . previous Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . APPEND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġload Keys For Last Player ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys ?. next Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . REFRESH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġload Keys For Closest Player ( state ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys ?. next Key Ġ?: Ġstarting Page Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġload And Save Api Data ( page , Ġstate , Ġload Type Ġ== ĠLoad Type . REFRESH ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload And Save Api Data ( ĊĠĠĠĠĠĠĠ Ġpage : ĠInt , ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠPlayer ListItem >, ĊĠĠĠĠĠĠĠ Ġis Refresh : ĠBoolean ĊĠĠĠ Ġ): ĠMed iator Result Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Response Ġ= Ġapi Service . get Players ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . config . pageSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Query , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġteam Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayers Ġ= Ġapi Response . convertTo Players () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Of Pagination Reached Ġ= Ġplayers . isEmpty () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . with Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . player Keys Dao (). delete All Player Keys () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . base ball Dao (). delete All Player List Items () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Key Ġ= Ġif Ġ( page Ġ== Ġstarting Page Index ) Ġnull Ġelse Ġpage Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Key Ġ= Ġif Ġ( end Of Pagination Reached ) Ġnull Ġelse Ġpage Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġplayers . map Ġ{ Ġplayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Keys ( player . player Id , Ġprevious Key , Ġnext Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . player Keys Dao (). insert Keys ( keys ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . base ball Dao (). insert OrUpdate Players ( players ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . base ball Dao (). insert Player List Items ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayers . map Ġ{ Ġplayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer ListItem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . player Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . fullName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . team Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġend Of Pagination Reached ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMed iator Result . Error ( ex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Keys For First Player ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠPlayer ListItem > ĊĠĠĠ Ġ) Ġ= Ġstate . pages . first OrNull Ġ{ Ġit . data . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ? . data ?. first OrNull ()?. let Ġ{ Ġplayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . player Keys Dao (). getPlayer Keys By Player Id ( player . player Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Keys For Last Player ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠPlayer ListItem > ĊĠĠĠ Ġ) Ġ= Ġstate . pages . last OrNull Ġ{ Ġit . data . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ Ġ? . data ?. last OrNull ()?. let Ġ{ Ġplayer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . player Keys Dao (). getPlayer Keys By Player Id ( player . player Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġload Keys For Closest Player ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠPlayer ListItem > ĊĠĠĠ Ġ) Ġ= Ġstate . anchor Position ?. let Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠ Ġstate . closest Item To Position ( position )?. player Id ?. let Ġ{ Ġplayer Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase ball Database . player Keys Dao (). getPlayer Keys By Player Id ( player Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġstarting Page Index Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ }