package Ġtv . q ubit . test Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Port er D uff Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . View Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . annotation . Nullable Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . google . android . material . resources . Material Resources Ċ import Ġcom . google . android . material . text field . TextInput EditText Ċ import Ġcom . google . android . material . text field . TextInput Layout Ċ import Ġcom . google . android . material . text field . TextInput Layout . END _ ICON _ NONE Ċ import Ġcom . google . android . material . text field . TextInput Layout . END _ ICON _ PASSWORD _ TO GGLE Ċ Ċ class ĠQ EditText Ġ: ĠLinearLayout Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Root Container : ĠView ĊĠĠĠ Ġprivate Ġvar Ġm TextInput Layout : ĠText Input Layout ĊĠĠĠ Ġprivate Ġvar Ġm TextInput EditText : ĠText Input EditText ĊĠĠĠ Ġprivate Ġvar Ġm Error TextView : ĠTextView ĊĠĠĠ Ġprivate Ġvar Ġm Border View : ĠLinearLayout ĊĠĠĠ Ġprivate Ġvar Ġm On Focus ChangeListener : ĠOn Focus ChangeListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Color EditText Icon Focused : ĠColor State List ĊĠĠĠ Ġprivate Ġval Ġm Color EditText Icon Default : ĠColor State List ĊĠĠĠ Ġprivate Ġvar Ġm End Drawable : ĠDrawable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm End Tint Color : ĠColor State List ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġerror : ĠString ? ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Error TextView . visibility Ġ= Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Error TextView . text Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate BorderColor () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Error TextView . text . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġm Root Container Ġ= Ġinf late ( context , ĠR . layout . q edit text _ view , Ġthis ) ĊĠĠĠĠĠĠĠ Ġm TextInput Layout Ġ= Ġm Root Container . findViewById ( R . id . text Layout ) ĊĠĠĠĠĠĠĠ Ġm TextInput EditText Ġ= Ġm Root Container . findViewById ( R . id . edit Text ) ĊĠĠĠĠĠĠĠ Ġm Error TextView Ġ= Ġm Root Container . findViewById ( R . id . error TextView ) ĊĠĠĠĠĠĠĠ Ġm Border View Ġ= Ġm Root Container . findViewById ( R . id . border View ) ĊĊĊĊĠĠĠĠĠĠĠ Ġm Color EditText Icon Focused Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColor State List . valueOf ( Context Compat . getColor ( context , ĠR . color . color EditText Icon Focused )) ĊĠĠĠĠĠĠĠ Ġm Color EditText Icon Default Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColor State List . valueOf ( Context Compat . getColor ( context , ĠR . color . color EditText Icon Default )) ĊĊĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Q EditText , Ġ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasValue ( R . style able . Q EditText _ hint )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . hint Ġ= ĠgetString ( R . style able . Q EditText _ hint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasValue ( R . style able . Q EditText _ text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput EditText . setText ( getString ( R . style able . Q EditText _ text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Password Visibility Toggle Enabled ( getBoolean ( R . style able . Q EditText _ password Toggle Enabled , Ġfalse )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasValue ( R . style able . Q EditText _ start Icon Drawable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . start Icon Drawable Ġ= Ġget Drawable ( R . style able . Q EditText _ start Icon Drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasValue ( R . style able . Q EditText _ end Icon Tint )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm End Tint Color Ġ= ĠColor State List . valueOf ( R . style able . Q EditText _ end Icon Tint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasValue ( R . style able . Q EditText _ end Icon Drawable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm End Drawable Ġ= Ġget Drawable ( R . style able . Q EditText _ end Icon Drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset End Drawable Visibility ( getBoolean ( R . style able . Q EditText _ end Icon Visible , false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasValue ( R . style able . Q EditText _ android _ ime Options )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput EditText . ime Options Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Int ( R . style able . Q EditText _ android _ ime Options , ĠEditor Info . IME _ NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hasValue ( R . style able . Q EditText _ android _ input Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput EditText . input Type Ġ= Ġget Int ( R . style able . Q EditText _ android _ input Type , ĠEditor Info . TYPE _ NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput EditText . setOn Focus ChangeListener Ġ{ Ġv , Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Focus ChangeListener ?. on Focus Change ( v , Ġhas Focus ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . set Start Icon Tint List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Focus ) Ġm Color EditText Icon Focused Ġelse Ġm Color EditText Icon Default ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate BorderColor () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate BorderColor () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( error . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Border View . background Ġ= Ġcontext . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m TextInput EditText . is Focused ) ĠR . drawable . bg _ q edit text _ border _ focused Ġelse ĠR . drawable . bg _ q edit text _ border ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Border View . background Ġ= Ġcontext . get Drawable ( R . drawable . bg _ q edit text _ border _ error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Password Visibility Toggle Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( enabled Ġ&& Ġm TextInput Layout . end Icon Mode Ġ!= ĠEND _ ICON _ PASSWORD _ TO GGLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . end Icon Mode Ġ= ĠEND _ ICON _ PASSWORD _ TO GGLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . end Icon Mode Ġ= ĠEND _ ICON _ NONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset On Focus ChangeListener ( l : ĠOn Focus ChangeListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm On Focus ChangeListener Ġ= Ġl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset End Drawable Visibility ( visible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( visible Ġ&& Ġm TextInput Layout . end Icon Mode Ġ!= ĠText Input Layout . END _ ICON _ CUSTOM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . end Icon Drawable Ġ= Ġm End Drawable ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m End Drawable Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( m End Tint Color Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . set End Icon Tint List ( m End Tint Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . set End Icon Tint Mode ( Port er D uff . Mode . ADD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . end Icon Mode Ġ= ĠText Input Layout . END _ ICON _ CUSTOM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . end Icon Mode Ġ= ĠEND _ ICON _ NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm TextInput Layout . end Icon Mode Ġ= ĠEND _ ICON _ NONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset End Icon Drawable ( drawable : ĠDrawable ? ){ ĊĠĠĠĠĠĠĠ Ġm End Drawable Ġ= Ġdrawable ĊĠĠĠĠĠĠĠ Ġset End Drawable Visibility ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset End Icon Tint List ( color : ĠColor State List ){ ĊĠĠĠĠĠĠĠ Ġm End Tint Color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġset End Drawable Visibility ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Input Focus (){ ĊĠĠĠĠĠĠĠ Ġm TextInput EditText . request Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġafter TextChanged ( after TextChanged : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm TextInput EditText . after TextChanged ( after TextChanged ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġafter Focus Changed ( after Focus Changed : Ġ( Boolean ) Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ Ġm TextInput EditText . setOn Focus ChangeListener Ġ{ Ġ_, Ġhas Focus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Focus Changed . invoke ( has Focus ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Editor ActionListener ( l : Ġ( action Id : ĠInt , Ġevent : ĠKeyEvent ?) Ġ-> ĠBoolean ){ ĊĠĠĠĠĠĠĠ Ġm TextInput EditText . setOn Editor ActionListener { Ġ_, Ġaction Id , Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl . invoke ( action Id , event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠEditText . after TextChanged ( after TextChanged : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġthis . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter TextChanged . invoke ( editable . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{} ĊĠĠĠ Ġ}) Ċ }