package Ġcom . dev . extension function usage Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . InputType Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . widget . EditText Ċ import Ġcom . google . android . material . text field . TextInput Layout Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġ// Min ĠMax Ġvalues ĊĠĠĠ Ġprivate Ġval Ġm General Min Char Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġval Ġm General Max Char Ġ= Ġ 3 0 ĊĊĠĠĠ Ġ// Different iation Ġfor Ġfield Ġvalidation ĊĠĠĠ Ġprivate Ġval Ġm Default InputType Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġval Ġm Password InputType Ġ= Ġ 1 ĊĊĠĠĠ Ġ// Email Ġvalidator Ġhelper ĊĠĠĠ Ġval Ġm Email Reg Ex Ġ= Ġ"[ a - zA - Z 0 - 9 ._ - ]+ @ [ a - z ]+ .[ a - z ] +" ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĊĠĠĠĠĠĠĠ Ġattach Text Change Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAtt aches ĠText ĠChange ĠList eners ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġattach Text Change Listeners () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtxt _ person _ name . on TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ person _ email , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ EMAIL _ ADDRESS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ person _ name _ error _ layout , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . name _ error _ msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġm General Max Char , Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtxt _ person _ email . on Email TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Default InputType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ email _ error _ layout , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . email _ error _ msg ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtxt _ person _ email . on Email TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ person _ designation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Default InputType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ email _ error _ layout , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . email _ error _ msg ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtxt _ person _ designation . on TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ PHONE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt _ designation _ error _ layout , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . designation _ error _ msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġm General Max Char , Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommon Ġentry Ġfield Ġlistener . ĊĠĠĠĠ Ġ* ĠPro pag ates Ġcorresponding Ġnext Ġentry Ġfield Ġnavigation Ġand Ġenabling / dis abling ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠEditText . on TextChanged ( ĊĠĠĠĠĠĠĠ Ġtarget Ed t : ĠEditText ?, ĊĠĠĠĠĠĠĠ Ġinput Type : ĠInt , ĊĠĠĠĠĠĠĠ Ġerror _ layout : ĠText Input Layout , ĊĠĠĠĠĠĠĠ Ġerror Msg : ĠString , ĊĠĠĠĠĠĠĠ Ġmax Characters Allowed : ĠInt , ĊĠĠĠĠĠĠĠ Ġis MinMax Strict Validation : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( ed t : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is MinMax Strict Validation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ed t ?. length Ġ!= Ġmax Characters Allowed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetError Condition ( target Ed t , Ġerror _ layout , Ġerror Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Non Error Condition ( target Ed t , Ġerror _ layout , Ġinput Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ed t !!. length Ġ< Ġm General Min Char Ġ|| Ġed t . length Ġ> Ġmax Characters Allowed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetError Condition ( target Ed t , Ġerror _ layout , Ġerror Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Non Error Condition ( target Ed t , Ġerror _ layout , Ġinput Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecific Ġvalidation Ġfor Ġemail Ġentry Ġfield . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠEditText . on Email TextChanged ( ĊĠĠĠĠĠĠĠ Ġtarget Ed t : ĠEditText ?, ĊĠĠĠĠĠĠĠ Ġinput Type : ĠInt , ĊĠĠĠĠĠĠĠ Ġerror _ layout : ĠText Input Layout , ĊĠĠĠĠĠĠĠ Ġerror Msg : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( ed t : ĠEdit able ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Ġ!= Ġnull Ġ&& Ġ!( Pattern . compile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Email Reg Ex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . CASE _ INS ENS ITIVE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). matcher ( text )). matches () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetError Condition ( target Ed t , Ġerror _ layout , Ġerror Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Non Error Condition ( target Ed t , Ġerror _ layout , Ġinput Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommon Ġerror Ġcondition Ġfor Ġentry Ġfields . ĠDis ables Ġnext Ġentry Ġfield . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetError Condition ( target Ed t : ĠEditText ?, Ġerror _ layout : ĠText Input Layout ?, Ġerror Msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror _ layout ?. error Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠ Ġtarget Ed t ?. set Disabled () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommon Ġnon Ġerror Ġcondition Ġfor Ġentry Ġfields . ĠEnables Ġthe Ġnext Ġentry Ġfield . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Non Error Condition ( target Ed t : ĠEditText ?, Ġerror _ layout : ĠText Input Layout ?, Ġinput Type : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror _ layout ?. error Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtarget Ed t ?. setEnabled ( input Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommon Ġfunction Ġfor Ġdisabling Ġentry Ġfields . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠEditText . set Disabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Focus able Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Focus able In Touch Mode Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . input Type Ġ= ĠInput Type . TYPE _ NULL ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommon Ġfunction Ġfor Ġenabling Ġand Ġsetting Ġinput Ġfield Ġaccording Ġto Ġtype Ġof Ġtargeted Ġentry . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠEditText . setEnabled ( input Type New : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Focus able In Touch Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhen Ġ( input Type New ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Default InputType Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . input Type Ġ= ĠInput Type . TYPE _ CLASS _ TEXT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Password InputType Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . input Type Ġ= ĠInput Type . TYPE _ CLASS _ TEXT Ġor ĠInput Type . TYPE _ TEXT _ VARI ATION _ PASSWORD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . input Type Ġ= Ġinput Type New ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ