package Ġcom . android . sample . common . base Ċ Ċ import Ġcom . android . sample . common . util . No DataException Ċ import Ġio . reactivex . Observable Ċ Ċ abstract Ġclass ĠBase Repository < T > Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcache Is Dirty Ġ= Ġfalse ĊĊĠĠĠ Ġprotected Ġabstract Ġval Ġresult From Remote DataSource : ĠObservable < T > ĊĊĠĠĠ Ġprotected Ġabstract Ġval Ġresult From Local DataSource : ĠT ? ĊĊĠĠĠ Ġprivate Ġval Ġremote Result ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresult From Remote DataSource . do On Complete Ġ{ Ġcache Is Dirty Ġ= Ġfalse Ġ} ĊĊĠĠĠ Ġopen Ġfun ĠisEmpty ( result From Local DataSource : ĠT ?) Ġ= ĊĠĠĠĠĠĠĠ Ġresult From Local DataSource Ġ== Ġnull ĊĊĠĠĠ Ġval Ġresult : ĠObservable < T > Ġ= ĊĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ Ġcache Is Dirty Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult From Local DataSource Ġ= Ġresult From Local DataSource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . create Ġ{ Ġsubscriber Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isEmpty ( result From Local DataSource )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . onError ( No DataException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult From Local DataSource ?. let Ġ{ Ġit 1 Ġ-> Ġsubscriber . onNext ( it 1 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. onError Resume Next ( remote Result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġcache Is Dirty Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ }