package Ġio . github . wy kop mob il ny . domain . api Ċ Ċ import Ġandroidx . paging . Load Type Ċ import Ġandroidx . paging . Paging Source Ċ import Ġandroidx . paging . Paging State Ċ import Ġandroidx . paging . Remote Mediator Ċ import Ġcom . dropbox . android . external . store 4 . Store Ċ import Ġcom . dropbox . android . external . store 4 . Store Request Ċ import Ġcom . dropbox . android . external . store 4 . Store Response Ċ import Ġio . github . wy kop mob il ny . ui . base . App Dispatch ers Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . cancel Children Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . map NotNull Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject Ċ Ċ internal Ġclass ĠStore Mediator < T Ġ: ĠAny > Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġstore : ĠStore < Int , ĠList < T >>, Ċ ) Ġ: ĠRemote Mediator < Int , ĠT >() Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( load Type : ĠLoad Type , Ġstate : ĠP aging State < Int , ĠT >): ĠMed iator Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġload Key Ġ= Ġwhen Ġ( load Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . REFRESH Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . PRE PEND Ġ-> Ġstate . pages . first OrNull ()?. prev Key ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Type . APPEND Ġ-> Ġstate . pages . last OrNull ()?. next Key ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġstore . stream ( Store Request . fresh ( load Key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . Loading Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . No New Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . Error , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . Loading Ġ-> Ġerror (" excluded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . Data Ġ-> ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġresponse . value . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . No New Data Ġ-> ĠMed iator Result . Success ( end Of Pagination Reached Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . Error . Exception Ġ-> ĠMed iator Result . Error ( response . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStore Response . Error . Message Ġ-> ĠMed iator Result . Error ( Exception ( response . message )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠP aging Source < T Ġ: ĠAny > Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġstore : ĠStore < Int , ĠList < T >>, Ċ ) Ġ: ĠP aging Source < Int , ĠT >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( job Ġ+ ĠApp Dispatch ers . Default ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Invalid ated Callback Ġ{ Ġjob . cancel Children () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Params < Int >, ĊĠĠĠ Ġ): ĠLoad Result < Int , ĠT > Ġ= Ġwith Context ( App Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Page Number Ġ= Ġparams . key Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġstore . stream ( Store Request . cached ( next Page Number , Ġrefresh Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġit . data OrNull () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġresponse . first () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . first Ġ{ Ġit Ġ!= Ġpage Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġpage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Key Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ= Ġif Ġ( page . isNotEmpty ()) Ġnext Page Number Ġ+ Ġ 1 Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrElse Ġ{ ĠLoad Result . Error ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠT >): ĠInt ? Ġ= ĊĠĠĠĠĠĠĠ Ġstate . anchor Position ?. let ( state :: closest Page To Position )?. let Ġ{ Ġanchor Page Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanchor Page . prev Key ?. plus ( 1 ) Ġ?: Ġanchor Page . next Key ?. minus ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ