diff --git a/res/layout/message_compose.xml b/res/layout/message_compose.xml
index 66f0de097..2cafb2428 100644
--- a/res/layout/message_compose.xml
+++ b/res/layout/message_compose.xml
@@ -237,6 +237,17 @@
android:textColor="@android:color/primary_text_light"
android:textAppearance="?android:attr/textAppearanceMedium" />
+
+
No email address could be found.
Some attachments were not downloaded. They will be downloaded automatically before this message is sent.Some attachments cannot be forwarded because they have not been downloaded.
-
+ Quote messageFrom: %s <%s>
@@ -564,6 +564,9 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Sending mail
+ Quote original message when replying
+ When replying to messages, the original message is in your reply.
+
Reply after quoted textWhen replying to messages, the original message will appear above your reply.
@@ -1049,4 +1052,5 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
Save attachments to...Save attachmentNo file browser found. Where would you like to save this attachment?
+
diff --git a/res/xml/account_settings_preferences.xml b/res/xml/account_settings_preferences.xml
index 33a29ed60..f30ed0065 100644
--- a/res/xml/account_settings_preferences.xml
+++ b/res/xml/account_settings_preferences.xml
@@ -239,6 +239,13 @@
android:entries="@array/account_settings_quote_style_entries"
android:entryValues="@array/account_settings_quote_style_values" />
+
+
0) {
- mQuotedHtmlContent = new InsertableHtmlContent();
- mQuotedHtmlContent.setQuotedContent(quotedHTML);
- mQuotedHtmlContent.setHeaderInsertionPoint(bodyOffset);
- mQuotedHTML.loadDataWithBaseURL("http://", mQuotedHtmlContent.getQuotedContent(), "text/html", "utf-8", null);
- mQuotedHTML.setVisibility(View.VISIBLE);
- mQuotedTextBar.setVisibility(View.VISIBLE);
- mQuotedTextEdit.setVisibility(View.VISIBLE);
- }
+ // Regenerate the quoted html without our user content in it.
+ StringBuilder quotedHTML = new StringBuilder();
+ quotedHTML.append(text.substring(0, bodyOffset)); // stuff before the reply
+ quotedHTML.append(text.substring(bodyOffset + bodyLength));
+ if (quotedHTML.length() > 0) {
+ mQuotedHtmlContent = new InsertableHtmlContent();
+ mQuotedHtmlContent.setQuotedContent(quotedHTML);
+ mQuotedHtmlContent.setHeaderInsertionPoint(bodyOffset);
+ mQuotedHTML.loadDataWithBaseURL("http://", mQuotedHtmlContent.getQuotedContent(), "text/html", "utf-8", null);
}
}
} else if (mMessageFormat == MessageFormat.TEXT) {
- MessageFormat format = k9identity.get(IdentityField.MESSAGE_FORMAT) != null
- ? MessageFormat.valueOf(k9identity.get(IdentityField.MESSAGE_FORMAT))
- : null;
- if (format == null) {
- mMessageContentView.setText(getBodyTextFromMessage(message, MessageFormat.TEXT));
- } else if (format.equals(MessageFormat.HTML)) {
- // We are in text mode, but have an HTML message.
- Part htmlPart = MimeUtility.findFirstPartByMimeType(message, "text/html");
- if (htmlPart != null) { // Shouldn't happen if we were the one who saved it.
- String text = MimeUtility.getTextFromPart(htmlPart);
- if (K9.DEBUG) {
- Log.d(K9.LOG_TAG, "Loading message with offset " + bodyOffset + ", length " + bodyLength + ". Text length is " + text.length() + ".");
- }
+ Part textPart = MimeUtility.findFirstPartByMimeType(message, "text/plain");
+ if (textPart != null) {
+ String text = MimeUtility.getTextFromPart(textPart);
+ // If we had a body length (and it was valid), separate the composition from the quoted text
+ // and put them in their respective places in the UI.
+ if (bodyLength != null && bodyLength + 1 < text.length()) { // + 1 to get rid of the newline we added when saving the draft
+ String bodyText = text.substring(0, bodyLength);
+ String quotedText = text.substring(bodyLength + 1, text.length());
- // Grab our reply text.
- String bodyText = text.substring(bodyOffset, bodyOffset + bodyLength);
- mMessageContentView.setText(Html.fromHtml(bodyText).toString());
-
- // Regenerate the quoted html without out content in it.
- StringBuilder quotedHTML = new StringBuilder();
- quotedHTML.append(text.substring(0, bodyOffset)); // stuff before the reply
- quotedHTML.append(text.substring(bodyOffset + bodyLength));
- // Convert it to text.
- mQuotedText.setText(HtmlConverter.htmlToText(quotedHTML.toString()));
-
- mQuotedTextBar.setVisibility(View.VISIBLE);
- mQuotedText.setVisibility(View.VISIBLE);
+ mMessageContentView.setText(bodyText);
+ mQuotedText.setText(quotedText);
} else {
- Log.e(K9.LOG_TAG, "Found an HTML draft but couldn't find the HTML part! Something's wrong.");
+ mMessageContentView.setText(text);
}
- } else if (format.equals(MessageFormat.TEXT)) {
- Part textPart = MimeUtility.findFirstPartByMimeType(message, "text/plain");
- if (textPart != null) {
- String text = MimeUtility.getTextFromPart(textPart);
- // If we had a body length (and it was valid), separate the composition from the quoted text
- // and put them in their respective places in the UI.
- if (bodyLength != null && bodyLength + 1 < text.length()) { // + 1 to get rid of the newline we added when saving the draft
- String bodyText = text.substring(0, bodyLength);
- String quotedText = text.substring(bodyLength + 1, text.length());
-
- mMessageContentView.setText(bodyText);
- mQuotedText.setText(quotedText);
-
- mQuotedTextBar.setVisibility(View.VISIBLE);
- mQuotedText.setVisibility(View.VISIBLE);
- mQuotedHTML.setVisibility(View.VISIBLE);
- } else {
- mMessageContentView.setText(text);
- }
- }
- } else {
- Log.e(K9.LOG_TAG, "Unhandled message format.");
}
+ } else {
+ Log.e(K9.LOG_TAG, "Unhandled message format.");
}
// Set the cursor position if we have it.
@@ -2170,6 +2196,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
} catch(Exception e) {
Log.e(K9.LOG_TAG, "Could not set cursor position in MessageCompose; ignoring.", e);
}
+
+ showOrHideQuotedText(QuotedTextMode.valueOf(showQuotedTextMode));
}
} catch (MessagingException me) {
/**
@@ -2178,15 +2206,17 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
*/
Log.e(K9.LOG_TAG, "Error while processing source message: ", me);
}
- mSourceMessageProcessed = true;
- mDraftNeedsSaving = false;
+ finally {
+ mSourceMessageProcessed = true;
+ mDraftNeedsSaving = false;
+ }
}
/**
* Build and populate the UI with the quoted message.
* @throws MessagingException
*/
- private void populateUIWithQuotedMessage() throws MessagingException {
+ private void populateUIWithQuotedMessage(boolean shown) throws MessagingException {
// TODO -- I am assuming that mSourceMessageBody will always be a text part. Is this a safe assumption?
// Handle the original message in the reply
@@ -2200,20 +2230,15 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
// Load the message with the reply header.
mQuotedHTML.loadDataWithBaseURL("http://", mQuotedHtmlContent.getQuotedContent(), "text/html", "utf-8", null);
- mQuotedTextBar.setVisibility(View.VISIBLE);
- mQuotedHTML.setVisibility(View.VISIBLE);
- mQuotedTextEdit.setVisibility(View.VISIBLE);
-
- mQuotedText.setVisibility(View.GONE);
} else if (mMessageFormat == MessageFormat.TEXT) {
mQuotedText.setText(quoteOriginalTextMessage(mSourceMessage, content, mAccount.getQuoteStyle()));
+ }
- mQuotedTextBar.setVisibility(View.VISIBLE);
- mQuotedText.setVisibility(View.VISIBLE);
-
- mQuotedHtmlContent = null;
- mQuotedTextEdit.setVisibility(View.GONE);
- mQuotedHTML.setVisibility(View.GONE);
+ if (shown) {
+ showOrHideQuotedText(QuotedTextMode.SHOW);
+ }
+ else {
+ showOrHideQuotedText(QuotedTextMode.HIDE);
}
}
@@ -2425,10 +2450,10 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
// part).
if (mSourceProcessed) {
try {
- populateUIWithQuotedMessage();
+ populateUIWithQuotedMessage(true);
} catch (MessagingException e) {
// Hm, if we couldn't populate the UI after source reprocessing, let's just delete it?
- deleteQuotedText();
+ showOrHideQuotedText(QuotedTextMode.HIDE);
Log.e(K9.LOG_TAG, "Could not re-process source message; deleting quoted text to be safe.", e);
}
} else {
diff --git a/src/com/fsck/k9/activity/setup/AccountSettings.java b/src/com/fsck/k9/activity/setup/AccountSettings.java
index 3a67198fb..38c9e38e0 100644
--- a/src/com/fsck/k9/activity/setup/AccountSettings.java
+++ b/src/com/fsck/k9/activity/setup/AccountSettings.java
@@ -88,6 +88,7 @@ public class AccountSettings extends K9PreferenceActivity {
private static final String PREFERENCE_MESSAGE_FORMAT = "message_format";
private static final String PREFERENCE_QUOTE_PREFIX = "account_quote_prefix";
private static final String PREFERENCE_QUOTE_STYLE = "quote_style";
+ private static final String PREFERENCE_DEFAULT_QUOTED_TEXT_SHOWN = "default_quoted_text_shown";
private static final String PREFERENCE_REPLY_AFTER_QUOTE = "reply_after_quote";
private static final String PREFERENCE_SYNC_REMOTE_DELETIONS = "account_sync_remote_deletetions";
private static final String PREFERENCE_CRYPTO_APP = "crypto_app";
@@ -145,6 +146,7 @@ public class AccountSettings extends K9PreferenceActivity {
private ListPreference mMessageFormat;
private ListPreference mQuoteStyle;
private EditTextPreference mAccountQuotePrefix;
+ private CheckBoxPreference mAccountDefaultQuotedTextShown;
private CheckBoxPreference mReplyAfterQuote;
private CheckBoxPreference mSyncRemoteDeletions;
private CheckBoxPreference mSaveAllHeaders;
@@ -226,6 +228,9 @@ public class AccountSettings extends K9PreferenceActivity {
}
});
+ mAccountDefaultQuotedTextShown = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT_QUOTED_TEXT_SHOWN);
+ mAccountDefaultQuotedTextShown.setChecked(mAccount.isDefaultQuotedTextShown());
+
mReplyAfterQuote = (CheckBoxPreference) findPreference(PREFERENCE_REPLY_AFTER_QUOTE);
mReplyAfterQuote.setChecked(mAccount.isReplyAfterQuote());
@@ -695,6 +700,7 @@ public class AccountSettings extends K9PreferenceActivity {
mAccount.setMessageFormat(Account.MessageFormat.valueOf(mMessageFormat.getValue()));
mAccount.setQuoteStyle(QuoteStyle.valueOf(mQuoteStyle.getValue()));
mAccount.setQuotePrefix(mAccountQuotePrefix.getText());
+ mAccount.setDefaultQuotedTextShown(mAccountDefaultQuotedTextShown.isChecked());
mAccount.setReplyAfterQuote(mReplyAfterQuote.isChecked());
mAccount.setCryptoApp(mCryptoApp.getValue());
mAccount.setCryptoAutoSignature(mCryptoAutoSignature.isChecked());