Skip to content

Commit 98a18fc

Browse files
committed
Optimization
1 parent a7f3bb9 commit 98a18fc

File tree

1 file changed

+58
-9
lines changed

1 file changed

+58
-9
lines changed

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

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import java.lang.annotation.RetentionPolicy;
5151
import java.util.ArrayList;
5252
import java.util.Arrays;
53+
import java.util.Comparator;
5354
import java.util.List;
5455

5556
/**
@@ -99,6 +100,7 @@ public class FormattedEditText extends AppCompatEditText {
99100
private HookLengthFilter mHookLengthFilter;
100101
private boolean mRestoring = false;
101102
private boolean mFilterRestoreTextChangeEvent = false;
103+
private PlaceholderComparator mComparator = new PlaceholderComparator();
102104

103105
public FormattedEditText(Context context) {
104106
super(context);
@@ -452,12 +454,16 @@ private void setConfig(Config config, boolean create) {
452454
if (config.mHintColor != null) {
453455
mHintColor = config.mHintColor;
454456
}
457+
Editable text = getText();
458+
if (text == null || text.length() == 0) {
459+
return;
460+
}
455461
if (!create) {
456462
setText(getRealText());
457463
} else {
458-
setText(getText());
464+
setText(text);
459465
}
460-
Editable text = getText();
466+
text = getText();
461467
Selection.setSelection(text, text.length());
462468
}
463469

@@ -523,7 +529,7 @@ public String getRealText() {
523529
}
524530

525531
private String getRealText(boolean saved) {
526-
if (mMode == MODE_NONE) {
532+
if (saved && mMode == MODE_NONE) {
527533
return "";
528534
}
529535
Editable editable = getText();
@@ -532,7 +538,9 @@ private String getRealText(boolean saved) {
532538
}
533539
SpannableStringBuilder value = new SpannableStringBuilder(editable);
534540
IPlaceholderSpan[] spans;
535-
if (mMode < MODE_MASK) {
541+
if (mMode == MODE_NONE) {
542+
spans = new IPlaceholderSpan[0];
543+
} else if (mMode < MODE_MASK) {
536544
spans =
537545
value.getSpans(
538546
0,
@@ -655,7 +663,7 @@ private void sendAfterTextChanged(Editable s) {
655663
}
656664
}
657665

658-
private void clearArray(final Placeholder[] holders) {
666+
private <T> void clearArray(final T[] holders) {
659667
if (holders != null) {
660668
Arrays.fill(holders, null);
661669
}
@@ -806,10 +814,13 @@ private void formatMask(final Editable editable, int start, boolean delete) {
806814
IPlaceholderSpan[] spans;
807815
if (start > 0) {
808816
spans = editable.getSpans(0, start, IPlaceholderSpan.class);
809-
if (spans.length != 0) {
817+
if (spans.length > 0) {
810818
if (spans.length == start) {
811819
start = 0;
812820
} else {
821+
mComparator.mEditable = editable;
822+
Arrays.sort(spans, mComparator);
823+
mComparator.mEditable = null;
813824
int last = start - 1;
814825
for (int i = spans.length - 1; i >= 0; i--) {
815826
int spanStart = editable.getSpanStart(spans[i]);
@@ -824,9 +835,36 @@ private void formatMask(final Editable editable, int start, boolean delete) {
824835
}
825836
}
826837
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+
}
830868
}
831869
if (delete
832870
&& start == editable.length()
@@ -1132,6 +1170,17 @@ public void writeToParcel(Parcel out, int flags) {
11321170
}
11331171
}
11341172

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+
11351184
private class PlaceholderFilter implements InputFilter {
11361185
private StringBuilder mFilterBuilder = new StringBuilder();
11371186

0 commit comments

Comments
 (0)