Skip to content

Commit 99cfc17

Browse files
committed
Improved efficiency && Improved experience consistency
1 parent 2b8e9e7 commit 99cfc17

File tree

1 file changed

+41
-24
lines changed

1 file changed

+41
-24
lines changed

core/src/main/java/me/dkzwm/widget/fet/FormattedEditText.java

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ private String getRealText(boolean saved) {
589589
return null;
590590
}
591591
} else {
592-
clearNonEmptySpans(value, spans);
592+
clearNonEmptySpans(value, spans, false);
593593
}
594594
final String realText = value.toString();
595595
value.clear();
@@ -693,9 +693,9 @@ private void sendAfterTextChanged(Editable s) {
693693
}
694694
}
695695

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);
699699
}
700700
}
701701

@@ -932,23 +932,41 @@ private void formatMask(final Editable editable, int start, boolean deletion) {
932932

933933
private int clearPlaceholders(Editable editable, int start) {
934934
IPlaceholderSpan[] spans;
935+
boolean sorted;
935936
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+
}
937954
IPlaceholderSpan[] right;
938955
if (start >= editable.length()) {
939956
right = EMPTY_SPANS;
940957
} else {
941958
right = editable.getSpans(start, editable.length(), IPlaceholderSpan.class);
959+
Arrays.sort(right, mComparator);
942960
}
943-
if (left.length == start) {
961+
mComparator.mEditable = null;
962+
if (left.length == 0) {
963+
spans = right;
964+
} else if (left.length == start) {
944965
start = 0;
945966
spans = new IPlaceholderSpan[left.length + right.length];
946967
System.arraycopy(left, 0, spans, 0, left.length);
947968
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 {
952970
int last = start - 1;
953971
int index;
954972
for (index = left.length - 1; index >= 0; index--) {
@@ -969,21 +987,18 @@ private int clearPlaceholders(Editable editable, int start) {
969987
System.arraycopy(left, index, spans, 0, leftLength);
970988
System.arraycopy(right, 0, spans, leftLength, right.length);
971989
}
972-
} else {
973-
spans = right;
974990
}
975991
} else {
992+
sorted = false;
976993
spans = editable.getSpans(0, editable.length(), IPlaceholderSpan.class);
977994
}
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;
986999
}
1000+
} else if (spans.length > 0) {
1001+
clearNonEmptySpans(editable, spans, sorted);
9871002
}
9881003
return start;
9891004
}
@@ -1008,10 +1023,12 @@ private int rangeCountEscapeChar(int end) {
10081023
return count;
10091024
}
10101025

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+
}
10151032
IPlaceholderSpan last = spans[0], current = spans[0];
10161033
int lastStart = editable.getSpanStart(last);
10171034
for (int i = 1; i < spans.length; i++) {

0 commit comments

Comments
 (0)