package Ġpayment . sdk . android . card payment . widget Ċ Ċ import Ġandroid . support . annotation . Int Range Ċ import Ġandroid . text . Input Filter Ċ import Ġandroid . text . Sp ann able StringBuilder Ċ import Ġandroid . text . Sp anned Ċ Ċ internal Ġclass ĠNumeric Mask Input Filter ( ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmask : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġplace Holder : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlistener : ĠMask Listener Ċ ) Ġ: ĠInput Filter Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mask . length Ġ!= Ġplace Holder . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Mask Ġ(${ mask . length }) Ġand Ġplace Holder (${ place Holder . length }) Ġsizes Ġshould Ġbe Ġthe Ġsame ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfilter ( source : ĠCharSequence , Ġsource Start : ĠInt , Ġsource End : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Sp anned : ĠSp anned , Ġstart : ĠInt , Ġend : ĠInt ): ĠCharSequence ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( destination Sp anned Ġ! is ĠSp ann able StringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( destination Sp anned . length Ġ>= Ġmask . length Ġ&& Ġsource . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNO _ TEXT _ UPDATE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! source . all Ġ{ Ġchr Ġ-> Ġchr . is Digit () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠNO _ TEXT _ UPDATE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġbuilder . append ( destination Sp anned . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġcursor Position : ĠInt ĊĊĠĠĠĠĠĠĠ Ġif Ġ( source . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Mask Position Ġ= Ġnext Mask Char Position ( start ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Mask Position Ġ>= Ġbuilder . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAppend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Position Ġ= Ġappend End ( builder , Ġnext Mask Position , Ġsource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInsert Ġ+ ĠShift ĠRight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeep Ġ= Ġbuilder . substring ( next Mask Position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . replace ( next Mask Position , Ġnext Mask Position Ġ+ Ġsource . length , Ġsource . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . delete ( next Mask Position Ġ+ Ġsource . length , Ġbuilder . length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Available Index Ġ= Ġnext Mask Char Position ( next Mask Position Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġchr ) Ġin Ġkeep . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mask Char ( next Mask Position Ġ+ Ġindex )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Available Index Ġ= Ġappend End ( builder , Ġlast Available Index , Ġchr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Position Ġ= Ġnext Mask Position Ġ+ Ġsource . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelete Ġ+ ĠShift ĠLeft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeep Ġ= Ġbuilder . substring ( end , Ġbuilder . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . delete ( start , Ġbuilder . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrop Last Until ( builder ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask [ index ] Ġ== ĠMASK _ CHAR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Available Index Ġ= Ġbuilder . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġchr ) Ġin Ġkeep . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mask Char ( end Ġ+ Ġindex )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Available Index Ġ= Ġappend End ( builder , Ġlast Available Index , Ġchr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Position Ġ= Ġlast Available Index ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlistener . on New Text ( getRaw Text ( builder ), Ġbuilder . toString (), Ġcursor Position ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠNO _ TEXT _ UPDATE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Raw Text ( text : ĠCharSequence ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġtext . forEach Indexed Ġ{ Ġindex , Ġchr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mask Char ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Builder . append ( chr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġraw Builder . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Mask Char Position (@ Int Range ( from Ġ= Ġ 0 ) Ġstart : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmask . indexOf ( MASK _ CHAR , Ġstart ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġdrop Last Until ( builder : ĠStringBuilder , Ġpredicate : Ġ( Int ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloop @ Ġfor Ġ( index Ġin Ġbuilder . last Index Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( predicate ( index )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . delete Char At ( builder . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend End ( builder : ĠStringBuilder , Ġ@ Int Range ( from Ġ= Ġ 0 ) Ġstart : ĠInt , Ġsource : ĠCharSequence ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnext Ġ= Ġstart ĊĠĠĠĠĠĠĠ Ġsource . forEach Ġ{ Ġchr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġappend End ( builder , Ġnext , Ġchr ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend End ( builder : ĠStringBuilder , Ġ@ Int Range ( from Ġ= Ġ 0 ) Ġstart : ĠInt , Ġchr : ĠChar ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġnext Mask Char Position ( start ) ĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . length ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ> Ġbuilder . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbuilder . length Ġuntil Ġnext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( place Holder [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . append ( chr ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Mask Char (@ Int Range ( from Ġ= Ġ 0 ) Ġindex : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( index Ġ< Ġmask . length Ġ&& Ġmask [ index ] Ġ== ĠMASK _ CHAR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Mask ( new Mask : ĠString , Ġnew Place Holder : ĠString , Ġtext : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( value Ġ= Ġnew Mask . length Ġ== Ġnew Place Holder . length ) ĊĠĠĠĠĠĠĠ Ġval Ġexisting Raw Text Ġ= Ġget Raw Text ( text ) ĊĠĠĠĠĠĠĠ Ġmask Ġ= Ġnew Mask ĊĠĠĠĠĠĠĠ Ġplace Holder Ġ= Ġnew Place Holder ĊĠĠĠĠĠĠĠ Ġfilter ( existing Raw Text , Ġ 0 , Ġexisting Raw Text . length , ĠSp ann able StringBuilder (), Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinterface ĠMask Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon New Text ( raw Text Value : ĠString , Ġmasked Text Value : ĠString , Ġ@ Int Range ( from Ġ= Ġ 0 ) Ġcursor Position : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNO _ TEXT _ UPDATE Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMASK _ CHAR Ġ= Ġ'#' ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPL ACE HOLDER _ CHAR Ġ= Ġ' 0 ' ĊĠĠĠ Ġ} Ċ } Ċ