/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠDesign ed Ġand Ġdeveloped Ġby Ġ 2 0 1 8 Ġsky do ves Ġ( Ja ew o ong ĠE um ) Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . sky do ves . the movies . repository Ċ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . annotation . Worker Thread Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mediator LiveData Ċ import Ġcom . sky do ves . the movies . api . ApiResponse Ċ import Ġcom . sky do ves . the movies . map pers . Network Response Mapper Ċ import Ġcom . sky do ves . the movies . models . Network Response Model Ċ import Ġcom . sky do ves . the movies . models . Resource Ċ import Ġtim ber . log . Tim ber Ċ Ċ abstract Ġclass ĠNetwork Bound Repository < Result Type , ĊĠ ĠRequest Type Ġ: ĠNetwork Response Model , ĊĠ ĠMapper Ġ: ĠNetwork Response Mapper < RequestType >> Ċ internal Ġconstructor () Ġ{ ĊĊĠ Ġprivate Ġval Ġresult : ĠMed iator LiveData < Resource < Result Type >> Ġ= ĠMed iator LiveData () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ ĠTim ber . d (" Injection ĠNetwork Bound Repository ") ĊĠĠĠ Ġval Ġloaded From DB Ġ= Ġthis . load From Db () ĊĠĠĠ Ġresult . add Source ( loaded From DB ) Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠ Ġresult . remove Source ( loaded From DB ) ĊĠĠĠĠĠ Ġif Ġ( should Fetch ( data )) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . post Value ( Resource . loading ( null )) ĊĠĠĠĠĠĠĠ Ġfetch From Network ( loaded From DB ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . add Source < Result Type >( loaded From DB ) Ġ{ ĠnewData Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠsetValue ( Resource . success ( new Data , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfetch From Network ( loaded From DB : ĠLive Data < Result Type >) Ġ{ ĊĠĠĠ Ġval Ġapi Response Ġ= Ġfetch Service () ĊĠĠĠ Ġresult . add Source ( api Response ) Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠ Ġresponse ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Fetch Data ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloaded Ġ= Ġload From Db () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source ( loaded ) Ġ{ ĠnewData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewData ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( Resource . success ( new Data , Ġmapper (). on Last Page ( response . body ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . remove Source ( loaded From DB ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Fetch Failed ( response . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source < Result Type >( loaded From DB ) Ġ{ ĠnewData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( Resource . error ( it , ĠnewData )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ MainThread ĊĠ Ġprivate Ġfun ĠsetValue ( newValue : ĠResource < Result Type >) Ġ{ ĊĠĠĠ Ġresult . value Ġ= ĠnewValue ĊĠ Ġ} ĊĊĠ Ġfun Ġas LiveData (): ĠLive Data < Resource < Result Type >> Ġ{ ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġ@ Worker Thread ĊĠ Ġprotected Ġabstract Ġfun Ġsave Fetch Data ( items : ĠRequest Type ) ĊĊĠ Ġ@ MainThread ĊĠ Ġprotected Ġabstract Ġfun Ġshould Fetch ( data : ĠResult Type ?): ĠBoolean ĊĊĠ Ġ@ MainThread ĊĠ Ġprotected Ġabstract Ġfun Ġload From Db (): ĠLive Data < Result Type > ĊĊĠ Ġ@ MainThread ĊĠ Ġprotected Ġabstract Ġfun Ġfetch Service (): ĠLive Data < ApiResponse < RequestType >> ĊĊĠ Ġ@ MainThread ĊĠ Ġprotected Ġabstract Ġfun Ġmapper (): ĠMapper ĊĊĠ Ġ@ MainThread ĊĠ Ġprotected Ġabstract Ġfun Ġon Fetch Failed ( message : ĠString ?) Ċ } Ċ