package Ġcom . mat b ade v . dab ir va . example . base Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Call Super Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . databinding . ViewData Binding Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . mat b ade v . dab ir va . example . App Ċ import Ġcom . mat b ade v . dab ir va . example . App Repositories Ċ import Ġcom . mat b ade v . dab ir va . example . BR Ċ import Ġkotlin . reflect . K Class Ċ Ċ abstract Ġclass ĠBase Activity < A Ġ: ĠParcel able , ĠE , ĠVM Ġ: ĠBase Screen ViewModel < A , ĠE >>( ĊĠĠĠ Ġprivate Ġval ĠviewModel Class : ĠK Class < VM >, ĊĠĠĠ Ġ@ Layout Res Ġprivate Ġval Ġlayout Id : ĠInt , Ċ ) Ġ: ĠAppCompatActivity (), ĠViewModel Provider . Factory , ĠUi EventHandler < E > Ġ{ ĊĊĠĠĠ Ġ@ Visible ForTesting ( otherwise Ġ= ĠVis ible ForTesting . PROTECT ED ) ĊĠĠĠ Ġlateinit Ġvar ĠviewModel : ĠVM ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠView Data Binding ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Provider Ġ= ĠViewModel Provider ( this , Ġthis ) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠviewModel Provider . get ( viewModel Class . java ) ĊĠĠĠĠĠĠĠ ĠviewModel . register Ui ( intent ?. extras , ĠsavedInstanceState , Ġthis ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . set ContentView ( this , Ġlayout Id , Ġnull ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġif Ġ(! binding . set Variable ( BR . viewModel , ĠviewModel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" View Ġmodel Ġvariable Ġis Ġnot Ġused Ġin Ġlayout Ġwith ĠID Ġ$ layout Id ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfinal Ġoverride Ġfun Ġ< T Ġ: ĠViewModel > Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApp . of ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild ViewModel ( app . repositories ) Ġas ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġbuild ViewModel ( repositories : ĠApp Repositories ): ĠVM ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġhandle Common Ui Event ( event : ĠCommon Ui Event ) Ġ= Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠStart Activity Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , Ġevent . activity Class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent , Ġevent . options ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠStart App Activity Event < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , Ġevent . activity Class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . arguments ?. let Ġ{ Ġarguments : ĠParcel able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Base Screen ViewModel . SCREEN _ ARGUMENT S _ KEY , Ġarguments ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent , Ġevent . options ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠShow Toast Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġevent . message Provider ( this ), Ġevent . duration . android Value ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ ĠviewModel . save ViewModel State ( out State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Call Super ĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġbinding . unbind () ĊĠĠĠĠĠĠĠ ĠviewModel . unregister Ui () ĊĠĠĠ Ġ} Ċ Ċ } Ċ