package Ġro . dob re sc u and rei . mv vm . editor Ċ Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġro . dob re sc u and rei . mv vm . Base ViewModel Ċ import Ġro . dob re sc u and rei . mv vm . R Ċ import Ġro . dob re sc u and rei . mv vm . utils . Foreground EventBus Ċ import Ġro . dob re sc u and rei . mv vm . utils . Ident ifiable Ċ import Ġro . dob re sc u and rei . mv vm . utils . On Editor Model Ċ import Ġro . dob re sc u and rei . utils . Run Ċ Ċ abstract Ġclass ĠBase Editor ViewModel < MODEL Ġ: ĠIdent ifiable < ID >, ĠID > Ġ: ĠBase ViewModel Ċ { ĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġval Ġmodel Ġ: ĠMutable LiveData < MODEL > Ġby Ġlazy Ġ{ ĠMutable LiveData < MODEL >() Ġ} ĊĊĠĠĠ Ġ@ Published Api ĊĠĠĠ Ġinternal Ġvar Ġshould Notify Model LiveData On Property Change Ġ: ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġvar ĠisValid Ġ: ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġopen Ġfun Ġ Ġadd Mode () Ġ= Ġmodel . value ?. id == null ĊĠĠĠ Ġopen Ġfun Ġedit Mode () Ġ= Ġmodel . value ?. id != null ĊĊĠĠĠ Ġabstract Ġfun Ġadd Ġ( model Ġ: ĠMODEL ) Ġ: ĠID ĊĠĠĠ Ġabstract Ġfun Ġedit ( model Ġ: ĠMODEL ) ĊĊĠĠĠ Ġopen Ġfun Ġprovide ErrorMessage ( ex Ġ: ĠException ? Ġ= Ġnull ) Ġ= ĠR . string . you _ have _ errors _ please _ correct ĊĊĠĠĠ Ġconstructor ( model Ġ: ĠMODEL ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . model . value = model ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġoperator Ġfun Ġrange To ( consumer Ġ: ĠMODEL .( MODEL ) Ġ-> Ġ( Unit )) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel . value ?. let Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer ( model , Ġmodel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Notify Model LiveData On Property Change ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . model . value = model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Save Button Clicked () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isValid ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloading . value = true ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . value ?. let Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Mode = add Mode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRun . async ( task Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . id = add ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġedit ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Any Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading . value = false ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror . value = provide ErrorMessage ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFore ground EventBus . post ( if Ġ( add Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOn Editor Model . Added Event ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠOn Editor Model . Edited Event ( model )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFore ground EventBus . post ( On Editor Model . Added Or Edited Event ( model )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror . value = provide ErrorMessage () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ