diff options
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.java | 60 |
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()) |