From 1ed3bdd9b5d92c2ac7fb2bab21d9f3dda2763b77 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 4 May 2020 10:23:10 +0200 Subject: [PATCH] Simplified search --- .../email/BoundaryCallbackMessages.java | 90 +++++++++---------- .../faircode/email/FragmentDialogSearch.java | 2 +- 2 files changed, 43 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index 3036d50591..7eb7a8b7ba 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -355,12 +355,14 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback msgnums = new ArrayList<>(); - for (Response response : responses) - if (((IMAPResponse) response).keyEquals("SEARCH")) { - int msgnum; - while ((msgnum = response.readNumber()) != -1) - msgnums.add(msgnum); - } - Message[] imessages = new Message[msgnums.size()]; - for (int i = 0; i < msgnums.size(); i++) - imessages[i] = state.ifolder.getMessage(msgnums.get(i)); - - return imessages; - } catch (Throwable ex) { - throw new ProtocolException("Search", ex); - } + if (protocol.supportsUtf8()) + try { + SearchTerm terms = criteria.getTerms( + true, + state.ifolder.getPermanentFlags(), + browsable.keywords); + + SearchSequence ss = new SearchSequence(protocol); + Argument args = ss.generateSequence(terms, StandardCharsets.UTF_8.name()); + args.writeAtom("ALL"); + + Response[] responses = protocol.command("SEARCH", args); + if (responses.length == 0) + throw new ProtocolException("No response"); + if (!responses[responses.length - 1].isOK()) + throw new ProtocolException(responses[responses.length - 1]); + + List msgnums = new ArrayList<>(); + for (Response response : responses) + if (((IMAPResponse) response).keyEquals("SEARCH")) { + int msgnum; + while ((msgnum = response.readNumber()) != -1) + msgnums.add(msgnum); } - }); - } catch (MessagingException ex) { - Log.w(ex); - } + Message[] imessages = new Message[msgnums.size()]; + for (int i = 0; i < msgnums.size(); i++) + imessages[i] = state.ifolder.getMessage(msgnums.get(i)); + + return imessages; + } catch (Throwable ex) { + ProtocolException pex = new ProtocolException( + "Search unicode " + account.host + " " + criteria, ex); + Log.e(pex); + // Fallback to ASCII search + } SearchTerm terms = criteria.getTerms( false, @@ -607,7 +601,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback