Don't use StringReader in HtmlConverter as calls to read have unnecessary locking.

This commit is contained in:
Doug Sparling 2015-07-23 00:07:21 -05:00
parent 9050ef16a2
commit ecd5239c2b
1 changed files with 51 additions and 66 deletions

View File

@ -2,13 +2,10 @@ package com.fsck.k9.helper;
import android.text.*; import android.text.*;
import android.text.Html.TagHandler; import android.text.Html.TagHandler;
import android.util.Log;
import com.fsck.k9.K9; import com.fsck.k9.K9;
import org.xml.sax.XMLReader; import org.xml.sax.XMLReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
@ -211,29 +208,23 @@ public class HtmlConverter {
// Encode HTML entities to make sure we don't display something evil. // Encode HTML entities to make sure we don't display something evil.
text = TextUtils.htmlEncode(text); text = TextUtils.htmlEncode(text);
StringReader reader = new StringReader(text);
StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH); StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH);
buff.append(htmlifyMessageHeader()); buff.append(htmlifyMessageHeader());
int c; for (int index = 0; index < text.length(); index++) {
try { char c = text.charAt(index);
while ((c = reader.read()) != -1) { switch (c) {
switch (c) { case '\n':
case '\n': // pine treats <br> as two newlines, but <br/> as one newline. Use <br/> so our messages aren't
// pine treats <br> as two newlines, but <br/> as one newline. Use <br/> so our messages aren't // doublespaced.
// doublespaced. buff.append("<br />");
buff.append("<br />"); break;
break; case '\r':
case '\r': break;
break; default:
default: buff.append(c);
buff.append((char)c); }//switch
}//switch
}
} catch (IOException e) {
//Should never happen
Log.e(K9.LOG_TAG, "Could not read string to convert text to HTML:", e);
} }
buff.append(htmlifyMessageFooter()); buff.append(htmlifyMessageFooter());
@ -274,60 +265,54 @@ public class HtmlConverter {
if (text.length() > MAX_SMART_HTMLIFY_MESSAGE_LENGTH) { if (text.length() > MAX_SMART_HTMLIFY_MESSAGE_LENGTH) {
return simpleTextToHtml(text); return simpleTextToHtml(text);
} }
StringReader reader = new StringReader(text);
StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH); StringBuilder buff = new StringBuilder(text.length() + TEXT_TO_HTML_EXTRA_BUFFER_LENGTH);
boolean isStartOfLine = true; // Are we currently at the start of a line? boolean isStartOfLine = true; // Are we currently at the start of a line?
int spaces = 0; int spaces = 0;
int quoteDepth = 0; // Number of DIVs deep we are. int quoteDepth = 0; // Number of DIVs deep we are.
int quotesThisLine = 0; // How deep we should be quoting for this line. int quotesThisLine = 0; // How deep we should be quoting for this line.
try { for (int index = 0; index < text.length(); index++) {
int c; char c = text.charAt(index);
while ((c = reader.read()) != -1) { if (isStartOfLine) {
if (isStartOfLine) { switch (c) {
switch (c) { case ' ':
case ' ': spaces++;
spaces++; break;
break; case '>':
case '>': quotesThisLine++;
quotesThisLine++; spaces = 0;
spaces = 0; break;
break; case '\n':
case '\n': appendbq(buff, quotesThisLine, quoteDepth);
appendbq(buff, quotesThisLine, quoteDepth); quoteDepth = quotesThisLine;
quoteDepth = quotesThisLine;
appendsp(buff, spaces); appendsp(buff, spaces);
spaces = 0; spaces = 0;
appendchar(buff, c);
isStartOfLine = true;
quotesThisLine = 0;
break;
default:
isStartOfLine = false;
appendbq(buff, quotesThisLine, quoteDepth);
quoteDepth = quotesThisLine;
appendsp(buff, spaces);
spaces = 0;
appendchar(buff, c);
isStartOfLine = false;
break;
}
}
else {
appendchar(buff, c); appendchar(buff, c);
if (c == '\n') { isStartOfLine = true;
isStartOfLine = true; quotesThisLine = 0;
quotesThisLine = 0; break;
} default:
isStartOfLine = false;
appendbq(buff, quotesThisLine, quoteDepth);
quoteDepth = quotesThisLine;
appendsp(buff, spaces);
spaces = 0;
appendchar(buff, c);
isStartOfLine = false;
break;
}
}
else {
appendchar(buff, c);
if (c == '\n') {
isStartOfLine = true;
quotesThisLine = 0;
} }
} }
} catch (IOException e) {
//Should never happen
Log.e(K9.LOG_TAG, "Could not read string to convert text to HTML:", e);
} }
// Close off any quotes we may have opened. // Close off any quotes we may have opened.
if (quoteDepth > 0) { if (quoteDepth > 0) {