messageview: simplify handling of external pictures, ditch ShowPicturesController

This commit is contained in:
Vincent Breitmoser 2016-06-06 22:45:47 +02:00
parent b5b603001b
commit fccb4a4b24
5 changed files with 27 additions and 53 deletions

View file

@ -35,7 +35,6 @@ import com.fsck.k9.helper.ClipboardManager;
import com.fsck.k9.helper.Contacts; import com.fsck.k9.helper.Contacts;
import com.fsck.k9.helper.Utility; import com.fsck.k9.helper.Utility;
import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mailstore.AttachmentResolver; import com.fsck.k9.mailstore.AttachmentResolver;
import com.fsck.k9.mailstore.AttachmentViewInfo; import com.fsck.k9.mailstore.AttachmentViewInfo;
import com.fsck.k9.mailstore.MessageViewInfo; import com.fsck.k9.mailstore.MessageViewInfo;
@ -76,6 +75,7 @@ public class MessageContainerView extends LinearLayout implements OnClickListene
private SavedState mSavedState; private SavedState mSavedState;
private ClipboardManager mClipboardManager; private ClipboardManager mClipboardManager;
private Map<AttachmentViewInfo, AttachmentView> attachments = new HashMap<>(); private Map<AttachmentViewInfo, AttachmentView> attachments = new HashMap<>();
private boolean hasHiddenExternalImages;
private String currentHtmlText; private String currentHtmlText;
private AttachmentResolver currentAttachmentResolver; private AttachmentResolver currentAttachmentResolver;
@ -403,8 +403,7 @@ public class MessageContainerView extends LinearLayout implements OnClickListene
public void displayMessageViewContainer(MessageViewInfo messageViewInfo, public void displayMessageViewContainer(MessageViewInfo messageViewInfo,
final OnRenderingFinishedListener onRenderingFinishedListener, boolean automaticallyLoadPictures, final OnRenderingFinishedListener onRenderingFinishedListener, boolean automaticallyLoadPictures,
ShowPicturesController showPicturesController, AttachmentViewCallback attachmentCallback) {
AttachmentViewCallback attachmentCallback) throws MessagingException {
this.attachmentCallback = attachmentCallback; this.attachmentCallback = attachmentCallback;
@ -414,11 +413,9 @@ public class MessageContainerView extends LinearLayout implements OnClickListene
mHiddenAttachments.setVisibility(View.GONE); mHiddenAttachments.setVisibility(View.GONE);
boolean lookForImages = true;
if (mSavedState != null) { if (mSavedState != null) {
if (mSavedState.showingPictures) { if (mSavedState.showingPictures) {
setLoadPictures(true); setLoadPictures(true);
lookForImages = false;
} }
if (mSavedState.hiddenAttachmentsVisible) { if (mSavedState.hiddenAttachmentsVisible) {
@ -429,12 +426,12 @@ public class MessageContainerView extends LinearLayout implements OnClickListene
} }
String textToDisplay = messageViewInfo.text; String textToDisplay = messageViewInfo.text;
if (textToDisplay != null && lookForImages) { if (textToDisplay != null && !isShowingPictures()) {
if (Utility.hasExternalImages(textToDisplay) && !isShowingPictures()) { if (Utility.hasExternalImages(textToDisplay)) {
if (automaticallyLoadPictures) { if (automaticallyLoadPictures) {
setLoadPictures(true); setLoadPictures(true);
} else { } else {
showPicturesController.notifyMessageContainerContainsPictures(this); hasHiddenExternalImages = true;
} }
} }
} }
@ -459,6 +456,10 @@ public class MessageContainerView extends LinearLayout implements OnClickListene
} }
} }
public boolean hasHiddenExternalImages() {
return hasHiddenExternalImages;
}
public String wrapStatusMessage(String status) { public String wrapStatusMessage(String status) {
return "<div style=\"text-align:center; color: grey;\">" + status + "</div>"; return "<div style=\"text-align:center; color: grey;\">" + status + "</div>";
} }
@ -478,7 +479,7 @@ public class MessageContainerView extends LinearLayout implements OnClickListene
mMessageContentView.displayHtmlContentWithInlineAttachments("", null, null); mMessageContentView.displayHtmlContentWithInlineAttachments("", null, null);
} }
public void renderAttachments(MessageViewInfo messageViewInfo) throws MessagingException { public void renderAttachments(MessageViewInfo messageViewInfo) {
if (messageViewInfo.attachments != null) { if (messageViewInfo.attachments != null) {
for (AttachmentViewInfo attachment : messageViewInfo.attachments) { for (AttachmentViewInfo attachment : messageViewInfo.attachments) {
ViewGroup parent = attachment.firstClassAttachment ? mAttachments : mHiddenAttachments; ViewGroup parent = attachment.firstClassAttachment ? mAttachments : mHiddenAttachments;

View file

@ -1,16 +1,12 @@
package com.fsck.k9.ui.messageview; package com.fsck.k9.ui.messageview;
import java.util.ArrayList;
import java.util.List;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -22,13 +18,11 @@ import android.widget.TextView;
import com.fsck.k9.Account; import com.fsck.k9.Account;
import com.fsck.k9.Account.ShowPictures; import com.fsck.k9.Account.ShowPictures;
import com.fsck.k9.K9;
import com.fsck.k9.R; import com.fsck.k9.R;
import com.fsck.k9.helper.Contacts; import com.fsck.k9.helper.Contacts;
import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.Flag;
import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Message;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mailstore.MessageViewInfo; import com.fsck.k9.mailstore.MessageViewInfo;
import com.fsck.k9.ui.messageview.MessageContainerView.OnRenderingFinishedListener; import com.fsck.k9.ui.messageview.MessageContainerView.OnRenderingFinishedListener;
import com.fsck.k9.view.MessageCryptoDisplayStatus; import com.fsck.k9.view.MessageCryptoDisplayStatus;
@ -37,7 +31,7 @@ import com.fsck.k9.view.ToolableViewAnimator;
import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.OpenPgpError;
public class MessageTopView extends LinearLayout implements ShowPicturesController { public class MessageTopView extends LinearLayout {
public static final int PROGRESS_MAX = 1000; public static final int PROGRESS_MAX = 1000;
public static final int PROGRESS_MAX_WITH_MARGIN = 950; public static final int PROGRESS_MAX_WITH_MARGIN = 950;
@ -54,7 +48,6 @@ public class MessageTopView extends LinearLayout implements ShowPicturesControll
private Button mDownloadRemainder; private Button mDownloadRemainder;
private AttachmentViewCallback attachmentCallback; private AttachmentViewCallback attachmentCallback;
private Button showPicturesButton; private Button showPicturesButton;
private List<MessageContainerView> messageContainerViewsWithPictures = new ArrayList<>();
private boolean isShowingProgress; private boolean isShowingProgress;
private MessageCryptoPresenter messageCryptoPresenter; private MessageCryptoPresenter messageCryptoPresenter;
@ -97,10 +90,10 @@ public class MessageTopView extends LinearLayout implements ShowPicturesControll
} }
private void showPicturesInAllContainerViews() { private void showPicturesInAllContainerViews() {
for (MessageContainerView containerView : messageContainerViewsWithPictures) { View messageContainerViewCandidate = containerView.getChildAt(0);
containerView.showPictures(); if (messageContainerViewCandidate instanceof MessageContainerView) {
((MessageContainerView) messageContainerViewCandidate).showPictures();
} }
hideShowPicturesButton(); hideShowPicturesButton();
} }
@ -109,7 +102,7 @@ public class MessageTopView extends LinearLayout implements ShowPicturesControll
containerView.removeAllViews(); containerView.removeAllViews();
} }
public void setMessage(Account account, MessageViewInfo messageViewInfo) throws MessagingException { public void setMessage(Account account, MessageViewInfo messageViewInfo) {
resetView(); resetView();
setShowDownloadButton(messageViewInfo.message); setShowDownloadButton(messageViewInfo.message);
@ -160,8 +153,7 @@ public class MessageTopView extends LinearLayout implements ShowPicturesControll
displayViewOnLoadFinished(false); displayViewOnLoadFinished(false);
} }
private void showMessageContentView(Account account, MessageViewInfo messageViewInfo) private void showMessageContentView(Account account, MessageViewInfo messageViewInfo) {
throws MessagingException {
ShowPictures showPicturesSetting = account.getShowPictures(); ShowPictures showPicturesSetting = account.getShowPictures();
boolean automaticallyLoadPictures = boolean automaticallyLoadPictures =
shouldAutomaticallyLoadPictures(showPicturesSetting, messageViewInfo.message); shouldAutomaticallyLoadPictures(showPicturesSetting, messageViewInfo.message);
@ -175,7 +167,11 @@ public class MessageTopView extends LinearLayout implements ShowPicturesControll
public void onLoadFinished() { public void onLoadFinished() {
displayViewOnLoadFinished(true); displayViewOnLoadFinished(true);
} }
}, automaticallyLoadPictures, this, attachmentCallback); }, automaticallyLoadPictures, attachmentCallback);
if (view.hasHiddenExternalImages()) {
showShowPicturesButton();
}
} }
private void showMessageCryptoErrorView(Account account, MessageViewInfo messageViewInfo) { private void showMessageCryptoErrorView(Account account, MessageViewInfo messageViewInfo) {
@ -231,16 +227,11 @@ public class MessageTopView extends LinearLayout implements ShowPicturesControll
} }
public void setHeaders(final Message message, Account account) { public void setHeaders(final Message message, Account account) {
try { mHeaderContainer.populate(message, account);
mHeaderContainer.populate(message, account); if (account.isOpenPgpProviderConfigured()) {
if (account.isOpenPgpProviderConfigured()) { mHeaderContainer.setCryptoStatus(MessageCryptoDisplayStatus.LOADING);
mHeaderContainer.setCryptoStatus(MessageCryptoDisplayStatus.LOADING);
}
mHeaderContainer.setVisibility(View.VISIBLE);
} catch (Exception me) {
Log.e(K9.LOG_TAG, "setHeaders - error", me);
} }
mHeaderContainer.setVisibility(View.VISIBLE);
} }
public void setOnToggleFlagClickListener(OnClickListener listener) { public void setOnToggleFlagClickListener(OnClickListener listener) {
@ -297,13 +288,6 @@ public class MessageTopView extends LinearLayout implements ShowPicturesControll
showPicturesButton.setVisibility(View.GONE); showPicturesButton.setVisibility(View.GONE);
} }
@Override
public void notifyMessageContainerContainsPictures(MessageContainerView messageContainerView) {
messageContainerViewsWithPictures.add(messageContainerView);
showShowPicturesButton();
}
private boolean shouldAutomaticallyLoadPictures(ShowPictures showPicturesSetting, Message message) { private boolean shouldAutomaticallyLoadPictures(ShowPictures showPicturesSetting, Message message) {
return showPicturesSetting == ShowPictures.ALWAYS || shouldShowPicturesFromSender(showPicturesSetting, message); return showPicturesSetting == ShowPictures.ALWAYS || shouldShowPicturesFromSender(showPicturesSetting, message);
} }

View file

@ -42,7 +42,6 @@ import com.fsck.k9.fragment.ProgressDialogFragment;
import com.fsck.k9.helper.FileBrowserHelper; import com.fsck.k9.helper.FileBrowserHelper;
import com.fsck.k9.helper.FileBrowserHelper.FileBrowserFailOverCallback; import com.fsck.k9.helper.FileBrowserHelper.FileBrowserFailOverCallback;
import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.Flag;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mailstore.AttachmentViewInfo; import com.fsck.k9.mailstore.AttachmentViewInfo;
import com.fsck.k9.mailstore.LocalMessage; import com.fsck.k9.mailstore.LocalMessage;
import com.fsck.k9.mailstore.MessageViewInfo; import com.fsck.k9.mailstore.MessageViewInfo;
@ -236,11 +235,7 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF
private void showMessage(MessageViewInfo messageViewInfo) { private void showMessage(MessageViewInfo messageViewInfo) {
messageCryptoPresenter.setMessageViewInfo(messageViewInfo); messageCryptoPresenter.setMessageViewInfo(messageViewInfo);
try { mMessageView.setMessage(mAccount, messageViewInfo);
mMessageView.setMessage(mAccount, messageViewInfo);
} catch (MessagingException e) {
Log.e(K9.LOG_TAG, "Error while trying to display message", e);
}
} }
private void displayMessageHeader(LocalMessage message) { private void displayMessageHeader(LocalMessage message) {

View file

@ -1,6 +0,0 @@
package com.fsck.k9.ui.messageview;
interface ShowPicturesController {
void notifyMessageContainerContainsPictures(MessageContainerView messageContainerView);
}

View file

@ -256,7 +256,7 @@ public class MessageHeader extends LinearLayout implements OnClickListener, OnLo
} }
public void populate(final Message message, final Account account) throws MessagingException { public void populate(final Message message, final Account account) {
final Contacts contacts = K9.showContactName() ? mContacts : null; final Contacts contacts = K9.showContactName() ? mContacts : null;
final CharSequence from = MessageHelper.toFriendly(message.getFrom(), contacts); final CharSequence from = MessageHelper.toFriendly(message.getFrom(), contacts);
final CharSequence to = MessageHelper.toFriendly(message.getRecipients(Message.RecipientType.TO), contacts); final CharSequence to = MessageHelper.toFriendly(message.getRecipients(Message.RecipientType.TO), contacts);