package Ġbe . app wise . core . ui . custom Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġbe . app wise . core . R Ċ import Ġbe . app wise . core . databinding . Number Step per Binding Ċ import Ġbe . app wise . core . extensions . view . optional Callbacks Ċ import Ġkotlinx . android . synt hetic . main . number _ step per . view .* Ċ Ċ /** Ċ Ġ* ĠA Ġview group Ġcontaining Ġa Ġlabel Ġ[ tv Label ] Ġ, Ġminus Ġbutton Ġ[ iv Minus ] Ġ, Ġplus Ġbutton Ġ[ iv Plus ] Ġand Ġa Ġinput field Ġfor Ġa Ġvalue Ġ[ et Value ] Ċ Ġ* Ġ@ constructor ĠCreates Ġan Ġ[ Number Step per ] Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġchange Ġthe Ġminus Ġbutton Ġby Ġadding Ġic _ minus . xml Ġunder Ġyour Ġdraw ables Ċ Ġ* ĠYou Ġcan Ġchange Ġthe Ġplus Ġbutton Ġby Ġadding Ġic _ plus . xml Ġunder Ġyour Ġdraw ables Ċ Ġ* Ċ Ġ* ĠYou Ġcan Ġchange Ġthe Ġstyling Ġof Ġ[ et Value ] Ġby Ġadding Ġa Ġstyle Ġwith Ġname Ġnumber Step per Edit text Ġin Ġyour Ġstyles Ċ */ Ċ Ċ class ĠNumber Step per Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġctx : ĠContext , ĊĠĠĠ Ġattribute Set : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠLinearLayout ( ctx , Ġattribute Set , Ġdef Style Attr ) Ġ, ĠTwo Way Binding Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Number Step per Binding : ĠNumber Step per Binding ĊĠĠĠ Ġprivate Ġvar Ġm MinValue : ĠDouble Ġ= ĠDouble . MIN _ VALUE ĊĠĠĠ Ġprivate Ġvar Ġm MaxValue : ĠDouble Ġ= ĠDouble . MAX _ VALUE ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= Ġcontext . getSystem Service ( Context . LAYOUT _ IN FL ATER _ SERVICE ) Ġas ĠLayoutInflater ĊĠĠĠĠĠĠĠ Ġm Number Step per Binding Ġ= ĠNumber Step per Binding . inflate ( in flater , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġattribute Set ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġcontext . obtain Styled Attributes ( it , ĠR . style able . Number Step per ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Label Text ( attributes . getString ( R . style able . Number Step per _ label )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// only Ġset Ġfields Ġwhen Ġset Ġin Ġxml Ġ--> Ġneeds Ġdouble Ġdefaults Ġinstead Ġof Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attributes . hasValue ( R . style able . Number Step per _ min Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MinValue Ġ= Ġattributes . get Float ( R . style able . Number Step per _ min Value , Ġ 0 f ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attributes . hasValue ( R . style able . Number Step per _ max Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MaxValue Ġ= Ġattributes . get Float ( R . style able . Number Step per _ max Value , Ġ 0 f ). toDouble () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( m Number Step per Binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv Plus . setImage Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes . getResource Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Number Step per _ plus _ icon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ plus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv Minus . setImage Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes . getResource Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Number Step per _ minus _ icon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . ic _ minus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwith ( m Number Step per Binding ) Ġ{ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠInput Filter Ġ{ Ġsource , Ġstart , Ġend , Ġdest , Ġd start , Ġd end Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Text Ġ= Ġdest . toString () Ġ+ Ġsource . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( future Text . toDouble () Ġ! in Ġm MinValue .. m MaxValue ) Ġ"" Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġet Value . filters Ġ= ĠarrayOf ( filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġet Value . optional Callbacks Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Value ChangeListener ?. on ValueChanged ( it . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv Plus . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= ĠgetValue () Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ<= Ġm MaxValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet Value . setText (( newValue ). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Value ChangeListener ?. on ValueChanged ( newValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv Minus . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= ĠgetValue () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( newValue Ġ>= Ġm MinValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet Value . setText (( newValue ). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Value ChangeListener ?. on ValueChanged ( newValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Value ChangeListener : ĠValue ChangeListener ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠGets Ġtriggered Ġwhen Ġusers Ġclicks Ġon Ġ[ iv Plus ] Ġand Ġ[ iv Minus ] Ġor Ġafter Ġtext Ġchanges Ġin Ġ[ et Value ] ĊĠĠĠĠ Ġ* Ġ Ġ@ see Ġinit ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġinterface ĠValue ChangeListener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon ValueChanged ( value : ĠInt ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa Ġ[ value ChangeListener ] Ġfor Ġthis Ġ[ Number Step per ] ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun ĠsetValue ChangeListener ( value ChangeListener : ĠValue ChangeListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Value ChangeListener Ġ= Ġvalue ChangeListener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsets Ġ[ label ] Ġas Ġthe Ġtext Ġfor Ġ[ tv Label ] Ġof Ġthis Ġ[ Number Step per ] ĊĠĠĠĠ Ġ* Ġwhen Ġ[ label ] Ġis Ġnull Ġor Ġempty Ġ[ tv Label ] Ġand Ġ[ spacing ] Ġwill Ġbe Ġhidden Ġand Ġonly ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Label Text ( label : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( m Number Step per Binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Label . text Ġ= Ġlabel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Label . visibility Ġ= Ġif Ġ( label . isNull OrEmpty ()) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspacing . visibility Ġ= Ġif Ġ( label . isNull OrEmpty ()) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtext Ġof Ġ[ et Value ] Ġas Ġan ĠInt ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetValue (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġm Number Step per Binding . et Value . text . toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value . isEmpty ()) Ġ 0 Ġelse Ġvalue . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsets Ġ[ number ] Ġas Ġthe Ġtext Ġof Ġ[ et Value ] ĊĠĠĠĠ Ġ* Ġ@ param Ġnumber Ġdigit Ġto Ġshow Ġin Ġthe ĠNumber step per ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetValue ( number : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Number Step per Binding . et Value . setText ( number . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Edit text For Binding () Ġ= Ġm Number Step per Binding . et Value Ċ }