Commit 1beabc1f authored by Thomas's avatar Thomas
Browse files

- Fix #572 add reverse timeline reading order (default disabled)

parent 2ec9f555
Loading
Loading
Loading
Loading
+42 −11
Original line number Diff line number Diff line
@@ -221,6 +221,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
    private final boolean checkRemotely;
    public RemoteInstance.InstanceType type;
    public PinnedTimeline pinnedTimeline;
    public boolean reverseTimeline;
    public FetchMoreCallBack fetchMoreCallBack;
    private Context context;
    private boolean visiblePixelfed;
@@ -2668,11 +2669,15 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
        }

        if ((status.isFetchMore || status.isUnreachableGap) && fetchMoreCallBack != null) {
            boolean showInTopContainer = (status.positionFetchMore == Status.PositionFetchMore.BOTTOM);
            if (adapter instanceof StatusAdapter && ((StatusAdapter) adapter).reverseTimeline) {
                showInTopContainer = !showInTopContainer;
            }
            if (status.isUnreachableGap) {
                DrawerFetchMoreBinding drawerFetchMoreBinding = DrawerFetchMoreBinding.inflate(LayoutInflater.from(context));
                drawerFetchMoreBinding.fetchMoreContainer.setVisibility(View.GONE);
                drawerFetchMoreBinding.unreachableGapMessage.setVisibility(View.VISIBLE);
                if (status.positionFetchMore == Status.PositionFetchMore.BOTTOM) {
                if (showInTopContainer) {
                    holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE);
                    holder.binding.fetchMoreContainerTop.setVisibility(View.VISIBLE);
                    holder.binding.fetchMoreContainerTop.removeAllViews();
@@ -2687,7 +2692,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
                DrawerFetchMoreBinding drawerFetchMoreBinding = DrawerFetchMoreBinding.inflate(LayoutInflater.from(context));
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                drawerFetchMoreBinding.getRoot().setLayoutParams(lp);
                if (status.positionFetchMore == Status.PositionFetchMore.BOTTOM) {
                if (showInTopContainer) {
                    holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE);
                    holder.binding.fetchMoreContainerTop.setVisibility(View.VISIBLE);
                    holder.binding.fetchMoreContainerTop.removeAllViews();
@@ -2698,12 +2703,21 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
                    holder.binding.fetchMoreContainerBottom.removeAllViews();
                    holder.binding.fetchMoreContainerBottom.addView(drawerFetchMoreBinding.getRoot());
                }
                boolean reverseMode = adapter instanceof StatusAdapter && ((StatusAdapter) adapter).reverseTimeline;
                drawerFetchMoreBinding.fetchMoreMin.setOnClickListener(v -> {
                    status.isFetchMore = false;
                    status.isFetching = true;
                    int position = holder.getBindingAdapterPosition();
                    adapter.notifyItemChanged(position);
                    if (position < statusList.size() - 1) {
                    if (reverseMode) {
                        String fromId;
                        if (status.positionFetchMore == Status.PositionFetchMore.TOP || position == 0) {
                            fromId = statusList.get(position).id;
                        } else {
                            fromId = statusList.get(position - 1).id;
                        }
                        fetchMoreCallBack.onClickMaxId(fromId, status);
                    } else if (position < statusList.size() - 1) {
                        String fromId;
                        if (status.positionFetchMore == Status.PositionFetchMore.TOP) {
                            fromId = statusList.get(position + 1).id;
@@ -2714,9 +2728,21 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
                    }
                });
                drawerFetchMoreBinding.fetchMoreMax.setOnClickListener(v -> {
                    //We hide the button
                    status.isFetchMore = false;
                    status.isFetching = true;
                    if (reverseMode) {
                        int position = holder.getBindingAdapterPosition();
                        adapter.notifyItemChanged(position);
                        if (position < statusList.size() - 1) {
                            String fromId;
                            if (status.positionFetchMore == Status.PositionFetchMore.TOP) {
                                fromId = statusList.get(position + 1).id;
                            } else {
                                fromId = status.id;
                            }
                            fetchMoreCallBack.onClickMinId(fromId, status);
                        }
                    } else {
                        String fromId;
                        if (status.positionFetchMore == Status.PositionFetchMore.TOP || holder.getBindingAdapterPosition() == 0) {
                            fromId = statusList.get(holder.getBindingAdapterPosition()).id;
@@ -2725,6 +2751,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
                        }
                        fetchMoreCallBack.onClickMaxId(fromId, status);
                        adapter.notifyItemChanged(holder.getBindingAdapterPosition());
                    }
                });
            } else {
                holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE);
@@ -2753,7 +2780,11 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            drawerMessageFetchingBinding.fetchingContainer.setLayoutParams(lp);
            drawerMessageFetchingBinding.fetchingProgress.getIndeterminateDrawable().setColorFilter(ThemeHelper.getAttColor(context, R.attr.colorPrimary), PorterDuff.Mode.SRC_IN);
            if (status.positionFetchMore == Status.PositionFetchMore.BOTTOM) {
            boolean fetchInTopContainer = (status.positionFetchMore == Status.PositionFetchMore.BOTTOM);
            if (adapter instanceof StatusAdapter && ((StatusAdapter) adapter).reverseTimeline) {
                fetchInTopContainer = !fetchInTopContainer;
            }
            if (fetchInTopContainer) {
                holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE);
                holder.binding.fetchMoreContainerTop.setVisibility(View.VISIBLE);
                holder.binding.fetchMoreContainerTop.removeAllViews();
+3 −0
Original line number Diff line number Diff line
@@ -119,6 +119,9 @@ public class FragmentTimelinesSettings extends PreferenceFragmentCompat implemen
            if (key.compareToIgnoreCase(getString(R.string.SET_TIMELINE_SCROLLBAR)) == 0) {
                recreate = true;
            }
            if (key.compareToIgnoreCase(getString(R.string.SET_REVERSE_TIMELINE)) == 0) {
                recreate = true;
            }
            if (key.compareToIgnoreCase(getString(R.string.SET_DISPLAY_BOOKMARK)) == 0) {
                SwitchPreferenceCompat SET_DISPLAY_BOOKMARK = findPreference(getString(R.string.SET_DISPLAY_BOOKMARK));
                if (SET_DISPLAY_BOOKMARK != null) {
+53 −16
Original line number Diff line number Diff line
@@ -217,6 +217,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
    private String ident;
    private String slug;
    private boolean canBeFederated;
    private boolean reverseTimeline;
    private boolean rememberPosition;
    private String publicTrendsDomain;

@@ -655,11 +656,18 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
            } else if (update != null && insertedStatus == 0 && direction == DIRECTION.REFRESH) {
                update.onUpdate(0, timelineType, slug);
            }
            if (direction == DIRECTION.TOP && fetchingMissing && canScroll) {
            if (fetchingMissing && canScroll) {
                if (!reverseTimeline && direction == DIRECTION.TOP) {
                    int position = getAbsolutePosition(fetched_statuses.statuses.get(fetched_statuses.statuses.size() - 1));
                    if (position != -1) {
                        binding.recyclerView.scrollToPosition(position + 1);
                    }
                } else if (reverseTimeline && direction == DIRECTION.BOTTOM) {
                    int position = getAbsolutePosition(fetched_statuses.statuses.get(0));
                    if (position > 0) {
                        binding.recyclerView.scrollToPosition(position - 1);
                    }
                }
            }
            if (!fetchingMissing) {
                if (search != null) {
@@ -773,9 +781,12 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
                min_id = statuses.pagination.min_id;
            }
        }
        SharedPreferences sharedpref = PreferenceManager.getDefaultSharedPreferences(requireActivity());
        reverseTimeline = sharedpref.getBoolean(getString(R.string.SET_REVERSE_TIMELINE), false);
        statusAdapter = new StatusAdapter(timelineStatuses, timelineType, minified, canBeFederated, checkRemotely);
        statusAdapter.fetchMoreCallBack = this;
        statusAdapter.pinnedTimeline = pinnedTimeline;
        statusAdapter.reverseTimeline = reverseTimeline;
        //------Specifications for Lemmy timelines
        if (pinnedTimeline != null && pinnedTimeline.remoteInstance != null) {
            statusAdapter.type = pinnedTimeline.remoteInstance.type;
@@ -791,6 +802,10 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
        }
        mLayoutManager = new LinearLayoutManager(requireActivity());
        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        if (reverseTimeline) {
            mLayoutManager.setReverseLayout(true);
            mLayoutManager.setStackFromEnd(true);
        }
        binding.recyclerView.setLayoutManager(mLayoutManager);
        binding.recyclerView.setAdapter(statusAdapter);

@@ -813,6 +828,27 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
                            ((BaseMainActivity) requireActivity()).manageFloatingButton(false);
                    }
                    int firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
                    if (reverseTimeline) {
                        if (dy < 0) {
                            int visibleItemCount = mLayoutManager.getChildCount();
                            int totalItemCount = mLayoutManager.getItemCount();
                            if (firstVisibleItem + visibleItemCount == totalItemCount) {
                                if (!flagLoading) {
                                    flagLoading = true;
                                    binding.loadingNextElements.setVisibility(View.VISIBLE);
                                    router(DIRECTION.BOTTOM);
                                }
                            } else {
                                binding.loadingNextElements.setVisibility(View.GONE);
                            }
                        } else if (firstVisibleItem == 0) {
                            if (!flagLoading) {
                                flagLoading = true;
                                binding.loadingNextElements.setVisibility(View.VISIBLE);
                                router(DIRECTION.TOP);
                            }
                        }
                    } else {
                        if (dy > 0) {
                            int visibleItemCount = mLayoutManager.getChildCount();
                            int totalItemCount = mLayoutManager.getItemCount();
@@ -825,7 +861,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
                            } else {
                                binding.loadingNextElements.setVisibility(View.GONE);
                            }
                    } else if (firstVisibleItem == 0) { //Scroll top and item is zero
                        } else if (firstVisibleItem == 0) {
                            if (!flagLoading) {
                                flagLoading = true;
                                binding.loadingNextElements.setVisibility(View.VISIBLE);
@@ -833,6 +869,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
                            }
                        }
                    }
                }
            });
            //For first tab we fetch new messages, if we keep position
            if (slug != null /*&& slug.compareTo(Helper.getSlugOfFirstFragment(requireActivity(), currentUserID, currentInstance)) == 0*/ && rememberPosition) {
+2 −0
Original line number Diff line number Diff line
@@ -1384,6 +1384,7 @@
    <string name="SET_GROUP_REBLOGS" translatable="false">SET_GROUP_REBLOGS</string>
    <string name="SET_BOOST_ORIGINAL_DATE" translatable="false">SET_BOOST_ORIGINAL_DATE</string>
    <string name="SET_TIMELINE_SCROLLBAR" translatable="false">SET_TIMELINE_SCROLLBAR</string>
    <string name="SET_REVERSE_TIMELINE" translatable="false">SET_REVERSE_TIMELINE</string>
    <string name="SET_HIGHLIGHT_NEW_COMMENTS" translatable="false">SET_HIGHLIGHT_NEW_COMMENTS</string>
    <string name="SET_MARKDOWN_SUPPORT" translatable="false">SET_MARKDOWN_SUPPORT</string>
    <string name="SET_TRUNCATE_LINKS" translatable="false">SET_TRUNCATE_LINKS</string>
@@ -2182,6 +2183,7 @@
    <string name="Directory">Directory</string>
    <string name="boost_original_date">Display original date for boosts</string>
    <string name="timeline_scrollbar">Display a scroll bar for timelines</string>
    <string name="reverse_timeline">Reverse timeline reading order</string>
    <string name="highlight_new_comments">Highlight new comments in threads</string>
    <string name="markdown_support">Markdown support</string>
    <string name="set_disable_release_notes">Disable release notes</string>
+7 −0
Original line number Diff line number Diff line
@@ -58,6 +58,13 @@
        app:singleLineTitle="false"
        app:title="@string/timeline_scrollbar" />

    <SwitchPreferenceCompat
        android:defaultValue="false"
        app:iconSpaceReserved="false"
        app:key="@string/SET_REVERSE_TIMELINE"
        app:singleLineTitle="false"
        app:title="@string/reverse_timeline" />

    <SwitchPreferenceCompat
        android:defaultValue="true"
        app:iconSpaceReserved="false"