/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠS ank et ĠB hat Ċ Ġ* Ċ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . ud acity . s ank et b hat . popular movies Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . paging . Pager Ċ import Ġandroidx . paging . Paging Config Ċ import Ġcom . ud acity . s ank et b hat . popular movies . api . The Movie DB ApiService Ċ import Ġcom . ud acity . s ank et b hat . popular movies . database . Movie Dao Ċ import Ġcom . ud acity . s ank et b hat . popular movies . model . Movie Ċ import Ġcom . ud acity . s ank et b hat . popular movies . model . Review Response Ċ import Ġcom . ud acity . s ank et b hat . popular movies . model . Video Response Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjava . util . concurrent . Executors Ċ Ċ // Class Ġthat Ġmanages Ġdata Ġfrom Ġnetwork Ġas Ġwell Ġas Ġlocal Ġdatabase Ċ class ĠMovie Repository Ġprivate Ġconstructor ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmovie Dao : ĠMovie Dao ĊĠĠĠ Ġprivate Ġval Ġservice : ĠThe Movie DB ApiService ĊĠĠĠ Ġprivate Ġval Ġexecutor : ĠExecutor ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠĠĠĠĠ Ġmovie Dao Ġ= ĠDependencies . get Movie Dao ( context ) ĊĠĠĠĠĠĠĠ Ġservice Ġ= ĠDependencies . the Movie DB ApiService ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Paged Movies ( sort Order : ĠString ) Ġ= ĠP ager ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP aging Config ( MOV IE _ PAGE _ SIZE , Ġenable Place holders Ġ= Ġfalse , Ġinitial Load Size Ġ= Ġ 2 0 ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠMovie Paging Source ( service , Ġsort Order ) ĊĠĠĠ Ġ}. flow ĊĊĠĠĠ Ġfun ĠgetAll F avorites () Ġ= ĠP ager ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= ĠP aging Config ( pageSize Ġ= ĠMOV IE _ PAGE _ SIZE , Ġenable Place holders Ġ= Ġfalse ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmovie Dao . all Movies () ĊĠĠĠ Ġ}. flow ĊĊĠĠĠ Ġfun Ġis Favorite ( id : ĠInt ): ĠLive Data < Movie > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmovie Dao . is Favorite ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Movie ( movie : ĠMovie ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ Ġmovie Dao . delete ( movie ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinsert Movie ( movie : ĠMovie ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ Ġmovie Dao . insert ( movie ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Reviews ( id : ĠInt , Ġcallback : ĠReview Response Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovie From Database Ġ= Ġmovie Dao . get Movie ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( movie From Database Ġ== Ġnull ) Ġload Reviews From Internet ( id , Ġfalse , Ġcallback ) Ġelse Ġif Ġ( movie From Database . review Response Ġ== Ġnull ) Ġload Reviews From Internet ( id , Ġtrue , Ġcallback ) Ġelse Ġcallback . on Review Response ( movie From Database . review Response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Videos ( id : ĠInt , Ġcallback : ĠVideo Response Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmovie From Database Ġ= Ġmovie Dao . get Movie ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( movie From Database Ġ== Ġnull ) Ġload Video From Internet ( id , Ġfalse , Ġcallback ) Ġelse Ġif Ġ( movie From Database . video Response Ġ== Ġnull ) Ġload Video From Internet ( id , Ġtrue , Ġcallback ) Ġelse Ġcallback . on Video Response ( movie From Database . video Response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Video From Internet ( id : ĠInt , Ġis Favorite : ĠBoolean , Ġcallback : ĠVideo Response Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġservice . get Videos ( id )?. enqueue ( object Ġ: ĠCallback < Video Response ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Video Response ? >, Ġresponse : ĠResponse < Video Response ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Response Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Video Response ( video Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Favorite Ġ&& Ġvideo Response Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ Ġmovie Dao . update Videos ( id , Ġvideo Response ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcallback . on Video Response ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Video Response ? >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Video Response ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Reviews From Internet ( id : ĠInt , Ġis Favorite : ĠBoolean , Ġcallback : ĠReview Response Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġservice . get Reviews ( id )?. enqueue ( object Ġ: ĠCallback < Review Response ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Review Response ? >, Ġresponse : ĠResponse < Review Response ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreview Response Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Review Response ( review Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Favorite Ġ&& Ġreview Response Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . execute Ġ{ Ġmovie Dao . update Reviews ( id , Ġreview Response ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcallback . on Review Response ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Review Response ? >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Review Response ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠReview Response Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Review Response ( review Response : ĠReview Response ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠVideo Response Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Video Response ( video Response : ĠVideo Response ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOCK Ġ= ĠAny () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmovie Repository : ĠMovie Repository ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// Singleton ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( context : ĠContext ): ĠMovie Repository Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( movie Repository Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( LOCK ) Ġ{ Ġmovie Repository Ġ= ĠMovie Repository ( context ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmovie Repository !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }