diff --git a/app/src/main/java/eu/faircode/email/DaoAttachment.java b/app/src/main/java/eu/faircode/email/DaoAttachment.java index 6ca55552c2..718d23333c 100644 --- a/app/src/main/java/eu/faircode/email/DaoAttachment.java +++ b/app/src/main/java/eu/faircode/email/DaoAttachment.java @@ -29,12 +29,21 @@ import androidx.room.Update; @Dao public interface DaoAttachment { - @Query("SELECT id, message, sequence, name, type, size, progress" + + @Query("SELECT attachment.id, attachment.message, sequence, name, type, size, progress" + ", (NOT content IS NULL) as content" + " FROM attachment" + - " WHERE message = :message" + + " WHERE message = :id" + + " ORDER BY sequence") + LiveData> liveAttachments(long id); + + @Query("SELECT attachment.id, attachment.message, sequence, name, type, size, progress" + + ", (NOT content IS NULL) as content" + + " FROM attachment" + + " JOIN message ON message.id = attachment.message" + + " WHERE folder = :folder" + + " AND msgid = :msgid" + " ORDER BY sequence") - LiveData> liveAttachments(long message); + LiveData> liveAttachments(long folder, String msgid); @Query("SELECT * FROM attachment" + " WHERE message = :message" + diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 018c798c42..ed545ed95e 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -103,8 +103,10 @@ public interface DaoMessage { " WHERE message.id = :id") LiveData liveMessage(long id); - @Query("SELECT * FROM message WHERE msgid = :msgid") - LiveData liveMessageByMsgId(String msgid); + @Query("SELECT * FROM message" + + " WHERE folder = :folder" + + " AND msgid = :msgid") + LiveData liveMessageByMsgId(long folder, String msgid); @Query("SELECT uid FROM message WHERE folder = :folder AND received >= :received AND NOT uid IS NULL") List getUids(long folder, long received); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 8d0a04e74a..c847fee2f6 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -585,12 +585,25 @@ public class FragmentCompose extends FragmentEx { return draft; } + @Override protected void onLoaded(Bundle args, EntityMessage draft) { FragmentCompose.this.draft = draft; Log.i(Helper.TAG, "Loaded draft id=" + draft.id + " msgid=" + draft.msgid); - DB.getInstance(getContext()).message().liveMessageByMsgId(draft.msgid).observe(getViewLifecycleOwner(), new Observer() { + DB db = DB.getInstance(getContext()); + + db.attachment().liveAttachments(draft.folder, draft.msgid).observe(getViewLifecycleOwner(), + new Observer>() { + @Override + public void onChanged(@Nullable List attachments) { + if (attachments != null) + adapter.set(attachments); + grpAttachments.setVisibility(attachments != null && attachments.size() > 0 ? View.VISIBLE : View.GONE); + } + }); + + db.message().liveMessageByMsgId(draft.folder, draft.msgid).observe(getViewLifecycleOwner(), new Observer() { boolean observed = false; @Override @@ -606,17 +619,6 @@ public class FragmentCompose extends FragmentEx { DB db = DB.getInstance(getContext()); - db.attachment().liveAttachments(draft.id).removeObservers(getViewLifecycleOwner()); - db.attachment().liveAttachments(draft.id).observe(getViewLifecycleOwner(), - new Observer>() { - @Override - public void onChanged(@Nullable List attachments) { - if (attachments != null) - adapter.set(attachments); - grpAttachments.setVisibility(attachments != null && attachments.size() > 0 ? View.VISIBLE : View.GONE); - } - }); - // Set controls only once if (observed) return; diff --git a/app/src/main/java/eu/faircode/email/FragmentMessage.java b/app/src/main/java/eu/faircode/email/FragmentMessage.java index 619cb2df24..a2d68c7944 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessage.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessage.java @@ -275,17 +275,6 @@ public class FragmentMessage extends FragmentEx { tvFrom.setTextColor(colorUnseen); tvTime.setTextColor(colorUnseen); - db.attachment().liveAttachments(id).removeObservers(getViewLifecycleOwner()); - db.attachment().liveAttachments(id).observe(getViewLifecycleOwner(), - new Observer>() { - @Override - public void onChanged(@Nullable List attachments) { - if (attachments != null) - adapter.set(attachments); - grpAttachments.setVisibility(attachments != null && attachments.size() > 0 ? View.VISIBLE : View.GONE); - } - }); - tvError.setText(message.error); tvError.setVisibility(message.error == null ? View.GONE : View.VISIBLE); @@ -350,6 +339,18 @@ public class FragmentMessage extends FragmentEx { grpReady.setVisibility(View.VISIBLE); } }); + + // Observe attachments + db.attachment().liveAttachments(id).observe(getViewLifecycleOwner(), + new Observer>() { + @Override + public void onChanged(@Nullable List attachments) { + if (attachments != null) + adapter.set(attachments); + grpAttachments.setVisibility(attachments != null && attachments.size() > 0 ? View.VISIBLE : View.GONE); + } + }); + } @Override diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 227aa97c1f..0c2af2a9d9 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1185,6 +1185,7 @@ public class ServiceSynchronize extends LifecycleService { DB db = DB.getInstance(this); try { int result = 0; + db.beginTransaction(); // Find message by uid (fast, no headers required)