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; return;
} }
if (spans.getClass().isArray()) { // @since 3.0.1-SNAPSHOT we introduce another method that recursively applies spans
for (Object o : ((Object[]) spans)) { // allowing array of arrays (and more)
builder.setSpan(o, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); setSpansInternal(builder, spans, start, end);
}
} else {
builder.setSpan(spans, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} }
} }
@ -406,4 +402,24 @@ public class SpannableBuilder implements Appendable, CharSequence {
super(text); 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()); assertTrue(builder.getSpans(0, builder.length()).isEmpty());
final Object[] flatSpans = {
new Object(),
new Object(),
new Object(),
new Object(),
new Object()
};
final Object[] spans = { final Object[] spans = {
new Object[]{ new Object[]{
new Object(), new Object() flatSpans[0], flatSpans[1]
}, },
new Object[]{ new Object[]{
new Object(), new Object(), new Object() flatSpans[2], flatSpans[3], flatSpans[4]
} }
}; };
setSpans(builder, spans, 0, 1); setSpans(builder, spans, 0, 1);
final List<SpannableBuilder.Span> actual = builder.getSpans(0, builder.length()); 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++) { for (int i = 0, length = spans.length; i < length; i++) {
assertEquals(spans[i], actual.get(i).what); assertEquals(flatSpans[i], actual.get(i).what);
} }
} }