package Ġcom . s antal u . mask ara Ċ Ċ import Ġandroid . text . Selection Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġfat ih . s antal u Ġon Ġ 7 / 7 / 2 0 2 0 . Ċ Ġ*/ Ċ Ċ @ Suppress (" Spell Checking Inspection ") Ċ internal Ġclass ĠMask ara ( private Ġval Ġmask : ĠMask ) Ġ{ ĊĊĠĠĠ Ġfun Ġapply ( text : ĠCharSequence , Ġaction : ĠAction ): ĠMask Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġtext . iterator () ĊĠĠĠĠĠĠĠ Ġval Ġmasked Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġun Mask ed Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġvar Ġchar Ġ= Ġsource . next OrNull () ĊĠĠĠĠĠĠĠ Ġloop @ Ġfor Ġ( mask Char Ġin Ġmask . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Char Ġ== Ġchar Ġ&& Ġmask Char Ġ!= Ġmask . character Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmasked . append ( mask Char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ġ= Ġsource . next OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmask Char Ġ== Ġmask . character Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ġ= Ġsource . next Mask Char ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mask . style Ġ== ĠMask Style . NORMAL ) Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmasked . append ( mask Char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmasked . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun Mask ed . append ( char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Ġ= Ġsource . next OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġnull Ġ&& Ġmask . style Ġ== ĠMask Style . NORMAL Ġ&& Ġaction Ġ== ĠAction . DELETE ) Ġbreak @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmasked . append ( mask Char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠClear Ġmask Ġto Ġlet Ġuser Ġdefined Ġhint Ġshown ĊĠĠĠĠĠĠĠ Ġvar Ġmasked Text Ġ= Ġmasked . toString () ĊĠĠĠĠĠĠĠ Ġvar Ġun Mask ed Text Ġ= Ġun Mask ed . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( mask . style Ġ!= ĠMask Style . PER SIST ENT Ġ&& Ġmask . value . startsWith ( masked Text )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmasked Text Ġ= Ġmasked . clear (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun Mask ed Text Ġ= Ġun Mask ed . clear (). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġselection Ġ= Ġmask . next Selection ( text , Ġmasked Text , Ġaction ) ĊĠĠĠĠĠĠĠ Ġreturn ĠMask Result ( selection , Ġmasked Text , Ġun Mask ed Text , Ġmask . is Done ( masked Text )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠChar Iterator . next OrNull (): ĠChar ? Ġ= Ġif Ġ( hasNext ()) Ġnext Char () Ġelse Ġnull Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġnext Ġvalid Ġmask Ġcharacter Ġfrom Ġstart Ċ Ġ*/ Ċ internal Ġfun ĠChar Iterator . next Mask Char ( char : ĠChar ?): ĠChar ? Ġ{ ĊĠĠĠ Ġvar Ġnext Mask Char Ġ= Ġchar Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġwhile Ġ( hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( next Mask Char . is Letter Or Digit ()) Ġbreak ĊĠĠĠĠĠĠĠ Ġnext Mask Char Ġ= Ġnext Char () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠIn Ġcase Ġwe Ġcould Ġnot Ġfind Ġany Ġvalid Ġcharacter ĊĠĠĠ Ġreturn Ġif Ġ( next Mask Char . is Letter Or Digit ()) Ġnext Mask Char Ġelse Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġindex Ġof Ġfirst Ġmask Ġcharacter Ġafter Ġthe Ġcurrent Ġcursor Ġposition Ċ Ġ*/ Ċ internal Ġfun ĠMask . next Selection ( before : ĠCharSequence , Ġafter : ĠCharSequence , Ġaction : ĠAction ): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ( after . isEmpty ()) Ġreturn Ġ 0 ĊĊĠĠĠ Ġval Ġstart Ġ= ĠSelection . getSelection Start ( before ) ĊĠĠĠ Ġif Ġ( action Ġ== ĠAction . DELETE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( style Ġ!= ĠMask Style . PER SIST ENT ) Ġreturn Ġstart ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġlet Ġthe Ġcursor Ġexceed Ġbeyond Ġfirst Ġmask Ġcharacter ĊĠĠĠĠĠĠĠ Ġval Ġfirst Mask Index Ġ= Ġvalue . indexOf ( character , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstart . coerce At Least ( first Mask Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġend Ġ= Ġafter . length ĊĠĠĠ Ġvar Ġnext Mask Index Ġ= Ġvalue . indexOf ( character , Ġstart ) ĊĠĠĠ Ġ// ĠMake Ġsure Ġthe Ġcursor Ġis Ġlocated Ġto Ġthe Ġend Ġof Ġthe Ġselection ĊĠĠĠ Ġval Ġprevious Char Ġ= Ġbefore . get OrNull ( start ) ĊĠĠĠ Ġval Ġnext Char Ġ= Ġafter . get OrNull ( next Mask Index ) ĊĠĠĠ Ġif Ġ( previous Char Ġ!= Ġnext Char Ġ&& Ġnext Char Ġ!= Ġcharacter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ++ next Mask Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnext Mask Index . coerce In ( min ( start , Ġend ), Ġmax ( start , Ġend )) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġvalidity Ġof Ġmask Ġresult Ċ Ġ*/ Ċ internal Ġfun ĠMask . is Done ( after : ĠCharSequence ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġafter . length Ġ== Ġvalue . length Ġ&& Ġ! after . contains ( character ) Ċ } Ċ