package Ġcom . but aj lo . image switch Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġkotlinx . android . synt hetic . main . view _ image _ switch . view .* Ċ Ċ class ĠImage Switch Ġ: ĠRelative Layout Ġ{ ĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt , Ġdef Style Res : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr , ĊĠĠĠĠĠĠĠ Ġdef Style Res ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġlazy Ġ{ ĠImage Switch ViewModel () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstate Listeners Ġby Ġlazy Ġ{ Ġmutable Set Of < On State Updated Listener >() Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġimage Observer Ġ= ĠObserver < Int > Ġ{ Ġset Image ( it Ġ?: Ġ 0 ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġstate Observer Ġ= ĠObserver < Boolean > Ġ{ Ġstate Updated ( it Ġ?: Ġfalse ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( attrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Image Switch , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! hasValue ( R . style able . Image Switch _ unchecked Image ) Ġ|| Ġ! hasValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Image Switch _ checked Image ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Image Switch Ġneeds Ġ' custom : unchecked Image ' Ġand Ġ' custom : checked Image ' Ġattributes Ġset ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Checked Image ( getResource Id ( R . style able . Image Switch _ checked Image , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Unchecked Image ( getResource Id ( R . style able . Image Switch _ unchecked Image , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠView . inflate ( context , ĠR . layout . view _ image _ switch , Ġthis ) ĊĠĠĠĠĠĠĠ Ġset OnClickListener (:: onClick ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠĠĠĠĠ ĠviewModel . image Res . observe Fore ver ( image Observer ) ĊĠĠĠĠĠĠĠ ĠviewModel . isChecked . observe Fore ver ( state Observer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ ĠviewModel . image Res . remove Observer ( image Observer ) ĊĠĠĠĠĠĠĠ ĠviewModel . isChecked . remove Observer ( state Observer ) ĊĠĠĠĠĠĠĠ Ġstate Listeners . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Checked Image (@ Drawable Res Ġimage Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . setChecked Image ( image Res ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Unchecked Image (@ Drawable Res Ġimage Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . set Unchecked Image ( image Res ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On State Update Listener ( listener : ĠOn State Updated Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonClick ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . onClick () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Image ( image Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġiv _ image _ switch . setImage Resource ( image Res ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstate Updated ( isChecked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Listeners . forEach Ġ{ Ġit . state Updated ( isChecked ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn State Updated Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġstate Updated ( isChecked : ĠBoolean ) ĊĠĠĠ Ġ} Ċ Ċ }