50
50
import java .lang .annotation .RetentionPolicy ;
51
51
import java .util .ArrayList ;
52
52
import java .util .Arrays ;
53
+ import java .util .Comparator ;
53
54
import java .util .List ;
54
55
55
56
/**
@@ -99,6 +100,7 @@ public class FormattedEditText extends AppCompatEditText {
99
100
private HookLengthFilter mHookLengthFilter ;
100
101
private boolean mRestoring = false ;
101
102
private boolean mFilterRestoreTextChangeEvent = false ;
103
+ private PlaceholderComparator mComparator = new PlaceholderComparator ();
102
104
103
105
public FormattedEditText (Context context ) {
104
106
super (context );
@@ -452,12 +454,16 @@ private void setConfig(Config config, boolean create) {
452
454
if (config .mHintColor != null ) {
453
455
mHintColor = config .mHintColor ;
454
456
}
457
+ Editable text = getText ();
458
+ if (text == null || text .length () == 0 ) {
459
+ return ;
460
+ }
455
461
if (!create ) {
456
462
setText (getRealText ());
457
463
} else {
458
- setText (getText () );
464
+ setText (text );
459
465
}
460
- Editable text = getText ();
466
+ text = getText ();
461
467
Selection .setSelection (text , text .length ());
462
468
}
463
469
@@ -523,7 +529,7 @@ public String getRealText() {
523
529
}
524
530
525
531
private String getRealText (boolean saved ) {
526
- if (mMode == MODE_NONE ) {
532
+ if (saved && mMode == MODE_NONE ) {
527
533
return "" ;
528
534
}
529
535
Editable editable = getText ();
@@ -532,7 +538,9 @@ private String getRealText(boolean saved) {
532
538
}
533
539
SpannableStringBuilder value = new SpannableStringBuilder (editable );
534
540
IPlaceholderSpan [] spans ;
535
- if (mMode < MODE_MASK ) {
541
+ if (mMode == MODE_NONE ) {
542
+ spans = new IPlaceholderSpan [0 ];
543
+ } else if (mMode < MODE_MASK ) {
536
544
spans =
537
545
value .getSpans (
538
546
0 ,
@@ -655,7 +663,7 @@ private void sendAfterTextChanged(Editable s) {
655
663
}
656
664
}
657
665
658
- private void clearArray (final Placeholder [] holders ) {
666
+ private < T > void clearArray (final T [] holders ) {
659
667
if (holders != null ) {
660
668
Arrays .fill (holders , null );
661
669
}
@@ -806,10 +814,13 @@ private void formatMask(final Editable editable, int start, boolean delete) {
806
814
IPlaceholderSpan [] spans ;
807
815
if (start > 0 ) {
808
816
spans = editable .getSpans (0 , start , IPlaceholderSpan .class );
809
- if (spans .length != 0 ) {
817
+ if (spans .length > 0 ) {
810
818
if (spans .length == start ) {
811
819
start = 0 ;
812
820
} else {
821
+ mComparator .mEditable = editable ;
822
+ Arrays .sort (spans , mComparator );
823
+ mComparator .mEditable = null ;
813
824
int last = start - 1 ;
814
825
for (int i = spans .length - 1 ; i >= 0 ; i --) {
815
826
int spanStart = editable .getSpanStart (spans [i ]);
@@ -824,9 +835,36 @@ private void formatMask(final Editable editable, int start, boolean delete) {
824
835
}
825
836
}
826
837
spans = editable .getSpans (start , editable .length (), IPlaceholderSpan .class );
827
- for (IPlaceholderSpan s : spans ) {
828
- int spanStart = editable .getSpanStart (s );
829
- editable .delete (spanStart , spanStart + 1 );
838
+ if (spans .length > 0 ) {
839
+ if (spans .length == editable .length () - start ) {
840
+ editable .delete (start , editable .length ());
841
+ } else {
842
+ mComparator .mEditable = editable ;
843
+ Arrays .sort (spans , mComparator );
844
+ mComparator .mEditable = null ;
845
+ IPlaceholderSpan [][] spansPair = new IPlaceholderSpan [spans .length ][2 ];
846
+ int index = 0 ;
847
+ spansPair [index ][0 ] = spans [0 ];
848
+ spansPair [index ][1 ] = spans [0 ];
849
+ int lastStart = editable .getSpanStart (spans [0 ]);
850
+ for (int i = 1 ; i < spans .length ; i ++) {
851
+ int spanStart = editable .getSpanStart (spans [i ]);
852
+ if (lastStart + 1 == spanStart ) {
853
+ spansPair [index ][1 ] = spans [i ];
854
+ } else {
855
+ if (index == spans .length - 1 ) break ;
856
+ index += 1 ;
857
+ spansPair [index ][0 ] = spans [i ];
858
+ spansPair [index ][1 ] = spans [i ];
859
+ }
860
+ lastStart = spanStart ;
861
+ }
862
+ for (int i = index ; i >= 0 ; i --) {
863
+ int spanStart = editable .getSpanStart (spansPair [i ][0 ]);
864
+ int spanEnd = editable .getSpanEnd (spansPair [i ][1 ]);
865
+ editable .delete (spanStart , spanEnd );
866
+ }
867
+ }
830
868
}
831
869
if (delete
832
870
&& start == editable .length ()
@@ -1132,6 +1170,17 @@ public void writeToParcel(Parcel out, int flags) {
1132
1170
}
1133
1171
}
1134
1172
1173
+ private static class PlaceholderComparator implements Comparator <IPlaceholderSpan > {
1174
+ private Editable mEditable ;
1175
+
1176
+ @ Override
1177
+ public int compare (IPlaceholderSpan o1 , IPlaceholderSpan o2 ) {
1178
+ int x = mEditable .getSpanStart (o1 );
1179
+ int y = mEditable .getSpanStart (o2 );
1180
+ return (x < y ) ? -1 : ((x == y ) ? 0 : 1 );
1181
+ }
1182
+ }
1183
+
1135
1184
private class PlaceholderFilter implements InputFilter {
1136
1185
private StringBuilder mFilterBuilder = new StringBuilder ();
1137
1186
0 commit comments