From a5166c530a4778e997b493a7f681e406b8ffb69c Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 22 Jan 2019 14:29:45 +0000 Subject: [PATCH] Added search unified inbox on device --- README.md | 2 +- .../java/eu/faircode/email/DaoFolder.java | 8 +++++ .../java/eu/faircode/email/DaoMessage.java | 5 +-- .../eu/faircode/email/FragmentMessages.java | 15 +++++---- .../eu/faircode/email/ViewModelBrowse.java | 31 +++++++++---------- app/src/main/res/values/strings.xml | 1 + 6 files changed, 37 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index cc1db0ff5b..5dcb53ca8b 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ This app starts a foreground service with a low priority status bar notification * Send messages after selected time * Reply templates * Filter rules -* Search on server +* Search on device or server * Keyword management * Encryption/decryption ([OpenPGP](https://www.openpgp.org/)) * Export settings diff --git a/app/src/main/java/eu/faircode/email/DaoFolder.java b/app/src/main/java/eu/faircode/email/DaoFolder.java index 3c6937b7a7..fd76f498bc 100644 --- a/app/src/main/java/eu/faircode/email/DaoFolder.java +++ b/app/src/main/java/eu/faircode/email/DaoFolder.java @@ -49,6 +49,14 @@ public interface DaoFolder { " WHERE account.synchronize AND folder.synchronize AND unified") List getFoldersSynchronizingUnified(); + @Query("SELECT folder.* FROM folder" + + " JOIN account ON account.id = folder.account" + + " WHERE ((:folder IS NULL AND unified) OR (NOT :folder is NULL AND folder.id = :folder))" + + " AND folder.synchronize" + + " AND account.synchronize" + + " AND (NOT :browse OR account.browse)") + List getFolders(Long folder, boolean browse); + @Query("SELECT folder.*, account.name AS accountName, account.color AS accountColor, account.state AS accountState" + ", COUNT(message.id) AS messages" + ", SUM(CASE WHEN message.content = 1 THEN 1 ELSE 0 END) AS content" + diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 420bea4287..37dfe8ce8b 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -63,7 +63,8 @@ public interface DaoMessage { " JOIN folder ON folder.id = message.folder" + " WHERE account.`synchronize`" + " AND (NOT message.ui_hide OR :debug)" + - " AND (:snoozed OR ui_snoozed IS NULL)" + + " AND (:snoozed OR :found OR ui_snoozed IS NULL)" + + " AND (NOT :found OR ui_found = :found)" + " GROUP BY account.id, CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" + " HAVING SUM(unified) > 0" + " ORDER BY" + @@ -74,7 +75,7 @@ public interface DaoMessage { " ELSE 0" + " END DESC, message.received DESC") @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) - DataSource.Factory pagedUnifiedInbox(boolean threading, String sort, boolean snoozed, boolean debug); + DataSource.Factory pagedUnifiedInbox(boolean threading, String sort, boolean snoozed, boolean found, boolean debug); String unseen_folder = "SUM(CASE WHEN message.ui_seen" + " OR (folder.id <> :folder AND folder.type = '" + EntityFolder.ARCHIVE + "')" + diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 733facd10c..2b6b43f3e9 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1515,7 +1515,7 @@ public class FragmentMessages extends FragmentBase { menuSearch.expandActionView(); final SearchView searchView = (SearchView) menuSearch.getActionView(); - searchView.setQueryHint(getString(R.string.title_search_hint)); + searchView.setQueryHint(getString(folder < 0 ? R.string.title_search_device : R.string.title_search_hint)); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { @@ -1573,8 +1573,7 @@ public class FragmentMessages extends FragmentBase { boolean selection = (selectionTracker != null && selectionTracker.hasSelection()); - menu.findItem(R.id.menu_search).setVisible( - folder >= 0 && viewType != AdapterMessage.ViewType.SEARCH); + menu.findItem(R.id.menu_search).setVisible(viewType != AdapterMessage.ViewType.SEARCH); menu.findItem(R.id.menu_folders).setVisible(primary >= 0); menu.findItem(R.id.menu_folders).setIcon(connected ? R.drawable.baseline_folder_24 : R.drawable.baseline_folder_open_24); @@ -1720,7 +1719,7 @@ public class FragmentMessages extends FragmentBase { switch (viewType) { case UNIFIED: builder = new LivePagedListBuilder<>( - db.message().pagedUnifiedInbox(threading, sort, snoozed, debug), LOCAL_PAGE_SIZE); + db.message().pagedUnifiedInbox(threading, sort, snoozed, false, debug), LOCAL_PAGE_SIZE); break; case FOLDER: @@ -1793,8 +1792,12 @@ public class FragmentMessages extends FragmentBase { .setPageSize(LOCAL_PAGE_SIZE) .setPrefetchDistance(REMOTE_PAGE_SIZE) .build(); - builder = new LivePagedListBuilder<>( - db.message().pagedFolder(folder, threading, "time", snoozed, true, false), configSearch); + if (folder < 0) + builder = new LivePagedListBuilder<>( + db.message().pagedUnifiedInbox(threading, "time", snoozed, true, debug), configSearch); + else + builder = new LivePagedListBuilder<>( + db.message().pagedFolder(folder, threading, "time", snoozed, true, debug), configSearch); builder.setBoundaryCallback(searchCallback); break; } diff --git a/app/src/main/java/eu/faircode/email/ViewModelBrowse.java b/app/src/main/java/eu/faircode/email/ViewModelBrowse.java index a8250f7853..c199ca9eef 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelBrowse.java +++ b/app/src/main/java/eu/faircode/email/ViewModelBrowse.java @@ -94,24 +94,22 @@ public class ViewModelBrowse extends ViewModel { return; DB db = DB.getInstance(state.context); - final EntityFolder folder = db.folder().getFolder(state.fid); - if (folder == null) // unified inbox + final List folders = db.folder().getFolders( + state.fid < 0 ? null : state.fid, state.search == null); + Log.i("Search fid=" + (state.fid < 0 ? null : state.fid) + " browse=" + (state.search == null) + " count=" + folders.size()); + if (folders.size() == 0) return; - if (folder.account == null) // outbox - return; - - if (state.search == null) { - EntityAccount account = db.account().getAccount(folder.account); - if (!account.browse) - return; - } if (state.search != null) try { db.beginTransaction(); - if (state.messages == null) - state.messages = db.message().getMessageByFolder(state.fid); + if (state.messages == null) { + state.messages = new ArrayList<>(); + for (EntityFolder folder : folders) + state.messages.addAll(db.message().getMessageByFolder(folder.id)); + Log.i("Messages=" + state.messages.size()); + } int matched = 0; for (int i = state.local; i < state.messages.size() && matched < state.pageSize; i++) { @@ -154,10 +152,11 @@ public class ViewModelBrowse extends ViewModel { db.endTransaction(); } - if (state.imessages == null) { - if (folder.account == null) // outbox - return; + if (folders.size() > 1) + return; + final EntityFolder folder = folders.get(0); + if (state.imessages == null) { EntityAccount account = db.account().getAccount(folder.account); try { @@ -292,7 +291,7 @@ public class ViewModelBrowse extends ViewModel { try { long uid = state.ifolder.getUID(isub[j]); Log.i("Boundary sync uid=" + uid); - EntityMessage message = db.message().getMessageByUid(state.fid, uid); + EntityMessage message = db.message().getMessageByUid(folder.id, uid); if (message == null) { message = ServiceSynchronize.synchronizeMessage(state.context, folder, state.ifolder, (IMAPMessage) isub[j], diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 85ec736799..d8a94a398f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -359,6 +359,7 @@ Search Search on server + Search on device Searching \'%1$s\' Sort on