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.java60
1 files changed, 43 insertions, 17 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 cdc3462a4..82d2aeff1 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
@@ -80,6 +80,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
private String search, searchCache;
private Status statusReport;
private String max_id, min_id, min_id_fetch_more, max_id_fetch_more;
+ private Integer offset;
private StatusAdapter statusAdapter;
private Timeline.TimeLineEnum timelineType;
private List<Status> timelineStatuses;
@@ -188,6 +189,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
if (statusAdapter != null) {
statusAdapter.notifyItemRangeRemoved(0, count);
max_id = statusReport != null ? statusReport.id : null;
+ offset = 0;
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
rememberPosition = sharedpreferences.getBoolean(getString(R.string.SET_REMEMBER_POSITION), true);
//Inner marker are only for pinned timelines and main timelines, they have isViewInitialized set to false
@@ -264,7 +266,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
}
public void scrollToTop() {
- if (binding != null) {
+ if (binding != null && search == null) {
binding.swipeContainer.setRefreshing(true);
flagLoading = false;
route(DIRECTION.SCROLL_TOP, true);
@@ -281,12 +283,17 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
binding.loader.setVisibility(View.VISIBLE);
binding.recyclerView.setVisibility(View.GONE);
max_id = statusReport != null ? statusReport.id : null;
+ offset = 0;
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
rememberPosition = sharedpreferences.getBoolean(getString(R.string.SET_REMEMBER_POSITION), true);
//Inner marker are only for pinned timelines and main timelines, they have isViewInitialized set to false
if (max_id == null && !isViewInitialized && rememberPosition) {
max_id = sharedpreferences.getString(getString(R.string.SET_INNER_MARKER) + BaseMainActivity.currentUserID + BaseMainActivity.currentInstance + slug, null);
}
+ if (search != null) {
+ binding.swipeContainer.setRefreshing(false);
+ binding.swipeContainer.setEnabled(false);
+ }
//Only fragment in main view pager should not have the view initialized
//AND Only the first fragment will initialize its view
flagLoading = false;
@@ -428,7 +435,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
}
//Update the timeline with new statuses
int insertedStatus;
- if (timelineType != Timeline.TimeLineEnum.TREND_MESSAGE_PUBLIC && timelineType != Timeline.TimeLineEnum.TREND_MESSAGE) {
+ if (timelineType != Timeline.TimeLineEnum.TREND_MESSAGE_PUBLIC && timelineType != Timeline.TimeLineEnum.TREND_MESSAGE && search == null) {
insertedStatus = updateStatusListWith(fetched_statuses.statuses);
} else { //Trends cannot be ordered by id
insertedStatus = fetched_statuses.statuses.size();
@@ -455,6 +462,9 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
min_id = fetched_statuses.pagination.min_id;
}
}
+ if (search != null) {
+ offset += MastodonHelper.SEARCH_PER_CALL;
+ }
int sizeBeforeFilter = 0;
int filteredMessage = 0;
int requestedMessages = MastodonHelper.statusesPerCall(requireActivity());
@@ -479,10 +489,9 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
flagLoading = true;
}
if (direction == DIRECTION.SCROLL_TOP) {
- binding.recyclerView.scrollToPosition(0);
+ new Handler().postDelayed(() -> binding.recyclerView.scrollToPosition(0), 200);
}
-
}
/**
@@ -501,6 +510,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
}
return;
}
+
binding.loader.setVisibility(View.GONE);
binding.noAction.setVisibility(View.GONE);
binding.swipeContainer.setRefreshing(false);
@@ -557,6 +567,9 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
if (min_id == null || (statuses.pagination.min_id != null && Helper.compareTo(statuses.pagination.min_id, min_id) > 0)) {
min_id = statuses.pagination.min_id;
}
+ if (search != null) {
+ offset += MastodonHelper.SEARCH_PER_CALL;
+ }
statusAdapter = new StatusAdapter(timelineStatuses, timelineType, minified, canBeFederated, checkRemotely);
statusAdapter.fetchMoreCallBack = this;
if (statusReport != null) {
@@ -570,8 +583,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
binding.recyclerView.setLayoutManager(mLayoutManager);
binding.recyclerView.setAdapter(statusAdapter);
-
- if (searchCache == null && timelineType != Timeline.TimeLineEnum.TREND_MESSAGE) {
+ if (timelineType != Timeline.TimeLineEnum.TREND_MESSAGE) {
binding.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
@@ -1033,17 +1045,31 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
}
} else if (search != null) {
SearchVM searchVM = new ViewModelProvider(FragmentMastodonTimeline.this).get(viewModelKey, SearchVM.class);
- searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, search.trim(), null, null, false, true, false, 0, null, null, MastodonHelper.STATUSES_PER_CALL)
- .observe(getViewLifecycleOwner(), results -> {
- if (results != null) {
- Statuses statuses = new Statuses();
- statuses.statuses = results.statuses;
- statuses.pagination = new Pagination();
- initializeStatusesCommonView(statuses);
- } else {
- Toasty.error(requireActivity(), getString(R.string.toast_error), Toasty.LENGTH_LONG).show();
- }
- });
+ if (direction == null) {
+ searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, search.trim(), null, null, false, true, false, 0, null, null, MastodonHelper.SEARCH_PER_CALL)
+ .observe(getViewLifecycleOwner(), results -> {
+ if (results != null) {
+ Statuses statuses = new Statuses();
+ statuses.statuses = results.statuses;
+ statuses.pagination = new Pagination();
+ initializeStatusesCommonView(statuses);
+ } else {
+ Toasty.error(requireActivity(), getString(R.string.toast_error), Toasty.LENGTH_LONG).show();
+ }
+ });
+ } else if (direction == DIRECTION.BOTTOM) {
+ searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, search.trim(), null, null, false, true, false, offset, null, null, MastodonHelper.SEARCH_PER_CALL)
+ .observe(getViewLifecycleOwner(), results -> {
+ if (results != null) {
+ Statuses statuses = new Statuses();
+ statuses.statuses = results.statuses;
+ statuses.pagination = new Pagination();
+ dealWithPagination(statuses, direction, false);
+ }
+ });
+ } else {
+ flagLoading = false;
+ }
} else if (searchCache != null) {
SearchVM searchVM = new ViewModelProvider(FragmentMastodonTimeline.this).get(viewModelKey, SearchVM.class);
searchVM.searchCache(BaseMainActivity.currentInstance, BaseMainActivity.currentUserID, searchCache.trim())