package Ġcom . do br uc ali . gor ill as . data . source Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . paging . Page Key ed DataSource Ċ import Ġandroidx . paging . Paged List Ċ import Ġcom . do br uc ali . gor ill as . Post List Query Ċ import Ġcom . do br uc ali . gor ill as . data . entity . is Success Ċ import Ġcom . do br uc ali . gor ill as . data . task . Post Task Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . ceil Ċ Ċ class ĠPosts DataSource ( ĊĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġprivate Ġval Ġpost Task : ĠPost Task , ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠP aged List . Config Ċ ) Ġ: ĊĠĠĠ ĠPage Key ed DataSource < String , ĠPost List Query . Data 1 >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠcurrentPage Ġ: ĠInt Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġmax Page Limit Ġ: ĠInt Ġ= ĠInt . MAX _ VALUE ĊĊĠĠĠ Ġoverride Ġfun Ġload Initial ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Initial Params < String >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Initial Callback < String , ĠPost List Query . Data 1 > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġpost Task . getPost sWith Page Number ( currentPage , Ġconfig . pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . is Success () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlisting Ġ= Ġresponse . data ?. posts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisting ?. meta ?. total Count ?. let Ġ{ Ġ Ġtotal Count Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Page Limit Ġ= Ġceil ( total Count . toDouble () Ġ/ Ġconfig . pageSize ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposts Ġ= Ġlisting ?. data ?. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( posts Ġ?: ĠlistOf (), ĠcurrentPage . toString (), ĠcurrentPage . plus ( 1 ). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception Ġ: ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Posts DataSource ", Ġ" Failed Ġto Ġfetch Ġdata !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Before ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Params < String >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Callback < String , ĠPost List Query . Data 1 > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ> Ġ 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġpost Task . getPost sWith Page Number ( currentPage . minus ( 1 ), Ġconfig . pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . is Success () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= ĠcurrentPage . minus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlisting Ġ= Ġresponse . data ?. posts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposts Ġ= Ġlisting ?. data ?. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( posts Ġ?: ĠlistOf (), ĠcurrentPage . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception Ġ: ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Posts DataSource ", Ġ" Failed Ġto Ġfetch Ġdata !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload After ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Params < String >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Callback < String , ĠPost List Query . Data 1 > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ< Ġmax Page Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġpost Task . getPost sWith Page Number ( currentPage . plus ( 1 ), Ġconfig . pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . is Success () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= ĠcurrentPage . plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlisting Ġ= Ġresponse . data ?. posts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposts Ġ= Ġlisting ?. data ?. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( posts Ġ?: ĠlistOf (), ĠcurrentPage . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception Ġ: ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Posts DataSource ", Ġ" Failed Ġto Ġfetch Ġdata !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . invalidate () ĊĠĠĠĠĠĠĠ Ġscope . cancel () ĊĠĠĠ Ġ} Ċ Ċ }