package Ġcom . nan am are . movie . ui . paging . ind b Ċ Ċ 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 . nan am are . data . local . db . Movie Database Ċ import Ġcom . nan am are . domain . model . Movie Model Ċ import Ġcom . nan am are . domain . model . Movie Remote Key Model Ċ import Ġcom . nan am are . domain . repository . Movie Local Repository Ċ import Ġcom . nan am are . domain . use case . Get Trend ing Movie UseCase Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ Ċ @ Opt In ( Experimental Paging Api :: class ) Ċ class ĠT rend ing Movie Remote Mediator Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġmovie Database : ĠMovie Database , ĊĠĠĠ Ġprivate Ġval Ġget Trend ing Movie UseCase : ĠGet Trend ing Movie UseCase , Ġ// ĠMovie Remote Repository ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠMovie Local Repository , Ċ ) Ġ: ĠRemote Mediator < Int , ĠMovie Model >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcache TimeOut Ġby Ġlazy Ġ{ ĠTimeUnit . MILLISECONDS . convert ( 7 , ĠTimeUnit . DAYS ) Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinitialize (): ĠInitialize Action Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ- Ġrepository . get Latest Updated Time () Ġ>= Ġcache TimeOut ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInitialize Action . SKIP _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInitialize Action . LA UNCH _ INITIAL _ REFRESH ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( ĊĠĠĠĠĠĠĠ Ġload Type : ĠLoad Type , ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠMovie Model > ĊĠĠĠ Ġ): ĠMed iator Result Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Page Ġ= Ġ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 Ġresponse Ġ= Ġget Trend ing Movie UseCase . invoke ( local Page ). get OrThrow () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Database . with Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( load Type Ġ== ĠLoad Type . REFRESH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . delete All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Page Ġ= Ġresponse . page ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Page Ġ= Ġif Ġ( remote Page Ġ== Ġ 1 ) Ġnull Ġelse Ġremote Page Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Page Ġ= Ġif Ġ( remote Page Ġ> Ġresponse . total Pages ) Ġnull Ġelse Ġremote Page . plus ( 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Key Ġ= Ġresponse . movies . map Ġ{ Ġmovie Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie Remote Key Model ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġmovie . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Page Ġ= Ġprev Page , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Page Ġ= Ġnext Page , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Updated Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . replace Remote Key ( remote Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . replace Movies ( response . movies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġresponse . movies . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMed iator Result . Error ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key Closest To Current Position ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠMovie Model >, ĊĠĠĠ Ġ): ĠMovie Remote Key Model ? Ġ= Ġstate . anchor Position ?. let Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠ Ġstate . closest Item To Position ( position )?. id ?. let Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Remote Key ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key For First Item ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠMovie Model >, ĊĠĠĠ Ġ): ĠMovie Remote Key Model ? Ġ= ĊĠĠĠĠĠĠĠ Ġstate . pages . first OrNull Ġ{ Ġit . data . isNotEmpty () Ġ} ?. data ?. first OrNull ()?. id ?. let Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Remote Key ( id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Key For Last Item ( ĊĠĠĠĠĠĠĠ Ġstate : ĠP aging State < Int , ĠMovie Model >, ĊĠĠĠ Ġ): ĠMovie Remote Key Model ? Ġ= ĊĠĠĠĠĠĠĠ Ġstate . pages . last OrNull Ġ{ Ġit . data . isNotEmpty () Ġ} ?. data ?. last OrNull ()?. id ?. let Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Remote Key ( id ) ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ }