package Ġio . ho op it . android . ui . widgets Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . core . graphics . drawable . Drawable Compat Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . core . widget . TextView Compat Ċ import Ġcom . google . android . material . text field . TextInput Layout Ċ import Ġio . ho op it . android . ui . R Ċ Ċ class ĠCustom TextInput Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠText Input Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ ĠR . style able . Custom TextInput Layout , ĊĠĠĠĠĠĠĠ Ġdef Style Attr , ĊĠĠĠĠĠĠĠĠ 0 ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Tint : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Optional TextView () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtext Watcher Ġ= ĠT int Text Watcher () ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠĠĠĠĠ Ġedit Text ?. add TextChanged Listener ( text Watcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġedit Text ?. remove TextChanged Listener ( text Watcher ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Tint Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text ?. compound Draw ables Relative ?. forEach Ġ{ Ġdrawable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ== Ġnull ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrap Ġ= ĠDrawable Compat . wrap ( drawable . mutate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Tint Ġ= Ġtyped Array . getColor ( R . style able . Custom TextInput Layout _ default Tint , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Tint ?. let Ġ{ ĠDrawable Compat . set Tint ( wrap , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠT int Text Watcher Ġ: Ġandroid . text . Text Watcher Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( char Sequence : ĠCharSequence , Ġi : ĠInt , Ġi 1 : ĠInt , Ġi 2 : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġif Ġ( char Sequence . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . getColor ( R . style able . Custom TextInput Layout _ default Tint , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . getColor ( R . style able . Custom TextInput Layout _ image Tint , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġt int ing Ġwith Ġthe Ġsame Ġcolor Ġrepeatedly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( color Ġ== Ġcurrent Tint ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text ?. compound Draw ables Relative ?. forEach Ġ{ Ġdrawable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ== Ġnull ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġmutate Ġif Ġit Ġhasn 't Ġbeen Ġmut ated Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrap Ġ= Ġif Ġ( current Tint Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable Compat . wrap ( drawable . mutate ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable Compat . wrap ( drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( wrap , Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Tint Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : Ġandroid . text . Editable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Optional TextView () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( typed Array . getBoolean ( R . style able . Custom TextInput Layout _ show Optional , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtv Optional Ġ= ĠTextView ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtv Optional . text Ġ= Ġresources . getString ( R . string . Custom TextInput Layout _ optional ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams ( LayoutParams . WRAP _ CONTENT , ĠLayout Params . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . gravity Ġ= ĠGr avity Compat . END ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTextView Compat . setText Appearance ( tv Optional , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style . TextAppearance _ Material Components _ Caption ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addView ( tv Optional , Ġparams ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ