package Ġxyz . team gravity . im ager ad io button Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . annotation . Requires Api Ċ Ċ class ĠGr avity Radio Group Ġ: ĠLinearLayout Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġradio Button Checked Id Ġ= ĠView . NO _ ID ĊĊĠĠĠ Ġprivate Ġvar Ġprotect From Checked Change Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġon Checked ChangeListener : ĠOn Checked ChangeListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġchild On Checked ChangeListener : ĠGr avity Radio Check able . On Checked ChangeListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpass Through Hierarchy ChangeListener : ĠPass Through Hierarchy ChangeListener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġchild Views Ġ= ĠHashMap < Int , ĠView >() ĊĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Attrs ( attrs ) ĊĠĠĠĠĠĠĠ Ġsetup View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . H ONE Y COMB ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdefault Style Attrs : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdefault Style Attrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Attrs ( attrs ) ĊĠĠĠĠĠĠĠ Ġsetup View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdefault Style Attrs : ĠInt , Ġdefault Style Res : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġsuper ( context , Ġattrs , Ġdefault Style Attrs , Ġdefault Style Res ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Attrs ( attrs ) ĊĠĠĠĠĠĠĠ Ġsetup View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Attrs ( attrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Gravity Radio Group , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradio Button Checked Id Ġ= Ġarray . getResource Id ( R . style able . Gravity Radio Group _ gr g RadioButton Checked Id , ĠView . NO _ ID ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup View () Ġ{ ĊĠĠĠĠĠĠĠ Ġchild On Checked ChangeListener Ġ= ĠChecked State Tracker () ĊĠĠĠĠĠĠĠ Ġpass Through Hierarchy ChangeListener Ġ= ĠPass Through Hierarchy ChangeListener () ĊĠĠĠĠĠĠĠ Ġsuper . setOn Hierarchy ChangeListener ( pass Through Hierarchy ChangeListener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd View ( child : ĠView ?, Ġindex : ĠInt , Ġparams : ĠViewGroup . LayoutParams ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠGr avity Radio Check able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotect From Checked Change Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( radioButton Checked Id Ġ!= ĠView . NO _ ID ) Ġset Checked State For View ( radioButton Checked Id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotect From Checked Change Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Checked Id ( child . id , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . addView ( child , Ġindex , Ġparams ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset On Hierarchy ChangeListener ( listener : ĠOn Hierarchy ChangeListener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġuser Ġlistener Ġis Ġdeleg ated Ġto Ġour Ġpass - through Ġlistener ĊĠĠĠĠĠĠĠ Ġpass Through Hierarchy ChangeListener ?. on Hierarchy ChangeListener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () ĊĠĠĠĠĠĠĠ Ġ// Ġchecks Ġthe Ġappropriate Ġradio Ġbutton Ġas Ġrequested Ġin Ġthe ĠXML Ġfile ĊĠĠĠĠĠĠĠ Ġif Ġ( radioButton Checked Id Ġ!= ĠView . NO _ ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotect From Checked Change Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Checked State For View ( radioButton Checked Id , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotect From Checked Change Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Checked Id ( radioButton Checked Id , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Checked Id (@ Id Res Ġid : ĠInt , Ġchecked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġradio Button Checked Id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġon Checked ChangeListener ?. on CheckedChanged ( this , Ġchild Views [ id ], Ġchecked , Ġradio Button Checked Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Id Res ĊĠĠĠ Ġfun Ġchecked RadioButton Id () Ġ= Ġradio Button Checked Id ĊĊĠĠĠ Ġoverride Ġfun Ġcheck LayoutParams ( p : ĠViewGroup . LayoutParams ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġp Ġis ĠLayout Params ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Check () Ġ= Ġcheck ( View . NO _ ID ) ĊĊĠĠĠ Ġprivate Ġfun Ġcheck (@ Id Res Ġid : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= ĠView . NO _ ID Ġ&& Ġid Ġ== Ġradio Button Checked Id ) Ġreturn Ġ// Ġdon 't Ġeven Ġbother ĊĠĠĠĠĠĠĠ Ġif Ġ( radioButton Checked Id Ġ!= ĠView . NO _ ID ) Ġset Checked State For View ( radioButton Checked Id , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= ĠView . NO _ ID ) Ġset Checked State For View ( id , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġset Checked Id ( id , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Checked State For View ( view Id : ĠInt , Ġchecked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġchecked View Ġ= Ġchild Views [ view Id ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( checked View Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchecked View Ġ= ĠfindViewById ( view Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( checked View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Views [ view Id ] Ġ= Ġchecked View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( checked View Ġas ? ĠGr avity Radio Check able )?. isChecked Ġ= Ġchecked ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate LayoutParams ( attrs : ĠAttributeSet ?): ĠLayout Params Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLayout Params ( context , Ġattrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Checked ChangeListener ( on Checked ChangeListener : ĠOn Checked ChangeListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Checked ChangeListener Ġ= Ġon Checked ChangeListener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Checked ChangeListener () Ġ= Ġon Checked ChangeListener ĊĊĠĠĠ Ġfun Ġinterface ĠOn Checked ChangeListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon CheckedChanged ( radio Group : ĠView , Ġradio Button : ĠView ?, Ġchecked : ĠBoolean , Ġchecked Id : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠChecked State Tracker Ġ: ĠGr avity Radio Check able . On Checked ChangeListener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Checked Change ( radioButton : ĠView , Ġchecked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( protect From Checked Change ) Ġreturn Ġ// Ġprevents Ġfrom Ġinfinite Ġrecursion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotect From Checked Change Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( radioButton Checked Id Ġ!= ĠView . NO _ ID ) Ġset Checked State For View ( radioButton Checked Id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotect From Checked Change Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Checked Id ( radioButton . id , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠPass Through Hierarchy ChangeListener Ġ: ĠOn Hierarchy ChangeListener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġon Hierarchy ChangeListener : ĠOn Hierarchy ChangeListener ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child View Added ( parent : ĠView ?, Ġchild : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġthis @ Gravity Radio Group Ġ&& Ġchild Ġis ĠGr avity Radio Check able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġchild . id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== ĠView . NO _ ID ) Ġ{ Ġ// Ġgenerates Ġan Ġid Ġif Ġit 's Ġmissing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠView . generate View Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild On Checked ChangeListener ?. let Ġ{ Ġ( child Ġas ĠGr avity Radio Check able ). add On Checked ChangeListener ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Views [ id ] Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Hierarchy ChangeListener ?. on Child View Added ( parent , Ġchild ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Child View Removed ( parent : ĠView ?, Ġchild : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġthis @ Gravity Radio Group Ġ&& Ġchild Ġis ĠGr avity Radio Check able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild On Checked ChangeListener ?. let Ġ{ Ġ( child Ġas ĠGr avity Radio Check able ). remove On Checked ChangeListener ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Views . remove ( child ?. id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Hierarchy ChangeListener ?. on Child View Removed ( parent , Ġchild ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }