package Ġcom . task . data . remote Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . paging . Page Key ed DataSource Ċ import Ġcom . task . data . Resource Ċ import Ġcom . task . data . dto . image . Image Item Ċ import Ġcom . task . data . error . NETWORK _ ERROR Ċ import Ġcom . task . data . error . NO _ INTER NET _ CONNECTION Ċ import Ġcom . task . data . remote . service . Gallery Service Ċ import Ġcom . task . utils . Network Connectivity Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġretrofit 2 . Response Ċ import Ġjava . io . IOException Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠK arth ik ĠS ĠS Ċ Ġ*/ Ċ class ĠImage Pagination DataSource Ċ @ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope : ĠCor outine Scope , ĊĠĠĠ Ġprivate Ġval Ġservice Generator : ĠService Generator , ĊĠĠĠ Ġprivate Ġval Ġnetwork Connectivity : ĠNetwork Connectivity Ċ ) Ġ: ĠPage Key ed DataSource < Int , ĠImage Item >() Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġimage Service : ĠGallery Service Ġ= Ġservice Generator . create Service ( Gallery Service :: class . java ) ĊĠĠĠ Ġvar Ġloading Status Ġ= ĠMutable LiveData < Resource < Any >>() ĊĊĠĠĠ Ġoverride Ġfun Ġload Initial ( ĊĠĠĠĠĠĠĠ Ġparams : ĠLoad Initial Params < Int >, ĊĠĠĠĠĠĠĠ Ġcallback : ĠLoad Initial Callback < Int , ĠImage Item > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Call ( 1 , Ġparams . requested Load Size , Ġimage Service :: fetch Images ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( response Ġas ĠArrayList < Image Item >, Ġnull , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Status . value Ġ= ĠResource . Data Error ( response Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġload After ( params : ĠLoad Params < Int >, Ġcallback : ĠLoad Callback < Int , ĠImage Item >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Call ( params . key , Ġparams . requested Load Size , Ġimage Service :: fetch Images ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( response Ġas ĠArrayList < Image Item >, Ġparams . key Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Status . value Ġ= ĠResource . Data Error ( response Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Before ( params : ĠLoad Params < Int >, Ġcallback : ĠLoad Callback < Int , ĠImage Item >) Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Not Ġyet Ġimplemented ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġprocess Call ( ĊĠĠĠĠĠĠĠ Ġpage : ĠInt , ĊĠĠĠĠĠĠĠ Ġlimit : ĠInt , ĊĠĠĠĠĠĠĠ Ġresponse Call : Ġsuspend Ġ( Int , ĠInt ) Ġ-> ĠResponse < *> ĊĠĠĠ Ġ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! network Connectivity . isConnected ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNO _ INTER NET _ CONNECTION ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġresponse Call . invoke ( page , Ġlimit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Code Ġ= Ġresponse . code () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNET WORK _ ERROR ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }