diff --git a/app/src/main/java/eu/faircode/email/DaoAttachment.java b/app/src/main/java/eu/faircode/email/DaoAttachment.java index 58c4f81efa..770d888811 100644 --- a/app/src/main/java/eu/faircode/email/DaoAttachment.java +++ b/app/src/main/java/eu/faircode/email/DaoAttachment.java @@ -38,11 +38,6 @@ public interface DaoAttachment { " WHERE message = :message") int getAttachmentSequence(long message); - @Query("SELECT COUNT(id)" + - " FROM attachment" + - " WHERE id = :id") - int countAttachment(long id); - @Query("SELECT * FROM attachment" + " WHERE message = :message" + " ORDER BY sequence") @@ -83,9 +78,9 @@ public interface DaoAttachment { void setDownloaded(long id, Long size); @Query("UPDATE attachment" + - " SET size = NULL, progress = NULL, available = 0" + + " SET size = NULL, progress = NULL, available = :available" + " WHERE id = :id") - void setUnavailable(long id); + void setAvailable(long id, boolean available); @Query("UPDATE attachment" + " SET error = :error, progress = NULL, available = 0" + diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 92dc222341..8b1c8aa87a 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -177,11 +177,6 @@ public interface DaoMessage { " AND ui_hide <> 0") LiveData> liveHidden(long account, String thread); - @Query("SELECT COUNT(id)" + - " FROM message" + - " WHERE id = :id") - int countMessage(long id); - @Query("SELECT *" + " FROM message" + " WHERE id = :id") diff --git a/app/src/main/java/eu/faircode/email/WorkerCleanup.java b/app/src/main/java/eu/faircode/email/WorkerCleanup.java index 809a0f7a8a..28cb002fff 100644 --- a/app/src/main/java/eu/faircode/email/WorkerCleanup.java +++ b/app/src/main/java/eu/faircode/email/WorkerCleanup.java @@ -82,59 +82,6 @@ public class WorkerCleanup extends Worker { " before=" + new Date(keep_time) + " deleted=" + messages); } - long now = new Date().getTime(); - - List files = new ArrayList<>(); - File[] messages = new File(context.getFilesDir(), "messages").listFiles(); - File[] revision = new File(context.getFilesDir(), "revision").listFiles(); - File[] references = new File(context.getFilesDir(), "references").listFiles(); - File[] raws = new File(context.getFilesDir(), "raw").listFiles(); - - if (messages != null) - files.addAll(Arrays.asList(messages)); - if (revision != null) - files.addAll(Arrays.asList(revision)); - if (references != null) - files.addAll(Arrays.asList(references)); - if (raws != null) - files.addAll(Arrays.asList(raws)); - - // Cleanup message files - Log.i("Cleanup message files"); - for (File file : files) { - long id = Long.parseLong(file.getName().split("\\.")[0]); - if (db.message().countMessage(id) == 0) { - Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); - } - } - - // Cleanup attachment files - Log.i("Cleanup attachment files"); - File[] attachments = new File(context.getFilesDir(), "attachments").listFiles(); - if (attachments != null) - for (File file : attachments) { - long id = Long.parseLong(file.getName().split("\\.")[0]); - if (db.attachment().countAttachment(id) == 0) { - Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); - } - } - - // Cleanup cached images - Log.i("Cleanup cached image files"); - File[] images = new File(context.getCacheDir(), "images").listFiles(); - if (images != null) - for (File file : images) - if (file.isFile()) - if (manual || now - file.lastModified() > CACHE_IMAGE_DURATION) { - Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); - } - if (manual) { // Check message files Log.i("Checking message files"); @@ -156,11 +103,66 @@ public class WorkerCleanup extends Worker { File file = attachment.getFile(context); if (!file.exists()) { Log.w("Attachment file missing id=" + aid); - db.attachment().setUnavailable(aid); + db.attachment().setAvailable(aid, false); } } } + long now = new Date().getTime(); + + List files = new ArrayList<>(); + File[] messages = new File(context.getFilesDir(), "messages").listFiles(); + File[] revision = new File(context.getFilesDir(), "revision").listFiles(); + File[] references = new File(context.getFilesDir(), "references").listFiles(); + File[] raws = new File(context.getFilesDir(), "raw").listFiles(); + + if (messages != null) + files.addAll(Arrays.asList(messages)); + if (revision != null) + files.addAll(Arrays.asList(revision)); + if (references != null) + files.addAll(Arrays.asList(references)); + if (raws != null) + files.addAll(Arrays.asList(raws)); + + // Cleanup message files + Log.i("Cleanup message files"); + for (File file : files) { + long id = Long.parseLong(file.getName().split("\\.")[0]); + EntityMessage message = db.message().getMessage(id); + if (message == null || !message.content) { + Log.i("Deleting " + file); + if (!file.delete()) + Log.w("Error deleting " + file); + } + } + + // Cleanup attachment files + Log.i("Cleanup attachment files"); + File[] attachments = new File(context.getFilesDir(), "attachments").listFiles(); + if (attachments != null) + for (File file : attachments) { + long id = Long.parseLong(file.getName().split("\\.")[0]); + EntityAttachment attachment = db.attachment().getAttachment(id); + if (attachment == null || !attachment.available) { + Log.i("Deleting " + file); + if (!file.delete()) + Log.w("Error deleting " + file); + } + } + + // Cleanup cached images + Log.i("Cleanup cached image files"); + File[] images = new File(context.getCacheDir(), "images").listFiles(); + if (images != null) + for (File file : images) + if (file.isFile()) + if (manual || now - file.lastModified() > CACHE_IMAGE_DURATION) { + Log.i("Deleting " + file); + if (!file.delete()) + Log.w("Error deleting " + file); + } + Log.i("Cleanup contacts"); int contacts = db.contact().deleteContacts(now - KEEP_CONTACTS_DURATION); Log.i("Deleted contacts=" + contacts);