diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java index a37fe49039..532651e1d9 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java @@ -33,6 +33,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.regex.Pattern; /** * Utility class to convert from spanTransitions = findSpanTransitions(spanned); @@ -76,7 +80,7 @@ import java.util.List; int previousTransition = 0; for (int i = 0; i < spanTransitions.size(); i++) { int index = spanTransitions.keyAt(i); - html.append(Html.escapeHtml(spanned.subSequence(previousTransition, index))); + html.append(escapeHtml(spanned.subSequence(previousTransition, index))); Transition transition = spanTransitions.get(index); Collections.sort(transition.spansRemoved, SpanInfo.FOR_CLOSING_TAGS); @@ -90,7 +94,7 @@ import java.util.List; previousTransition = index; } - html.append(Html.escapeHtml(spanned.subSequence(previousTransition, spanned.length()))); + html.append(escapeHtml(spanned.subSequence(previousTransition, spanned.length()))); return html.toString(); } @@ -187,6 +191,11 @@ import java.util.List; return transition; } + private static String escapeHtml(CharSequence text) { + String escaped = Html.escapeHtml(text); + return NEWLINE_PATTERN.matcher(escaped).replaceAll("
"); + } + private static final class SpanInfo { /** * Sort by end index (descending), then by opening tag and then closing tag (both ascending, for diff --git a/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java b/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java index a92a566ad5..a69499296d 100644 --- a/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java +++ b/library/ui/src/test/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverterTest.java @@ -132,6 +132,20 @@ public class SpannedToHtmlConverterTest { assertThat(html).isEqualTo("String with <b>bold</b> tags"); } + @Test + public void convert_handlesLinebreakInUnspannedString() { + String html = SpannedToHtmlConverter.convert("String with\nnew line and\r\ncrlf style too"); + + assertThat(html).isEqualTo("String with
new line and
crlf style too"); + } + + @Test + public void convert_doesntConvertAmpersandLineFeedToBrTag() { + String html = SpannedToHtmlConverter.convert("String with new line ampersand code"); + + assertThat(html).isEqualTo("String with&#10;new line ampersand code"); + } + @Test public void convert_escapesUnrecognisedTagInSpannedString() { SpannableString spanned = new SpannableString("String with unrecognised tags"); @@ -146,6 +160,13 @@ public class SpannedToHtmlConverterTest { assertThat(html).isEqualTo("String with <foo>unrecognised</foo> tags"); } + @Test + public void convert_handlesLinebreakInSpannedString() { + String html = SpannedToHtmlConverter.convert("String with\nnew line and\r\ncrlf style too"); + + assertThat(html).isEqualTo("String with
new line and
crlf style too"); + } + @Test public void convert_convertsNonAsciiCharactersToAmpersandCodes() { String html =