package Ġeu . kan ade . t ach iy omi . ui . library . filter Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . core . view . isVisible Ċ import Ġcom . f 2 pr ate ek . rx . preferences . Preference Ċ import Ġeu . kan ade . t ach iy omi . R Ċ import Ġeu . kan ade . t ach iy omi . data . preference . get OrDefault Ċ import Ġeu . kan ade . t ach iy omi . databinding . Filter Tag Group Binding Ċ import Ġeu . kan ade . t ach iy omi . util . system . dp To Px Ċ import Ġeu . kan ade . t ach iy omi . util . system . getResource Color Ċ Ċ class ĠFilter Tag Group @ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull ) Ġ: ĠLinearLayout Ċ ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġlistener : ĠFilter Tag Group Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġitem Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġroot : ĠViewGroup ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġbuttons Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Button , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . second Button , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . third Button , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . four th Button ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsepar ators Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . separator 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . separator 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . separator 3 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Activated (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuttons . any Ġ{ Ġit . is Activated Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġbinding : ĠFilter Tag Group Binding ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish Inf late () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Finish Inf late () ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFilter Tag Group Binding . bind ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġname Of ( index : ĠInt ): ĠString ? Ġ= Ġbuttons . get OrNull ( index )?. text Ġas ? ĠString ĊĊĠĠĠ Ġfun Ġsetup ( root : ĠViewGroup , Ġfirst Text : ĠInt , Ġvar arg Ġextra : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext 1 Ġ= Ġcontext . getString ( first Text ) ĊĠĠĠĠĠĠĠ Ġval Ġstrings Ġ= Ġextra . map NotNull Ġ{ Ġif Ġ( it Ġ!= Ġnull ) Ġcontext . getString ( it ) Ġelse Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġsetup ( root , Ġtext 1 , Ġextra Ġ= Ġstrings . to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup ( root : ĠViewGroup , Ġfirst Text : ĠString , Ġvar arg Ġextra : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener Ġ= Ġroot Ġas ? ĠFilter Tag Group Listener ĊĠĠĠĠĠĠĠ Ġ( layout Params Ġas ? ĠMargin LayoutParams )?. right Margin Ġ= Ġ 5 . dp To Px ĊĠĠĠĠĠĠĠ Ġ( layout Params Ġas ? ĠMargin LayoutParams )?. left Margin Ġ= Ġ 5 . dp To Px ĊĠĠĠĠĠĠĠ Ġbinding . first Button . text Ġ= Ġfirst Text ĊĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġ( extra . toList () Ġ+ ĠlistOf < String ? >( null , Ġnull , Ġnull )). take ( separ ators . size ) ĊĠĠĠĠĠĠĠ Ġextras . forEach Indexed Ġ{ Ġindex , Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons [ index Ġ+ Ġ 1 ]. text Ġ= Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsepar ators [ index ]. isVisible Ġ= Ġtext Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons [ index Ġ+ Ġ 1 ]. isVisible Ġ= Ġtext Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġitem Count Ġ= Ġbuttons . count Ġ{ Ġ! it . text . isNull Or Blank () Ġ} ĊĠĠĠĠĠĠĠ Ġthis . root Ġ= Ġroot ĊĠĠĠĠĠĠĠ Ġbuttons . forEach Indexed Ġ{ Ġindex , ĠtextView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setOnClickListener Ġ{ Ġtoggle Button ( index ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġstate : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbuttons . indexOf First Ġ{ Ġit . is Activated Ġ} ĊĠĠĠĠĠĠĠ Ġset ( index ) Ġ= Ġtoggle Button ( index , Ġfalse ) ĊĊĠĠĠ Ġfun ĠsetState ( preference : ĠPreference < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġpreference . get OrDefault () Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetState ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġbuttons . indexOf First Ġ{ Ġit . text Ġ== Ġtext Ġ&& Ġit . visibility Ġ== ĠView . VISIBLE Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġbuttons . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Activated Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġitem Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons [ i ]. isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons [ i ]. setTextColor ( context . getResource Color ( R . attr . color On Background )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ( item Count Ġ- Ġ 1 )) Ġsepar ators [ i ]. isVisible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Button ( index : ĠInt , Ġcall Back : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 Ġ|| Ġitem Count Ġ== Ġ 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( is Activated Ġ&& Ġindex Ġ!= Ġbuttons . indexOf First Ġ{ Ġit . is Activated Ġ}) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( call Back ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Ġ= Ġandroidx . transition . Auto Transition () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition . duration Ġ= Ġ 1 5 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroidx . transition . Transition Manager . begin Delayed Transition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . parent Ġas ĠViewGroup , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( item Count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Button . is Activated Ġ= Ġ! binding . first Button . is Activated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . first Button . setTextColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getResource Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding . first Button . is Activated ) ĠR . attr . color On Secondary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠR . attr . color On Background ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Filter Clicked ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding . first Button . is Activated ) Ġindex Ġelse Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Back ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmain Button Ġ= Ġbuttons [ index ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( main Button . is Activated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button . is Activated Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Filter Clicked ( this , Ġ- 1 , Ġcall Back ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons . forEach Indexed Ġ{ Ġview Index , ĠtextView Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! textView . text . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsepar ators [ view Index Ġ- Ġ 1 ]. isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Button . is Activated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Filter Clicked ( this , Ġindex , Ġcall Back ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons . forEach Ġ{ Ġif Ġ( it Ġ!= Ġmain Button ) Ġit . isVisible Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsepar ators . forEach Ġ{ Ġit . isVisible Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmain Button . setTextColor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getResource Color ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( main Button . is Activated ) ĠR . attr . color On Secondary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠR . attr . color On Background ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠFilter Tag Group Listener Ġ{ ĊĠĠĠ Ġfun Ġon Filter Clicked ( view : ĠFilter Tag Group , Ġindex : ĠInt , Ġupdate Preference : ĠBoolean ) Ċ } Ċ