diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index b8ecd1e2b0..1b08f77ba6 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -874,7 +874,7 @@ public class AdapterMessage extends RecyclerView.Adapter>() { @Override @@ -1313,7 +1307,7 @@ public class AdapterMessage extends RecyclerView.Adapter() { + @Override + protected Boolean onLoad(Context context, Bundle args) { + long id = args.getLong("id"); + List attachments = DB.getInstance(context).attachment().getAttachments(id); + for (EntityAttachment attachment : attachments) + if (attachment.cid != null && !attachment.available) + return false; + return true; + } + + @Override + protected void onLoaded(Bundle args, Boolean available) { + final Intent reply = new Intent(context, ActivityCompose.class) + .putExtra("action", all ? "reply_all" : "reply") + .putExtra("reference", data.message.id); + if (available) + context.startActivity(reply); + else + new DialogBuilderLifecycle(context, owner) + .setMessage(R.string.title_image_unavailable) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + context.startActivity(reply); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(context, owner, ex); + } + }.load(context, owner, args); } ItemDetailsLookup.ItemDetails getItemDetails(@NonNull MotionEvent motionEvent) { diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index f7405e5d0f..7cffb63075 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -25,7 +25,6 @@ import android.content.Context; import android.content.pm.PackageManager; import android.database.Cursor; import android.provider.ContactsContract; -import android.text.Html; import android.text.TextUtils; import android.util.Log; @@ -250,14 +249,6 @@ public class EntityMessage implements Serializable { return false; } - static String getQuote(Context context, long id) throws IOException { - EntityMessage message = DB.getInstance(context).message().getMessage(id); - return String.format("

%s %s:

%s
", - Html.escapeHtml(new Date(message.received).toString()), - Html.escapeHtml(MessageHelper.getFormattedAddresses(message.from, true)), - HtmlHelper.sanitize(EntityMessage.read(context, id))); - } - public boolean uiEquals(Object obj) { if (obj instanceof EntityMessage) { EntityMessage other = (EntityMessage) obj; diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 685318fb26..c5a36f2e30 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -1217,11 +1217,12 @@ public class FragmentCompose extends FragmentEx { if (uris != null) for (Uri uri : uris) addAttachment(context, result.draft.id, uri, false); - } else if ("forward".equals(action)) { + } else { int sequence = 0; List attachments = db.attachment().getAttachments(ref.id); for (EntityAttachment attachment : attachments) - if (attachment.available) { + if (attachment.available && + ("forward".equals(action) || attachment.cid != null)) { EntityAttachment copy = new EntityAttachment(); copy.message = result.draft.id; copy.sequence = ++sequence; @@ -1300,14 +1301,21 @@ public class FragmentCompose extends FragmentEx { @Override protected Spanned[] onLoad(final Context context, Bundle args) throws Throwable { long id = args.getLong("id"); - long reference = args.getLong("reference", -1); + final long reference = args.getLong("reference", -1); String body = EntityMessage.read(context, id); - String quote = (reference < 0 ? null : EntityMessage.getQuote(context, reference)); + String quote = (reference < 0 ? null : HtmlHelper.getQuote(context, reference, true)); return new Spanned[]{ Html.fromHtml(body, cidGetter, null), - quote == null ? null : Html.fromHtml(quote)}; + quote == null ? null : Html.fromHtml(quote, + new Html.ImageGetter() { + @Override + public Drawable getDrawable(String source) { + return HtmlHelper.decodeImage(source, context, reference, false); + } + }, + null)}; } @Override diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index c031687552..1d2599bedb 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -24,6 +24,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.text.Html; import android.text.TextUtils; import android.util.Base64; import android.util.Log; @@ -43,6 +44,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -218,4 +220,13 @@ public class HtmlHelper { return d; } } + + static String getQuote(Context context, long id, boolean sanitize) throws IOException { + EntityMessage message = DB.getInstance(context).message().getMessage(id); + String html = EntityMessage.read(context, id); + return String.format("

%s %s:

%s
", + Html.escapeHtml(new Date(message.received).toString()), + Html.escapeHtml(MessageHelper.getFormattedAddresses(message.from, true)), + sanitize ? HtmlHelper.sanitize(html) : html); + } } diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index c8f3be5841..919ac89271 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -293,7 +293,8 @@ public class MessageHelper { } if (message.replying != null || message.forwarding != null) - body += EntityMessage.getQuote(context, message.replying == null ? message.forwarding : message.replying); + body += HtmlHelper.getQuote(context, + message.replying == null ? message.forwarding : message.replying, false); BodyPart plain = new MimeBodyPart(); plain.setContent(Jsoup.parse(body).text(), "text/plain; charset=" + Charset.defaultCharset().name()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e5b8c2e23d..0d70e953fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -250,6 +250,7 @@ Contact picker not available Attachment saved Some attachments are not downloaded and will not be forwarded, continue? + Some images are not downloaded and will not be added, continue? Delete message permanently? Delete selected messages permanently? Delete reply template permanently?