diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index 9cee6934cb..1dc3561706 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -71,15 +71,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback messages = null; - - private MailService iservice = null; - private IMAPFolder ifolder = null; - private Message[] imessages = null; + private State state; interface IBoundaryCallbackMessages { void onLoading(); @@ -100,11 +92,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback rules = db.rule().getEnabledRules(browsable.id); int found = 0; - while (index >= 0 && found < pageSize && !destroyed) { - Log.i("Boundary server index=" + index); - int from = Math.max(0, index - (pageSize - found) + 1); - Message[] isub = Arrays.copyOfRange(imessages, from, index + 1); - index -= (pageSize - found); + while (state.index >= 0 && found < pageSize && !state.destroyed) { + Log.i("Boundary server index=" + state.index); + int from = Math.max(0, state.index - (pageSize - found) + 1); + Message[] isub = Arrays.copyOfRange(state.imessages, from, state.index + 1); + state.index -= (pageSize - found); FetchProfile fp = new FetchProfile(); fp.add(FetchProfile.Item.ENVELOPE); @@ -411,20 +401,20 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback= 0 && found < pageSize && !destroyed; j--) + for (int j = isub.length - 1; j >= 0 && found < pageSize && !state.destroyed; j--) try { - long uid = ifolder.getUID(isub[j]); + long uid = state.ifolder.getUID(isub[j]); Log.i("Boundary server sync uid=" + uid); EntityMessage message = db.message().getMessageByUid(browsable.id, uid); if (message == null) { message = Core.synchronizeMessage(context, account, browsable, - ifolder, (IMAPMessage) isub[j], + state.ifolder, (IMAPMessage) isub[j], true, true, rules, null); found++; @@ -457,20 +447,39 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback messages = null; + + MailService iservice = null; + IMAPFolder ifolder = null; + Message[] imessages = null; + } } \ No newline at end of file diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 2452357124..555f8e3002 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -2779,7 +2779,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. getContext(), getViewLifecycleOwner(), viewType, type, account, folder, thread, id, query, server); - vmodel.setCallback(callback); + vmodel.setCallback(getViewLifecycleOwner(), callback); vmodel.setObserver(getViewLifecycleOwner(), observer); } diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index 579ade5e9a..9da9434973 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -71,10 +71,8 @@ public class ViewModelMessages extends ViewModel { if (model == null || !model.args.equals(args)) { Log.i("Creating model=" + viewType + " replace=" + (model != null)); - if (model != null) { + if (model != null) model.list.removeObservers(owner); - model.clear(); - } DB db = DB.getInstance(context); @@ -174,7 +172,7 @@ public class ViewModelMessages extends ViewModel { if (viewType == AdapterMessage.ViewType.THREAD || lowmem) { Log.i("Remove model=" + viewType); - remove(viewType); + models.remove(viewType); } dump(); @@ -182,10 +180,10 @@ public class ViewModelMessages extends ViewModel { }); if (viewType == AdapterMessage.ViewType.UNIFIED) { - remove(AdapterMessage.ViewType.FOLDER); - remove(AdapterMessage.ViewType.SEARCH); + models.remove(AdapterMessage.ViewType.FOLDER); + models.remove(AdapterMessage.ViewType.SEARCH); } else if (viewType == AdapterMessage.ViewType.FOLDER) - remove(AdapterMessage.ViewType.SEARCH); + models.remove(AdapterMessage.ViewType.SEARCH); if (viewType != AdapterMessage.ViewType.THREAD) { last = viewType; @@ -201,15 +199,7 @@ public class ViewModelMessages extends ViewModel { @Override protected void onCleared() { for (AdapterMessage.ViewType viewType : new ArrayList<>(models.keySet())) - remove(viewType); - } - - private void remove(AdapterMessage.ViewType viewType) { - Model model = models.get(viewType); - if (model != null) { - model.clear(); models.remove(viewType); - } } void observePrevNext(LifecycleOwner owner, final long id, final IPrevNext intf) { @@ -385,20 +375,23 @@ public class ViewModelMessages extends ViewModel { this.boundary = boundary; } - void setCallback(BoundaryCallbackMessages.IBoundaryCallbackMessages callback) { - if (boundary != null) + void setCallback(LifecycleOwner owner, BoundaryCallbackMessages.IBoundaryCallbackMessages callback) { + if (boundary != null) { boundary.setCallback(callback); + + owner.getLifecycle().addObserver(new LifecycleObserver() { + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + public void onDestroyed() { + boundary.close(); + } + }); + } } void setObserver(LifecycleOwner owner, @NonNull Observer> observer) { //list.removeObservers(owner); list.observe(owner, observer); } - - private void clear() { - if (this.boundary != null) - this.boundary.clear(); - } } interface IPrevNext {