package Ġde . half bit . k not 3 . sample Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Disposable Ċ import Ġio . reactivex . rx java 3 . functions . Consumer Ċ Ċ class ĠMain ViewModel ( ĊĠĠĠ Ġstate Observer : ĠObservable < State >, ĊĠĠĠ Ġprivate Ġval Ġchange Consumer : ĠConsumer < Change >, ĊĠĠĠ Ġprivate Ġval Ġdis posable : ĠDis posable Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġshow Button : ĠObservable < Boolean > Ġ= Ġstate Observer ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ== ĠState . Initial Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĊĠĠĠ Ġval Ġshow Loading : ĠObservable < Boolean > Ġ= Ġstate Observer ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ== ĠState . Loading Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĊĠĠĠ Ġval Ġshow Movies : ĠObservable < List < Movie >> Ġ= Ġstate Observer ĊĠĠĠĠĠĠĠ Ġ. of Type ( State . Ready :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . movies Ġ} ĊĠĠĠĠĠĠĠ Ġ. distinct Until Changed () ĊĊĠĠĠ Ġfun Ġon Button Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Consumer . accept ( Change . Load ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ Ġdis posable . dispose () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġval Ġmain ViewModel Factory : ĠViewModel Provider . Factory ĊĠĠĠ Ġget () Ġ= Ġobject Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel > Ġcreate ( model Class : ĠClass < T >): ĠT Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model Class . isAssignableFrom ( Main ViewModel :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Main K not (). let Ġ{ Ġk not Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMain ViewModel ( k not . state , Ġk not . change , Ġk not ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġerror (" Unsupported Ġmodel Ġtype : Ġ$ model Class ") ĊĠĠĠ Ġ} Ċ