diff --git a/app/src/main/java/eu/faircode/email/EntityFolder.java b/app/src/main/java/eu/faircode/email/EntityFolder.java index f1d9e52188..426148434c 100644 --- a/app/src/main/java/eu/faircode/email/EntityFolder.java +++ b/app/src/main/java/eu/faircode/email/EntityFolder.java @@ -101,8 +101,10 @@ public class EntityFolder implements Serializable { static final String SYSTEM = "System"; static final String USER = "User"; + // https://www.iana.org/assignments/imap-mailbox-name-attributes/imap-mailbox-name-attributes.xhtml static final List SYSTEM_FOLDER_ATTR = Arrays.asList( "All", + "Archive", "Drafts", "Trash", "Junk", @@ -111,6 +113,7 @@ public class EntityFolder implements Serializable { "Flagged" ); static final List SYSTEM_FOLDER_TYPE = Arrays.asList( + ARCHIVE, ARCHIVE, DRAFTS, TRASH, diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index 3a3fa4b614..7d12cdff36 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -478,11 +478,11 @@ public class FragmentAccount extends FragmentEx { result.idle = istore.hasCapability("IDLE"); for (Folder ifolder : istore.getDefaultFolder().list("*")) { + // Check folder attributes String type = null; - - // First check folder attributes boolean selectable = true; String[] attrs = ((IMAPFolder) ifolder).getAttributes(); + Log.i(Helper.TAG, ifolder.getFullName() + " attrs=" + TextUtils.join(" ", attrs)); for (String attr : attrs) { if ("\\Noselect".equals(attr)) selectable = false; @@ -496,17 +496,6 @@ public class FragmentAccount extends FragmentEx { } if (selectable) { - // Next check folder full name - if (type == null) { - String fullname = ifolder.getFullName(); - for (String attr : EntityFolder.SYSTEM_FOLDER_ATTR) - if (attr.equals(fullname)) { - int index = EntityFolder.SYSTEM_FOLDER_ATTR.indexOf(attr); - type = EntityFolder.SYSTEM_FOLDER_TYPE.get(index); - break; - } - } - // Create entry DB db = DB.getInstance(context); EntityFolder folder = db.folder().getFolderByName(id, ifolder.getFullName()); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index e9bcefea05..391e435b85 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -1908,11 +1908,20 @@ public class ServiceSynchronize extends LifecycleService { Log.i(Helper.TAG, "Remote folder count=" + ifolders.length + " separator=" + separator); for (Folder ifolder : ifolders) { + String type = null; boolean selectable = true; String[] attrs = ((IMAPFolder) ifolder).getAttributes(); + Log.i(Helper.TAG, ifolder.getFullName() + " attrs=" + TextUtils.join(" ", attrs)); for (String attr : attrs) { if ("\\Noselect".equals(attr)) selectable = false; + if (attr.startsWith("\\")) { + int index = EntityFolder.SYSTEM_FOLDER_ATTR.indexOf(attr.substring(1)); + if (index >= 0) { + type = EntityFolder.SYSTEM_FOLDER_TYPE.get(index); + break; + } + } } if (selectable) { @@ -1923,7 +1932,7 @@ public class ServiceSynchronize extends LifecycleService { folder = new EntityFolder(); folder.account = account.id; folder.name = fullName; - folder.type = EntityFolder.USER; + folder.type = (type == null ? EntityFolder.USER : type); folder.level = level; folder.synchronize = false; folder.poll = ("imap.gmail.com".equals(account.host)); @@ -1935,6 +1944,8 @@ public class ServiceSynchronize extends LifecycleService { names.remove(folder.name); Log.i(Helper.TAG, folder.name + " exists"); db.folder().setFolderLevel(folder.id, level); + if (EntityFolder.USER.equals(folder.type) && type != null) + db.folder().setFolderType(folder.id, type); } } }