package Ġcom . ke cs ot . le it ner box . base . detail Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . ke cs ot . base ke cs ot . R Ċ import Ġcom . ke cs ot . base ke cs ot . view . alert dialog . Base AlertDialog Ċ import Ġcom . ke cs ot . base ke cs ot . view . alert dialog . Base AlertDialog Event Ċ import Ġcom . ke cs ot . base ke cs ot . view . alert dialog . Positive Click AlertDialog Event Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġio . reactivex . subjects . Publish Subject Ċ Ċ abstract Ġclass ĠAbstract Details Fragment < T , ĠVM Ġ: ĠAbstract Details ViewModel < T >> Ġ: ĠAbstract Le it ner Fragment () Ġ{ ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar ĠviewModel : ĠVM ĊĊĠĠĠ Ġprivate Ġvar Ġdelete Dialog : ĠBase AlertDialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠonDelete Dialog Event Publish Subject Ġ= ĠPublish Subject . create < Base AlertDialog Event >() ĊĠĠĠ Ġprivate Ġvar ĠonDelete Dialog Visibility Behavior Subject Ġ= ĠBehavior Subject . create < Boolean >() ĊĊĊĠĠĠ Ġabstract Ġfun Ġcreate ViewModel (): ĠVM ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġcreate ViewModel () ĊĊĠĠĠĠĠĠĠ Ġsetup Arguments () ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġget Argument ItemId (): ĠLong ĊĠĠĠ Ġabstract Ġfun Ġget Argument Screen Type (): ĠBase Details Fragment Screen Type ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġpublic Ġopen Ġfun Ġsetup Arguments () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġargument ItemId Ġ= Ġget Argument ItemId () ĊĠĠĠĠĠĠĠ Ġval Ġargument Screen Type Ġ= Ġget Argument Screen Type () ĊĊĠĠĠĠĠĠĠ ĠviewModel . screen Type . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . screen Type . value Ġ= Ġargument Screen Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( argument Screen Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Details Fragment Screen Type . EDIT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Details Fragment Screen Type . VIEW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( argument ItemId ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . detail Item . value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Entity ById ( argument ItemId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Details Fragment Screen Type . ADD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Default Item () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Subscribe Reactive X Observable s () Ġ{ ĊĠĠĠĠĠĠĠ ĠonDelete Dialog Event Publish Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Type ( Positive Click AlertDialog Event :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . detail Item . value ?. let Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . delete Entity ById ( getItem Id ( item )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Composite Disposable () ĊĊĠĠĠĠĠĠĠ Ġ// ĠIt Ġwill Ġemit Ġwhen Ġuser Ġrotate Ġscreen , Ġand Ġit Ġwill Ġre show Ġdialog Ġif Ġneeded ĊĠĠĠĠĠĠĠ ĠonDelete Dialog Visibility Behavior Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġis Last State Visible Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Delete Dialog Visible Ġ= Ġdelete Dialog ?. is Showing () Ġ== Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Last State Visible Ġ&& Ġ! is Delete Dialog Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Delete Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Composite Disposable () ĊĊĠĠĠĠĠĠĠ ĠviewModel . on Detail Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCreate Entity Fragment Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUpdate Entity Fragment Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDelete Entity Fragment Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Sn ackBar ( R . string . base _ general _ success ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLoad Entity Fragment Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate Back () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Sn ackBar ( R . string . base _ general _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Composite Disposable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġupdate Screen By Item ( item : ĠT ) ĊĠĠĠ Ġopen Ġfun Ġupdate Screen By Screen Type ( screen Type : ĠBase Details Fragment Screen Type ) Ġ{} ĊĠĠĠ Ġabstract Ġfun Ġset Detail Fields Enable ( is Enable : ĠBoolean ) ĊĊĠĠĠ Ġ// ĠFIXME : Ġremove Ġit Ġwith Ġit : ĠBase Entity Ġwith Ġid ĊĠĠĠ Ġabstract Ġfun ĠgetItem Id ( item : ĠT ): ĠLong ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Subscribe ViewModel Observable s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Item . observe ( this @ Abstract Details Fragment , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Screen By Item ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen Type . observe ( this @ Abstract Details Fragment , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase Details Fragment Screen Type . VIEW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Detail Fields Enable ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase Details Fragment Screen Type . EDIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase Details Fragment Screen Type . ADD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Detail Fields Enable ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe build ĠMenu ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. invalidate Options Menu () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Screen By Screen Type ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinflater . inflate ( R . menu . base _ menu _ fragment _ details , Ġmenu ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsave Menu Ġ= Ġmenu . find Item ( R . id . base _ action _ details _ save ) ĊĠĠĠĠĠĠĠ Ġval Ġedit Menu Ġ= Ġmenu . find Item ( R . id . base _ action _ details _ edit ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Menu Ġ= Ġmenu . find Item ( R . id . base _ action _ details _ delete ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . screen Type . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Add Mode Ġ= Ġit Ġ== ĠBase Details Fragment Screen Type . ADD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis View Mode Ġ= Ġit Ġ== ĠBase Details Fragment Screen Type . VIEW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Edit Mode Ġ= Ġit Ġ== ĠBase Details Fragment Screen Type . EDIT ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave ĠMenu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Menu . isVisible Ġ= Ġ( is Add Mode Ġ|| Ġis Edit Mode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEdit ĠMenu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Menu . isVisible Ġ= Ġ( is View Mode ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete ĠMenu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Menu . isVisible Ġ= Ġ( is View Mode Ġ|| Ġis Edit Mode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate Options Menu ( menu , Ġinflater ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . base _ action _ details _ save Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Save Menu Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . base _ action _ details _ edit Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Edit Menu Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . base _ action _ details _ delete Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonDelete Menu Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġis Detail Inputs Are Valid () Ġ: ĠBoolean ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Save Menu Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠisValid Ġ= Ġis Detail Inputs Are Valid () ĊĊĠĠĠĠĠĠĠ Ġif ( isValid ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . detail Item . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis New Deck Ġ= ĠgetItem Id ( it ) Ġ== Ġ 0 L ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNew Deck ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonCreate Entity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Entity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠonCreate Entity ( entity : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . create Entity ( entity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun ĠonUpdate Entity ( entity : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . update Entity ( entity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġon Edit Menu Clicked () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . screen Type . post Value ( Base Details Fragment Screen Type . EDIT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠonDelete Menu Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Delete Dialog () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġget Delete Dialog Title () Ġ: ĠString ĊĠĠĠ Ġabstract Ġfun Ġget Delete Dialog Message () Ġ: ĠString ĊĊĠĠĠ Ġprivate Ġfun Ġshow Delete Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( delete Dialog Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Dialog Ġ= ĠBase AlertDialog . Builder ( require Context (), ĠBase AlertDialog . Buttons Type . POSITIVE _ NEGATIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( get Delete Dialog Title ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( get Delete Dialog Message ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive ButtonText ( R . string . base _ general _ delete ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative ButtonText ( R . string . base _ general _ cancel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdelete Dialog !!. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon AlertDialog Publish Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( onDelete Dialog Event Publish Subject ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon AlertDialog Visibility Publish Subject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( onDelete Dialog Visibility Behavior Subject ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Showing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }