diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 1d1179cd9a..7c736334e3 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -70,7 +70,6 @@ import androidx.constraintlayout.widget.Group; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.Lifecycle; -import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -452,11 +451,10 @@ public class FragmentMessages extends FragmentEx { FragmentActivity activity = getActivity(); if (activity != null) { ViewModelMessages modelMessages = ViewModelProviders.of(activity).get(ViewModelMessages.class); - LifecycleOwner owner = (viewType == AdapterMessage.ViewType.THREAD ? getViewLifecycleOwner() : activity); if (selectionTracker.hasSelection()) - modelMessages.removeObservers(viewType, owner); + modelMessages.removeObservers(viewType, getViewLifecycleOwner()); else - modelMessages.observe(viewType, owner, observer); + modelMessages.observe(viewType, getViewLifecycleOwner(), observer); } if (selectionTracker.hasSelection()) { @@ -1758,8 +1756,7 @@ public class FragmentMessages extends FragmentEx { // Sort changed final ViewModelMessages modelMessages = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class); - LifecycleOwner owner = (viewType == AdapterMessage.ViewType.THREAD ? getViewLifecycleOwner() : getActivity()); - modelMessages.removeObservers(viewType, owner); + modelMessages.removeObservers(viewType, getViewLifecycleOwner()); DB db = DB.getInstance(getContext()); LivePagedListBuilder builder = null; @@ -1847,8 +1844,8 @@ public class FragmentMessages extends FragmentEx { builder.setFetchExecutor(executor); - modelMessages.setMessages(viewType, builder.build()); - modelMessages.observe(viewType, owner, observer); + modelMessages.setMessages(viewType, getActivity(), builder.build()); + modelMessages.observe(viewType, getViewLifecycleOwner(), observer); } private Observer> observer = new Observer>() { diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index a028960b9d..f5b0cd2172 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -34,23 +34,30 @@ import androidx.paging.PagedList; public class ViewModelMessages extends ViewModel { private Map>> messages = new HashMap<>(); - void setMessages(AdapterMessage.ViewType viewType, LiveData> messages) { - boolean thread = (viewType == AdapterMessage.ViewType.THREAD); + void setMessages(AdapterMessage.ViewType viewType, LifecycleOwner owner, final LiveData> messages) { + final boolean thread = (viewType == AdapterMessage.ViewType.THREAD); this.messages.put(thread, messages); + + // Keep list up-to-date for previous/next navigation + messages.observe(owner, new Observer>() { + @Override + public void onChanged(PagedList messages) { + } + }); + + owner.getLifecycle().addObserver(new LifecycleObserver() { + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + public void onDestroyed() { + Log.i("Removed model thread=" + thread); + ViewModelMessages.this.messages.remove(thread); + } + }); } void observe(AdapterMessage.ViewType viewType, LifecycleOwner owner, Observer> observer) { if (owner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) { final boolean thread = (viewType == AdapterMessage.ViewType.THREAD); messages.get(thread).observe(owner, observer); - - owner.getLifecycle().addObserver(new LifecycleObserver() { - @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) - public void onDestroyed() { - Log.i("Removed model thread=" + thread); - messages.remove(thread); - } - }); } }