diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index e0dbafe00d..704d96cc7b 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -1498,6 +1498,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB args.putLong("folder", intent.getLongExtra("folder", -1)); args.putString("thread", intent.getStringExtra("thread")); args.putLong("id", intent.getLongExtra("id", -1)); + args.putInt("lpos", intent.getIntExtra("lpos", -1)); args.putBoolean("filter_archive", intent.getBooleanExtra("filter_archive", true)); args.putBoolean("found", found); args.putBoolean("pinned", intent.getBooleanExtra("pinned", false)); diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 3bba326243..dfecfe60c2 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -3307,6 +3307,7 @@ public class AdapterMessage extends RecyclerView.Adapter>() { @Override protected Pair onExecute(Context context, Bundle args) { long id = args.getLong("id"); + int lpos = args.getInt("lpos"); PagedList plist = model.list.getValue(); if (plist == null) @@ -317,38 +320,55 @@ public class ViewModelMessages extends ViewModel { LimitOffsetDataSource ds = (LimitOffsetDataSource) plist.getDataSource(); int count = ds.countItems(); + + if (lpos >= 0) { + int from = Math.max(0, lpos - 10); + int load = Math.min(20, count - from); + Log.i("Observe previous/next load lpos=" + lpos + + " range=" + from + "/#" + load); + List messages = ds.loadRange(from, load); + for (int j = 0; j < messages.size(); j++) + if (messages.get(j).id == id) + return getPair(plist, ds, count, from + j); + } + for (int i = 0; i < count; i += 100) { - Log.i("Observe previous/next load range=" + i + "/" + count); + Log.i("Observe previous/next load" + + " range=" + i + "/#" + count); List messages = ds.loadRange(i, Math.min(100, count - i)); for (int j = 0; j < messages.size(); j++) - if (messages.get(j).id == id) { - int pos = i + j; - - if (pos < plist.size()) - plist.loadAround(pos); - - List lprev = null; - if (pos - 1 >= 0) - lprev = ds.loadRange(pos - 1, 1); - - List lnext = null; - if (pos + 1 < count) - lnext = ds.loadRange(pos + 1, 1); - - TupleMessageEx prev = (lprev != null && lprev.size() > 0 ? lprev.get(0) : null); - TupleMessageEx next = (lnext != null && lnext.size() > 0 ? lnext.get(0) : null); - - Pair result = new Pair<>( - prev == null ? null : prev.id, - next == null ? null : next.id); - Log.i("Observe previous/next fallback=" + result); - return result; - } + if (messages.get(j).id == id) + return getPair(plist, ds, count, i + j); } return null; } + private Pair getPair( + PagedList plist, + LimitOffsetDataSource ds, + int count, int pos) { + if (pos < plist.size()) + plist.loadAround(pos); + + List lprev = null; + if (pos - 1 >= 0) + lprev = ds.loadRange(pos - 1, 1); + + List lnext = null; + if (pos + 1 < count) + lnext = ds.loadRange(pos + 1, 1); + + TupleMessageEx prev = (lprev != null && lprev.size() > 0 ? lprev.get(0) : null); + TupleMessageEx next = (lnext != null && lnext.size() > 0 ? lnext.get(0) : null); + + Pair result = new Pair<>( + prev == null ? null : prev.id, + next == null ? null : next.id); + Log.i("Observe previous/next fallback=" + result); + return result; + } + @Override protected void onExecuted(Bundle args, Pair data) { intf.onPrevious(data != null && data.first != null, data == null ? null : data.first);