diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 38ec9c6945..bc4090cf5c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -71,7 +71,6 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; -import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -2620,78 +2619,82 @@ public class FragmentMessages extends FragmentBase { ViewModelMessages model = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class); - LiveData> liveMessages = model.getPagedList( + ViewModelMessages.Model vmodel = model.getModel( getContext(), getViewLifecycleOwner(), - viewType, account, folder, thread, id, query, server, - new BoundaryCallbackMessages.IBoundaryCallbackMessages() { - @Override - public void onLoading() { - loading = true; - pbWait.setVisibility(View.VISIBLE); - } - - @Override - public void onLoaded(int fetched) { - loading = false; - pbWait.setVisibility(View.GONE); - - Integer submitted = (Integer) rvMessage.getTag(); - if (submitted == null) - submitted = 0; - if (submitted + fetched == 0) - tvNoEmail.setVisibility(View.VISIBLE); - } + viewType, account, folder, thread, id, query, server); - @Override - public void onError(Throwable ex) { - if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) - if (ex instanceof IllegalArgumentException) - Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_LONG).show(); - else - new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) - .setMessage(Helper.formatThrowable(ex)) - .setPositiveButton(android.R.string.cancel, null) - .create() - .show(); - } - }); + vmodel.setCallback(callback); + vmodel.setObserver(getViewLifecycleOwner(), observer); + } - liveMessages.observe(getViewLifecycleOwner(), new Observer>() { - @Override - public void onChanged(@Nullable PagedList messages) { - if (messages == null) - return; + private BoundaryCallbackMessages.IBoundaryCallbackMessages callback = new BoundaryCallbackMessages.IBoundaryCallbackMessages() { + @Override + public void onLoading() { + loading = true; + pbWait.setVisibility(View.VISIBLE); + } - if (viewType == AdapterMessage.ViewType.THREAD) - if (handleThreadActions(messages)) - return; + @Override + public void onLoaded(int fetched) { + loading = false; + pbWait.setVisibility(View.GONE); + + Integer submitted = (Integer) rvMessage.getTag(); + if (submitted == null) + submitted = 0; + if (submitted + fetched == 0) + tvNoEmail.setVisibility(View.VISIBLE); + } - Log.i("Submit messages=" + messages.size()); - adapter.submitList(messages); + @Override + public void onError(Throwable ex) { + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) + if (ex instanceof IllegalArgumentException) + Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_LONG).show(); + else + new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) + .setMessage(Helper.formatThrowable(ex)) + .setPositiveButton(android.R.string.cancel, null) + .create() + .show(); + } + }; - // This is to workaround not drawing when the search is expanded - new Handler().post(new Runnable() { - @Override - public void run() { - rvMessage.requestLayout(); - } - }); + private Observer> observer = new Observer>() { + @Override + public void onChanged(@Nullable PagedList messages) { + if (messages == null) + return; - rvMessage.setTag(messages.size()); + if (viewType == AdapterMessage.ViewType.THREAD) + if (handleThreadActions(messages)) + return; - boolean hasBoundary = (viewType == AdapterMessage.ViewType.FOLDER || viewType == AdapterMessage.ViewType.SEARCH); + Log.i("Submit messages=" + messages.size()); + adapter.submitList(messages); - if (!hasBoundary || !loading) - pbWait.setVisibility(View.GONE); - if (!hasBoundary && messages.size() == 0) - tvNoEmail.setVisibility(View.VISIBLE); - if (messages.size() > 0) { - tvNoEmail.setVisibility(View.GONE); - grpReady.setVisibility(View.VISIBLE); + // This is to workaround not drawing when the search is expanded + new Handler().post(new Runnable() { + @Override + public void run() { + rvMessage.requestLayout(); } + }); + + rvMessage.setTag(messages.size()); + + boolean hasBoundary = (viewType == AdapterMessage.ViewType.FOLDER || viewType == AdapterMessage.ViewType.SEARCH); + + if (!hasBoundary || !loading) + pbWait.setVisibility(View.GONE); + if (!hasBoundary && messages.size() == 0) + tvNoEmail.setVisibility(View.VISIBLE); + if (messages.size() > 0) { + tvNoEmail.setVisibility(View.GONE); + grpReady.setVisibility(View.VISIBLE); } - }); - } + } + }; private boolean handleThreadActions(@NonNull PagedList messages) { // Auto close / next diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index 451883ab46..b49a9b4943 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -52,12 +52,11 @@ public class ViewModelMessages extends ViewModel { private static final int LOCAL_PAGE_SIZE = 100; private static final int REMOTE_PAGE_SIZE = 10; - LiveData> getPagedList( - Context context, LifecycleOwner owner, + Model getModel( + Context context, final LifecycleOwner owner, final AdapterMessage.ViewType viewType, long account, long folder, String thread, long id, - String query, boolean server, - BoundaryCallbackMessages.IBoundaryCallbackMessages callback) { + String query, boolean server) { Args args = new Args(context, account, folder, thread, id, query, server); Log.i("Get model " + viewType + " " + args); @@ -67,8 +66,10 @@ public class ViewModelMessages extends ViewModel { if (model == null || !model.args.equals(args)) { Log.i("Creating model"); - if (model != null) + if (model != null) { model.clear(); + model.list.removeObservers(owner); + } DB db = DB.getInstance(context); @@ -168,9 +169,6 @@ public class ViewModelMessages extends ViewModel { }); } - if (model.boundary != null) - model.boundary.setCallback(callback); - if (viewType == AdapterMessage.ViewType.UNIFIED) { remove(AdapterMessage.ViewType.FOLDER); remove(AdapterMessage.ViewType.SEARCH); @@ -182,7 +180,7 @@ public class ViewModelMessages extends ViewModel { Log.i("Returning model=" + viewType); dump(); - return model.list; + return model; } @Override @@ -193,10 +191,8 @@ public class ViewModelMessages extends ViewModel { private void remove(AdapterMessage.ViewType viewType) { Model model = models.get(viewType); - if (model != null) { - model.clear(); + if (model != null) models.remove(viewType); - } } void observePrevNext(LifecycleOwner owner, final long id, final IPrevNext intf) { @@ -321,7 +317,7 @@ public class ViewModelMessages extends ViewModel { Log.i("Current models=" + TextUtils.join(", ", models.keySet())); } - private class Model { + class Model { private Args args; private LiveData> list; private BoundaryCallbackMessages boundary; @@ -332,6 +328,15 @@ public class ViewModelMessages extends ViewModel { this.boundary = boundary; } + void setCallback(BoundaryCallbackMessages.IBoundaryCallbackMessages callback) { + if (boundary != null) + boundary.setCallback(callback); + } + + void setObserver(LifecycleOwner owner, @NonNull Observer> observer) { + list.observe(owner, observer); + } + private void clear() { if (this.boundary != null) this.boundary.clear();