Added search unified inbox on device

pull/147/head
M66B 6 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
* Reply templates
* Filter rules
* Search on server
* Search on device or server
* Keyword management
* Encryption/decryption ([OpenPGP](https://www.openpgp.org/))
* Export settings

@ -49,6 +49,14 @@ public interface DaoFolder {
" WHERE account.synchronize AND folder.synchronize AND unified")
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" +
", COUNT(message.id) AS messages" +
", 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" +
" 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<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" +
" OR (folder.id <> :folder AND folder.type = '" + EntityFolder.ARCHIVE + "')" +

@ -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;
}

@ -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<EntityFolder> 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],

@ -359,6 +359,7 @@
<string name="title_search">Search</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_sort_on">Sort on</string>

Loading…
Cancel
Save