package Ġcom . gang . not odo . data . task Ċ Ċ import Ġcom . gang . not odo . data . task . local . Task Local Source Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* ĠTask ĠçļĦ ä»ĵåºĵ Ċ Ġ* Ġ æīĢæľī æŃ¤ ç±» çļĦæĸ¹æ³ķ Ġ å¿ħé¡» åľ¨ ä¸» çº¿ç¨ĭ ä¸Ń è°ĥçĶ¨ Ċ Ġ*/ Ċ object ĠTask Repository Ġ: ĠTask DataSource , ĠTask Cache Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcache Is Dirty Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġvar Ġloading Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġlocal Ġ= ĠTask Local Source ĊĊĠĠĠ Ġprivate Ġvar Ġcached Tasks : ĠLinkedHashMap < String , ĠTask > Ġ= ĠLinkedHashMap () ĊĊĠĠĠ Ġprivate Ġval Ġblocked Callback : ĠQueue < Task DataSource . Load Tasks Callback > Ġ= ĊĠĠĠĠĠĠĠ ĠLinkedList < Task DataSource . Load Tasks Callback >() ĊĊĠĠĠ Ġprivate Ġvar Ġon Refresh Observer s Ġ= Ġmutable ListOf < () Ġ-> ĠUnit >() ĊĊĠĠĠ Ġvar ĠuserId : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġget Tasks ( callback : ĠTask DataSource . Load Tasks Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ-> Ġblocked Callback . offer ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Is Dirty Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblocked Callback . offer ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ// Ġ! cache Is Dirty Ġ&& Ġ! loading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Tasks Loaded ( cached Tasks . values . toList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Tasks By Date ( ĊĠĠĠĠĠĠĠ Ġyear : ĠInt , ĊĠĠĠĠĠĠĠ Ġmonth : ĠInt , ĊĠĠĠĠĠĠĠ Ġday : ĠInt , ĊĠĠĠĠĠĠĠ Ġcallback : ĠTask DataSource . Load Tasks Callback ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! cache Is Dirty Ġ&& Ġ! loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Tasks . values . filter Ġ{ Ġit . year Ġ== Ġyear Ġ&& Ġit . month Ġ== Ġmonth Ġ&& Ġit . day Ġ== Ġday Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Tasks Loaded ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Data Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . get Tasks By Date ( year , Ġmonth , Ġday , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Task ( taskId : ĠString , Ġcallback : ĠTask DataSource . Get Task Callback ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! cache Is Dirty Ġ&& Ġ! loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġcached Tasks [ taskId ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask ?. let Ġ{ Ġcallback . on Task Loaded ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . get Task ( taskId , Ġcallback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Task ( task : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Tasks [ task . id ] Ġ= Ġtask ĊĠĠĠĠĠĠĠ Ġlocal . save Task ( task ) ĊĠĠĠĠĠĠĠ Ġon Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Completed Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Tasks Ġ= Ġcached Tasks . filter Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isActive ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠLinkedHashMap < String , ĠTask > ĊĠĠĠĠĠĠĠ Ġlocal . clear Completed Tasks () ĊĠĠĠĠĠĠĠ Ġon Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcomplete Task ( taskId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Tasks [ taskId ]?. is Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġlocal . complete Task ( taskId ) ĊĠĠĠĠĠĠĠ Ġon Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete All Tasks () Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Tasks . clear () ĊĠĠĠĠĠĠĠ Ġlocal . delete All Tasks () ĊĠĠĠĠĠĠĠ Ġon Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Task ( taskId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Tasks . remove ( taskId ) ĊĠĠĠĠĠĠĠ Ġlocal . delete Task ( taskId ) ĊĠĠĠĠĠĠĠ Ġon Refresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Refresh Cache ( tasks : ĠList < Task >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcached Tasks . clear () ĊĠĠĠĠĠĠĠ Ġtasks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Tasks [ it . id ] Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcache Is Dirty Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! blocked Callback . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocked Callback . poll ()?. on Tasks Loaded ( tasks ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Not Available () Ġ{ ĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! blocked Callback . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblocked Callback . poll ()?. on Data Not Available () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrefresh All () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcache Is Dirty Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcached Tasks . clear () ĊĠĠĠĠĠĠĠ Ġlocal . get Tasks ( object Ġ: ĠTask DataSource . Load Tasks Callback Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tasks Loaded ( tasks : ĠList < Task >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Refresh Cache ( tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Not Available () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Refresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Refresh Observer s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On Refresh Observer ( on Refresh Observer : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Refresh Observer s . add ( on Refresh Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove On Refresh Observer ( on Refresh Observer : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Refresh Observer s . remove ( on Refresh Observer ) ĊĠĠĠ Ġ} Ċ }