Commit 2ec9f555 authored by Thomas's avatar Thomas
Browse files

- Add pinned statuses carousel in profiles

parent aaa923e5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -183,6 +183,8 @@ public class Status implements Serializable, Cloneable {
    public boolean mathsShown = false;
    public boolean canLoadMedia = false;
    public transient boolean isFocused = false;
    public transient List<Status> pinnedList;
    public transient int pinnedIndex = 0;
    public transient boolean setCursorToEnd = false;
    public transient int cursorPosition = 0;
    public transient boolean submitted = false;
+29 −0
Original line number Diff line number Diff line
@@ -976,8 +976,37 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>

        if (status.pinned) {
            holder.binding.statusPinned.setVisibility(View.VISIBLE);
            if (status.pinnedList != null && status.pinnedList.size() > 1) {
                holder.binding.pinnedNavigation.setVisibility(View.VISIBLE);
                holder.binding.pinnedCounter.setText(String.format(Locale.getDefault(), "%d/%d", status.pinnedIndex + 1, status.pinnedList.size()));
                holder.binding.pinnedPrev.setOnClickListener(v -> {
                    int position = holder.getBindingAdapterPosition();
                    if (position < 0) return;
                    int newIndex = status.pinnedIndex - 1;
                    if (newIndex < 0) newIndex = status.pinnedList.size() - 1;
                    Status newPinned = status.pinnedList.get(newIndex);
                    newPinned.pinnedIndex = newIndex;
                    newPinned.pinnedList = status.pinnedList;
                    statusList.set(position, newPinned);
                    adapter.notifyItemChanged(position);
                });
                holder.binding.pinnedNext.setOnClickListener(v -> {
                    int position = holder.getBindingAdapterPosition();
                    if (position < 0) return;
                    int newIndex = status.pinnedIndex + 1;
                    if (newIndex >= status.pinnedList.size()) newIndex = 0;
                    Status newPinned = status.pinnedList.get(newIndex);
                    newPinned.pinnedIndex = newIndex;
                    newPinned.pinnedList = status.pinnedList;
                    statusList.set(position, newPinned);
                    adapter.notifyItemChanged(position);
                });
            } else {
                holder.binding.pinnedNavigation.setVisibility(View.GONE);
            }
        } else {
            holder.binding.statusPinned.setVisibility(View.GONE);
            holder.binding.pinnedNavigation.setVisibility(View.GONE);
        }

        holder.binding.toggleTruncate.setVisibility(View.GONE);
+15 −12
Original line number Diff line number Diff line
@@ -1393,10 +1393,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
                                                .observe(getViewLifecycleOwner(), otherStatuses -> {
                                                    if (otherStatuses != null && otherStatuses.statuses != null) {
                                                        if (pinnedStatuses != null && pinnedStatuses.statuses != null) {
                                                            for (Status status : pinnedStatuses.statuses) {
                                                                status.pinned = true;
                                                            }
                                                            otherStatuses.statuses.addAll(0, pinnedStatuses.statuses);
                                                            addPinnedCarousel(pinnedStatuses.statuses, otherStatuses);
                                                        }
                                                    }
                                                    initializeStatusesCommonView(otherStatuses);
@@ -1594,10 +1591,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
                        .observe(getViewLifecycleOwner(), pinnedStatuses -> accountsVM.getAccountStatuses(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, accountId, null, null, null, exclude_replies, exclude_reblogs, media_only, false, tagged, MastodonHelper.statusesPerCall(requireActivity()))
                                .observe(getViewLifecycleOwner(), otherStatuses -> {
                                    if (otherStatuses != null && otherStatuses.statuses != null && pinnedStatuses != null && pinnedStatuses.statuses != null) {
                                        for (Status status : pinnedStatuses.statuses) {
                                            status.pinned = true;
                                        }
                                        otherStatuses.statuses.addAll(0, pinnedStatuses.statuses);
                                        addPinnedCarousel(pinnedStatuses.statuses, otherStatuses);
                                        initializeStatusesCommonView(otherStatuses);
                                    }
                                }));
@@ -1612,10 +1606,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
                            .observe(getViewLifecycleOwner(), otherStatuses -> {
                                if (otherStatuses != null && otherStatuses.statuses != null) {
                                    if (pinnedStatuses != null && pinnedStatuses.statuses != null) {
                                        for (Status status : pinnedStatuses.statuses) {
                                            status.pinned = true;
                                        }
                                        otherStatuses.statuses.addAll(0, pinnedStatuses.statuses);
                                        addPinnedCarousel(pinnedStatuses.statuses, otherStatuses);
                                    }
                                    initializeStatusesCommonView(otherStatuses);
                                }
@@ -1637,6 +1628,18 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter.
        }
    }

    private void addPinnedCarousel(List<Status> pinnedList, Statuses otherStatuses) {
        if (pinnedList.isEmpty()) {
            return;
        }
        for (Status status : pinnedList) {
            status.pinned = true;
            status.pinnedList = pinnedList;
        }
        pinnedList.get(0).pinnedIndex = 0;
        otherStatuses.statuses.add(0, pinnedList.get(0));
    }

    @Override
    public void onClickMinId(String min_id, Status fetchStatus) {
        //Fetch more has been pressed
+45 −2
Original line number Diff line number Diff line
@@ -231,11 +231,11 @@
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_gravity="top"
                tools:visibility="visible"
                android:scaleType="centerInside"
                android:contentDescription="@string/pinned"
                android:src="@drawable/ic_baseline_push_pin_24"
                android:visibility="gone" />
                android:visibility="gone"
                tools:visibility="visible" />

            <androidx.appcompat.widget.AppCompatImageView
                android:id="@+id/type_of_notification"
@@ -955,6 +955,49 @@
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <androidx.appcompat.widget.LinearLayoutCompat
            android:id="@+id/pinned_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="horizontal"
            android:paddingHorizontal="12dp"
            android:paddingVertical="8dp"
            android:visibility="gone"
            tools:visibility="visible">

            <com.google.android.material.button.MaterialButton
                android:id="@+id/pinned_prev"
                style="@style/Widget.Material3.Button.IconButton.Outlined"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:contentDescription="@string/previous"
                app:icon="@drawable/ic_navigate_before"
                app:iconTint="?colorPrimary" />

            <androidx.appcompat.widget.AppCompatTextView
                android:id="@+id/pinned_counter"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginHorizontal="8dp"
                android:layout_weight="1"
                android:gravity="center"
                android:textColor="?colorPrimary"
                android:textSize="14sp"
                android:textStyle="bold"
                tools:text="1/3" />

            <com.google.android.material.button.MaterialButton
                android:id="@+id/pinned_next"
                style="@style/Widget.Material3.Button.IconButton.Outlined"
                android:layout_width="48dp"
                android:layout_height="48dp"
                android:contentDescription="@string/next"
                app:icon="@drawable/ic_navigate_next"
                app:iconTint="?colorPrimary" />

        </androidx.appcompat.widget.LinearLayoutCompat>

    </androidx.appcompat.widget.LinearLayoutCompat>

</com.google.android.material.card.MaterialCardView>