// ĠCopyright Ġ( c ) ĠMicrosoft ĠCorporation . Ċ // ĠLicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ċ package Ġcom . microsoft . research . k ary a . utils Ċ Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ Ċ /** ĠCustom Ġ[ Text Watcher ] Ġclass Ġthat Ġapp ends Ġa Ġgiven Ġ[ separator ] Ġfor Ġevery Ġ[ interval ]. Ġ*/ Ċ abstract Ġclass ĠSe parator Text Watcher ( ĊĠ Ġprivate Ġval Ġseparator : ĠChar , ĊĠ Ġprivate Ġval Ġinterval : ĠInt , Ċ ) Ġ: ĠText Watcher Ġ{ ĊĊĠ Ġprivate Ġvar Ġdirty Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġstart Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġbefore Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġcount Ġ= Ġ 0 ĊĊĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ?) Ġ{ ĊĠĠĠ Ġif Ġ( dirty ) Ġreturn ĊĊĠĠĠ Ġdirty Ġ= Ġtrue ĊĠĠĠ Ġval Ġtext And Position Ġ= Ġhandle Separator ( editable . toString ()) ĊĠĠĠ Ġon After TextChanged ( text And Position . first , Ġtext And Position . second ) ĊĠĠĠ Ġdirty Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠ Ġ// ĠEmpty ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġ_ start : ĠInt , Ġ_ before : ĠInt , Ġ_ count : ĠInt ) Ġ{ ĊĠĠĠ Ġstart Ġ= Ġ_ start ĊĠĠĠ Ġbefore Ġ= Ġ_ before ĊĠĠĠ Ġcount Ġ= Ġ_ count ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Separator (_ text : ĠString ): ĠPair < String , ĠInt > Ġ{ ĊĠĠĠ Ġvar Ġtext Ġ= Ġ_ text ĊĊĠĠĠ Ġ/** ĠDelete Ġan Ġextra Ġcharacter Ġif Ġa Ġseparator Ġwas Ġremoved Ġ*/ ĊĠĠĠ Ġif Ġ( before Ġ== Ġ 1 Ġ&& Ġcount Ġ== Ġ 0 Ġ&& Ġ( start Ġ+ Ġ 1 ). rem ( interval Ġ+ Ġ 1 ) Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder ( text ) ĊĠĠĠĠĠ Ġbuilder . delete Char At ( start Ġ- Ġ 1 ) ĊĠĠĠĠĠ Ġtext Ġ= Ġbuilder . toString () ĊĠĠĠĠĠ Ġstart Ġ-= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRe format Ġentire Ġtext Ġ*/ ĊĠĠĠ Ġval Ġtext Without Separator Ġ= Ġtext . replace ( separator . toString (), Ġ"") ĊĠĠĠ Ġval Ġlength Ġ= Ġtext Without Separator . length ĊĠĠĠ Ġvar Ġinsert At Ġ= Ġ(( length Ġ- Ġ 1 ) Ġ/ Ġinterval ) Ġ* Ġinterval ĊĠĠĠ Ġval ĠstringBuilder Ġ= ĠStringBuilder ( text Without Separator ) ĊĠĠĠ Ġwhile Ġ( insert At Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ ĠstringBuilder . insert ( insert At , Ġseparator ) ĊĠĠĠĠĠ Ġinsert At Ġ-= Ġinterval ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠIf Ġadding Ġa Ġcharacter Ġwhere Ġa Ġseparator Ġwould Ġhave Ġbeen Ġadded , Ġthen Ġadd Ġ 1 Ġto Ġnew Ġposition Ġ*/ ĊĠĠĠ Ġval ĠaddTo Position Ġ= Ġif Ġ( before Ġ== Ġ 0 Ġ&& Ġ( start Ġ+ Ġ 1 ). rem ( interval Ġ+ Ġ 1 ) Ġ== Ġ 0 ) Ġ 1 Ġelse Ġ 0 ĊĊĠĠĠ Ġ/** ĠReturn Ġformatted Ġtext Ġand Ġcurrent Ġtext Ġposition Ġ*/ ĊĠĠĠ Ġval Ġnew Text Ġ= ĠstringBuilder . toString () ĊĠĠĠ Ġvar Ġnew Position Ġ= Ġstart Ġ+ Ġcount Ġ+ ĠaddTo Position ĊĠĠĠ Ġif Ġ( new Position Ġ> Ġnew Text . length ) Ġnew Position Ġ= Ġnew Text . length ĊĠĠĠ Ġreturn ĠPair ( new Text , Ġnew Position ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠSub classes Ġmust Ġimplement Ġthis Ġmethod Ġto Ġget Ġthe Ġformatted Ġtext . Ġ*/ ĊĠ Ġabstract Ġfun Ġon After TextChanged ( text : ĠString , Ġposition : ĠInt ) Ċ } Ċ