package Ġio . mer cu let . core . repository Ċ Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mediator LiveData Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . support . annotation . MainThread Ċ import Ġandroid . support . annotation . Worker Thread Ċ import Ġio . mer cu let . core . vo . Resource Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ Ċ /** Ċ Ġ* Ġ@ Author ĠA aron Ċ Ġ* Ġ@ Email Ġa aron @ mer cu let . io Ċ Ġ* Ġ@ Description Ċ Ġ*/ Ċ abstract Ġclass ĠNetwork Bound Resource < Result Type , ĠRequest Type > Ġ@ MainThread Ġconstructor () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġapi Response : ĠLive Data < io . mer cu let . core . api . ApiResponse < RequestType >> ĊĠĠĠ Ġprotected Ġval Ġlive Data : ĠMutable LiveData < RequestType > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġprivate Ġval Ġresult Ġ= ĠMed iator LiveData < Resource < Result Type >>() ĊĊĠĠĠ Ġfun Ġas LiveData (): ĠLive Data < Resource < Result Type >> Ġ= Ġresult ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . value Ġ= ĠResource . loading ( null ) ĊĠĠĠĠĠĠĠ Ġresult . value ?. setOn Cancel Listener Ġ{ Ġcancel All () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Le aking This ") ĊĠĠĠĠĠĠĠ Ġval Ġdb Source Ġ= Ġload From Db () ĊĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ ä¸į çĶ¨ DB ï¼Į åĪĻ æ¯ıæ¬¡ éĥ½ fetch From Network ï¼Į æŃ¤ æĹ¶ db Source æ²¡æľī çĽĳåĲ¬ èĢħ ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Active Observer s For Net Work Only ( db Source )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch From Network ( db Source ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source ( db Source ) Ġ{ Ġresult Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . remove Source ( db Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Fetch ( result Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfetch From Network ( db Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source ( db Source ) Ġ{ Ġr T Ġ-> Ġresult . value Ġ= ĠResource . success ( r T ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġprivate Ġfun ĠsetValue ( newValue : ĠResource < Result Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result . value Ġ!= ĠnewValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= ĠnewValue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch From Network ( db Source : ĠLive Data < Result Type >) Ġ{ ĊĠĠĠĠĠĠĠ Ġapi Response Ġ= Ġcreate Call () ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġre - attach Ġdb Source Ġas Ġa Ġnew Ġsource , Ġit Ġwill Ġdispatch Ġits Ġlatest Ġvalue Ġquickly ĊĠĠĠĠĠĠĠ Ġresult . add Source ( db Source ) Ġ{ ĠnewData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue ( Resource . loading ( new Data )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . add Source ( api Response ) Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . remove Source ( api Response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . remove Source ( db Source ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġio . mer cu let . core . api . Api Success Response Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Response ( response ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ Ġsave Call Result ( it !! ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġspec ially Ġrequest Ġa Ġnew Ġlive Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġwe Ġwill Ġget Ġimmediately Ġlast Ġcached Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhich Ġmay Ġnot Ġbe Ġupdated Ġwith Ġlatest Ġresults Ġreceived Ġfrom Ġnetwork . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source ( load From Db ()) Ġ{ Ġresult Type Ġ-> Ġresult . value Ġ= ĠResource . success ( result Type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġio . mer cu let . core . api . Api Empty Response Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source ( load From Db ()) Ġ{ ĠnewData Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= ĠResource . success ( new Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġio . mer cu let . core . api . Api ErrorResponse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Fetch Failed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Active Observer s For Net Work Only ( db Source )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add Source ( db Source ) Ġ{ Ġresult Type Ġ-> Ġresult . value Ġ= Ġresponse . errorMessage . let Ġ{ ĠResource . error ( result Type , Ġit ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . value Ġ= Ġresponse . errorMessage . let Ġ{ ĠResource . error ( null , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprotected Ġopen Ġfun Ġprocess Response ( response : Ġio . mer cu let . core . api . Api Success Response < RequestType >) Ġ= Ġresponse . body ĊĊĠĠĠ Ġ// Ġå°Ĩ ç½ĳç»ľ èİ·åıĸ çļĦæķ°æį® åŃĺåĤ¨ åĪ° db ĊĠĠĠ Ġ@ Worker Thread ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġsave Call Result ( item : ĠRequest Type ) ĊĊĠĠĠ Ġ// Ġæĺ¯åĲ¦ éľĢè¦ģ ä»İ ç½ĳç»ľ éĩįæĸ° èİ·åıĸ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġshould Fetch ( data : ĠResult Type ?): ĠBoolean ĊĊĠĠĠ Ġ// Ġä»İ db åĨħ èİ·åıĸ cache æķ°æį® ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġload From Db (): ĠLive Data < Result Type > ĊĊĠĠĠ Ġ// Ġä»İ ç½ĳç»ľ ä¸Ń èİ·åıĸ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġcreate Call (): ĠLive Data < io . mer cu let . core . api . ApiResponse < RequestType >> ĊĊĠĠĠ Ġ// Ġ ç½ĳç»ľ èİ·åıĸ å¤±è´¥ ĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Fetch Failed () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġcancel All () Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . remove Source ( api Response ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Active Observer s For Net Work Only ( db Source : ĠLive Data < Result Type >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb Source . has Active Observer s () ĊĠĠĠ Ġ} Ċ }