diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index a49330cb51..cda112d37e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -50,6 +50,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -125,6 +127,8 @@ public class FragmentMessages extends FragmentEx { private BoundaryCallbackMessages searchCallback = null; + private ExecutorService executor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory); + private static final int LOCAL_PAGE_SIZE = 100; private static final int REMOTE_PAGE_SIZE = 10; private static final int UNDO_TIMEOUT = 5000; // milliseconds @@ -1622,100 +1626,101 @@ public class FragmentMessages extends FragmentEx { model.set(getContext(), folder, search, REMOTE_PAGE_SIZE); // Observe folder/messages/search - if (TextUtils.isEmpty(search)) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - String sort = prefs.getString("sort", "time"); - boolean debug = prefs.getBoolean("debug", false); - - // Sort changed - if (messages != null) - messages.removeObservers(getViewLifecycleOwner()); - - switch (viewType) { - case UNIFIED: - messages = new LivePagedListBuilder<>( - db.message().pagedUnifiedInbox(threading, sort, debug), LOCAL_PAGE_SIZE).build(); - break; - - case FOLDER: - if (searchCallback == null) - searchCallback = new BoundaryCallbackMessages(this, model, - new BoundaryCallbackMessages.IBoundaryCallbackMessages() { - @Override - public void onLoading() { - pbWait.setVisibility(View.VISIBLE); - } + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + String sort = prefs.getString("sort", "time"); + boolean debug = prefs.getBoolean("debug", false); - @Override - public void onLoaded() { - pbWait.setVisibility(View.GONE); - } + // Sort changed + if (messages != null) + messages.removeObservers(getViewLifecycleOwner()); - @Override - public void onError(Throwable ex) { - if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) - new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) - .setMessage(Helper.formatThrowable(ex)) - .setPositiveButton(android.R.string.cancel, null) - .create() - .show(); - } - }); - - PagedList.Config config = new PagedList.Config.Builder() - .setPageSize(LOCAL_PAGE_SIZE) - .setPrefetchDistance(REMOTE_PAGE_SIZE) - .build(); - LivePagedListBuilder builder = new LivePagedListBuilder<>( - db.message().pagedFolder(folder, threading, sort, false, debug), config); - builder.setBoundaryCallback(searchCallback); - messages = builder.build(); - - break; - - case THREAD: - messages = new LivePagedListBuilder<>( - db.message().pagedThread(account, thread, threading ? null : id, debug), LOCAL_PAGE_SIZE).build(); - break; - } - } else { - if (searchCallback == null) - searchCallback = new BoundaryCallbackMessages(this, model, - new BoundaryCallbackMessages.IBoundaryCallbackMessages() { - @Override - public void onLoading() { - tvNoEmail.setVisibility(View.GONE); - pbWait.setVisibility(View.VISIBLE); - } + LivePagedListBuilder builder = null; + switch (viewType) { + case UNIFIED: + builder = new LivePagedListBuilder<>( + db.message().pagedUnifiedInbox(threading, sort, debug), LOCAL_PAGE_SIZE); + break; - @Override - public void onLoaded() { - pbWait.setVisibility(View.GONE); - if (messages.getValue() == null || messages.getValue().size() == 0) - tvNoEmail.setVisibility(View.VISIBLE); - } + case FOLDER: + if (searchCallback == null) + searchCallback = new BoundaryCallbackMessages(this, model, + new BoundaryCallbackMessages.IBoundaryCallbackMessages() { + @Override + public void onLoading() { + pbWait.setVisibility(View.VISIBLE); + } - @Override - public void onError(Throwable ex) { - if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) - new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) - .setMessage(Helper.formatThrowable(ex)) - .setPositiveButton(android.R.string.cancel, null) - .create() - .show(); - } - }); + @Override + public void onLoaded() { + pbWait.setVisibility(View.GONE); + } - PagedList.Config config = new PagedList.Config.Builder() - .setPageSize(LOCAL_PAGE_SIZE) - .setPrefetchDistance(REMOTE_PAGE_SIZE) - .build(); - LivePagedListBuilder builder = new LivePagedListBuilder<>( - db.message().pagedFolder(folder, threading, "time", true, false), config); - builder.setBoundaryCallback(searchCallback); - messages = builder.build(); + @Override + public void onError(Throwable ex) { + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) + new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) + .setMessage(Helper.formatThrowable(ex)) + .setPositiveButton(android.R.string.cancel, null) + .create() + .show(); + } + }); + + PagedList.Config configFolder = new PagedList.Config.Builder() + .setPageSize(LOCAL_PAGE_SIZE) + .setPrefetchDistance(REMOTE_PAGE_SIZE) + .build(); + builder = new LivePagedListBuilder<>( + db.message().pagedFolder(folder, threading, sort, false, debug), configFolder); + builder.setBoundaryCallback(searchCallback); + break; + + case THREAD: + builder = new LivePagedListBuilder<>( + db.message().pagedThread(account, thread, threading ? null : id, debug), LOCAL_PAGE_SIZE); + break; + + case SEARCH: + if (searchCallback == null) + searchCallback = new BoundaryCallbackMessages(this, model, + new BoundaryCallbackMessages.IBoundaryCallbackMessages() { + @Override + public void onLoading() { + tvNoEmail.setVisibility(View.GONE); + pbWait.setVisibility(View.VISIBLE); + } + + @Override + public void onLoaded() { + pbWait.setVisibility(View.GONE); + if (messages.getValue() == null || messages.getValue().size() == 0) + tvNoEmail.setVisibility(View.VISIBLE); + } + + @Override + public void onError(Throwable ex) { + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) + new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) + .setMessage(Helper.formatThrowable(ex)) + .setPositiveButton(android.R.string.cancel, null) + .create() + .show(); + } + }); + + PagedList.Config configSearch = new PagedList.Config.Builder() + .setPageSize(LOCAL_PAGE_SIZE) + .setPrefetchDistance(REMOTE_PAGE_SIZE) + .build(); + builder = new LivePagedListBuilder<>( + db.message().pagedFolder(folder, threading, "time", true, false), configSearch); + builder.setBoundaryCallback(searchCallback); + break; } + builder.setFetchExecutor(executor); + + messages = builder.build(); messages.observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(@Nullable PagedList messages) {