diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfo.java b/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfo.java index 98f8fc2b2..d254f114c 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfo.java +++ b/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfo.java @@ -1,20 +1,43 @@ package com.fsck.k9.mailstore; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; import com.fsck.k9.mail.Message; +import org.openintents.openpgp.OpenPgpSignatureResult; public class MessageViewInfo { - public final String text; - public final List attachments; - public final Message message; + public final Message message; + public final List containers = new ArrayList(); + + @Deprecated public MessageViewInfo(String text, List attachments, Message message) { - this.text = text; - this.attachments = Collections.unmodifiableList(attachments); + containers.add(new MessageViewContainer(text, attachments)); this.message = message; } + + public static class MessageViewContainer { + + final public String text; + final public List attachments; + final public OpenPgpSignatureResult signatureResult; + + MessageViewContainer(String text, List attachments) { + this.text = text; + this.attachments = attachments; + this.signatureResult = null; + } + + MessageViewContainer(String text, List attachments, + OpenPgpSignatureResult signatureResult) { + this.text = text; + this.attachments = attachments; + this.signatureResult = signatureResult; + } + + } + } diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/SingleMessageView.java b/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/SingleMessageView.java rename to k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java index e3d61764b..6f0a687f4 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/SingleMessageView.java +++ b/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java @@ -20,7 +20,6 @@ import android.os.AsyncTask; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; -import android.util.Log; import android.util.TypedValue; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -55,15 +54,15 @@ import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.internet.MimeUtility; import com.fsck.k9.mailstore.AttachmentViewInfo; import com.fsck.k9.mailstore.MessageViewInfo; +import com.fsck.k9.mailstore.MessageViewInfo.MessageViewContainer; import com.fsck.k9.provider.AttachmentProvider.AttachmentProviderColumns; -import com.fsck.k9.view.MessageHeader; import com.fsck.k9.view.MessageHeader.OnLayoutChangedListener; import com.fsck.k9.view.MessageWebView; import org.apache.commons.io.IOUtils; -public class SingleMessageView extends LinearLayout implements OnClickListener, +public class MessageContainerView extends LinearLayout implements OnClickListener, OnLayoutChangedListener, OnCreateContextMenuListener { private static final int MENU_ITEM_LINK_VIEW = Menu.FIRST; private static final int MENU_ITEM_LINK_SHARE = Menu.FIRST + 1; @@ -90,7 +89,6 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, private MessageOpenPgpViewOld mOpenPgpView; private MessageWebView mMessageContentView; - private MessageHeader mHeaderContainer; private LinearLayout mAttachments; private Button mShowHiddenAttachments; private LinearLayout mHiddenAttachments; @@ -99,7 +97,6 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, private View mShowAttachmentsAction; private boolean mShowPictures; private boolean mHasAttachments; - private Button mDownloadRemainder; private LayoutInflater mInflater; private Contacts mContacts; private AttachmentViewCallback attachmentCallback; @@ -110,25 +107,21 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, private Map attachments = new HashMap(); - public void initialize(Fragment fragment) { + public void initialize(Fragment fragment, AttachmentViewCallback attachmentCallback) { + this.attachmentCallback = attachmentCallback; + Activity activity = fragment.getActivity(); mMessageContentView = (MessageWebView) findViewById(R.id.message_content); mMessageContentView.configure(); activity.registerForContextMenu(mMessageContentView); mMessageContentView.setOnCreateContextMenuListener(this); - mHeaderContainer = (MessageHeader) findViewById(R.id.header_container); - mHeaderContainer.setOnLayoutChangedListener(this); - mAttachmentsContainer = findViewById(R.id.attachments_container); mAttachments = (LinearLayout) findViewById(R.id.attachments); mHiddenAttachments = (LinearLayout) findViewById(R.id.hidden_attachments); mHiddenAttachments.setVisibility(View.GONE); mShowHiddenAttachments = (Button) findViewById(R.id.show_hidden_attachments); mShowHiddenAttachments.setVisibility(View.GONE); - mOpenPgpView = (MessageOpenPgpViewOld) findViewById(R.id.layout_decrypt_openpgp); - mOpenPgpView.setFragment(fragment); - mOpenPgpView.setupChildViews(); mShowPicturesAction = findViewById(R.id.show_pictures); mShowMessageAction = findViewById(R.id.show_message); @@ -139,23 +132,19 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, mContacts = Contacts.getInstance(activity); mInflater = ((MessageViewFragment) fragment).getFragmentLayoutInflater(); - mDownloadRemainder = (Button) findViewById(R.id.download_remainder); - mDownloadRemainder.setVisibility(View.GONE); - mAttachmentsContainer.setVisibility(View.GONE); mMessageContentView.setVisibility(View.VISIBLE); // the HTC version of WebView tries to force the background of the // titlebar, which is really unfair. TypedValue outValue = new TypedValue(); getContext().getTheme().resolveAttribute(R.attr.messageViewHeaderBackgroundColor, outValue, true); - mHeaderContainer.setBackgroundColor(outValue.data); // also set background of the whole view (including the attachments view) setBackgroundColor(outValue.data); mShowHiddenAttachments.setOnClickListener(this); - mShowMessageAction.setOnClickListener(this); - mShowAttachmentsAction.setOnClickListener(this); - mShowPicturesAction.setOnClickListener(this); + // mShowMessageAction.setOnClickListener(this); + // mShowAttachmentsAction.setOnClickListener(this); + // mShowPicturesAction.setOnClickListener(this); mClipboardManager = ClipboardManager.getInstance(activity); } @@ -382,14 +371,6 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, onShowHiddenAttachments(); break; } - case R.id.show_message: { - onShowMessage(); - break; - } - case R.id.show_attachments: { - onShowAttachments(); - break; - } case R.id.show_pictures: { // Allow network access first... setLoadPictures(true); @@ -405,21 +386,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, mHiddenAttachments.setVisibility(View.VISIBLE); } - public void onShowMessage() { - showShowMessageAction(false); - showAttachments(false); - showShowAttachmentsAction(mHasAttachments); - showMessageWebView(true); - } - - public void onShowAttachments() { - showMessageWebView(false); - showShowAttachmentsAction(false); - showShowMessageAction(true); - showAttachments(true); - } - - public SingleMessageView(Context context, AttributeSet attrs) { + public MessageContainerView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -446,58 +413,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, } public void showShowPicturesAction(boolean show) { - mShowPicturesAction.setVisibility(show ? View.VISIBLE : View.GONE); - } - public void showShowMessageAction(boolean show) { - mShowMessageAction.setVisibility(show ? View.VISIBLE : View.GONE); - } - public void showShowAttachmentsAction(boolean show) { - mShowAttachmentsAction.setVisibility(show ? View.VISIBLE : View.GONE); - } - - /** - * Fetch the message header view. This is not the same as the message headers; this is the View shown at the top - * of messages. - * @return MessageHeader View. - */ - public MessageHeader getMessageHeaderView() { - return mHeaderContainer; - } - - public void setHeaders(final Message message, Account account) { - try { - mHeaderContainer.populate(message, account); - mHeaderContainer.setVisibility(View.VISIBLE); - - - } catch (Exception me) { - Log.e(K9.LOG_TAG, "setHeaders - error", me); - } - } - - public void setOnToggleFlagClickListener(OnClickListener listener) { - mHeaderContainer.setOnFlagListener(listener); - } - - public void setOnDownloadButtonClickListener(OnClickListener listener) { - mDownloadRemainder.setOnClickListener(listener); - } - - public void enableDownloadButton() { - mDownloadRemainder.setEnabled(true); - } - - public void disableDownloadButton() { - mDownloadRemainder.setEnabled(false); - } - - public void setShowDownloadButton(Message message) { - if (message.isSet(Flag.X_DOWNLOADED_FULL)) { - mDownloadRemainder.setVisibility(View.GONE); - } else { - mDownloadRemainder.setEnabled(true); - mDownloadRemainder.setVisibility(View.VISIBLE); - } + // mShowPicturesAction.setVisibility(show ? View.VISIBLE : View.GONE); } public void enableAttachmentButtons() { @@ -512,36 +428,16 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, } } - public void showAllHeaders() { - mHeaderContainer.onShowAdditionalHeaders(); - } - - public boolean additionalHeadersVisible() { - return mHeaderContainer.additionalHeadersVisible(); - } - - public void setMessage(Account account, MessageViewInfo messageViewInfo, PgpData pgpData) + public void setMessage(MessageViewContainer messageViewContainer) throws MessagingException { resetView(); - String text = null; - if (pgpData != null) { - text = pgpData.getDecryptedData(); - if (text != null) { - text = HtmlConverter.textToHtml(text); - } - } - - if (text == null) { - text = messageViewInfo.text; - } - // Save the text so we can reset the WebView when the user clicks the "Show pictures" button - mText = text; + mText = messageViewContainer.text; - mHasAttachments = !messageViewInfo.attachments.isEmpty(); + mHasAttachments = !messageViewContainer.attachments.isEmpty(); if (mHasAttachments) { - renderAttachments(messageViewInfo); + renderAttachments(messageViewContainer); } mHiddenAttachments.setVisibility(View.GONE); @@ -553,27 +449,20 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, lookForImages = false; } - if (mSavedState.attachmentViewVisible) { - onShowAttachments(); - } else { - onShowMessage(); - } - if (mSavedState.hiddenAttachmentsVisible) { onShowHiddenAttachments(); } mSavedState = null; - } else { - onShowMessage(); } + /* if (text != null && lookForImages) { // If the message contains external pictures and the "Show pictures" // button wasn't already pressed, see if the user's preferences has us // showing them anyway. if (Utility.hasExternalImages(text) && !showPictures()) { - Address[] from = messageViewInfo.message.getFrom(); + Address[] from = messageViewContainer.message.getFrom(); if ((account.getShowPictures() == Account.ShowPictures.ALWAYS) || ((account.getShowPictures() == Account.ShowPictures.ONLY_FROM_CONTACTS) && // Make sure we have at least one from address @@ -585,11 +474,10 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, } } } + */ - if (text != null) { - loadBodyFromText(text); - mOpenPgpView.updateLayout(account, pgpData.getDecryptedData(), - pgpData.getSignatureResult(), messageViewInfo.message); + if (mText != null) { + loadBodyFromText(mText); } else { showStatusMessage(getContext().getString(R.string.webview_empty_message)); } @@ -604,18 +492,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, mMessageContentView.setText(emailText); } - public void showAttachments(boolean show) { - mAttachmentsContainer.setVisibility(show ? View.VISIBLE : View.GONE); - boolean showHidden = (show && mHiddenAttachments.getVisibility() == View.GONE && - mHiddenAttachments.getChildCount() > 0); - mShowHiddenAttachments.setVisibility(showHidden ? View.VISIBLE : View.GONE); - } - - public void showMessageWebView(boolean show) { - mMessageContentView.setVisibility(show ? View.VISIBLE : View.GONE); - } - - public void renderAttachments(MessageViewInfo messageContainer) throws MessagingException { + public void renderAttachments(MessageViewContainer messageContainer) throws MessagingException { for (AttachmentViewInfo attachment : messageContainer.attachments) { AttachmentView view = (AttachmentView) mInflater.inflate(R.layout.message_view_attachment, null); view.setCallback(attachmentCallback); @@ -652,10 +529,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, } public void resetView() { - mDownloadRemainder.setVisibility(View.GONE); setLoadPictures(false); - showShowAttachmentsAction(false); - showShowMessageAction(false); showShowPicturesAction(false); mAttachments.removeAllViews(); mHiddenAttachments.removeAllViews(); @@ -670,14 +544,6 @@ public class SingleMessageView extends LinearLayout implements OnClickListener, loadBodyFromText(""); } - public void resetHeaderView() { - mHeaderContainer.setVisibility(View.GONE); - } - - public void setAttachmentCallback(AttachmentViewCallback attachmentCallback) { - this.attachmentCallback = attachmentCallback; - } - @Override public Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageTopView.java b/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageTopView.java new file mode 100644 index 000000000..341460ca5 --- /dev/null +++ b/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageTopView.java @@ -0,0 +1,133 @@ +package com.fsck.k9.ui.messageview; + +import android.app.Activity; +import android.app.Fragment; +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; + +import com.fsck.k9.Account; +import com.fsck.k9.K9; +import com.fsck.k9.R; +import com.fsck.k9.crypto.PgpData; +import com.fsck.k9.mail.Flag; +import com.fsck.k9.mail.Message; +import com.fsck.k9.mail.MessagingException; +import com.fsck.k9.mailstore.MessageViewInfo; +import com.fsck.k9.mailstore.MessageViewInfo.MessageViewContainer; +import com.fsck.k9.view.MessageHeader; + + +public class MessageTopView extends LinearLayout { + + private MessageHeader mHeaderContainer; + private LayoutInflater mInflater; + private LinearLayout containerViews; + private Fragment fragment; + private Button mDownloadRemainder; + private AttachmentViewCallback attachmentCallback; + + public MessageTopView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void initialize (Fragment fragment, AttachmentViewCallback attachmentCallback) { + this.fragment = fragment; + this.attachmentCallback = attachmentCallback; + + mHeaderContainer = (MessageHeader) findViewById(R.id.header_container); + // mHeaderContainer.setOnLayoutChangedListener(this); + mInflater = ((MessageViewFragment) fragment).getFragmentLayoutInflater(); + + TypedValue outValue = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.messageViewHeaderBackgroundColor, outValue, true); + mHeaderContainer.setBackgroundColor(outValue.data); + + mDownloadRemainder = (Button) findViewById(R.id.download_remainder); + mDownloadRemainder.setVisibility(View.GONE); + + containerViews = (LinearLayout) findViewById(R.id.message_containers); + + } + + public void resetView() { + mDownloadRemainder.setVisibility(View.GONE); + containerViews.removeAllViews(); + } + + public void setMessage(Account account, MessageViewInfo messageViewInfo) + throws MessagingException { + resetView(); + + for (MessageViewContainer container : messageViewInfo.containers) { + MessageContainerView view = (MessageContainerView) mInflater.inflate(R.layout.message_container, null); + view.initialize(fragment, attachmentCallback); + view.setMessage(container); + containerViews.addView(view); + } + + } + + /** + * Fetch the message header view. This is not the same as the message headers; this is the View shown at the top + * of messages. + * @return MessageHeader View. + */ + public MessageHeader getMessageHeaderView() { + return mHeaderContainer; + } + + public void setHeaders(final Message message, Account account) { + try { + mHeaderContainer.populate(message, account); + mHeaderContainer.setVisibility(View.VISIBLE); + + + } catch (Exception me) { + Log.e(K9.LOG_TAG, "setHeaders - error", me); + } + } + + public void setOnToggleFlagClickListener(OnClickListener listener) { + mHeaderContainer.setOnFlagListener(listener); + } + + public void showAllHeaders() { + mHeaderContainer.onShowAdditionalHeaders(); + } + + public boolean additionalHeadersVisible() { + return mHeaderContainer.additionalHeadersVisible(); + } + + public void resetHeaderView() { + mHeaderContainer.setVisibility(View.GONE); + } + + public void setOnDownloadButtonClickListener(OnClickListener listener) { + mDownloadRemainder.setOnClickListener(listener); + } + + public void enableDownloadButton() { + mDownloadRemainder.setEnabled(true); + } + + public void disableDownloadButton() { + mDownloadRemainder.setEnabled(false); + } + + public void setShowDownloadButton(Message message) { + if (message.isSet(Flag.X_DOWNLOADED_FULL)) { + mDownloadRemainder.setVisibility(View.GONE); + } else { + mDownloadRemainder.setEnabled(true); + mDownloadRemainder.setVisibility(View.VISIBLE); + } + } + +} diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.java b/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.java index 61ff0c9be..bce40dff5 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.java +++ b/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.java @@ -78,7 +78,7 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF } - private SingleMessageView mMessageView; + private MessageTopView mMessageView; private PgpData mPgpData; private Account mAccount; private MessageReference mMessageReference; @@ -145,17 +145,16 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF View view = mLayoutInflater.inflate(R.layout.message, container, false); - mMessageView = (SingleMessageView) view.findViewById(R.id.message_view); + mMessageView = (MessageTopView) view.findViewById(R.id.message_view); - mMessageView.setAttachmentCallback(this); - - mMessageView.initialize(this); + mMessageView.initialize(this, this); mMessageView.setOnToggleFlagClickListener(new OnClickListener() { @Override public void onClick(View v) { onToggleFlagged(); } }); + mMessageView.setOnDownloadButtonClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -229,7 +228,7 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF } private void onLoadMessageFromDatabaseFailed() { - mMessageView.showStatusMessage(mContext.getString(R.string.status_invalid_id_error)); + // mMessageView.showStatusMessage(mContext.getString(R.string.status_invalid_id_error)); } private void startDownloadingMessageBody(LocalMessage message) { @@ -269,7 +268,7 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF private void showMessage(MessageViewInfo messageContainer) { try { - mMessageView.setMessage(mAccount, messageContainer, mPgpData); + mMessageView.setMessage(mAccount, messageContainer); mMessageView.setShowDownloadButton(mMessage); } catch (MessagingException e) { Log.e(K9.LOG_TAG, "Error while trying to display message", e); @@ -406,7 +405,8 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF } public void onSelectText() { - mMessageView.beginSelectingText(); + // FIXME + // mMessageView.beginSelectingText(); } private void startRefileActivity(int activity) { @@ -418,7 +418,6 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF startActivityForResult(intent, activity); } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { @@ -533,7 +532,7 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF PgpData data = new PgpData(); data.setDecryptedData(decryptedData); data.setSignatureResult(signatureResult); - mMessageView.setMessage(mAccount, messageViewInfo, data); + mMessageView.setMessage(mAccount, messageViewInfo); } catch (MessagingException e) { Log.e(K9.LOG_TAG, "displayMessageBody failed", e); } @@ -600,7 +599,7 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF } public void zoom(KeyEvent event) { - mMessageView.zoom(event); + // mMessageView.zoom(event); } @Override @@ -668,11 +667,11 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF } public void disableAttachmentButtons(AttachmentViewInfo attachment) { - mMessageView.disableAttachmentButtons(attachment); + // mMessageView.disableAttachmentButtons(attachment); } public void enableAttachmentButtons(AttachmentViewInfo attachment) { - mMessageView.enableAttachmentButtons(attachment); + // mMessageView.enableAttachmentButtons(attachment); } public void runOnMainThread(Runnable runnable) { @@ -680,7 +679,7 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF } public void showAttachmentLoadingDialog() { - mMessageView.disableAttachmentButtons(); + // mMessageView.disableAttachmentButtons(); showDialog(R.id.dialog_attachment_progress); } @@ -689,13 +688,13 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF @Override public void run() { removeDialog(R.id.dialog_attachment_progress); - mMessageView.enableAttachmentButtons(); + // mMessageView.enableAttachmentButtons(); } }); } public void refreshAttachmentThumbnail(AttachmentViewInfo attachment) { - mMessageView.refreshAttachmentThumbnail(attachment); + // mMessageView.refreshAttachmentThumbnail(attachment); } public interface MessageViewFragmentListener { diff --git a/k9mail/src/main/res/layout/message.xml b/k9mail/src/main/res/layout/message.xml index cbf2552de..a3f18a080 100644 --- a/k9mail/src/main/res/layout/message.xml +++ b/k9mail/src/main/res/layout/message.xml @@ -1,5 +1,5 @@ - - - - - - - - - - - -