Low priority paging

This commit is contained in:
M66B 2018-12-24 13:20:59 +00:00
parent 5930e5e561
commit c16fa09dab
1 changed files with 86 additions and 81 deletions

View File

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