@@ -589,7 +589,7 @@ private String getRealText(boolean saved) {
589
589
return null ;
590
590
}
591
591
} else {
592
- clearNonEmptySpans (value , spans );
592
+ clearNonEmptySpans (value , spans , false );
593
593
}
594
594
final String realText = value .toString ();
595
595
value .clear ();
@@ -693,9 +693,9 @@ private void sendAfterTextChanged(Editable s) {
693
693
}
694
694
}
695
695
696
- private <T > void clearArray (final T [] holders ) {
697
- if (holders != null ) {
698
- Arrays .fill (holders , null );
696
+ private <T > void clearArray (final T [] array ) {
697
+ if (array != null ) {
698
+ Arrays .fill (array , null );
699
699
}
700
700
}
701
701
@@ -932,23 +932,41 @@ private void formatMask(final Editable editable, int start, boolean deletion) {
932
932
933
933
private int clearPlaceholders (Editable editable , int start ) {
934
934
IPlaceholderSpan [] spans ;
935
+ boolean sorted ;
935
936
if (start > 0 ) {
936
- IPlaceholderSpan [] left = editable .getSpans (0 , start , IPlaceholderSpan .class );
937
+ sorted = true ;
938
+ mComparator .mEditable = editable ;
939
+ IPlaceholderSpan [] left ;
940
+ if (mMode < MODE_MASK ) {
941
+ int i ;
942
+ for (i = start ; i > 0 ; i --) {
943
+ char holder = findPlaceholder (i );
944
+ if (holder == 0 ) {
945
+ break ;
946
+ }
947
+ }
948
+ start = i ;
949
+ left = EMPTY_SPANS ;
950
+ } else {
951
+ left = editable .getSpans (0 , start , IPlaceholderSpan .class );
952
+ Arrays .sort (left , mComparator );
953
+ }
937
954
IPlaceholderSpan [] right ;
938
955
if (start >= editable .length ()) {
939
956
right = EMPTY_SPANS ;
940
957
} else {
941
958
right = editable .getSpans (start , editable .length (), IPlaceholderSpan .class );
959
+ Arrays .sort (right , mComparator );
942
960
}
943
- if (left .length == start ) {
961
+ mComparator .mEditable = null ;
962
+ if (left .length == 0 ) {
963
+ spans = right ;
964
+ } else if (left .length == start ) {
944
965
start = 0 ;
945
966
spans = new IPlaceholderSpan [left .length + right .length ];
946
967
System .arraycopy (left , 0 , spans , 0 , left .length );
947
968
System .arraycopy (right , 0 , spans , left .length , right .length );
948
- } else if (left .length > 0 ) {
949
- mComparator .mEditable = editable ;
950
- Arrays .sort (left , mComparator );
951
- mComparator .mEditable = null ;
969
+ } else {
952
970
int last = start - 1 ;
953
971
int index ;
954
972
for (index = left .length - 1 ; index >= 0 ; index --) {
@@ -969,21 +987,18 @@ private int clearPlaceholders(Editable editable, int start) {
969
987
System .arraycopy (left , index , spans , 0 , leftLength );
970
988
System .arraycopy (right , 0 , spans , leftLength , right .length );
971
989
}
972
- } else {
973
- spans = right ;
974
990
}
975
991
} else {
992
+ sorted = false ;
976
993
spans = editable .getSpans (0 , editable .length (), IPlaceholderSpan .class );
977
994
}
978
- if (spans .length > 0 ) {
979
- if (spans .length == editable .length () - start ) {
980
- editable .delete (start , editable .length ());
981
- if (start == 0 && isNeedClearText ()) {
982
- return -1 ;
983
- }
984
- } else {
985
- clearNonEmptySpans (editable , spans );
995
+ if (spans .length == editable .length () - start ) {
996
+ editable .delete (start , editable .length ());
997
+ if (start == 0 && isNeedClearText ()) {
998
+ return -1 ;
986
999
}
1000
+ } else if (spans .length > 0 ) {
1001
+ clearNonEmptySpans (editable , spans , sorted );
987
1002
}
988
1003
return start ;
989
1004
}
@@ -1008,10 +1023,12 @@ private int rangeCountEscapeChar(int end) {
1008
1023
return count ;
1009
1024
}
1010
1025
1011
- private void clearNonEmptySpans (Editable editable , IPlaceholderSpan [] spans ) {
1012
- mComparator .mEditable = editable ;
1013
- Arrays .sort (spans , mComparator );
1014
- mComparator .mEditable = null ;
1026
+ private void clearNonEmptySpans (Editable editable , IPlaceholderSpan [] spans , boolean sorted ) {
1027
+ if (!sorted ) {
1028
+ mComparator .mEditable = editable ;
1029
+ Arrays .sort (spans , mComparator );
1030
+ mComparator .mEditable = null ;
1031
+ }
1015
1032
IPlaceholderSpan last = spans [0 ], current = spans [0 ];
1016
1033
int lastStart = editable .getSpanStart (last );
1017
1034
for (int i = 1 ; i < spans .length ; i ++) {
0 commit comments