Loading app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +16 −59 Original line number Diff line number Diff line Loading @@ -60,7 +60,6 @@ import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.FolderClass; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.MessageDownloadState; import com.fsck.k9.mail.MessageRetrievalListener; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.Part; import com.fsck.k9.mail.ServerSettings; Loading Loading @@ -401,56 +400,22 @@ public class MessagingController { /** * Find all messages in any local account which match the query 'query' */ public void searchLocalMessages(final LocalSearch search, final MessagingListener listener) { threadPool.execute(new Runnable() { @Override public void run() { searchLocalMessagesSynchronous(search, listener); } }); } @VisibleForTesting void searchLocalMessagesSynchronous(final LocalSearch search, final MessagingListener listener) { public List<LocalMessage> searchLocalMessages(final LocalSearch search) { List<Account> searchAccounts = getAccountsFromLocalSearch(search, preferences); for (final Account account : searchAccounts) { // Collecting statistics of the search result MessageRetrievalListener<LocalMessage> retrievalListener = new MessageRetrievalListener<LocalMessage>() { @Override public void messageStarted(String message, int number, int ofTotal) { } @Override public void messagesFinished(int number) { } @Override public void messageFinished(LocalMessage message, int number, int ofTotal) { if (!isMessageSuppressed(message)) { List<LocalMessage> messages = new ArrayList<>(); messages.add(message); if (listener != null) { listener.listLocalMessagesAddMessages(account, null, messages); } } } }; // build and do the query in the localstore for (final Account account : searchAccounts) { try { LocalStore localStore = localStoreProvider.getInstance(account); localStore.searchForMessages(retrievalListener, search); List<LocalMessage> localMessages = localStore.searchForMessages(search); messages.addAll(localMessages); } catch (Exception e) { Timber.e(e); } } if (listener != null) { listener.listLocalMessagesFinished(); } return messages; } public Future<?> searchRemoteMessages(String acctUuid, long folderId, String query, Set<Flag> requiredFlags, Loading Loading @@ -1070,7 +1035,7 @@ public class MessagingController { Timber.i("Marking all messages in %s:%s as read", account, folderServerId); // TODO: Make this one database UPDATE operation List<LocalMessage> messages = localFolder.getMessages(null, false); List<LocalMessage> messages = localFolder.getMessages(false); for (Message message : messages) { if (!message.isSet(Flag.SEEN)) { message.setFlag(Flag.SEEN, true); Loading Loading @@ -1539,7 +1504,7 @@ public class MessagingController { long outboxFolderId = localFolder.getDatabaseId(); List<LocalMessage> localMessages = localFolder.getMessages(null); List<LocalMessage> localMessages = localFolder.getMessages(); int progress = 0; int todo = localMessages.size(); for (MessagingListener l : getListeners()) { Loading Loading @@ -2198,7 +2163,7 @@ public class MessagingController { // Remove all messages marked as deleted folder.destroyDeletedMessages(); compact(account, null); compact(account); } public void emptyTrash(final Account account, MessagingListener listener) { Loading Loading @@ -2482,22 +2447,14 @@ public class MessagingController { notificationController.clearFetchingMailNotification(account); } public void compact(final Account account, final MessagingListener ml) { putBackground("compact:" + account, ml, new Runnable() { @Override public void run() { public void compact(Account account) { putBackground("compact:" + account, null, () -> { try { MessageStore messageStore = messageStoreManager.getMessageStore(account); long oldSize = messageStore.getSize(); messageStore.compact(); long newSize = messageStore.getSize(); for (MessagingListener l : getListeners(ml)) { l.accountSizeChanged(account, oldSize, newSize); } } catch (Exception e) { Timber.e(e, "Failed to compact account %s", account); } } }); } Loading app/core/src/main/java/com/fsck/k9/controller/MessagingListener.java +0 −5 Original line number Diff line number Diff line Loading @@ -13,11 +13,6 @@ import com.fsck.k9.mailstore.LocalMessage; public interface MessagingListener { void accountSizeChanged(Account account, long oldSize, long newSize); void listLocalMessagesAddMessages(Account account, String folderServerId, List<LocalMessage> messages); void listLocalMessagesFinished(); void synchronizeMailboxStarted(Account account, long folderId); void synchronizeMailboxHeadersStarted(Account account, String folderServerId); void synchronizeMailboxHeadersProgress(Account account, String folderServerId, int completed, int total); Loading app/core/src/main/java/com/fsck/k9/controller/SimpleMessagingListener.java +0 −13 Original line number Diff line number Diff line Loading @@ -9,22 +9,9 @@ import android.content.Context; import com.fsck.k9.Account; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Part; import com.fsck.k9.mailstore.LocalMessage; public abstract class SimpleMessagingListener implements MessagingListener { @Override public void accountSizeChanged(Account account, long oldSize, long newSize) { } @Override public void listLocalMessagesAddMessages(Account account, String folderServerId, List<LocalMessage> messages) { } @Override public void listLocalMessagesFinished() { } @Override public void synchronizeMailboxStarted(Account account, long folderId) { } Loading app/core/src/main/java/com/fsck/k9/mailstore/LocalFolder.java +5 −6 Original line number Diff line number Diff line Loading @@ -576,17 +576,16 @@ public class LocalFolder { }); } public List<LocalMessage> getMessages(MessageRetrievalListener<LocalMessage> listener) throws MessagingException { return getMessages(listener, true); public List<LocalMessage> getMessages() throws MessagingException { return getMessages(true); } public List<LocalMessage> getMessages(final MessageRetrievalListener<LocalMessage> listener, final boolean includeDeleted) throws MessagingException { public List<LocalMessage> getMessages(final boolean includeDeleted) throws MessagingException { return localStore.getDatabase().execute(false, new DbCallback<List<LocalMessage>>() { @Override public List<LocalMessage> doDbWork(final SQLiteDatabase db) throws MessagingException { open(); return LocalFolder.this.localStore.getMessages(listener, LocalFolder.this, return LocalFolder.this.localStore.getMessages(LocalFolder.this, "SELECT " + LocalStore.GET_MESSAGES_COLS + "FROM messages " + "LEFT JOIN message_parts ON (message_parts.id = messages.message_part_id) " + Loading Loading @@ -898,7 +897,7 @@ public class LocalFolder { public void setFlags(final Set<Flag> flags, boolean value) throws MessagingException { open(); for (LocalMessage message : getMessages(null)) { for (LocalMessage message : getMessages()) { message.setFlags(flags, value); } } Loading app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java +9 −26 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import com.fsck.k9.mail.FetchProfile.Item; import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.FolderClass; import com.fsck.k9.mail.FolderType; import com.fsck.k9.mail.MessageRetrievalListener; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.Multipart; import com.fsck.k9.mail.Part; Loading Loading @@ -359,9 +358,7 @@ public class LocalStore { }); } public List<LocalMessage> searchForMessages(MessageRetrievalListener<LocalMessage> retrievalListener, LocalSearch search) throws MessagingException { public List<LocalMessage> searchForMessages(LocalSearch search) throws MessagingException { StringBuilder query = new StringBuilder(); List<String> queryArgs = new ArrayList<>(); SqlQueryBuilder.buildWhereClause(account, search.getConditions(), query, queryArgs); Loading @@ -382,24 +379,20 @@ public class LocalStore { Timber.d("Query = %s", sqlQuery); return getMessages(retrievalListener, null, sqlQuery, selectionArgs); return getMessages(null, sqlQuery, selectionArgs); } /* * Given a query string, actually do the query for the messages and * call the MessageRetrievalListener for each one */ List<LocalMessage> getMessages( final MessageRetrievalListener<LocalMessage> listener, final LocalFolder folder, final String queryString, final String[] placeHolders ) throws MessagingException { List<LocalMessage> getMessages(LocalFolder folder, String queryString, String[] placeHolders) throws MessagingException { final List<LocalMessage> messages = new ArrayList<>(); final int j = database.execute(false, new DbCallback<Integer>() { database.execute(false, new DbCallback<Void>() { @Override public Integer doDbWork(final SQLiteDatabase db) { public Void doDbWork(final SQLiteDatabase db) { Cursor cursor = null; int i = 0; try { cursor = db.rawQuery(queryString + " LIMIT 10", placeHolders); Loading @@ -408,10 +401,6 @@ public class LocalStore { message.populateFromGetMessageCursor(cursor); messages.add(message); if (listener != null) { listener.messageFinished(message, i, -1); } i++; } cursor.close(); cursor = db.rawQuery(queryString + " LIMIT -1 OFFSET 10", placeHolders); Loading @@ -421,22 +410,16 @@ public class LocalStore { message.populateFromGetMessageCursor(cursor); messages.add(message); if (listener != null) { listener.messageFinished(message, i, -1); } i++; } } catch (Exception e) { Timber.d(e, "Got an exception"); } finally { Utility.closeQuietly(cursor); } return i; return null; } }); if (listener != null) { listener.messagesFinished(j); } return Collections.unmodifiableList(messages); Loading @@ -448,7 +431,7 @@ public class LocalStore { LocalSearch search = new LocalSearch(); search.and(SearchField.THREAD_ID, rootIdString, Attribute.EQUALS); return searchForMessages(null, search); return searchForMessages(search); } public AttachmentInfo getAttachmentInfo(final String attachmentId) throws MessagingException { Loading Loading
app/core/src/main/java/com/fsck/k9/controller/MessagingController.java +16 −59 Original line number Diff line number Diff line Loading @@ -60,7 +60,6 @@ import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.FolderClass; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.MessageDownloadState; import com.fsck.k9.mail.MessageRetrievalListener; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.Part; import com.fsck.k9.mail.ServerSettings; Loading Loading @@ -401,56 +400,22 @@ public class MessagingController { /** * Find all messages in any local account which match the query 'query' */ public void searchLocalMessages(final LocalSearch search, final MessagingListener listener) { threadPool.execute(new Runnable() { @Override public void run() { searchLocalMessagesSynchronous(search, listener); } }); } @VisibleForTesting void searchLocalMessagesSynchronous(final LocalSearch search, final MessagingListener listener) { public List<LocalMessage> searchLocalMessages(final LocalSearch search) { List<Account> searchAccounts = getAccountsFromLocalSearch(search, preferences); for (final Account account : searchAccounts) { // Collecting statistics of the search result MessageRetrievalListener<LocalMessage> retrievalListener = new MessageRetrievalListener<LocalMessage>() { @Override public void messageStarted(String message, int number, int ofTotal) { } @Override public void messagesFinished(int number) { } @Override public void messageFinished(LocalMessage message, int number, int ofTotal) { if (!isMessageSuppressed(message)) { List<LocalMessage> messages = new ArrayList<>(); messages.add(message); if (listener != null) { listener.listLocalMessagesAddMessages(account, null, messages); } } } }; // build and do the query in the localstore for (final Account account : searchAccounts) { try { LocalStore localStore = localStoreProvider.getInstance(account); localStore.searchForMessages(retrievalListener, search); List<LocalMessage> localMessages = localStore.searchForMessages(search); messages.addAll(localMessages); } catch (Exception e) { Timber.e(e); } } if (listener != null) { listener.listLocalMessagesFinished(); } return messages; } public Future<?> searchRemoteMessages(String acctUuid, long folderId, String query, Set<Flag> requiredFlags, Loading Loading @@ -1070,7 +1035,7 @@ public class MessagingController { Timber.i("Marking all messages in %s:%s as read", account, folderServerId); // TODO: Make this one database UPDATE operation List<LocalMessage> messages = localFolder.getMessages(null, false); List<LocalMessage> messages = localFolder.getMessages(false); for (Message message : messages) { if (!message.isSet(Flag.SEEN)) { message.setFlag(Flag.SEEN, true); Loading Loading @@ -1539,7 +1504,7 @@ public class MessagingController { long outboxFolderId = localFolder.getDatabaseId(); List<LocalMessage> localMessages = localFolder.getMessages(null); List<LocalMessage> localMessages = localFolder.getMessages(); int progress = 0; int todo = localMessages.size(); for (MessagingListener l : getListeners()) { Loading Loading @@ -2198,7 +2163,7 @@ public class MessagingController { // Remove all messages marked as deleted folder.destroyDeletedMessages(); compact(account, null); compact(account); } public void emptyTrash(final Account account, MessagingListener listener) { Loading Loading @@ -2482,22 +2447,14 @@ public class MessagingController { notificationController.clearFetchingMailNotification(account); } public void compact(final Account account, final MessagingListener ml) { putBackground("compact:" + account, ml, new Runnable() { @Override public void run() { public void compact(Account account) { putBackground("compact:" + account, null, () -> { try { MessageStore messageStore = messageStoreManager.getMessageStore(account); long oldSize = messageStore.getSize(); messageStore.compact(); long newSize = messageStore.getSize(); for (MessagingListener l : getListeners(ml)) { l.accountSizeChanged(account, oldSize, newSize); } } catch (Exception e) { Timber.e(e, "Failed to compact account %s", account); } } }); } Loading
app/core/src/main/java/com/fsck/k9/controller/MessagingListener.java +0 −5 Original line number Diff line number Diff line Loading @@ -13,11 +13,6 @@ import com.fsck.k9.mailstore.LocalMessage; public interface MessagingListener { void accountSizeChanged(Account account, long oldSize, long newSize); void listLocalMessagesAddMessages(Account account, String folderServerId, List<LocalMessage> messages); void listLocalMessagesFinished(); void synchronizeMailboxStarted(Account account, long folderId); void synchronizeMailboxHeadersStarted(Account account, String folderServerId); void synchronizeMailboxHeadersProgress(Account account, String folderServerId, int completed, int total); Loading
app/core/src/main/java/com/fsck/k9/controller/SimpleMessagingListener.java +0 −13 Original line number Diff line number Diff line Loading @@ -9,22 +9,9 @@ import android.content.Context; import com.fsck.k9.Account; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Part; import com.fsck.k9.mailstore.LocalMessage; public abstract class SimpleMessagingListener implements MessagingListener { @Override public void accountSizeChanged(Account account, long oldSize, long newSize) { } @Override public void listLocalMessagesAddMessages(Account account, String folderServerId, List<LocalMessage> messages) { } @Override public void listLocalMessagesFinished() { } @Override public void synchronizeMailboxStarted(Account account, long folderId) { } Loading
app/core/src/main/java/com/fsck/k9/mailstore/LocalFolder.java +5 −6 Original line number Diff line number Diff line Loading @@ -576,17 +576,16 @@ public class LocalFolder { }); } public List<LocalMessage> getMessages(MessageRetrievalListener<LocalMessage> listener) throws MessagingException { return getMessages(listener, true); public List<LocalMessage> getMessages() throws MessagingException { return getMessages(true); } public List<LocalMessage> getMessages(final MessageRetrievalListener<LocalMessage> listener, final boolean includeDeleted) throws MessagingException { public List<LocalMessage> getMessages(final boolean includeDeleted) throws MessagingException { return localStore.getDatabase().execute(false, new DbCallback<List<LocalMessage>>() { @Override public List<LocalMessage> doDbWork(final SQLiteDatabase db) throws MessagingException { open(); return LocalFolder.this.localStore.getMessages(listener, LocalFolder.this, return LocalFolder.this.localStore.getMessages(LocalFolder.this, "SELECT " + LocalStore.GET_MESSAGES_COLS + "FROM messages " + "LEFT JOIN message_parts ON (message_parts.id = messages.message_part_id) " + Loading Loading @@ -898,7 +897,7 @@ public class LocalFolder { public void setFlags(final Set<Flag> flags, boolean value) throws MessagingException { open(); for (LocalMessage message : getMessages(null)) { for (LocalMessage message : getMessages()) { message.setFlags(flags, value); } } Loading
app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java +9 −26 Original line number Diff line number Diff line Loading @@ -43,7 +43,6 @@ import com.fsck.k9.mail.FetchProfile.Item; import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.FolderClass; import com.fsck.k9.mail.FolderType; import com.fsck.k9.mail.MessageRetrievalListener; import com.fsck.k9.mail.MessagingException; import com.fsck.k9.mail.Multipart; import com.fsck.k9.mail.Part; Loading Loading @@ -359,9 +358,7 @@ public class LocalStore { }); } public List<LocalMessage> searchForMessages(MessageRetrievalListener<LocalMessage> retrievalListener, LocalSearch search) throws MessagingException { public List<LocalMessage> searchForMessages(LocalSearch search) throws MessagingException { StringBuilder query = new StringBuilder(); List<String> queryArgs = new ArrayList<>(); SqlQueryBuilder.buildWhereClause(account, search.getConditions(), query, queryArgs); Loading @@ -382,24 +379,20 @@ public class LocalStore { Timber.d("Query = %s", sqlQuery); return getMessages(retrievalListener, null, sqlQuery, selectionArgs); return getMessages(null, sqlQuery, selectionArgs); } /* * Given a query string, actually do the query for the messages and * call the MessageRetrievalListener for each one */ List<LocalMessage> getMessages( final MessageRetrievalListener<LocalMessage> listener, final LocalFolder folder, final String queryString, final String[] placeHolders ) throws MessagingException { List<LocalMessage> getMessages(LocalFolder folder, String queryString, String[] placeHolders) throws MessagingException { final List<LocalMessage> messages = new ArrayList<>(); final int j = database.execute(false, new DbCallback<Integer>() { database.execute(false, new DbCallback<Void>() { @Override public Integer doDbWork(final SQLiteDatabase db) { public Void doDbWork(final SQLiteDatabase db) { Cursor cursor = null; int i = 0; try { cursor = db.rawQuery(queryString + " LIMIT 10", placeHolders); Loading @@ -408,10 +401,6 @@ public class LocalStore { message.populateFromGetMessageCursor(cursor); messages.add(message); if (listener != null) { listener.messageFinished(message, i, -1); } i++; } cursor.close(); cursor = db.rawQuery(queryString + " LIMIT -1 OFFSET 10", placeHolders); Loading @@ -421,22 +410,16 @@ public class LocalStore { message.populateFromGetMessageCursor(cursor); messages.add(message); if (listener != null) { listener.messageFinished(message, i, -1); } i++; } } catch (Exception e) { Timber.d(e, "Got an exception"); } finally { Utility.closeQuietly(cursor); } return i; return null; } }); if (listener != null) { listener.messagesFinished(j); } return Collections.unmodifiableList(messages); Loading @@ -448,7 +431,7 @@ public class LocalStore { LocalSearch search = new LocalSearch(); search.and(SearchField.THREAD_ID, rootIdString, Attribute.EQUALS); return searchForMessages(null, search); return searchForMessages(search); } public AttachmentInfo getAttachmentInfo(final String attachmentId) throws MessagingException { Loading