package Ġcom . c zech . mu v ies . data Sources Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . paging . DataSource Ċ import Ġandroidx . paging . Page Key ed DataSource Ċ import Ġcom . c zech . mu v ies . Build Config Ċ import Ġcom . c zech . mu v ies . LANGUAGE Ċ import Ġcom . c zech . mu v ies . models . Movies Ċ import Ġcom . c zech . mu v ies . network . Movies ApiService Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . lang . Exception Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ class ĠUp coming DataSource ( private Ġvar Ġapi Service : ĠMov ies ApiService , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context ): ĠPage Key ed DataSource < Int , ĠMov ies . Movies Result >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġscope Ġ= ĠCor outine Scope ( coroutine Context Ġ+ Ġjob ) ĊĊĠĠĠ Ġoverride Ġfun Ġload Initial ( params : ĠLoad Initial Params < Int >, Ġcallback : ĠLoad Initial Callback < Int , ĠMov ies . Movies Result >) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi Service . get Paged Up coming List ( Build Config . API _ KEY , ĠLANGUAGE , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . is Successful Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( response . body () !!. results , Ġnull , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Movies DataSource ", Ġ" Failed Ġto Ġfetch Ġupcoming Ġmovies !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload After ( params : ĠLoad Params < Int >, Ġcallback : ĠLoad Callback < Int , ĠMov ies . Movies Result >) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi Service . get Paged Up coming List ( Build Config . API _ KEY , ĠLANGUAGE , Ġparams . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . is Successful Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Result ( response . body () !!. results , Ġparams . key Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Movies DataSource ", Ġ" Failed Ġto Ġfetch Ġupcoming Ġmovies !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Before ( params : ĠLoad Params < Int >, Ġcallback : ĠLoad Callback < Int , ĠMov ies . Movies Result >) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . invalidate () ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUp coming DataSource Factory ( private Ġval Ġapi Service : ĠMov ies ApiService , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context ): ĠDataSource . Factory < Int , ĠMov ies . Movies Result >() Ġ{ ĊĊĠĠĠ Ġval Ġupcoming DataSource LiveData Ġ= ĠMutable LiveData < Up coming DataSource >() ĊĊĠĠĠ Ġoverride Ġfun Ġcreate (): ĠDataSource < Int , ĠMov ies . Movies Result > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupcoming DataSource Ġ= ĠUp coming DataSource ( api Service , ĠDispatch ers . IO ) ĊĠĠĠĠĠĠĠ Ġupcoming DataSource LiveData . post Value ( up coming DataSource ) ĊĠĠĠĠĠĠĠ Ġreturn Ġupcoming DataSource ĊĠĠĠ Ġ} Ċ Ċ }