package Ġio . case y . mus ik cube . remote . framework Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġcom . u acf . task runner . Runner Ċ import Ġcom . u acf . task runner . Task Ċ import Ġio . case y . mus ik cube . remote . Application Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġio . reactivex . subjects . Subject Ċ import Ġjava . util . concurrent . atomic . Atomic Long Ċ Ċ abstract Ġclass ĠViewModel < T >( protected Ġval Ġrunner : ĠRunner ? Ġ= Ġnull ): ĠRunner . Task Callbacks Ġ{ ĊĠĠĠ Ġval Ġid : ĠLong Ġ= Ġnext Id . increment AndGet () ĊĠĠĠ Ġprivate Ġval Ġpublisher Ġby Ġlazy Ġ{ Ġcreate Subject () Ġ} ĊĊĠĠĠ Ġvar Ġpaused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġinterface ĠProvider Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< T : ĠViewModel <* >> Ġcreate ViewModel (): ĠT ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġpaused Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġpaused Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ( cleanup , ĠC LEAN UP _ DELAY _ MS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Cleanup () Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobserve (): ĠObservable < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpublisher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Android Schedulers . main Thread ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcontext : ĠContext Ġ= ĠApplication . instance ĊĊĠĠĠ Ġinternal Ġval Ġcleanup Ġ= ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġid To Instance . remove ( id ) ĊĠĠĠĠĠĠĠ Ġon Cleanup () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġpublish ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpublisher . onNext ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġcreate Subject (): ĠSubject < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPublish Subject . create () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Task Error ( name : ĠString ?, Ġid : ĠLong , Ġtask : ĠTask < *, Ġ*> ?, Ġerror : ĠThrowable ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Task Completed ( name : ĠString ?, Ġid : ĠLong , Ġtask : ĠTask < *, Ġ*> ?, Ġresult : ĠAny ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠC LEAN UP _ DELAY _ MS Ġ= Ġ 3 0 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnext Id Ġ= ĠAtomic Long ( System . currentTimeMillis () Ġ+ Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandler Ġby Ġlazy Ġ{ ĠHandler ( Looper . get Main Looper ()) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġid To Instance Ġ= Ġmutable Map Of < Long , ĠViewModel <* >>() ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< T : ĠViewModel <* >> Ġrestore ( id : ĠLong ): ĠT ? Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" unchecked _ cast ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance : ĠT ? Ġ= Ġid To Instance [ id ] Ġas ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instance Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . remove Callbacks ( instance . cleanup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ