package Ġbr . com . ever to fab io Ċ Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġcom . google . android . material . text field . TextInput EditText Ċ Ċ class ĠWatch er Mask ( private Ġval Ġmask : ĠString , Ġprivate Ġval Ġedit Text : ĠText Input EditText ): ĠText Watcher Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġis Updating Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġmask Chars Ġ= Ġ"/ - ,. ()" ĊĠĠĠ Ġprivate Ġval Ġmask Length Ġ= Ġmask . length ĊĊĠĠĠ Ġprivate Ġfun Ġget Mask Char ( pos : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmask Char Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( pos Ġ< Ġmask Length ) Ġ&& Ġ( is Mask Char ( mask [ pos ]))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmask Char Ġ= Ġmask [ pos ]. toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmask Char ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Mask Char ( char : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmask Chars . contains ( char ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Updating ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Updating Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( before == 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġonly Numbers ( s . toString ()) ĊĠĠĠĠĠĠĠ Ġvar Ġnew Text Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġtext . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmask Separator Ġ= Ġget Mask Char ( index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mask Separator . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Text Ġ+= Ġmask Separator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Text Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Updating Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġedit Text . setText ( new Text ) ĊĠĠĠĠĠĠĠ Ġedit Text . setSelection ( new Text . length ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ?) Ġ{ ĊĠĠĠ Ġ} Ċ }