package Ġme . byte beats . views . bank card Ċ Ċ import Ġandroid . text . Text Watcher Ċ import Ġjava . lang . StringBuffer Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Selection Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . text . Input Filter . Length Filter Ċ import Ġandroid . widget . EditText Ċ Ċ /** Ċ Ġ* Ġ@ author Ġbyte beats Ġ|| Ġhappy ch in ap c [ at ] gmail [ dot ] com Ċ Ġ* Ġ@ date Ġ 2 0 1 5 / 3 / 2 5 Ċ Ġ* Ġ@ time Ġ 1 6 : 3 6 Ċ Ġ*/ Ċ class ĠBank Card Text Watcher ( private Ġval Ġm Editor : ĠEditText , Ġvar Ġsplit ter : ĠSplit ter Ġ= ĠSplit ter . WH ITES PACE ) Ġ: ĊĠĠĠĠĠĠĠ ĠText Watcher Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġprev Text Length Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcur Text Length Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis Changed Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcursor Ġ= Ġ 0 Ġ// Ġcursor 's Ġlocation ; ĊĠĠĠ Ġprivate Ġvar Ġtmp CharArray : ĠChar Array ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbuffer Ġ= ĠStringBuffer () ĊĠĠĠ Ġprivate Ġvar Ġsplit ter Counter Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġon Bank Card Verify Listener : ĠOn Verify Bank Card Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġm Editor . filters Ġ= ĠarrayOf < Input Filter >( Length Filter ( LIMIT _ OF _ INPUT _ LENGTH )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprev Text Length Ġ= Ġs . length ĊĠĠĠĠĠĠĠ Ġif Ġ( buffer . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . delete ( 0 , Ġbuffer . length ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsplit ter Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ== Ġsplit ter . splitter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit ter Counter ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcur Text Length Ġ= Ġs . length ĊĠĠĠĠĠĠĠ Ġbuffer . append ( s ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cur Text Length Ġ== Ġprev Text Length Ġ|| Ġcur Text Length Ġ<= Ġ 3 Ġ|| Ġis Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġm Editor . selection End ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġbuffer . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ index ] Ġ== Ġsplit ter . splitter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . delete Char At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtmp Splitter Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġbuffer . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 4 Ġ|| Ġindex Ġ== Ġ 9 Ġ|| Ġindex Ġ== Ġ 1 4 Ġ|| Ġindex Ġ== Ġ 1 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . insert ( index , Ġsplit ter . splitter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Splitter Counter ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmp Splitter Counter Ġ> Ġsplit ter Counter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ+= Ġtmp Splitter Counter Ġ- Ġsplit ter Counter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp CharArray Ġ= ĠChar Array ( buffer . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . get Chars ( 0 , Ġbuffer . length , Ġtmp CharArray , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġbuffer . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ> Ġstr . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġstr . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( cursor Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Editor . setText ( str ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditable Ġ= Ġm Editor . text ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSelection . setSelection ( editable , Ġcursor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrimmed Bank Card No Ġ= Ġif Ġ( m Editor Ġis ĠBank Card EditText ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrimmed Bank Card No ( m Editor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrimmed Bank Card No ( m Editor , Ġsplit ter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Bank Card Verify Listener Ġ!= Ġnull Ġ&& Ġverify Bank Card ( trimmed Bank Card No )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Bank Card Verify Listener ?. on Success ( Bank Card Info ( trimmed Bank Card No !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Bank Card Verify Listener ?. on Failure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLIMIT _ OF _ INPUT _ LENGTH Ġ= Ġ 2 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Bank Card Text Watcher " ĊĊĠĠĠĠĠĠĠ Ġfun Ġtrimmed Bank Card No ( editor : ĠBank Card EditText ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġeditor . text ?. replace ( Regex ( editor . splitter . splitter . toString ()), Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtrimmed Bank Card No ( editor : ĠEditText , Ġsplit ter : ĠSplit ter ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġeditor . text ?. replace ( Regex ( splitter . splitter . toString ()), Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }