package Ġcom . wt m ber lin . data Ċ Ċ import Ġcom . wt m ber lin . data . Refresh Status .* Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . functions . Bi Function Ċ import Ġio . reactivex . processors . Behavior Processor Ċ import Ġio . reactivex . processors . Publish Processor Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġtim ber . log . Tim ber Ċ Ċ abstract Ġclass ĠNetwork Bound Resource < Network T , ĠDatabase T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrefresh Events Ġ= ĠPublish Processor . create < Refresh Event >() ĊĊĠĠĠ Ġprivate Ġval Ġrefresh Statuses Ġ= ĠBehavior Processor . create < Refresh Status >() ĊĠĠĠ Ġprivate Ġvar Ġrefresh Start Ġ= Ġ 0 L ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Events ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ Ġrefresh Start Ġ= ĠSystem . currentTimeMillis () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Refresh () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ ĠTim ber . w (" Refresh Ġtime : Ġ${ System . currentTimeMillis () Ġ- Ġrefresh Start }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĊĠĠĠĠĠĠĠ Ġrefresh Statuses . onNext ( Idle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Events . onNext ( Refresh Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvalues (): ĠFlow able < Result < Database T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFlow able . combine Latest ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload From Database (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Statuses , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBi Function Ġ{ Ġdata : ĠDatabase T , Ġrefresh Status : ĠRefresh Status Ġ-> Ġto Result ( data , Ġrefresh Status ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ ĠResult < Database T >( loading Ġ= Ġfalse , Ġdata Ġ= Ġnull , Ġerror Ġ= Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Result ( data : ĠDatabase T , Ġrefresh Status : ĠRefresh Status ) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( refresh Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠId le Ġ-> ĠResult ( loading Ġ= Ġfalse , Ġdata Ġ= Ġdata , Ġerror Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIn Progress Ġ-> ĠResult ( loading Ġ= Ġtrue , Ġdata Ġ= Ġdata , Ġerror Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Ġ-> ĠResult ( loading Ġ= Ġfalse , Ġdata Ġ= Ġdata , Ġerror Ġ= Ġrefresh Status . error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġload From Network (): ĠSingle < Network T > ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġload From Database (): ĠFlow able < Database T > ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġsave To Database ( value : ĠNetwork T ) ĊĊĠĠĠ Ġprivate Ġfun Ġdo Refresh (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġload From Network () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ ĠComp letable . from Action Ġ{ Ġsave To Database ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Subscribe Ġ{ Ġrefresh Statuses . onNext ( InProgress ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ Ġrefresh Statuses . onNext ( Idle ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do OnError Ġ{ Ġrefresh Statuses . onNext ( Error ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Complete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . computation ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠRefresh Event Ċ Ċ private Ġsealed Ġclass ĠRefresh Status Ġ{ ĊĠĠĠ Ġobject ĠId le Ġ: ĠRefresh Status () ĊĠĠĠ Ġobject ĠIn Progress Ġ: ĠRefresh Status () ĊĠĠĠ Ġdata Ġclass ĠError ( val Ġerror : ĠThrowable ) Ġ: ĠRefresh Status () Ċ }