@ file : Suppress (" ClassName ") Ċ Ċ package Ġy 2 k . virtual . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġy 2 k . android . Build Config Ċ import Ġjava . io . Serializable Ċ import Ġjava . util .* Ċ Ċ @ Dsl Marker Ċ annotation Ġclass ĠVirtual Node Marker Ċ Ċ data Ġclass ĠQu adr uple < T 1 , ĠT 2 , ĠT 3 , ĠT 4 >( val Ġfirst : ĠT 1 , Ġval Ġsecond : ĠT 2 , Ġval Ġthird : ĠT 3 , Ġval Ġfourth : ĠT 4 ) Ġ: ĠSerializable Ċ Ċ class ĠVirtual Host View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠFrame Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġprev Node : ĠVirtual Node ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġupdate ( f : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs 2 Ġ= Ġmk Node Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Real View ( this , Ġprev Node , Ġs 2 ) ĊĠĠĠĠĠĠĠ Ġprev Node Ġ= Ġs 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( node : ĠVirtual Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Real View ( this , Ġprev Node , Ġnode ) ĊĠĠĠĠĠĠĠ Ġprev Node Ġ= Ġnode ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġmk Node ( f : Ġ() Ġ-> ĠUnit ): ĠVirtual Node Ġ{ ĊĠĠĠ Ġglobal View Stack Ġ+= Ġobject Ġ: ĠVirtual Node () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclear ( p : ĠProperty , Ġa : ĠView ): ĠUnit Ġ= Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( p : ĠProperty , Ġa : ĠView ): ĠUnit Ġ= Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Empty ( context : ĠContext ): ĠView Ġ= Ġthrow ĠIllegalStateException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġf () ĊĊĠĠĠ Ġreturn Ġglobal View Stack . pop (). children . first () Ċ } Ċ Ċ val Ġis Remote Ġ= ĠThread Local < Unit >() Ċ Ċ fun Ġrun In Remote ( f : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġis Remote . set ( Unit ) ĊĠĠĠĠĠĠĠ Ġf () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġis Remote . remove () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠVirtual Node . update Prop ( is Remote Ready : ĠBoolean , Ġprop Id : ĠInt , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠ Ġif Ġ( is Remote . get () Ġ!= Ġnull Ġ&& Ġ! is Remote Ready ) Ġreturn ĊĠĠĠ Ġprops Ġ+= ĠProperty ( prop Id , Ġvalue ) Ċ } Ċ Ċ val Ġglobal View Stack Ġ= ĠStack < Virtual Node >() Ċ Ċ class ĠNot Remov able Property Exception Ġ: ĠException () Ċ Ċ class ĠProperty ( ĊĠĠĠ Ġval Ġprop Id : ĠInt , ĊĠĠĠ Ġvar Ġvalue : ĠAny ? Ċ ) Ġ: ĠSerializable Ċ Ċ abstract Ġclass ĠVirtual Node Ġ: ĠSerializable Ġ{ ĊĊĠĠĠ Ġopen Ġfun Ġclear ( p : ĠProperty , Ġa : ĠView ): ĠUnit Ġ= Ġthrow ĠNot Remov able Property Exception () ĊĠĠĠ Ġopen Ġfun Ġupdate ( p : ĠProperty , Ġa : ĠView ): ĠUnit Ġ= Ġthrow ĠIllegalStateException ("$ p Ġ$ a ") ĊĊĠĠĠ Ġval Ġchildren Ġ= ĠArrayList < Virtual Node >() ĊĊĠĠĠ Ġval Ġprops Ġ= ĠArrayList < Property >() ĊĊĠĠĠ Ġabstract Ġfun Ġcreate Empty ( context : ĠContext ): ĠView Ċ } Ċ Ċ fun Ġupdate Real View ( view : ĠView , Ġprev : ĠVirtual Node ?, Ġcurrent : ĠVirtual Node ) Ġ{ ĊĠĠĠ Ġif Ġ( prev Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent . props . forEach Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . update ( p , Ġview ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġprev . props . forEach Ġ{ Ġold Prop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Prop Ġ= Ġcurrent . props . find Ġ{ Ġit . prop Id Ġ== Ġold Prop . prop Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Prop Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev . clear ( old Prop , Ġview ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Prop . value Ġ!= Ġnew Prop . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . update ( new Prop , Ġview ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent . props . forEach Ġ{ Ġnew Prop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev . props . none Ġ{ Ġit . prop Id Ġ== Ġnew Prop . prop Id Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . update ( new Prop , Ġview ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( view Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprev Children Ġ= Ġprev ?. children Ġ?: Ġempty List < Virtual Node >() ĊĠĠĠĠĠĠĠ Ġvar Ġview Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil ĠMath . max ( current . children . size , Ġprev Children . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġprev Children . get OrNull ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġcurrent . children . get OrNull ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . remove View At ( view Pos --) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġc . create Empty ( view . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ{ Ġ" Add Ġview Ġ'${ v . java Class . simple Name } '" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . addView ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Real View ( v , Ġp , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNot Remov able Property Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p . java Class Ġ== Ġc . java Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Real View ( view . getChild At ( i ), Ġp , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNot Remov able Property Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Node ( view , Ġi , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Node ( view , Ġi , Ġc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Pos ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġreplace Node ( view : ĠViewGroup , Ġi : ĠInt , Ġc : ĠVirtual Node ) Ġ{ ĊĠĠĠ Ġview . remove View At ( i ) ĊĠĠĠ Ġval Ġv Ġ= Ġc . create Empty ( view . context ) ĊĠĠĠ Ġview . addView ( v , Ġi ) ĊĠĠĠ Ġupdate Real View ( v , Ġnull , Ġc ) Ċ } Ċ Ċ private Ġinline Ġfun Ġlog ( f : Ġ() Ġ-> ĠString ) Ġ{ ĊĠĠĠ Ġif Ġ( Build Config . DEBUG ) ĠLog . i (" Virtual Ui ", Ġf ()) Ċ } Ċ