package Ġnet . app tr onic . core . android . view model Ċ Ċ import Ġandroidx . annotation . Layout Res Ċ import Ġnet . app tr onic . core . base . Serial Id Generator Ċ import Ġnet . app tr onic . core . view model . I ViewModel Ċ import Ġnet . app tr onic . core . view model . ViewModel Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . full . super classes Ċ Ċ fun Ġcompose View Binder Adapter ( var arg Ġadapters : ĠView Binder Adapter ?): ĠView Binder Adapter Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġadapters . filter NotNull () ĊĠĠĠ Ġreturn ĠChain View Binder Adapter ( list ) Ċ } Ċ Ċ fun Ġview Binder Adapter ( initializer : ĠConcrete View Binder Adapter . () Ġ-> ĠUnit ): ĠView Binder Adapter Ġ{ ĊĠĠĠ Ġreturn ĠConcrete View Binder Adapter (). apply ( initializer ) Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠViewModel Type Ġ: ĠI ViewModel > Ġsingle View Binder Adapter ( ĊĠĠĠ Ġno inline Ġbuilder : Ġ() Ġ-> ĠView Binder < ViewModel Type > Ċ ): ĠView Binder Adapter Ġ{ ĊĠĠĠ Ġreturn Ġview Binder Adapter Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( builder ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠView Binder Adapter Ġ{ ĊĊĠĠĠ Ġfun Ġget Binder ( type Id : ĠInt ): ĠView Binder < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġlookup Binder ( type Id ) Ġ?: ĠGeneric View Binder < I ViewModel >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T Ġ: ĠI ViewModel > Ġget Binder ( viewModel : ĠT ): ĠView Binder < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġlookup Binder ( viewModel ) Ġas ? ĠView Binder < T > Ġ?: ĠGeneric View Binder () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetType ( viewModel : ĠI ViewModel ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlookup Type ( viewModel ) Ġ?: Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġabstract Ġfun Ġlookup Binder ( type Id : ĠInt ): ĠView Binder < *> ? ĊĊĠĠĠ Ġinternal Ġabstract Ġfun Ġlookup Binder ( viewModel : ĠI ViewModel ): ĠView Binder < *> ? ĊĊĠĠĠ Ġinternal Ġabstract Ġfun Ġlookup Type ( viewModel : ĠI ViewModel ): ĠInt ? Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġis Ġ[ View Binder ] Ġregistry , Ġwhich Ġallows Ġto Ġbuild Ġ[ View Binder ] Ġto Ġcorresponding Ċ Ġ* Ġ[ ViewModel ] Ġwhen Ġneeded Ġby Ġadapters . Ċ Ġ*/ Ċ class ĠConcrete View Binder Adapter Ġinternal Ġconstructor () Ġ: ĠView Binder Adapter () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Id Generator Ġ= ĠSerial Id Generator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġviews Ġ= Ġmutable Map Of < K Class <* >, ĠView Spec >() ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠView Spec ( ĊĠĠĠĠĠĠĠ Ġval Ġbuilder : Ġ() Ġ-> ĠView Binder <* >, ĊĠĠĠĠĠĠĠ Ġval Ġtype Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġlayout Res Id : ĠInt ? ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠView Binder < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . invoke (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Res Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout Res Id Ġ= Ġlayout Res Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġbinding Ġwith Ġonly Ġdisplay Ġlayout Ġfeature Ġwithout Ġbindings ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ layout Res Id ] Ġvalue Ġfor Ġlayout Ġin Ġ[ View Binder ] ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ builder ] Ġbuilder Ġfunction Ġof Ġconstructor Ġreference Ġfor Ġ[ View Binder ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠViewModel Type Ġ: ĠI ViewModel > Ġadd Empty ( ĊĠĠĠĠĠĠĠ Ġ@ Layout Res Ġlayout Res Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġno inline Ġbuilder : Ġ() Ġ-> ĠView Binder < ViewModel Type > Ġ= Ġ:: Empty View Binder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Ġ= ĠViewModel Type :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Ġ= Ġbuilder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Res Id Ġ= Ġlayout Res Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġbinding ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ ViewModel Type ] Ġtype Ġof Ġ[ ViewModel ] Ġfor Ġbind ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ builder ] Ġbuilder Ġfunction Ġof Ġconstructor Ġreference Ġfor Ġ[ View Binder ] ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ layout Res Id ] Ġoptional Ġvalue Ġfor Ġlayout Ġto Ġbe Ġoverridden Ġinstead Ġof Ġset Ġin Ġ[ View Binder ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠViewModel Type Ġ: ĠI ViewModel > Ġadd ( ĊĠĠĠĠĠĠĠ Ġno inline Ġbuilder : Ġ() Ġ-> ĠView Binder < ViewModel Type >, ĊĠĠĠĠĠĠĠ Ġ@ Layout Res Ġlayout Res Id : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclazz Ġ= ĠViewModel Type :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Ġ= Ġbuilder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Res Id Ġ= Ġlayout Res Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġbinding ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ clazz ] Ġtype Ġof Ġ[ ViewModel ] Ġfor Ġbind ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ builder ] Ġbuilder Ġfunction Ġof Ġconstructor Ġreference Ġfor Ġ[ View Binder ] ĊĠĠĠĠ Ġ* Ġ@ param Ġ[ layout Res Id ] Ġoptional Ġvalue Ġfor Ġlayout Ġto Ġbe Ġoverridden Ġinstead Ġof Ġset Ġin Ġ[ View Binder ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< ViewModel Type Ġ: ĠI ViewModel > Ġadd ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠK Class < ViewModel Type >, ĊĠĠĠĠĠĠĠ Ġbuilder : Ġ() Ġ-> ĠView Binder < ViewModel Type >, ĊĠĠĠĠĠĠĠ Ġ@ Layout Res Ġlayout Res Id : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġviews [ clazz ] Ġ= ĠView Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder Ġ= Ġbuilder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Id Ġ= Ġtype Id Generator . next Id (). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Res Id Ġ= Ġlayout Res Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlookup Binder ( type Id : ĠInt ): ĠView Binder < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġviews . values . first OrNull Ġ{ Ġit . type Id Ġ== Ġtype Id Ġ} ?. builder ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlookup Binder ( viewModel : ĠI ViewModel ): ĠView Binder < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Recursive ( viewModel :: class )?. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlookup Type ( viewModel : ĠI ViewModel ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsearch Recursive ( viewModel :: class )?. type Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch Recursive ( clazz : ĠK Class < out ĠI ViewModel >): ĠView Spec ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġiterable Value : ĠK Class < *> ? Ġ= Ġclazz ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġviews [ iterable Value ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiterable Value Ġ= Ġiterable Value ?. super classes ?. get OrNull ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( iterable Value Ġ!= Ġnull Ġ&& Ġiterable Value Ġ!= ĠI ViewModel :: class ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġnew Ġ[ View Binder Adapter ] Ġwhich Ġinherits Ġall Ġbindings Ġfrom Ġcurrent Ġbut Ġwith Ġpossibility ĊĠĠĠĠ Ġ* Ġto Ġadd Ġnew Ġbindings Ġwhich Ġhave Ġno Ġaffect ing Ġfor Ġinitial Ġ[ View Binder Adapter ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoverride ( initializer : ĠView Binder Adapter . () Ġ-> ĠUnit ): ĠView Binder Adapter Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompose View Binder Adapter ( view Binder Adapter ( initializer ), Ġthis ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġclass ĠChain View Binder Adapter ( private Ġval Ġtargets : ĠList < View Binder Adapter >) Ġ: ĊĠĠĠ ĠView Binder Adapter () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġlookup Binder ( type Id : ĠInt ): ĠView Binder < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( target Ġin Ġtargets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= Ġtarget . lookup Binder ( type Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbinder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlookup Binder ( viewModel : ĠI ViewModel ): ĠView Binder < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( target Ġin Ġtargets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinder Ġ= Ġtarget . lookup Binder ( viewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbinder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlookup Type ( viewModel : ĠI ViewModel ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( target Ġin Ġtargets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Id Ġ= Ġtarget . lookup Type ( viewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} Ċ Ċ }