SpannableBuilder setSpans allow array of arrays

This commit is contained in:
Dimitry Ivanov 2019-03-28 13:28:02 +03:00
parent 947f57d0eb
commit ad284c756b
2 changed files with 35 additions and 11 deletions

View File

@ -38,13 +38,9 @@ public class SpannableBuilder implements Appendable, CharSequence {
return;
}
if (spans.getClass().isArray()) {
for (Object o : ((Object[]) spans)) {
builder.setSpan(o, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else {
builder.setSpan(spans, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// @since 3.0.1-SNAPSHOT we introduce another method that recursively applies spans
// allowing array of arrays (and more)
setSpansInternal(builder, spans, start, end);
}
}
@ -406,4 +402,24 @@ public class SpannableBuilder implements Appendable, CharSequence {
super(text);
}
}
/**
* @since 3.0.1-SNAPSHOT
*/
private static void setSpansInternal(
@NonNull SpannableBuilder builder,
@Nullable Object spans,
int start,
int end) {
if (spans != null) {
if (spans.getClass().isArray()) {
for (Object o : ((Object[]) spans)) {
// @since 3.0.1-SNAPSHOT recursively apply spans (allow array of arrays)
setSpansInternal(builder, o, start, end);
}
} else {
builder.setSpan(spans, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}

View File

@ -224,22 +224,30 @@ public class SpannableBuilderTest {
assertTrue(builder.getSpans(0, builder.length()).isEmpty());
final Object[] flatSpans = {
new Object(),
new Object(),
new Object(),
new Object(),
new Object()
};
final Object[] spans = {
new Object[]{
new Object(), new Object()
flatSpans[0], flatSpans[1]
},
new Object[]{
new Object(), new Object(), new Object()
flatSpans[2], flatSpans[3], flatSpans[4]
}
};
setSpans(builder, spans, 0, 1);
final List<SpannableBuilder.Span> actual = builder.getSpans(0, builder.length());
assertEquals(2, actual.size());
assertEquals(flatSpans.length, actual.size());
for (int i = 0, length = spans.length; i < length; i++) {
assertEquals(spans[i], actual.get(i).what);
assertEquals(flatSpans[i], actual.get(i).what);
}
}