package Ġcom . re think books . observable s Ċ Ċ import Ġandroid . arch . lifecycle . Lifecycle Owner Ċ import Ġandroid . databinding . Base Observable Ċ import Ġandroid . databinding . Observable Ċ import Ġandroid . databinding . Observable Field Ċ import Ġcom . re think books . utils . Composite Disposable Interface Ċ import Ġtim ber . log . Tim ber Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠCustom ĠObservable Field Ġthat Ġgives Ġmore Ġflexibility Ġabout Ġgetting Ġand Ġsetting Ġvalues Ġand Ġatt aching Ġthe Ġobservable Ġto Ġa Ġparent Ċ Ġ* Ċ Ġ* ĠCreated Ġby Ġb rad th ome Ġon Ġ 1 1 / 1 7 / 1 7 . Ċ Ġ*/ Ċ open Ġclass ĠOb serve < T Ġ: ĠAny ? >( value : ĠT ? Ġ= Ġnull ) Ġ: ĠObservable Field < T >( value ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġnotify Ġa Ġparent ĠObservable Ġwhen Ġchanges Ġare Ġmade Ġto Ġthis ĠObservable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġparent Ob serve : ĠBase Observable ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġk Prop : ĠK Property < *> ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEasy Ġaccess Ġto Ġget () Ġand Ġset () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġitem : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis . get () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġthis . set ( value ) ĊĊĠĠĠ Ġvar Ġaccept Change : Ġ( currentItem : ĠT , Ġnew Item : ĠT ) Ġ-> ĠBoolean Ġ= Ġ{ Ġcurrent Item , Ġnew Item Ġ-> Ġcurrent Item Ġ!= Ġnew Item Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG ives Ġflexibility Ġto Ġdefine Ġlogic Ġthat Ġis Ġapplied Ġbefore Ġthe Ġactually Ġsetter Ġis Ġran ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcustom Setter : Ġ(( T ) Ġ-> ĠT )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG ives Ġflexibility Ġto Ġdefine Ġlogic Ġthat Ġis Ġapplied Ġbefore Ġthe Ġactually Ġsetter Ġis Ġran ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġproperty Changed : Ġ(( new Item : ĠT , Ġold Item : ĠT ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG ives Ġflexibility Ġto Ġdefine Ġlogic Ġthat Ġis Ġapplied Ġbefore Ġthe Ġactually Ġgetter Ġis Ġran ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcustom Getter : Ġ(( T ) Ġ-> ĠT )? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġfinal Update Ġ= ĠAction Item < T >() ĊĊĠĠĠ Ġfun Ġset ( value : ĠT , Ġforce Update : ĠBoolean Ġ= Ġfalse ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Item Ġ= Ġget () ĊĠĠĠĠĠĠĠ Ġvar Ġitem Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġcustom Setter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ= Ġit ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! force Update Ġ&& Ġ! accept Change ( old Item , Ġitem )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġchanged Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġchanged Listener Ġ= Ġobject Ġ: ĠObservable . On PropertyChanged Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon PropertyChanged ( p 0 : ĠObservable ?, Ġp 1 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . add On PropertyChanged Callback ( changed Listener ) ĊĠĠĠĠĠĠĠ Ġsuper . set ( item ) ĊĠĠĠĠĠĠĠ Ġsuper . remove On PropertyChanged Callback ( changed Listener ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! changed ) Ġnotify Change () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( item , Ġold Item ) ĊĠĠĠĠĠĠĠ Ġproperty Changed ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( item , Ġold Item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġk Prop ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ("[ ${ it . name }] Ġvalue Ġchanged Ġto Ġ$ item Ġfrom Ġ$ old Item ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġparent Ob serve ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . notify Change () ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġfinal Update . action Occurred ( get ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun Ġforce Update ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( value , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġin fix Ġfun Ġset ( value : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( value , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget (): ĠT Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Getter ?. let Ġ{ Ġit ( super . get ()) Ġ} Ġ?: Ġsuper . get () ĊĊĠĠĠ Ġprotected Ġfun Ġproperty Changed ( new Item : ĠT , Ġold Item : ĠT ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet ĠCustom ĠSetter Ġand Ġreturn Ġthis ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpre Setter ( setter : Ġ(( T ) Ġ-> ĠT )? ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġcustom Setter Ġ= Ġsetter ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcustom Getter ( getter : Ġ(( T ) Ġ-> ĠT )? ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġcustom Getter Ġ= Ġgetter ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet ĠCustom ĠPost ĠSetter Ġand Ġreturn Ġthis ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconfig Post Setter ( property Changed : Ġ(( new Item : ĠT , Ġold Item : ĠT ) Ġ-> ĠUnit )? ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . property Changed Ġ= Ġproperty Changed ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet ĠCustom ĠGetter Ġand Ġreturn Ġthis ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpre Getter ( getter : Ġ(( T ) Ġ-> ĠT )? ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġcustom Getter Ġ= Ġgetter ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconfig Parent ( parent : ĠBase Observable ? Ġ= Ġnull ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġparent Ob serve Ġ= Ġparent ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaccept Change ( accept Change Item : Ġ( currentItem : ĠT , Ġnew Item : ĠT ) Ġ-> ĠBoolean ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . accept Change Ġ= Ġaccept Change Item ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġallow All Changes : ĠOb serve < T > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . accept Change Ġ= Ġ{ Ġitem O , Ġitem d Ġ-> Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsync With Ob serve ( observe : ĠOb serve < T >): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add On PropertyChanged Callback Ġ{ Ġif Ġ( observe . item Ġ!= Ġit ) Ġobserve . set ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġobserve . add On PropertyChanged Callback Ġ{ Ġif Ġ( observe . item Ġ!= Ġit ) Ġthis . set ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On PropertyChanged Callback ( action : Ġ( T ) Ġ-> ĠUnit ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add On PropertyChanged Callback ( object Ġ: Ġandroid . databinding . Observable . On PropertyChanged Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon PropertyChanged ( sender : Ġandroid . databinding . Observable ?, Ġproperty Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( this @ Ob serve . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd On PropertyChanged Callback ( callback : ĠObservable . On PropertyChanged Callback ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . add On PropertyChanged Callback ( callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Properties Changed ( action : Ġ( new Item : ĠT , Ġold Item : ĠT ) Ġ-> ĠUnit ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġproperty Changed Ġ= Ġaction ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠgetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property < *> ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġk Prop Ġ= Ġproperty ĊĠĠĠĠĠĠĠ Ġreturn Ġget () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun ĠsetValue ( this Ref : ĠAny ?, Ġproperty : ĠK Property <* >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġk Prop Ġ= Ġproperty ĊĠĠĠĠĠĠĠ Ġset ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Final Update ( composite Disposable Interface : ĠComposite Disposable Interface , Ġaction : Ġ( T ) Ġ-> ĠUnit ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġfinal Update . observe ( composite Disposable Interface . composite Disposable , Ġaction ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Final Update ( lifecycle Owner : ĠLifecycle Owner , Ġaction : Ġ( T ) Ġ-> ĠUnit ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġfinal Update . observe ( lifecycle Owner , Ġaction ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Final Update ( action : Ġ( T ) Ġ-> ĠUnit ): ĠOb serve < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġfinal Update . observe Fore ver ( action ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstring ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠtoString () ĊĊĠĠĠ Ġval Ġ< T > ĠT . observe : ĠOb serve < T > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠOb serve ( this ). config Parent ( this @ Ob serve ) ĊĊĠĠĠ Ġfun Ġ< SET TER , ĠGET TER > ĠSET TER . formatted Ob serve ( formatted Getter : Ġ( SET TER ) Ġ-> ĠGET TER , Ġformatted Setter : Ġ( GET TER ) Ġ-> ĠSET TER ): ĠOb serve < SET TER > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠForm att ed Ob serve < SET TER , ĠGET TER >( this , Ġformatted Getter , Ġformatted Setter ). config Parent ( this @ Ob serve ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠOb serve < T >. on Changed ( action : Ġ( T ) Ġ-> ĠUnit ): ĠOb serve < T > Ġ{ ĊĠĠĠ Ġthis . add On PropertyChanged Callback ( action ) ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠExt ends ĠOb serve Ġand Ġgives Ġthe Ġflexibility Ġto Ġformat Ġthe Ġset Ġand Ġget Ġof Ġanother Ġtype Ġfor Ġthis ĠObservable Ċ Ġ* Ċ Ġ* ĠCreated Ġby Ġb rad th ome Ġon Ġ 1 1 / 1 7 / 1 7 . Ċ Ġ*/ Ċ open Ġclass ĠForm att ed Ob serve < SET TER Ġ: ĠAny ?, ĠGET TER Ġ: ĠAny ? >( value : ĠSET TER ? Ġ= Ġnull , Ġprivate Ġvar Ġformatted Getter : Ġ( SET TER ) Ġ-> ĠGET TER , Ġprivate Ġvar Ġformatted Setter : Ġ( GET TER ) Ġ-> ĠSET TER ) Ġ: ĠOb serve < SET TER >( value ) Ġ{ ĊĠĠĠ Ġvar Ġformatted : ĠGET TER ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġformatted Getter ( get ()) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġset ( formatted Setter ( value )) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġformatted . toString () ĊĠĠĠ Ġ} Ċ Ċ }