Proper go top, refactoring

pull/156/head
M66B 6 years ago
parent c287483dea
commit 10c4deef60

@ -160,8 +160,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
private boolean authentication; private boolean authentication;
private boolean debug; private boolean debug;
private boolean gotop = false;
private AsyncPagedListDiffer<TupleMessageEx> differ;
private SelectionTracker<Long> selectionTracker = null; private SelectionTracker<Long> selectionTracker = null;
private AsyncPagedListDiffer<TupleMessageEx> differ = new AsyncPagedListDiffer<>(this, DIFF_CALLBACK);
enum ViewType {UNIFIED, FOLDER, THREAD, SEARCH} enum ViewType {UNIFIED, FOLDER, THREAD, SEARCH}
@ -3143,7 +3144,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
} }
AdapterMessage(Context context, LifecycleOwner owner, AdapterMessage(Context context, LifecycleOwner owner,
ViewType viewType, boolean compact, int zoom, String sort, boolean filter_duplicates, IProperties properties) { ViewType viewType, boolean compact, int zoom, String sort, boolean filter_duplicates, final IProperties properties) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
this.TF = Helper.getTimeInstance(context, SimpleDateFormat.SHORT); this.TF = Helper.getTimeInstance(context, SimpleDateFormat.SHORT);
@ -3189,9 +3190,21 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
this.autoimages = (this.contacts && prefs.getBoolean("autoimages", false)); this.autoimages = (this.contacts && prefs.getBoolean("autoimages", false));
this.authentication = prefs.getBoolean("authentication", false); this.authentication = prefs.getBoolean("authentication", false);
this.debug = prefs.getBoolean("debug", false); this.debug = prefs.getBoolean("debug", false);
this.differ = new AsyncPagedListDiffer<>(this, DIFF_CALLBACK);
this.differ.addPagedListListener(new AsyncPagedListDiffer.PagedListListener<TupleMessageEx>() {
@Override
public void onCurrentListChanged(@Nullable PagedList<TupleMessageEx> previousList, @Nullable PagedList<TupleMessageEx> currentList) {
if (gotop) {
gotop = false;
properties.scrollTo(0);
}
}
});
} }
void submitList(PagedList<TupleMessageEx> list) { void submitList(PagedList<TupleMessageEx> list, boolean gotop) {
this.gotop = gotop;
differ.submitList(list); differ.submitList(list);
} }

@ -1788,7 +1788,7 @@ public class FragmentMessages extends FragmentBase {
break; break;
} }
loadMessages(); loadMessages(false);
if (selectionTracker != null && selectionTracker.hasSelection()) if (selectionTracker != null && selectionTracker.hasSelection())
fabMore.show(); fabMore.show();
@ -2079,7 +2079,7 @@ public class FragmentMessages extends FragmentBase {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
prefs.edit().putString("sort", sort).apply(); prefs.edit().putString("sort", sort).apply();
adapter.setSort(sort); adapter.setSort(sort);
loadMessages(); loadMessages(true);
} }
private void onMenuFilterRead(boolean filter) { private void onMenuFilterRead(boolean filter) {
@ -2088,7 +2088,7 @@ public class FragmentMessages extends FragmentBase {
getActivity().invalidateOptionsMenu(); getActivity().invalidateOptionsMenu();
if (selectionTracker != null) if (selectionTracker != null)
selectionTracker.clearSelection(); selectionTracker.clearSelection();
loadMessages(); loadMessages(true);
} }
private void onMenuFilterSnoozed(boolean filter) { private void onMenuFilterSnoozed(boolean filter) {
@ -2097,7 +2097,7 @@ public class FragmentMessages extends FragmentBase {
getActivity().invalidateOptionsMenu(); getActivity().invalidateOptionsMenu();
if (selectionTracker != null) if (selectionTracker != null)
selectionTracker.clearSelection(); selectionTracker.clearSelection();
loadMessages(); loadMessages(true);
} }
private void onMenuFilterDuplicates(boolean filter) { private void onMenuFilterDuplicates(boolean filter) {
@ -2198,13 +2198,7 @@ public class FragmentMessages extends FragmentBase {
if (lastUnseen == null || lastUnseen != unseen) { if (lastUnseen == null || lastUnseen != unseen) {
if ((!refreshing && manual) || if ((!refreshing && manual) ||
(autoscroll && lastUnseen != null && lastUnseen < unseen)) (autoscroll && lastUnseen != null && lastUnseen < unseen))
// Delay to let list update loadMessages(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
rvMessage.scrollToPosition(0);
}
}, 3000);
manual = false; manual = false;
lastUnseen = unseen; lastUnseen = unseen;
} }
@ -2221,7 +2215,7 @@ public class FragmentMessages extends FragmentBase {
swipeRefresh.setRefreshing(refreshing); swipeRefresh.setRefreshing(refreshing);
} }
private void loadMessages() { private void loadMessages(final boolean top) {
if (viewType == AdapterMessage.ViewType.THREAD && autonext) { if (viewType == AdapterMessage.ViewType.THREAD && autonext) {
ViewModelMessages model = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class); ViewModelMessages model = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class);
model.observePrevNext(getViewLifecycleOwner(), id, found, new ViewModelMessages.IPrevNext() { model.observePrevNext(getViewLifecycleOwner(), id, found, new ViewModelMessages.IPrevNext() {
@ -2238,7 +2232,7 @@ public class FragmentMessages extends FragmentBase {
closeNext = id; closeNext = id;
if (!once) { if (!once) {
once = true; once = true;
loadMessagesNext(); loadMessagesNext(top);
} }
} }
} }
@ -2249,10 +2243,10 @@ public class FragmentMessages extends FragmentBase {
} }
}); });
} else } else
loadMessagesNext(); loadMessagesNext(top);
} }
private void loadMessagesNext() { private void loadMessagesNext(final boolean top) {
ViewModelBrowse modelBrowse = ViewModelProviders.of(getActivity()).get(ViewModelBrowse.class); ViewModelBrowse modelBrowse = ViewModelProviders.of(getActivity()).get(ViewModelBrowse.class);
modelBrowse.set(getContext(), folder, search, REMOTE_PAGE_SIZE); modelBrowse.set(getContext(), folder, search, REMOTE_PAGE_SIZE);
@ -2344,20 +2338,52 @@ public class FragmentMessages extends FragmentBase {
builder.setFetchExecutor(executor); builder.setFetchExecutor(executor);
modelMessages.setMessages(viewType, getViewLifecycleOwner(), builder.build()); modelMessages.setMessages(viewType, getViewLifecycleOwner(), builder.build());
modelMessages.observe(viewType, getViewLifecycleOwner(), observer); modelMessages.observe(viewType, getViewLifecycleOwner(), new Observer<PagedList<TupleMessageEx>>() {
} private boolean topped = false;
private Observer<PagedList<TupleMessageEx>> observer = new Observer<PagedList<TupleMessageEx>>() {
@Override @Override
public void onChanged(@Nullable PagedList<TupleMessageEx> messages) { public void onChanged(@Nullable PagedList<TupleMessageEx> messages) {
if (messages == null || if (messages == null)
(viewType == AdapterMessage.ViewType.THREAD && messages.size() == 0 && return;
(autoclose || autonext))) {
handleAutoClose(); if (viewType == AdapterMessage.ViewType.THREAD)
if (handleThreadActions(messages))
return; return;
boolean gotop = (top && !topped);
topped = true;
Log.i("Submit messages=" + messages.size() + " top=" + gotop);
adapter.submitList(messages, gotop);
// 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());
if (boundaryCallback == null || !boundaryCallback.isLoading())
pbWait.setVisibility(View.GONE);
if (boundaryCallback == null && messages.size() == 0)
tvNoEmail.setVisibility(View.VISIBLE);
if (messages.size() > 0) {
tvNoEmail.setVisibility(View.GONE);
grpReady.setVisibility(View.VISIBLE);
}
}
});
}
private boolean handleThreadActions(@NonNull PagedList<TupleMessageEx> messages) {
// Auto close / next
if (messages.size() == 0 && (autoclose || autonext)) {
handleAutoClose();
return true;
} }
if (viewType == AdapterMessage.ViewType.THREAD) {
// Mark duplicates // Mark duplicates
Map<String, List<TupleMessageEx>> duplicates = new HashMap<>(); Map<String, List<TupleMessageEx>> duplicates = new HashMap<>();
for (TupleMessageEx message : messages) for (TupleMessageEx message : messages)
@ -2459,7 +2485,7 @@ public class FragmentMessages extends FragmentBase {
if (count == 0) { if (count == 0) {
handleAutoClose(); handleAutoClose();
return; return true;
} }
} }
} }
@ -2521,32 +2547,9 @@ public class FragmentMessages extends FragmentBase {
} }
}.execute(FragmentMessages.this, args, "messages:navigation"); }.execute(FragmentMessages.this, args, "messages:navigation");
} }
return false;
} }
Log.i("Submit messages=" + messages.size());
adapter.submitList(messages);
// 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());
if (boundaryCallback == null || !boundaryCallback.isLoading())
pbWait.setVisibility(View.GONE);
if (boundaryCallback == null && messages.size() == 0)
tvNoEmail.setVisibility(View.VISIBLE);
if (messages.size() > 0) {
tvNoEmail.setVisibility(View.GONE);
grpReady.setVisibility(View.VISIBLE);
}
}
};
private void handleExpand(long id) { private void handleExpand(long id) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putLong("id", id); args.putLong("id", id);

Loading…
Cancel
Save