diff --git a/mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java b/mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java index e15b627097db053d3838fdd12f8240c3f04c58cb..b723fa9ce49486e0a7589b0e8992461f7503a1c8 100644 --- a/mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java +++ b/mail/protocols/imap/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java @@ -179,7 +179,7 @@ public class ImapStore extends RemoteStore { ListResponse.parseLsub(responses) : ListResponse.parseList(responses); - List folders = new ArrayList<>(listResponses.size()); + Map folderMap = new HashMap<>(listResponses.size()); for (ListResponse listResponse : listResponses) { String decodedFolderName; try { @@ -235,10 +235,15 @@ public class ImapStore extends RemoteStore { type = FolderType.REGULAR; } - folders.add(new FolderListItem(folder, type)); + FolderListItem existingItem = folderMap.get(folder); + if (existingItem == null || existingItem.getType() == FolderType.REGULAR) { + folderMap.put(folder, new FolderListItem(folder, type)); + } } + List folders = new ArrayList<>(folderMap.size() + 1); folders.add(new FolderListItem(ImapFolder.INBOX, FolderType.INBOX)); + folders.addAll(folderMap.values()); return folders; } diff --git a/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreTest.java b/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreTest.java index d7079fa16af456e873a2295b340502be28d21840..13ceadc6e5e48997bea47f0f2358b39adfaf8115 100644 --- a/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreTest.java +++ b/mail/protocols/imap/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreTest.java @@ -241,6 +241,31 @@ public class ImapStoreTest { assertEquals(Sets.newSet("INBOX", "FolderOne"), extractFolderNames(result)); } + @Test + public void getPersonalNamespaces_withDuplicateFolderNames_shouldRemoveDuplicatesAndKeepFolderType() + throws Exception { + ImapConnection imapConnection = mock(ImapConnection.class); + when(imapConnection.hasCapability(Capabilities.LIST_EXTENDED)).thenReturn(true); + when(imapConnection.hasCapability(Capabilities.SPECIAL_USE)).thenReturn(true); + List imapResponses = Arrays.asList( + createImapResponse("* LIST () \".\" \"INBOX\""), + createImapResponse("* LIST (\\HasNoChildren) \".\" \"Junk\""), + createImapResponse("* LIST (\\Junk) \".\" \"Junk\""), + createImapResponse("* LIST (\\HasNoChildren) \".\" \"Junk\""), + createImapResponse("5 OK Success") + ); + when(imapConnection.executeSimpleCommand("LIST \"\" \"*\" RETURN (SPECIAL-USE)")).thenReturn(imapResponses); + imapStore.enqueueImapConnection(imapConnection); + + List result = imapStore.getPersonalNamespaces(); + + assertNotNull(result); + assertEquals(2, result.size()); + ImapFolder junkFolder = getFolderByName(result, "Junk"); + assertNotNull(junkFolder); + assertEquals(FolderType.SPAM, junkFolder.getType()); + } + @Test public void getPersonalNamespaces_withoutException_shouldLeaveImapConnectionOpen() throws Exception { ImapConnection imapConnection = mock(ImapConnection.class); @@ -367,6 +392,15 @@ public class ImapStoreTest { return folderNames; } + private ImapFolder getFolderByName(List result, String folderName) { + for (ImapFolder imapFolder : result) { + if (imapFolder.getName().equals(folderName)) { + return imapFolder; + } + } + return null; + } + private Map toFolderMap(List folders) { Map folderMap = new HashMap<>(); for (ImapFolder folder : folders) {