package Ġcom . example . repos inter actors Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . paging . Paging Source Ċ import Ġandroidx . paging . Paging State Ċ import Ġcom . example . core . domain . DEFAULT _ REPO _ VALUE Ċ import Ġcom . example . core . domain . PAGE _ SIZE Ċ import Ġcom . example . core . domain . REPO _ CONST Ċ import Ġcom . example . core . domain . Trend ing Repository Ċ import Ġcom . example . core . dto . Trend ing Repo DTO Ċ import Ġcom . example . core . dto . to Trend ing Repo Ċ import Ġcom . example . internet detector . core . is Online Ċ import Ġcom . example . paging . No Connection Exception Ċ import Ġcom . example . paging . can Not Load More Content Ċ import Ġcom . example . trend ing . repo . Trend ing Repo Ċ import Ġdagger . ass isted . Ass isted Ċ import Ġdagger . ass isted . Ass isted Factory Ċ import Ġdagger . ass isted . Ass isted Inject Ċ import Ġdagger . h ilt . android . qual ifiers . ApplicationContext Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ class ĠT rend ing Repo DataSource Ġ@ Ass isted Inject Ġconstructor ( ĊĠĠĠ Ġ@ ApplicationContext Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġ@ Ass isted ( REPO _ CONST ) Ġprivate Ġval Ġrepo Name : ĠString , ĊĠĠĠ Ġprivate Ġval Ġtrend ing Repository : ĠT rend ing Repository ĊĠĠĠ Ġ) Ġ: ĠP aging Source < Int , ĠT rend ing Repo >() Ġ{ ĊĊĠĠĠ Ġvar Ġcan Load More Ġ= Ġtrue ĊĊĠĠĠ Ġ@ Ass isted Factory ĊĠĠĠ Ġinterface ĠT rend ing Repo DataSource Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Ass isted ( REPO _ CONST ) Ġrepo Name : ĠString ĊĠĠĠĠĠĠĠ Ġ): ĠT rend ing Repo DataSource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Refresh Key ( state : ĠP aging State < Int , ĠT rend ing Repo >): ĠInt ? Ġ Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( params : ĠLoad Params < Int >): ĠLoad Result < Int , ĠT rend ing Repo > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġparams . key Ġ?: Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( context . is Online ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrend ing Repository . get Trend ing Repos ( page , Ġrepo Name . if Empty Ġ{ ĠDEFAULT _ REPO _ VALUE Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Not Load More Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry To Load Books ( page , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLoad Result . Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLoad Result . Error ( No Connection Exception ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry To Load Books ( page : ĠInt , Ġit : ĠList < Trend ing Repo DTO >): ĠLoad Result . Page < Int , ĠT rend ing Repo > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( can Load More ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Books ( it , Ġpage ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcan Not Load More Content () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Books ( list : ĠList < Trend ing Repo DTO > ?, Ġpage : ĠInt ): ĠLoad Result . Page < Int , ĠT rend ing Repo > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrepo DTO Ġ= Ġlist ?. map Ġ{ Ġit . to Trend ing Repo () Ġ} ĊĊĠĠĠĠĠĠĠ Ġlist ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . size Ġ< ĠPAGE _ SIZE . toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// cant Ġload Ġmore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Load More Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( repo DTO . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcan Not Load More Content () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Key Ġ= Ġif Ġ( repo DTO . isEmpty ()) Ġif Ġ( page Ġ== Ġ 1 ) Ġnull Ġelse Ġpage Ġ- Ġ 1 Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Key Ġ= Ġif Ġ( repo DTO . count () Ġ== Ġ 0 ) Ġnull Ġelse Ġpage . plus ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLoad Result . Page ( repo DTO , Ġprev Key , Ġnext Key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }