Added search unified inbox on device

pull/147/head
M66B 7 years ago
parent 3eb2798a17
commit a5166c530a

@ -42,7 +42,7 @@ This app starts a foreground service with a low priority status bar notification
* Send messages after selected time * Send messages after selected time
* Reply templates * Reply templates
* Filter rules * Filter rules
* Search on server * Search on device or server
* Keyword management * Keyword management
* Encryption/decryption ([OpenPGP](https://www.openpgp.org/)) * Encryption/decryption ([OpenPGP](https://www.openpgp.org/))
* Export settings * Export settings

@ -49,6 +49,14 @@ public interface DaoFolder {
" WHERE account.synchronize AND folder.synchronize AND unified") " WHERE account.synchronize AND folder.synchronize AND unified")
List<EntityFolder> getFoldersSynchronizingUnified(); List<EntityFolder> 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<EntityFolder> getFolders(Long folder, boolean browse);
@Query("SELECT folder.*, account.name AS accountName, account.color AS accountColor, account.state AS accountState" + @Query("SELECT folder.*, account.name AS accountName, account.color AS accountColor, account.state AS accountState" +
", COUNT(message.id) AS messages" + ", COUNT(message.id) AS messages" +
", SUM(CASE WHEN message.content = 1 THEN 1 ELSE 0 END) AS content" + ", SUM(CASE WHEN message.content = 1 THEN 1 ELSE 0 END) AS content" +

@ -63,7 +63,8 @@ public interface DaoMessage {
" JOIN folder ON folder.id = message.folder" + " JOIN folder ON folder.id = message.folder" +
" WHERE account.`synchronize`" + " WHERE account.`synchronize`" +
" AND (NOT message.ui_hide OR :debug)" + " 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" + " GROUP BY account.id, CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" +
" HAVING SUM(unified) > 0" + " HAVING SUM(unified) > 0" +
" ORDER BY" + " ORDER BY" +
@ -74,7 +75,7 @@ public interface DaoMessage {
" ELSE 0" + " ELSE 0" +
" END DESC, message.received DESC") " END DESC, message.received DESC")
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
DataSource.Factory<Integer, TupleMessageEx> pagedUnifiedInbox(boolean threading, String sort, boolean snoozed, boolean debug); DataSource.Factory<Integer, TupleMessageEx> pagedUnifiedInbox(boolean threading, String sort, boolean snoozed, boolean found, boolean debug);
String unseen_folder = "SUM(CASE WHEN message.ui_seen" + String unseen_folder = "SUM(CASE WHEN message.ui_seen" +
" OR (folder.id <> :folder AND folder.type = '" + EntityFolder.ARCHIVE + "')" + " OR (folder.id <> :folder AND folder.type = '" + EntityFolder.ARCHIVE + "')" +

@ -1515,7 +1515,7 @@ public class FragmentMessages extends FragmentBase {
menuSearch.expandActionView(); menuSearch.expandActionView();
final SearchView searchView = (SearchView) menuSearch.getActionView(); 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() { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override @Override
public boolean onQueryTextSubmit(String query) { public boolean onQueryTextSubmit(String query) {
@ -1573,8 +1573,7 @@ public class FragmentMessages extends FragmentBase {
boolean selection = (selectionTracker != null && selectionTracker.hasSelection()); boolean selection = (selectionTracker != null && selectionTracker.hasSelection());
menu.findItem(R.id.menu_search).setVisible( menu.findItem(R.id.menu_search).setVisible(viewType != AdapterMessage.ViewType.SEARCH);
folder >= 0 && viewType != AdapterMessage.ViewType.SEARCH);
menu.findItem(R.id.menu_folders).setVisible(primary >= 0); 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); 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) { switch (viewType) {
case UNIFIED: case UNIFIED:
builder = new LivePagedListBuilder<>( 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; break;
case FOLDER: case FOLDER:
@ -1793,8 +1792,12 @@ public class FragmentMessages extends FragmentBase {
.setPageSize(LOCAL_PAGE_SIZE) .setPageSize(LOCAL_PAGE_SIZE)
.setPrefetchDistance(REMOTE_PAGE_SIZE) .setPrefetchDistance(REMOTE_PAGE_SIZE)
.build(); .build();
builder = new LivePagedListBuilder<>( if (folder < 0)
db.message().pagedFolder(folder, threading, "time", snoozed, true, false), configSearch); 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); builder.setBoundaryCallback(searchCallback);
break; break;
} }

@ -94,24 +94,22 @@ public class ViewModelBrowse extends ViewModel {
return; return;
DB db = DB.getInstance(state.context); DB db = DB.getInstance(state.context);
final EntityFolder folder = db.folder().getFolder(state.fid); final List<EntityFolder> folders = db.folder().getFolders(
if (folder == null) // unified inbox 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; 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) if (state.search != null)
try { try {
db.beginTransaction(); db.beginTransaction();
if (state.messages == null) if (state.messages == null) {
state.messages = db.message().getMessageByFolder(state.fid); 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; int matched = 0;
for (int i = state.local; i < state.messages.size() && matched < state.pageSize; i++) { for (int i = state.local; i < state.messages.size() && matched < state.pageSize; i++) {
@ -154,10 +152,11 @@ public class ViewModelBrowse extends ViewModel {
db.endTransaction(); db.endTransaction();
} }
if (state.imessages == null) { if (folders.size() > 1)
if (folder.account == null) // outbox return;
return;
final EntityFolder folder = folders.get(0);
if (state.imessages == null) {
EntityAccount account = db.account().getAccount(folder.account); EntityAccount account = db.account().getAccount(folder.account);
try { try {
@ -292,7 +291,7 @@ public class ViewModelBrowse extends ViewModel {
try { try {
long uid = state.ifolder.getUID(isub[j]); long uid = state.ifolder.getUID(isub[j]);
Log.i("Boundary sync uid=" + uid); 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) { if (message == null) {
message = ServiceSynchronize.synchronizeMessage(state.context, message = ServiceSynchronize.synchronizeMessage(state.context,
folder, state.ifolder, (IMAPMessage) isub[j], folder, state.ifolder, (IMAPMessage) isub[j],

@ -359,6 +359,7 @@
<string name="title_search">Search</string> <string name="title_search">Search</string>
<string name="title_search_hint">Search on server</string> <string name="title_search_hint">Search on server</string>
<string name="title_search_device">Search on device</string>
<string name="title_searching">Searching \'%1$s\'</string> <string name="title_searching">Searching \'%1$s\'</string>
<string name="title_sort_on">Sort on</string> <string name="title_sort_on">Sort on</string>

Loading…
Cancel
Save