From 7ccb1c96b2ad7d58c878ba53e098abd76556fc27 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 6 Dec 2022 17:50:25 +0100 Subject: [PATCH] Fix issue #607 - Fetch more broken --- .../android/ui/drawer/StatusAdapter.java | 41 +++++++++++++++---- .../viewmodel/mastodon/TimelinesVM.java | 7 ++++ app/src/main/res/layout/drawer_status.xml | 22 ++++++---- 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java index 330aede12..3b1de7cc1 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java @@ -123,6 +123,7 @@ import app.fedilab.android.client.entities.app.BaseAccount; import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.client.entities.app.StatusDraft; import app.fedilab.android.client.entities.app.Timeline; +import app.fedilab.android.databinding.DrawerFetchMoreBinding; import app.fedilab.android.databinding.DrawerStatusArtBinding; import app.fedilab.android.databinding.DrawerStatusBinding; import app.fedilab.android.databinding.DrawerStatusFilteredBinding; @@ -175,6 +176,18 @@ public class StatusAdapter extends RecyclerView.Adapter this.checkRemotely = checkRemotely; } + public static int getStatusPosition(List timelineStatuses, Status status) { + int position = 0; + if (timelineStatuses != null && status != null) { + for (Status _s : timelineStatuses) { + if (_s.id.compareTo(status.id) == 0) { + return position; + } + position++; + } + } + return -1; + } private static boolean isVisible(Timeline.TimeLineEnum timelineType, Status status) { if (timelineType == Timeline.TimeLineEnum.HOME && !show_boosts && status.reblog != null) { @@ -1853,21 +1866,34 @@ public class StatusAdapter extends RecyclerView.Adapter } if (status.isFetchMore && fetchMoreCallBack != null) { - holder.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.VISIBLE); - holder.binding.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> { + DrawerFetchMoreBinding drawerFetchMoreBinding = DrawerFetchMoreBinding.inflate(LayoutInflater.from(context)); + if (status.positionFetchMore == Status.PositionFetchMore.BOTTOM) { + holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE); + holder.binding.fetchMoreContainerTop.setVisibility(View.VISIBLE); + holder.binding.fetchMoreContainerTop.removeAllViews(); + holder.binding.fetchMoreContainerTop.addView(drawerFetchMoreBinding.getRoot()); + } else { + holder.binding.fetchMoreContainerBottom.setVisibility(View.VISIBLE); + holder.binding.fetchMoreContainerTop.setVisibility(View.GONE); + holder.binding.fetchMoreContainerBottom.removeAllViews(); + holder.binding.fetchMoreContainerBottom.addView(drawerFetchMoreBinding.getRoot()); + } + drawerFetchMoreBinding.fetchMoreMin.setOnClickListener(v -> { status.isFetchMore = false; - adapter.notifyItemChanged(holder.getBindingAdapterPosition()); - if (holder.getBindingAdapterPosition() < statusList.size() - 1) { + int position = holder.getBindingAdapterPosition(); + int position2 = getStatusPosition(statusList, status); + adapter.notifyItemChanged(position); + if (position < statusList.size() - 1) { String fromId; if (status.positionFetchMore == Status.PositionFetchMore.TOP) { - fromId = statusList.get(holder.getBindingAdapterPosition() + 1).id; + fromId = statusList.get(position + 1).id; } else { fromId = status.id; } fetchMoreCallBack.onClickMinId(fromId, status); } }); - holder.binding.layoutFetchMore.fetchMoreMax.setOnClickListener(v -> { + drawerFetchMoreBinding.fetchMoreMax.setOnClickListener(v -> { //We hide the button status.isFetchMore = false; String fromId; @@ -1880,7 +1906,8 @@ public class StatusAdapter extends RecyclerView.Adapter adapter.notifyItemChanged(holder.getBindingAdapterPosition()); }); } else { - holder.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE); + holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE); + holder.binding.fetchMoreContainerTop.setVisibility(View.GONE); } } diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java index d94d1ad08..dd8e752ef 100644 --- a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java +++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TimelinesVM.java @@ -29,6 +29,7 @@ import androidx.lifecycle.MutableLiveData; import androidx.preference.PreferenceManager; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; @@ -90,8 +91,14 @@ public class TimelinesVM extends AndroidViewModel { super(application); } + + private static void sortDesc(List statusList) { + Collections.sort(statusList, (obj1, obj2) -> obj2.id.compareToIgnoreCase(obj1.id)); + } + private static void addFetchMore(List statusList, List timelineStatuses, TimelineParams timelineParams) throws DBException { if (statusList != null && statusList.size() > 0 && timelineStatuses != null && timelineStatuses.size() > 0) { + sortDesc(statusList); if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) { //When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole if (statusList.get(statusList.size() - 1).id.compareToIgnoreCase(timelineStatuses.get(0).id) > 0) { diff --git a/app/src/main/res/layout/drawer_status.xml b/app/src/main/res/layout/drawer_status.xml index 3a741fe3f..aa6609ab7 100644 --- a/app/src/main/res/layout/drawer_status.xml +++ b/app/src/main/res/layout/drawer_status.xml @@ -25,10 +25,6 @@ android:clipToPadding="false" android:clipChildren="false"> - + + + - +