From eca46c49ba5253f5d7459d121f70154e029bb2fc Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 3 May 2020 22:22:55 +0200 Subject: [PATCH] Fallback to ASCII search --- .../email/BoundaryCallbackMessages.java | 136 ++++++++++-------- 1 file changed, 78 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index 4d4ce648c6..7852279125 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -386,67 +386,28 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback 0) - term = new OrTerm(or.toArray(new SearchTerm[0])); - - if (and.size() > 0) - if (term == null) - term = new AndTerm(and.toArray(new SearchTerm[0])); - else - term = new AndTerm(term, new AndTerm(and.toArray(new SearchTerm[0]))); - - if (term == null) + SearchTerm terms = criteria.getTerms( + utf8, + state.ifolder.getPermanentFlags(), + browsable.keywords); + if (terms == null) return new Message[0]; - return state.ifolder.search(term); + try { + return state.ifolder.search(terms); + } catch (MessagingException ex) { + if (utf8) { + Log.w(ex); + terms = criteria.getTerms( + false, + state.ifolder.getPermanentFlags(), + browsable.keywords); + return state.ifolder.search(terms); + } else + throw ex; + } } } catch (MessagingException ex) { ProtocolException pex = new ProtocolException( @@ -656,6 +617,65 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback or = new ArrayList<>(); + List and = new ArrayList<>(); + if (query != null) { + String search = query; + + if (!utf8) { + search = search.replace("ß", "ss"); // Eszett + search = Normalizer.normalize(search, Normalizer.Form.NFKD) + .replaceAll("[^\\p{ASCII}]", ""); + } + + // Yahoo! does not support keyword search, but uses the flags $Forwarded $Junk $NotJunk + boolean hasKeywords = false; + for (String keyword : keywords) + if (!keyword.startsWith("$")) { + hasKeywords = true; + break; + } + + if (in_senders) + or.add(new FromStringTerm(search)); + if (in_receipients) { + or.add(new RecipientStringTerm(Message.RecipientType.TO, search)); + or.add(new RecipientStringTerm(Message.RecipientType.CC, search)); + or.add(new RecipientStringTerm(Message.RecipientType.BCC, search)); + } + if (in_subject) + or.add(new SubjectTerm(search)); + if (in_keywords && hasKeywords) + or.add(new FlagTerm(new Flags(MessageHelper.sanitizeKeyword(search)), true)); + if (in_message) + or.add(new BodyTerm(search)); + } + + if (with_unseen && flags.contains(Flags.Flag.SEEN)) + and.add(new FlagTerm(new Flags(Flags.Flag.SEEN), false)); + if (with_flagged && flags.contains(Flags.Flag.FLAGGED)) + and.add(new FlagTerm(new Flags(Flags.Flag.FLAGGED), true)); + + if (after != null) + and.add(new ReceivedDateTerm(ComparisonTerm.GT, new Date(after))); + if (before != null) + and.add(new ReceivedDateTerm(ComparisonTerm.LT, new Date(before))); + + SearchTerm term = null; + + if (or.size() > 0) + term = new OrTerm(or.toArray(new SearchTerm[0])); + + if (and.size() > 0) + if (term == null) + term = new AndTerm(and.toArray(new SearchTerm[0])); + else + term = new AndTerm(term, new AndTerm(and.toArray(new SearchTerm[0]))); + + return term; + } + String getTitle(Context context) { List flags = new ArrayList<>(); if (with_unseen)