Loading k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentInfoExtractor.java +1 −3 Original line number Diff line number Diff line Loading @@ -49,10 +49,8 @@ public class AttachmentInfoExtractor { List<AttachmentViewInfo> attachments = new ArrayList<>(); for (Part part : attachmentParts) { AttachmentViewInfo attachmentViewInfo = extractAttachmentInfo(part); if (!attachmentViewInfo.inlineAttachment) { attachments.add(attachmentViewInfo); } } return attachments; } Loading k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java +38 −40 Original line number Diff line number Diff line Loading @@ -69,7 +69,8 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange private AttachmentViewCallback attachmentCallback; private SavedState mSavedState; private ClipboardManager mClipboardManager; private Map<AttachmentViewInfo, AttachmentView> attachments = new HashMap<>(); private Map<AttachmentViewInfo, AttachmentView> attachmentViewMap = new HashMap<>(); private Map<Uri, AttachmentViewInfo> attachments = new HashMap<>(); private boolean hasHiddenExternalImages; private String currentHtmlText; Loading Loading @@ -162,35 +163,38 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } case HitTestResult.IMAGE_TYPE: case HitTestResult.SRC_IMAGE_ANCHOR_TYPE: { final String url = getUriForExternalAccess(result.getExtra()); if (url == null) { final Uri uri = Uri.parse(result.getExtra()); if (uri == null) { return; } final AttachmentViewInfo attachmentViewInfo = getAttachmentViewInfoIfCidUri(uri); final boolean externalImage = url.startsWith("http"); OnMenuItemClickListener listener = new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case MENU_ITEM_IMAGE_VIEW: { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); if (!externalImage) { // Grant read permission if this points to our // AttachmentProvider intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (attachmentViewInfo != null) { attachmentCallback.onViewAttachment(attachmentViewInfo); break; } Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivityIfAvailable(getContext(), intent); break; } case MENU_ITEM_IMAGE_SAVE: { if (attachmentViewInfo != null) { attachmentCallback.onSaveAttachment(attachmentViewInfo); break; } //TODO: Use download manager new DownloadImageTask(getContext()).execute(url); new DownloadImageTask(getContext()).execute(uri.toString()); break; } case MENU_ITEM_IMAGE_COPY: { String label = getContext().getString( R.string.webview_contextmenu_image_clipboard_label); mClipboardManager.setText(label, url); mClipboardManager.setText(label, uri.toString()); break; } } Loading @@ -198,20 +202,20 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } }; menu.setHeaderTitle((externalImage) ? url : context.getString(R.string.webview_contextmenu_image_title)); menu.setHeaderTitle(attachmentViewInfo == null ? uri.toString() : context.getString(R.string.webview_contextmenu_image_title)); menu.add(Menu.NONE, MENU_ITEM_IMAGE_VIEW, 0, context.getString(R.string.webview_contextmenu_image_view_action)) .setOnMenuItemClickListener(listener); menu.add(Menu.NONE, MENU_ITEM_IMAGE_SAVE, 1, (externalImage) ? attachmentViewInfo == null ? context.getString(R.string.webview_contextmenu_image_download_action) : context.getString(R.string.webview_contextmenu_image_save_action)) .setOnMenuItemClickListener(listener); if (externalImage) { if (attachmentViewInfo == null) { menu.add(Menu.NONE, MENU_ITEM_IMAGE_COPY, 2, context.getString(R.string.webview_contextmenu_image_copy_action)) .setOnMenuItemClickListener(listener); Loading Loading @@ -312,29 +316,15 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } } private String getUriForExternalAccess(String url) { if (!url.startsWith("cid:")) { return url; } String cid = Uri.parse(url).getSchemeSpecificPart(); AttachmentViewInfo attachment = getAttachmentByContentId(cid); if (attachment == null) { private AttachmentViewInfo getAttachmentViewInfoIfCidUri(Uri uri) { if (!"cid".equals(uri.getScheme())) { return null; } return attachment.internalUri.toString(); } String cid = uri.getSchemeSpecificPart(); Uri internalUri = currentAttachmentResolver.getAttachmentUriForContentId(cid); private AttachmentViewInfo getAttachmentByContentId(String cid) { for (AttachmentViewInfo attachment : attachments.keySet()) { if (cid.equals(attachment.part.getContentId())) { return attachment; } } return null; return attachments.get(internalUri); } private void startActivityIfAvailable(Context context, Intent intent) { Loading Loading @@ -365,13 +355,13 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } public void enableAttachmentButtons() { for (AttachmentView attachmentView : attachments.values()) { for (AttachmentView attachmentView : attachmentViewMap.values()) { attachmentView.enableButtons(); } } public void disableAttachmentButtons() { for (AttachmentView attachmentView : attachments.values()) { for (AttachmentView attachmentView : attachmentViewMap.values()) { attachmentView.disableButtons(); } } Loading Loading @@ -445,22 +435,30 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } public void renderAttachments(MessageViewInfo messageViewInfo) { boolean hasHiddenAttachments = false; if (messageViewInfo.attachments != null) { for (AttachmentViewInfo attachment : messageViewInfo.attachments) { attachments.put(attachment.internalUri, attachment); if (attachment.inlineAttachment) { continue; } AttachmentView view = (AttachmentView) mInflater.inflate(R.layout.message_view_attachment, mAttachments, false); view.setCallback(attachmentCallback); view.setAttachment(attachment); attachments.put(attachment, view); attachmentViewMap.put(attachment, view); mAttachments.addView(view); } } if (messageViewInfo.extraAttachments != null) { for (AttachmentViewInfo attachment : messageViewInfo.extraAttachments) { attachments.put(attachment.internalUri, attachment); if (attachment.inlineAttachment) { continue; } LockedAttachmentView view = (LockedAttachmentView) mInflater .inflate(R.layout.message_view_attachment_locked, mAttachments, false); view.setCallback(attachmentCallback); Loading Loading @@ -547,7 +545,7 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } private AttachmentView getAttachmentView(AttachmentViewInfo attachment) { return attachments.get(attachment); return attachmentViewMap.get(attachment); } static class SavedState extends BaseSavedState { Loading Loading
k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentInfoExtractor.java +1 −3 Original line number Diff line number Diff line Loading @@ -49,10 +49,8 @@ public class AttachmentInfoExtractor { List<AttachmentViewInfo> attachments = new ArrayList<>(); for (Part part : attachmentParts) { AttachmentViewInfo attachmentViewInfo = extractAttachmentInfo(part); if (!attachmentViewInfo.inlineAttachment) { attachments.add(attachmentViewInfo); } } return attachments; } Loading
k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java +38 −40 Original line number Diff line number Diff line Loading @@ -69,7 +69,8 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange private AttachmentViewCallback attachmentCallback; private SavedState mSavedState; private ClipboardManager mClipboardManager; private Map<AttachmentViewInfo, AttachmentView> attachments = new HashMap<>(); private Map<AttachmentViewInfo, AttachmentView> attachmentViewMap = new HashMap<>(); private Map<Uri, AttachmentViewInfo> attachments = new HashMap<>(); private boolean hasHiddenExternalImages; private String currentHtmlText; Loading Loading @@ -162,35 +163,38 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } case HitTestResult.IMAGE_TYPE: case HitTestResult.SRC_IMAGE_ANCHOR_TYPE: { final String url = getUriForExternalAccess(result.getExtra()); if (url == null) { final Uri uri = Uri.parse(result.getExtra()); if (uri == null) { return; } final AttachmentViewInfo attachmentViewInfo = getAttachmentViewInfoIfCidUri(uri); final boolean externalImage = url.startsWith("http"); OnMenuItemClickListener listener = new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case MENU_ITEM_IMAGE_VIEW: { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); if (!externalImage) { // Grant read permission if this points to our // AttachmentProvider intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (attachmentViewInfo != null) { attachmentCallback.onViewAttachment(attachmentViewInfo); break; } Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivityIfAvailable(getContext(), intent); break; } case MENU_ITEM_IMAGE_SAVE: { if (attachmentViewInfo != null) { attachmentCallback.onSaveAttachment(attachmentViewInfo); break; } //TODO: Use download manager new DownloadImageTask(getContext()).execute(url); new DownloadImageTask(getContext()).execute(uri.toString()); break; } case MENU_ITEM_IMAGE_COPY: { String label = getContext().getString( R.string.webview_contextmenu_image_clipboard_label); mClipboardManager.setText(label, url); mClipboardManager.setText(label, uri.toString()); break; } } Loading @@ -198,20 +202,20 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } }; menu.setHeaderTitle((externalImage) ? url : context.getString(R.string.webview_contextmenu_image_title)); menu.setHeaderTitle(attachmentViewInfo == null ? uri.toString() : context.getString(R.string.webview_contextmenu_image_title)); menu.add(Menu.NONE, MENU_ITEM_IMAGE_VIEW, 0, context.getString(R.string.webview_contextmenu_image_view_action)) .setOnMenuItemClickListener(listener); menu.add(Menu.NONE, MENU_ITEM_IMAGE_SAVE, 1, (externalImage) ? attachmentViewInfo == null ? context.getString(R.string.webview_contextmenu_image_download_action) : context.getString(R.string.webview_contextmenu_image_save_action)) .setOnMenuItemClickListener(listener); if (externalImage) { if (attachmentViewInfo == null) { menu.add(Menu.NONE, MENU_ITEM_IMAGE_COPY, 2, context.getString(R.string.webview_contextmenu_image_copy_action)) .setOnMenuItemClickListener(listener); Loading Loading @@ -312,29 +316,15 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } } private String getUriForExternalAccess(String url) { if (!url.startsWith("cid:")) { return url; } String cid = Uri.parse(url).getSchemeSpecificPart(); AttachmentViewInfo attachment = getAttachmentByContentId(cid); if (attachment == null) { private AttachmentViewInfo getAttachmentViewInfoIfCidUri(Uri uri) { if (!"cid".equals(uri.getScheme())) { return null; } return attachment.internalUri.toString(); } String cid = uri.getSchemeSpecificPart(); Uri internalUri = currentAttachmentResolver.getAttachmentUriForContentId(cid); private AttachmentViewInfo getAttachmentByContentId(String cid) { for (AttachmentViewInfo attachment : attachments.keySet()) { if (cid.equals(attachment.part.getContentId())) { return attachment; } } return null; return attachments.get(internalUri); } private void startActivityIfAvailable(Context context, Intent intent) { Loading Loading @@ -365,13 +355,13 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } public void enableAttachmentButtons() { for (AttachmentView attachmentView : attachments.values()) { for (AttachmentView attachmentView : attachmentViewMap.values()) { attachmentView.enableButtons(); } } public void disableAttachmentButtons() { for (AttachmentView attachmentView : attachments.values()) { for (AttachmentView attachmentView : attachmentViewMap.values()) { attachmentView.disableButtons(); } } Loading Loading @@ -445,22 +435,30 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } public void renderAttachments(MessageViewInfo messageViewInfo) { boolean hasHiddenAttachments = false; if (messageViewInfo.attachments != null) { for (AttachmentViewInfo attachment : messageViewInfo.attachments) { attachments.put(attachment.internalUri, attachment); if (attachment.inlineAttachment) { continue; } AttachmentView view = (AttachmentView) mInflater.inflate(R.layout.message_view_attachment, mAttachments, false); view.setCallback(attachmentCallback); view.setAttachment(attachment); attachments.put(attachment, view); attachmentViewMap.put(attachment, view); mAttachments.addView(view); } } if (messageViewInfo.extraAttachments != null) { for (AttachmentViewInfo attachment : messageViewInfo.extraAttachments) { attachments.put(attachment.internalUri, attachment); if (attachment.inlineAttachment) { continue; } LockedAttachmentView view = (LockedAttachmentView) mInflater .inflate(R.layout.message_view_attachment_locked, mAttachments, false); view.setCallback(attachmentCallback); Loading Loading @@ -547,7 +545,7 @@ public class MessageContainerView extends LinearLayout implements OnLayoutChange } private AttachmentView getAttachmentView(AttachmentViewInfo attachment) { return attachments.get(attachment); return attachmentViewMap.get(attachment); } static class SavedState extends BaseSavedState { Loading