summaryrefslogtreecommitdiffstats
path: root/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java')
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java53
1 files changed, 47 insertions, 6 deletions
diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java
index b3e2e6b42..d4a84a5fd 100644
--- a/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java
+++ b/app/src/main/java/app/fedilab/android/ui/fragment/timeline/FragmentMastodonTimeline.java
@@ -40,6 +40,9 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
+import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader;
+import com.bumptech.glide.util.ViewPreloadSizeProvider;
+
import java.util.ArrayList;
import java.util.List;
@@ -60,6 +63,7 @@ import app.fedilab.android.client.entities.app.Timeline;
import app.fedilab.android.databinding.FragmentPaginationBinding;
import app.fedilab.android.exception.DBException;
import app.fedilab.android.helper.CrossActionHelper;
+import app.fedilab.android.helper.GlideApp;
import app.fedilab.android.helper.Helper;
import app.fedilab.android.helper.MastodonHelper;
import app.fedilab.android.ui.drawer.StatusAdapter;
@@ -84,6 +88,8 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
private StatusAdapter statusAdapter;
private Timeline.TimeLineEnum timelineType;
private List<Status> timelineStatuses;
+ private static final int PRELOAD_AHEAD_ITEMS = 10;
+ private ViewPreloadSizeProvider<Attachment> preloadSizeProvider;
//Handle actions that can be done in other fragments
private final BroadcastReceiver receive_action = new BroadcastReceiver() {
@Override
@@ -161,8 +167,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
if (toRemove.size() > 0) {
for (int i = 0; i < toRemove.size(); i++) {
int position = getPosition(toRemove.get(i));
- timelineStatuses.remove(position);
- statusAdapter.notifyItemRemoved(position);
+ if (position >= 0) {
+ timelineStatuses.remove(position);
+ statusAdapter.notifyItemRemoved(position);
+ }
}
}
} else if (refreshAll) {
@@ -266,6 +274,29 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
return found ? position : -1;
}
+
+ /**
+ * Return the position of the status in the ArrayList
+ *
+ * @param status - Status to fetch
+ * @return position or -1 if not found
+ */
+ private int getAbsolutePosition(Status status) {
+ int position = 0;
+ boolean found = false;
+ if (status.id == null) {
+ return -1;
+ }
+ for (Status _status : timelineStatuses) {
+ if (_status.id != null && _status.id.compareTo(status.id) == 0) {
+ found = true;
+ break;
+ }
+ position++;
+ }
+ return found ? position : -1;
+ }
+
/**
* Returned list of checked status id for reports
*
@@ -395,6 +426,8 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
if (timelineType != null) {
slug = timelineType != Timeline.TimeLineEnum.ART ? timelineType.getValue() + (ident != null ? "|" + ident : "") : Timeline.TimeLineEnum.TAG.getValue() + (ident != null ? "|" + ident : "");
}
+
+
LocalBroadcastManager.getInstance(requireActivity()).registerReceiver(receive_action, new IntentFilter(Helper.RECEIVE_STATUS_ACTION));
binding = FragmentPaginationBinding.inflate(inflater, container, false);
return binding.getRoot();
@@ -412,7 +445,6 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
binding.swipeContainer.setRefreshing(false);
binding.loadingNextElements.setVisibility(View.GONE);
flagLoading = false;
- int currentPosition = mLayoutManager.findFirstVisibleItemPosition();
if (timelineStatuses != null && fetched_statuses != null && fetched_statuses.statuses != null && fetched_statuses.statuses.size() > 0) {
try {
if (statusToUpdate != null) {
@@ -475,9 +507,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
update.onUpdate(0, timelineType, slug);
}
if (direction == DIRECTION.TOP && fetchingMissing) {
- int newPosition = currentPosition + fetched_statuses.statuses.size() + 1;
- if (newPosition < timelineStatuses.size()) {
- binding.recyclerView.scrollToPosition(newPosition);
+ int position = getAbsolutePosition(fetched_statuses.statuses.get(fetched_statuses.statuses.size() - 1));
+
+ if (position != -1) {
+ binding.recyclerView.scrollToPosition(position + 1);
}
}
if (!fetchingMissing) {
@@ -611,6 +644,14 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
binding.recyclerView.setLayoutManager(mLayoutManager);
binding.recyclerView.setAdapter(statusAdapter);
+
+ preloadSizeProvider = new ViewPreloadSizeProvider<>();
+ RecyclerViewPreloader<Attachment> preloader =
+ new RecyclerViewPreloader<>(
+ GlideApp.with(this), statusAdapter, preloadSizeProvider, PRELOAD_AHEAD_ITEMS);
+ binding.recyclerView.addOnScrollListener(preloader);
+ binding.recyclerView.setItemViewCacheSize(0);
+
if (timelineType != Timeline.TimeLineEnum.TREND_MESSAGE) {
binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override