package Ġcom . lq min h lab . mm _ travel . src . ext enst ions Ċ Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . util . Patterns Ċ import Ġandroid . widget . EditText Ċ Ċ fun ĠEditText . validate ( validator : Ġ( String ) Ġ-> ĠBoolean , Ġmessage Error : ĠString ) Ġ: ĠBoolean Ġ{ ĊĠĠĠ Ġthis . after TextChanged Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . error Ġ= Ġif Ġ( validator ( it )) Ġnull Ġelse Ġmessage Error ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvalidator ( this . text . toString ()) Ċ } Ċ Ċ fun ĠEditText . after TextChanged ( after TextChanged Ġ: Ġ( String )-> Unit ){ ĊĠĠĠ Ġthis . add TextChanged Listener ( object : ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter TextChanged . invoke ( s . 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 ) Ġ{ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ fun ĠString . isValid Length ( length : ĠInt ): ĠBoolean Ġ Ġ= Ġthis . length Ġ>= Ġlength Ċ fun ĠString . isValid Email () Ġ= Ġ! isNull OrEmpty () Ġ&& ĠPattern s . EMAIL _ ADDRESS . matcher ( this ). matches ()