package Ġru . coffee plan ter . map test . data Ċ Ċ import Ġandroid . util . Log Ċ import Ġru . coffee plan ter . map test . data . model . Point Ċ import Ġjava . util .* Ċ Ċ class ĠPoints Repository Ġprivate Ġconstructor ( private Ġval Ġpoints Remote DataSource : ĠDataSource , Ġprivate Ġval Ġpoints Local DataSource : ĠDataSource ) Ġ: ĠDataSource Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcached Points : ĠMutable List < Point > ĊĠĠĠ Ġprivate Ġvar Ġare All Points Loaded In Cache Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġval ĠisEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpoints Local DataSource . isEmpty Ġ|| Ġpoints Remote DataSource . isEmpty ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Points Ġ= ĠArrayList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ========== ĠDataSource Ġ========== ĊĊĠĠĠ Ġoverride Ġfun Ġget Points ( callback : ĠDataSource . GetData Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Points ( DataSource . DEFAULT _ REMOTE _ START _ POSITION , ĠDataSource . DEFAULT _ REMOTE _ PAGE _ SIZE , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Points ( callback : ĠDataSource . GetData Callback , Ġis Activity Re created : ĠBoolean , Ġare Points Downloaded : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġare All Points Loaded In Cache Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( cached Points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Data Ġgot Ġfrom Ġmemory Ġcache ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġare Points Downloaded Ġ-> Ġget Points From Local DataSource ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Activity Re created Ġ-> Ġget Points From Local And Remote DataSource ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġget Points From Remote DataSource ( callback , ĠDataSource . DEFAULT _ REMOTE _ START _ POSITION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Points From Local DataSource ( callback : ĠDataSource . GetData Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpoints Local DataSource . get Points ( object Ġ: ĠDataSource . GetData Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( points : ĠList < Point >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Points . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Points . addAll ( points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( cached Points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġare All Points Loaded In Cache Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Data Ġgot Ġfrom Ġlocal Ġdata Ġsource ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġwhile Ġgetting Ġpoints Ġfrom Ġlocal Ġdatabase ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Points From Local And Remote DataSource ( callback : ĠDataSource . GetData Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpoints Local DataSource . get Points ( object Ġ: ĠDataSource . GetData Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( points : ĠList < Point >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Points . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Points . addAll ( points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( cached Points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Point Stored Ġ= Ġpoints [ points . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Points From Remote DataSource ( callback , Ġlast Point Stored . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Data Ġpartially Ġstored Ġin Ġthe Ġlocal Ġdatabase , Ġcontinue Ġto Ġdownload Ġit Ġfrom Ġthe Ġremote Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Points From Remote DataSource ( callback , ĠDataSource . DEFAULT _ REMOTE _ START _ POSITION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Points From Remote DataSource ( callback : ĠDataSource . GetData Callback , ĠstartPosition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpoints Remote DataSource . get Points ( start Position , ĠDataSource . DEFAULT _ REMOTE _ PAGE _ SIZE , Ġobject Ġ: ĠDataSource . GetData Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( points : ĠList < Point >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoints Local DataSource . save Points ( points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Points . addAll ( points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( cached Points ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġare All Points Loaded In Cache Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Data Ġgot Ġfrom Ġremote Ġdata Ġsource ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġwhile Ġgetting Ġpoints Ġfrom Ġremote Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Points ( start From : ĠInt , Ġcallback : ĠDataSource . GetData Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Points ( start From , ĠDataSource . DEFAULT _ REMOTE _ PAGE _ SIZE , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Points ( start From : ĠInt , ĠpageSize : ĠInt , Ġcallback : ĠDataSource . GetData Callback ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Points ( points : ĠList < Point >) Ġ{} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠPoints Repository :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġinstance : ĠPoints Repository ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( tasks Remote DataSource : ĠDataSource , Ġtasks Local DataSource : ĠDataSource ): ĠPoints Repository Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= ĠPoints Repository ( tasks Remote DataSource , Ġtasks Local DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance Ġas ĠPoints Repository ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠĠĠĠĠ Ġfun Ġdestroy Instance () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ