diff --git a/app/src/main/java/eu/faircode/email/AdapterRule.java b/app/src/main/java/eu/faircode/email/AdapterRule.java index 9fa8f19f87..e37b56c9d0 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRule.java +++ b/app/src/main/java/eu/faircode/email/AdapterRule.java @@ -263,7 +263,8 @@ public class AdapterRule extends RecyclerView.Adapter { return 0; int applied = 0; - List ids = db.message().getMessageIdsByFolder(rule.folder); + List ids = + db.message().getMessageIdsByFolder(rule.folder, null, null, null); for (long mid : ids) try { db.beginTransaction(); diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index e93e2abe65..82b51f6d61 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -35,6 +35,7 @@ import com.sun.mail.imap.IMAPMessage; import com.sun.mail.imap.protocol.IMAPProtocol; import com.sun.mail.imap.protocol.IMAPResponse; +import java.io.File; import java.io.IOException; import java.text.Normalizer; import java.util.ArrayList; @@ -46,7 +47,6 @@ import java.util.Locale; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.mail.Address; import javax.mail.FetchProfile; import javax.mail.Flags; import javax.mail.Folder; @@ -55,7 +55,6 @@ import javax.mail.Message; import javax.mail.MessageRemovedException; import javax.mail.MessagingException; import javax.mail.UIDFolder; -import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.search.AndTerm; import javax.mail.search.BodyTerm; @@ -165,74 +164,60 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback addresses = new ArrayList<>(); - if (message.from != null) - addresses.addAll(Arrays.asList(message.from)); - if (message.to != null) - addresses.addAll(Arrays.asList(message.to)); - if (message.cc != null) - addresses.addAll(Arrays.asList(message.cc)); - - for (Address address : addresses) { - String email = ((InternetAddress) address).getAddress(); - String name = ((InternetAddress) address).getPersonal(); - if (email != null && email.toLowerCase(Locale.ROOT).contains(find) || - name != null && name.toLowerCase(Locale.ROOT).contains(find)) - match = true; - } - - if (!match && message.subject != null) - match = message.subject.toLowerCase(Locale.ROOT).contains(find); - - if (!match && message.keywords != null && message.keywords.length > 0) - for (String keyword : message.keywords) - if (keyword.toLowerCase(Locale.ROOT).contains(find)) { - match = true; - break; - } - - if (!match && message.content) { - try { - String body = Helper.readText(message.getFile(context)); - match = body.toLowerCase(Locale.ROOT).contains(find); - } catch (IOException ex) { - Log.e(ex); + message = db.message().match(id, find); + if (message == null) + try { + File file = EntityMessage.getFile(context, id); + if (file.exists()) { + String body = Helper.readText(file); + if (body.toLowerCase(Locale.ROOT).contains(find)) + message = db.message().getMessage(id); } + } catch (IOException ex) { + Log.e(ex); } - } } - if (match) { + if (message != null) { found++; db.message().setMessageFound(message.account, message.thread); } diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 17f361319f..f54cab699f 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -215,8 +215,14 @@ public interface DaoMessage { " FROM message" + " WHERE (:folder IS NULL OR folder = :folder)" + " AND NOT ui_hide" + + " AND (:seen IS NULL OR message.ui_seen = :seen)" + + " AND (:flagged IS NULL OR message.ui_flagged = :flagged)" + + " AND CASE :snoozed" + + " WHEN 0 THEN message.ui_snoozed IS NULL" + + " WHEN 1 THEN message.ui_snoozed IS NOT NULL" + + " ELSE 1 END" + // NULL: true " ORDER BY message.received DESC") - List getMessageIdsByFolder(Long folder); + List getMessageIdsByFolder(Long folder, Boolean seen, Boolean flagged, Boolean snoozed); @Query("SELECT id" + " FROM message" + @@ -363,6 +369,16 @@ public interface DaoMessage { " WHERE folder = :folder") Long getMessageOldest(long folder); + @Query("SELECT * FROM message" + + " WHERE id = :id" + + " AND (`from` LIKE :find COLLATE NOCASE" + + " OR `to` LIKE :find COLLATE NOCASE" + + " OR `cc` LIKE :find COLLATE NOCASE" + + " OR `subject` LIKE :find COLLATE NOCASE" + + " OR `keywords` LIKE :find COLLATE NOCASE" + + " OR `preview` LIKE :find COLLATE NOCASE)") + EntityMessage match(long id, String find); + @Insert long insertMessage(EntityMessage message); diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 1c73dac0d8..315028ac47 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -1076,7 +1076,8 @@ public class FragmentRule extends FragmentBase { int applied = 0; DB db = DB.getInstance(context); - List ids = db.message().getMessageIdsByFolder(rule.folder); + List ids = + db.message().getMessageIdsByFolder(rule.folder, null, null, null); for (long mid : ids) try { db.beginTransaction(); @@ -1121,7 +1122,8 @@ public class FragmentRule extends FragmentBase { List matching = new ArrayList<>(); DB db = DB.getInstance(context); - List ids = db.message().getMessageIdsByFolder(rule.folder); + List ids = + db.message().getMessageIdsByFolder(rule.folder, null, null, null); for (long id : ids) { EntityMessage message = db.message().getMessage(id); diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index 35dd87855e..b040082440 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -54,6 +54,7 @@ public class ViewModelMessages extends ViewModel { private static final int LOCAL_PAGE_SIZE = 100; private static final int REMOTE_PAGE_SIZE = 10; + private static final int SEARCH_PAGE_SIZE = 1; private static final int LOW_MEM_MB = 32; Model getModel( @@ -77,10 +78,13 @@ public class ViewModelMessages extends ViewModel { DB db = DB.getInstance(context); BoundaryCallbackMessages boundary = null; - if (viewType == AdapterMessage.ViewType.FOLDER || viewType == AdapterMessage.ViewType.SEARCH) + if (viewType == AdapterMessage.ViewType.FOLDER) boundary = new BoundaryCallbackMessages(context, - args.folder, args.server || viewType == AdapterMessage.ViewType.FOLDER, - args.query, REMOTE_PAGE_SIZE); + args.folder, true, args.query, REMOTE_PAGE_SIZE); + else if (viewType == AdapterMessage.ViewType.SEARCH) + boundary = new BoundaryCallbackMessages(context, + args.folder, args.server, args.query, + args.server ? REMOTE_PAGE_SIZE : SEARCH_PAGE_SIZE); LivePagedListBuilder builder = null; switch (viewType) {