From 9e5ccb28b945cc6956d74e42fb093da92e6b23d6 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 7 Jul 2019 09:25:52 +0200 Subject: [PATCH] Improved read only folder support --- .../java/eu/faircode/email/ActivitySetup.java | 2 +- .../java/eu/faircode/email/AdapterFolder.java | 3 +- .../eu/faircode/email/AdapterMessage.java | 58 ++++++++++--------- app/src/main/java/eu/faircode/email/Core.java | 2 +- .../java/eu/faircode/email/DaoFolder.java | 3 +- .../java/eu/faircode/email/DaoMessage.java | 10 ++-- .../eu/faircode/email/FragmentAccount.java | 2 +- .../eu/faircode/email/FragmentMessages.java | 16 ++++- .../java/eu/faircode/email/FragmentRule.java | 2 +- .../email/SelectionPredicateMessage.java | 4 +- .../eu/faircode/email/ServiceSynchronize.java | 7 +-- .../eu/faircode/email/TupleMessageEx.java | 3 + 12 files changed, 65 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivitySetup.java b/app/src/main/java/eu/faircode/email/ActivitySetup.java index 356809c967..10fc066814 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySetup.java +++ b/app/src/main/java/eu/faircode/email/ActivitySetup.java @@ -507,7 +507,7 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac // Folders JSONArray jfolders = new JSONArray(); - for (EntityFolder folder : db.folder().getFolders(account.id, true)) { + for (EntityFolder folder : db.folder().getFolders(account.id, false, true)) { JSONObject jfolder = folder.toJSON(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 4f72dcd727..21b7ee9044 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -380,7 +380,8 @@ public class AdapterFolder extends RecyclerView.Adapter= Build.VERSION_CODES.O) { diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 48c23a7426..003da453b2 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -851,7 +851,9 @@ public class AdapterMessage extends RecyclerView.Adapter 0 ? message.color == null || !Helper.isPro(context) ? colorAccent : message.color : textColorSecondary)); - ivFlagged.setVisibility(flags ? (message.uid == null ? View.INVISIBLE : View.VISIBLE) : View.GONE); + ivFlagged.setVisibility(flags && !message.folderReadOnly + ? message.uid == null ? View.INVISIBLE : View.VISIBLE + : View.GONE); } private void bindContactInfo(ContactInfo info, TupleMessageEx message) { @@ -1064,25 +1066,27 @@ public class AdapterMessage extends RecyclerView.Adapter 0); diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index f6633e98c6..b77ac1cb4a 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -783,7 +783,7 @@ class Core { // Get folder names Map local = new HashMap<>(); - for (EntityFolder folder : db.folder().getFolders(account.id, true)) + for (EntityFolder folder : db.folder().getFolders(account.id, false, false)) if (folder.tbc != null) { Log.i(folder.name + " creating"); Folder ifolder = istore.getFolder(folder.name); diff --git a/app/src/main/java/eu/faircode/email/DaoFolder.java b/app/src/main/java/eu/faircode/email/DaoFolder.java index 722fedac85..ddf094fd51 100644 --- a/app/src/main/java/eu/faircode/email/DaoFolder.java +++ b/app/src/main/java/eu/faircode/email/DaoFolder.java @@ -30,8 +30,9 @@ import java.util.List; public interface DaoFolder { @Query("SELECT * FROM folder" + " WHERE account = :account" + + " AND (NOT :writable OR NOT read_only)" + " AND (NOT :selectable OR selectable)") - List getFolders(long account, boolean selectable); + List getFolders(long account, boolean writable, boolean selectable); @Query("SELECT folder.*" + ", account.id AS accountId, account.`order` AS accountOrder, account.name AS accountName, account.color AS accountColor, account.state AS accountState" + diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 2daf48a45d..92dc222341 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -43,7 +43,7 @@ public interface DaoMessage { @Query("SELECT message.*" + ", account.name AS accountName, IFNULL(identity.color, account.color) AS accountColor, account.notify AS accountNotify" + - ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType" + + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", COUNT(message.id) AS count" + ", " + unseen_unified + " AS unseen" + @@ -89,7 +89,7 @@ public interface DaoMessage { @Query("SELECT message.*" + ", account.name AS accountName, IFNULL(identity.color, account.color) AS accountColor, account.notify AS accountNotify" + - ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType" + + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", COUNT(message.id) AS count" + ", " + unseen_folder + " AS unseen" + @@ -132,7 +132,7 @@ public interface DaoMessage { @Query("SELECT message.*" + ", account.name AS accountName, IFNULL(identity.color, account.color) AS accountColor, account.notify AS accountNotify" + - ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType" + + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", 1 AS count" + ", CASE WHEN message.ui_seen THEN 0 ELSE 1 END AS unseen" + @@ -244,7 +244,7 @@ public interface DaoMessage { @Query("SELECT message.*" + ", account.name AS accountName, identity.color AS accountColor, account.notify AS accountNotify" + - ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType" + + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", 1 AS count" + ", CASE WHEN message.ui_seen THEN 0 ELSE 1 END AS unseen" + @@ -262,7 +262,7 @@ public interface DaoMessage { @Query("SELECT message.*" + ", account.name AS accountName, IFNULL(identity.color, account.color) AS accountColor, account.notify AS accountNotify" + - ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType" + + ", folder.name AS folderName, folder.display AS folderDisplay, folder.type AS folderType, folder.read_only AS folderReadOnly" + ", identity.name AS identityName, identity.email AS identityEmail, identity.synchronize AS identitySynchronize" + ", 1 AS count" + ", 1 AS unseen" + diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index ecfb69950a..5965e2dfe2 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -1215,7 +1215,7 @@ public class FragmentAccount extends FragmentBase { long account = args.getLong("account"); DB db = DB.getInstance(context); - List folders = db.folder().getFolders(account, true); + List folders = db.folder().getFolders(account, false, true); if (folders != null && folders.size() > 0) Collections.sort(folders, folders.get(0).getComparator(null)); diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 042cfde59d..a82ff2f215 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1196,6 +1196,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. if (message == null) return 0; + if (message.folderReadOnly) + return 0; + if (EntityFolder.OUTBOX.equals(message.folderType)) return 0; @@ -2846,7 +2849,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. boolean archivable = false; for (EntityMessage message : messages) { EntityFolder folder = db.folder().getFolder(message.folder); - if (!EntityFolder.DRAFTS.equals(folder.type) && + + if (!folder.read_only && + !EntityFolder.DRAFTS.equals(folder.type) && !EntityFolder.OUTBOX.equals(folder.type) && // allow sent !EntityFolder.TRASH.equals(folder.type) && @@ -2856,7 +2861,8 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. if (!EntityFolder.OUTBOX.equals(folder.type)) snoozable = true; - if (!EntityFolder.isOutgoing(folder.type) && + if (!folder.read_only && + !EntityFolder.isOutgoing(folder.type) && !EntityFolder.TRASH.equals(folder.type) && !EntityFolder.JUNK.equals(folder.type) && !EntityFolder.ARCHIVE.equals(folder.type)) @@ -2912,10 +2918,14 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. if (message == null) return null; + EntityFolder folder = db.folder().getFolder(message.folder); + if (folder == null) + return null; + if (message.uid != null) { if (!message.content) EntityOperation.queue(context, message, EntityOperation.BODY); - if (!message.ui_seen) + if (!message.ui_seen && !folder.read_only) EntityOperation.queue(context, message, EntityOperation.SEEN, true); } diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 2537885bb1..3aff29e104 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -372,7 +372,7 @@ public class FragmentRule extends FragmentBase { DB db = DB.getInstance(context); data.folder = db.folder().getFolder(fid); - data.folders = db.folder().getFolders(aid, true); + data.folders = db.folder().getFolders(aid, true, true); if (data.folders == null) data.folders = new ArrayList<>(); diff --git a/app/src/main/java/eu/faircode/email/SelectionPredicateMessage.java b/app/src/main/java/eu/faircode/email/SelectionPredicateMessage.java index 92bfadcec8..687d5c8013 100644 --- a/app/src/main/java/eu/faircode/email/SelectionPredicateMessage.java +++ b/app/src/main/java/eu/faircode/email/SelectionPredicateMessage.java @@ -46,7 +46,7 @@ public class SelectionPredicateMessage extends SelectionTracker.SelectionPredica if (message == null) // happens when restoring state return true; - if (message.uid != null) + if (message.uid != null && !message.folderReadOnly) return true; return false; @@ -62,7 +62,7 @@ public class SelectionPredicateMessage extends SelectionTracker.SelectionPredica if (message == null) // happens when restoring state return true; - if (message.uid != null) + if (message.uid != null && !message.folderReadOnly) return true; return false; diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index f66f0a63c0..e69288d61e 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -739,7 +739,7 @@ public class ServiceSynchronize extends LifecycleService { // Open synchronizing folders final ExecutorService executor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory); - List folders = db.folder().getFolders(account.id, true); + List folders = db.folder().getFolders(account.id, false, true); Collections.sort(folders, new Comparator() { @Override public int compare(EntityFolder f1, EntityFolder f2) { @@ -761,13 +761,12 @@ public class ServiceSynchronize extends LifecycleService { final IMAPFolder ifolder = (IMAPFolder) istore.getFolder(folder.name); try { - //if ("Postausgang".equals(folder.name)) - // throw new ReadOnlyFolderException(ifolder); + if (BuildConfig.DEBUG && "Postausgang".equals(folder.name)) + throw new ReadOnlyFolderException(ifolder); ifolder.open(Folder.READ_WRITE); db.folder().setFolderReadOnly(folder.id, false); } catch (ReadOnlyFolderException ex) { Log.w(folder.name + " read only"); - db.folder().setFolderError(folder.id, Helper.formatThrowable(ex)); try { ifolder.open(Folder.READ_ONLY); db.folder().setFolderReadOnly(folder.id, true); diff --git a/app/src/main/java/eu/faircode/email/TupleMessageEx.java b/app/src/main/java/eu/faircode/email/TupleMessageEx.java index 4c3c1d45ee..ca9d5afc39 100644 --- a/app/src/main/java/eu/faircode/email/TupleMessageEx.java +++ b/app/src/main/java/eu/faircode/email/TupleMessageEx.java @@ -30,6 +30,7 @@ public class TupleMessageEx extends EntityMessage { public String folderName; public String folderDisplay; public String folderType; + public boolean folderReadOnly; public String identityName; public String identityEmail; public Boolean identitySynchronize; @@ -40,6 +41,7 @@ public class TupleMessageEx extends EntityMessage { public int drafts; public int visible; public Long totalSize; + @Ignore public boolean duplicate; @@ -54,6 +56,7 @@ public class TupleMessageEx extends EntityMessage { this.folderName.equals(other.folderName) && Objects.equals(this.folderDisplay, other.folderDisplay) && this.folderType.equals(other.folderType) && + this.folderReadOnly == other.folderReadOnly && Objects.equals(this.identityName, other.identityName) && Objects.equals(this.identityEmail, other.identityEmail) && Objects.equals(this.identitySynchronize, other.identitySynchronize) &&