package Ġcom . bern af err ari . change detection . data . source . local Ċ Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġcom . bern af err ari . change detection . data . Site Ċ import Ġcom . bern af err ari . change detection . data . source . Sites DataSource Ċ import Ġcom . bern af err ari . change detection . util . App Executors ĊĊ Ċ /** Ċ Ġ* ĠConcrete Ġimplementation Ġof Ġa Ġdata Ġsource Ġas Ġa Ġdb . Ċ Ġ* ĠIn sp ired Ġfrom ĠArchitecture ĠComponents ĠMV VM Ġsample Ġapp Ċ Ġ*/ Ċ class ĠS ites Local DataSource // ĠPrevent Ġdirect Ġinstantiation . Ċ private Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġm App Executors : ĠApp Executors , ĊĠĠĠ Ġprivate Ġval Ġm Sites Dao : ĠS ites Dao , ĊĠĠĠ Ġprivate Ġval Ġm D iffs Dao : ĠD iffs Dao Ċ ) Ġ: ĠS ites DataSource Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Site And Last Diff ( callback : Ġ( Mutable List < Site And Last Diff >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsites Ġ= Ġm Sites Dao . sites ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Site And Last Diff >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsites . map To ( list ) Ġ{ Ġsite Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSite And Last Diff ( site , Ġm D iffs Dao . getLast Diff Without Value By Site Id ( site . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm App Executors . main Thread (). execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . invoke ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm App Executors . disk IO (). execute ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNote : Ġ[ Load Tasks Callback . on Data Not Available ] Ġis Ġfired Ġif Ġthe Ġdatabase Ġdoesn 't Ġexist ĊĠĠĠĠ Ġ* Ġor Ġthe Ġtable Ġis Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Sites ( callback : ĠS ites DataSource . Load Sites Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsites Ġ= Ġm Sites Dao . sites ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm App Executors . main Thread (). execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sites . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġbe Ġcalled Ġif Ġthe Ġtable Ġis Ġnew Ġor Ġjust Ġempty . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Data Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Sites Loaded ( sites ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm App Executors . disk IO (). execute ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNote : Ġ[ Get Task Callback . on Data Not Available ] Ġis Ġfired Ġif Ġthe Ġ[ Site ] Ġisn 't ĊĠĠĠĠ Ġ* Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Site ( site Id : ĠString , Ġcallback : ĠS ites DataSource . Get Site Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrunnable Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsite Ġ= Ġm Sites Dao . get Site ById ( site Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm App Executors . main Thread (). execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( site Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Site Loaded ( site ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Data Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm App Executors . disk IO (). execute ( run nable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Site ( site : ĠSite ) Ġ{ ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( site ) ĊĠĠĠĠĠĠĠ Ġval Ġsave Runnable Ġ= ĠRunnable Ġ{ Ġm Sites Dao . insert Site ( site ) Ġ} ĊĠĠĠĠĠĠĠ Ġm App Executors . disk IO (). execute ( save Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete All Sites () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelete Runnable Ġ= ĠRunnable Ġ{ Ġm Sites Dao . delete Sites () Ġ} ĊĊĠĠĠĠĠĠĠ Ġm App Executors . disk IO (). execute ( delete Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Site ( site Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelete Runnable Ġ= ĠRunnable Ġ{ Ġm Sites Dao . delete Site ById ( site Id ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġm App Executors . disk IO (). execute ( delete Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠS ites Local DataSource ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Executors : ĠApp Executors , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsites Dao : ĠS ites Dao , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiffs Dao : ĠD iffs Dao ĊĠĠĠĠĠĠĠ Ġ): ĠS ites Local DataSource Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( Sites Local DataSource :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= ĠS ites Local DataSource ( app Executors , Ġsites Dao , Ġdiffs Dao ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġclear Instance () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ