mirror of
https://github.com/moparisthebest/k-9
synced 2024-11-27 11:42:16 -05:00
Move IMAP search into the Folder level.
Should also consider moving the LocalStore search into the folder level and have the store call the folder level searches.
This commit is contained in:
parent
270d948edb
commit
9f96cd36a7
@ -830,7 +830,7 @@ public class MessagingController implements Runnable {
|
||||
throw new MessagingException("Folder not found");
|
||||
}
|
||||
|
||||
List<Message> messages = remoteStore.searchRemoteMessages(query, folderName, requiredFlags, forbiddenFlags);
|
||||
List<Message> messages = remoteFolder.search(query, requiredFlags, forbiddenFlags);
|
||||
if (listener != null) {
|
||||
listener.remoteSearchServerQueryComplete(acct, folderName, messages.size());
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.fsck.k9.mail;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import android.util.Log;
|
||||
@ -226,4 +227,9 @@ public abstract class Folder {
|
||||
public Account getAccount() {
|
||||
return mAccount;
|
||||
}
|
||||
|
||||
public List<Message> search(String queryString, final Flag[] requiredFlags, final Flag[] forbiddenFlags)
|
||||
throws MessagingException {
|
||||
throw new MessagingException("K-9 does not support searches on this folder type");
|
||||
}
|
||||
}
|
||||
|
@ -178,8 +178,5 @@ public abstract class Store {
|
||||
return mAccount;
|
||||
}
|
||||
|
||||
public List<Message> searchRemoteMessages(String queryString,
|
||||
String folder, final Flag[] requiredFlags, final Flag[] forbiddenFlags) throws MessagingException {
|
||||
throw new MessagingException("K-9 does not support remote searching on this account type");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2213,6 +2213,108 @@ public class ImapStore extends Store {
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search the remote ImapFolder.
|
||||
* @param queryString String to query for.
|
||||
* @param requiredFlags Mandatory flags
|
||||
* @param forbiddenFlags Flags to exclude
|
||||
* @return List of messages found
|
||||
* @throws MessagingException On any error.
|
||||
*/
|
||||
@Override
|
||||
public List<Message> search(final String queryString, final Flag[] requiredFlags, final Flag[] forbiddenFlags)
|
||||
throws MessagingException {
|
||||
|
||||
if (!mAccount.allowRemoteSearch()) {
|
||||
throw new MessagingException("Your settings do not allow remote searching of this account");
|
||||
}
|
||||
|
||||
// Setup the searcher
|
||||
final ImapSearcher searcher = new ImapSearcher() {
|
||||
public List<ImapResponse> search() throws IOException, MessagingException {
|
||||
String imapQuery = "UID SEARCH ";
|
||||
if (requiredFlags != null) {
|
||||
for (Flag f : requiredFlags) {
|
||||
switch (f) {
|
||||
case DELETED:
|
||||
imapQuery += "DELETED ";
|
||||
break;
|
||||
|
||||
case SEEN:
|
||||
imapQuery += "SEEN ";
|
||||
break;
|
||||
|
||||
case ANSWERED:
|
||||
imapQuery += "ANSWERED ";
|
||||
break;
|
||||
|
||||
case FLAGGED:
|
||||
imapQuery += "FLAGGED ";
|
||||
break;
|
||||
|
||||
case DRAFT:
|
||||
imapQuery += "DRAFT ";
|
||||
break;
|
||||
|
||||
case RECENT:
|
||||
imapQuery += "RECENT ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (forbiddenFlags != null) {
|
||||
for (Flag f : forbiddenFlags) {
|
||||
switch (f) {
|
||||
case DELETED:
|
||||
imapQuery += "UNDELETED ";
|
||||
break;
|
||||
|
||||
case SEEN:
|
||||
imapQuery += "UNSEEN ";
|
||||
break;
|
||||
|
||||
case ANSWERED:
|
||||
imapQuery += "UNANSWERED ";
|
||||
break;
|
||||
|
||||
case FLAGGED:
|
||||
imapQuery += "UNFLAGGED ";
|
||||
break;
|
||||
|
||||
case DRAFT:
|
||||
imapQuery += "UNDRAFT ";
|
||||
break;
|
||||
|
||||
case RECENT:
|
||||
imapQuery += "UNRECENT ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
final String encodedQry = encodeString(queryString);
|
||||
if (mAccount.isRemoteSearchFullText()) {
|
||||
imapQuery += "TEXT " + encodedQry;
|
||||
} else {
|
||||
imapQuery += "OR SUBJECT " + encodedQry + " FROM " + encodedQry;
|
||||
}
|
||||
return executeSimpleCommand(imapQuery);
|
||||
}
|
||||
};
|
||||
|
||||
// Execute the search
|
||||
try {
|
||||
open(OpenMode.READ_ONLY);
|
||||
checkOpen();
|
||||
|
||||
//don't pass listener--we don't want to add messages until we've downloaded them
|
||||
return search(searcher, null);
|
||||
} catch (Exception e) {
|
||||
Log.e(K9.LOG_TAG, "Exception caught during remote search", e);
|
||||
throw new MessagingException("Error during search: " + e.toString());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3424,106 +3526,4 @@ public class ImapStore extends Store {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Message> searchRemoteMessages(final String queryString,
|
||||
final String folderName, final Flag[] requiredFlags, final Flag[] forbiddenFlags) throws MessagingException {
|
||||
|
||||
if (!mAccount.allowRemoteSearch()) {
|
||||
throw new MessagingException("Your settings do not allow remote searching of this account");
|
||||
}
|
||||
|
||||
final ImapFolder folder = (ImapFolder) getFolder(folderName);
|
||||
if (folder == null) {
|
||||
throw new MessagingException("Invalid folder specified");
|
||||
}
|
||||
|
||||
try {
|
||||
folder.open(OpenMode.READ_ONLY);
|
||||
folder.checkOpen();
|
||||
|
||||
|
||||
ImapSearcher searcher = new ImapSearcher() {
|
||||
public List<ImapResponse> search() throws IOException, MessagingException {
|
||||
String imapQuery = "UID SEARCH ";
|
||||
if (requiredFlags != null) {
|
||||
for (Flag f : requiredFlags) {
|
||||
switch (f) {
|
||||
case DELETED:
|
||||
imapQuery += "DELETED ";
|
||||
break;
|
||||
|
||||
case SEEN:
|
||||
imapQuery += "SEEN ";
|
||||
break;
|
||||
|
||||
case ANSWERED:
|
||||
imapQuery += "ANSWERED ";
|
||||
break;
|
||||
|
||||
case FLAGGED:
|
||||
imapQuery += "FLAGGED ";
|
||||
break;
|
||||
|
||||
case DRAFT:
|
||||
imapQuery += "DRAFT ";
|
||||
break;
|
||||
|
||||
case RECENT:
|
||||
imapQuery += "RECENT ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (forbiddenFlags != null) {
|
||||
for (Flag f : forbiddenFlags) {
|
||||
switch (f) {
|
||||
case DELETED:
|
||||
imapQuery += "UNDELETED ";
|
||||
break;
|
||||
|
||||
case SEEN:
|
||||
imapQuery += "UNSEEN ";
|
||||
break;
|
||||
|
||||
case ANSWERED:
|
||||
imapQuery += "UNANSWERED ";
|
||||
break;
|
||||
|
||||
case FLAGGED:
|
||||
imapQuery += "UNFLAGGED ";
|
||||
break;
|
||||
|
||||
case DRAFT:
|
||||
imapQuery += "UNDRAFT ";
|
||||
break;
|
||||
|
||||
case RECENT:
|
||||
imapQuery += "UNRECENT ";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
String encodedQry = encodeString(queryString);
|
||||
if (mAccount.isRemoteSearchFullText()) {
|
||||
imapQuery += "TEXT " + encodedQry;
|
||||
} else {
|
||||
imapQuery += "OR SUBJECT " + encodedQry + " FROM " + encodedQry;
|
||||
}
|
||||
return folder.executeSimpleCommand(imapQuery);
|
||||
}
|
||||
};
|
||||
|
||||
//don't pass listener--we don't want to add messages until we've downloaded them
|
||||
return folder.search(searcher, null);
|
||||
|
||||
} catch (Exception e) {
|
||||
Log.e(K9.LOG_TAG, "Exception caught during remote search", e);
|
||||
throw new MessagingException("Error during search: " + e.toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user