From 8e2c629043c9f1a5652f8c1a536983c534d12a82 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 30 Jan 2019 12:51:50 +0000 Subject: [PATCH] Workaround no next on deleting current message --- .../eu/faircode/email/FragmentMessages.java | 20 ++++++++ .../eu/faircode/email/ViewModelMessages.java | 48 +++++++++++++------ 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index e963f8c09d..d46cbe9e90 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -129,6 +129,7 @@ public class FragmentMessages extends FragmentBase { private AdapterMessage.ViewType viewType; private SelectionTracker selectionTracker = null; + private Long last_next = null; private int autoCloseCount = 0; private boolean autoExpand = true; private Map> values = new HashMap<>(); @@ -291,6 +292,8 @@ public class FragmentMessages extends FragmentBase { @Override public void onNext(boolean exists, Long id) { + if (id != null) + last_next = id; bottom_navigation.getMenu().findItem(R.id.action_next).setIntent(new Intent().putExtra("id", id)); bottom_navigation.getMenu().findItem(R.id.action_next).setEnabled(id != null); } @@ -2080,8 +2083,16 @@ public class FragmentMessages extends FragmentBase { if (autoclose) finish(); else if (autonext) { + if (last_next != null) { + Log.i("Navigating to last next=" + last_next); + navigate(last_next); + return; + } + ViewModelMessages model = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class); model.observePrevNext(getViewLifecycleOwner(), thread, new ViewModelMessages.IPrevNext() { + private boolean once = false; + @Override public void onPrevious(boolean exists, Long id) { // Do nothing @@ -2089,6 +2100,10 @@ public class FragmentMessages extends FragmentBase { @Override public void onNext(boolean exists, Long id) { + if (once) + return; + once = true; + if (id != null) navigate(id); if (!exists) @@ -2110,6 +2125,11 @@ public class FragmentMessages extends FragmentBase { @Override protected void onExecuted(Bundle args, EntityMessage message) { + if (message == null) { + finish(); + return; + } + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); lbm.sendBroadcast( new Intent(ActivityView.ACTION_VIEW_THREAD) diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index abe4096119..0203ec2153 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -77,42 +77,62 @@ public class ViewModelMessages extends ViewModel { void observePrevNext(LifecycleOwner owner, final String thread, final IPrevNext intf) { LiveData> list = messages.get(false); - if (list == null) + if (list == null) { + Log.w("Observe previous/next without list"); return; + } + Log.i("Observe previous/next thread=" + thread); list.observe(owner, new Observer>() { @Override - public void onChanged(PagedList list) { - boolean load = false; - for (int pos = 0; pos < list.size(); pos++) { - TupleMessageEx item = list.get(pos); + public void onChanged(PagedList messages) { + Log.i("Observe previous/next thread=" + thread + " messages=" + messages.size()); + + for (int pos = 0; pos < messages.size(); pos++) { + TupleMessageEx item = messages.get(pos); if (item != null && thread.equals(item.thread)) { + boolean load = false; + if (pos - 1 >= 0) { - TupleMessageEx next = list.get(pos - 1); + TupleMessageEx next = messages.get(pos - 1); if (next == null) load = true; - intf.onNext(true, next == null ? null : next.id); + reportNext(intf, true, next == null ? null : next.id); } else - intf.onNext(false, null); + reportNext(intf, false, null); - if (pos + 1 < list.size()) { - TupleMessageEx prev = list.get(pos + 1); + if (pos + 1 < messages.size()) { + TupleMessageEx prev = messages.get(pos + 1); if (prev == null) load = true; - intf.onPrevious(true, prev == null ? null : prev.id); + reportPrevious(intf, true, prev == null ? null : prev.id); } else - intf.onPrevious(false, null); + reportPrevious(intf, false, null); if (load) - list.loadAround(pos); + messages.loadAround(pos); - break; + return; } } + + Log.w("Observe previous/next gone thread=" + thread); + reportNext(intf, false, null); + reportPrevious(intf, false, null); } }); } + private void reportPrevious(IPrevNext intf, boolean exists, Long id) { + Log.i("Previous exists=" + exists + " id=" + id); + intf.onPrevious(exists, id); + } + + private void reportNext(IPrevNext intf, boolean exists, Long id) { + Log.i("Next exists=" + exists + " id=" + id); + intf.onNext(exists, id); + } + interface IPrevNext { void onPrevious(boolean exists, Long id);