package Ġkr . ac . sn u . hc il . om n itr ack . ui . pages . services Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġkr . ac . sn u . hc il . om n itr ack . core . external s . OT External Service Ċ import Ġkr . ac . sn u . hc il . om n itr ack . views . dependency . Dependency Control ViewModel Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġyo un gh ok im Ġon Ġ 2 0 1 7 . Ġ 5 . Ġ 2 5 .. Ċ Ġ*/ Ċ class ĠService Activation ViewModel Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠState Ġ{ ĠChecking , ĠId le Not Sat ist ified , ĠS atisf ied Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsubscriptions Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġvar Ġattached Service : ĠO T External Service ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Thumbnail Res Id . onNext ( value . thumb ResourceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠserviceName Res Id . onNext ( value . name ResourceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Desc Res Id . onNext ( value . desc ResourceId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dependency ViewModels Ġ= Ġvalue . dependency List . map Ġ{ ĠDependency Control ViewModel ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Thumbnail Res Id . onNext ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠserviceName Res Id . onNext ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Desc Res Id . onNext ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dependency ViewModels Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcurrent State : ĠBehavior Subject < State > Ġ= ĠBehavior Subject . create () ĊĠĠĠ Ġvar Ġservice Thumbnail Res Id : ĠBehavior Subject < Int > Ġ= ĠBehavior Subject . create () ĊĠĠĠ Ġvar ĠserviceName Res Id : ĠBehavior Subject < Int > Ġ= ĠBehavior Subject . create () ĊĠĠĠ Ġvar Ġservice Desc Res Id : ĠBehavior Subject < Int > Ġ= ĠBehavior Subject . create () ĊĊĠĠĠ Ġvar Ġservice Dependency ViewModels : ĠBehavior Subject < List < Dependency Control ViewModel >> Ġ= ĠBehavior Subject . create () ĊĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Dependency ViewModels : ĠList < Dependency Control ViewModel >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . merge ( it . map Ġ{ Ġmodel Ġ-> Ġmodel . on Status Changed . map Ġ{ Ġstate Ġ-> ĠPair ( model , Ġstate ) Ġ} Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State . onNext ( combine Current Dependency ViewModel State ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Dependency ViewModels . onNext ( value Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent State . onNext ( State . Idle Not Sat ist ified ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcombine Current Dependency ViewModel State (): ĠState Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnull Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġfatal Failed Exists Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcurrent Dependency ViewModels ?. forEach Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model . on Status Changed . hasValue ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model . on Status Changed . value Ġ== ĠDependency Control ViewModel . State . CHECK ING Ġ|| Ġmodel . on Status Changed . value Ġ== ĠDependency Control ViewModel . State . RESOL V ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState . Checking ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( model . on Status Changed . value Ġ== ĠDependency Control ViewModel . State . FAILED _ FATAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfatal Failed Exists Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fatal Failed Exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠState . Idle Not Sat ist ified ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġreturn Ġif Ġ( null Count Ġ== Ġ 0 ) ĠState . Satisf ied Ġelse ĠState . Idle Not Sat ist ified ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Dependency Check ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( currentState . value Ġ== ĠState . Checking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdependency Models Ġ= Ġservice Dependency ViewModels . value Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġdependency Models . forEach Ġ{ Ġit . check Dependency ( context ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġobservable s Ġ= Ġdependency Models . map Ġ{ Ġit . on Status Changed . take Until Ġ{ Ġstate Ġ-> Ġstate Ġ!= ĠDependency Control ViewModel . State . CHECK ING Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġdependency Check Subscriptions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . zip < State >( observable s , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Array Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Array . filter Ġ{ Ġit Ġ== ĠDependency Control ViewModel . State . FAILED _ FATAL Ġ}. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . Idle Not Sat ist ified ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState . Satisf ied ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent State . onNext ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Service ĠActivation ĠDependency ĠCheck Ġfinished .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) */ ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġactivate Service (): ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġattached Service ?. activate Sil ently () Ġ?: ĠSingle . just ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġsubscriptions . clear () ĊĠĠĠ Ġ} Ċ Ċ }