Loading app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +29 −0 Original line number Diff line number Diff line Loading @@ -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); Loading app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java +15 −12 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } })); Loading @@ -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); } Loading @@ -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 Loading app/src/main/res/layouts/mastodon/layout/drawer_status.xml +45 −2 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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> Loading
app/src/main/java/app/fedilab/android/mastodon/client/entities/api/Status.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +29 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java +15 −12 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } })); Loading @@ -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); } Loading @@ -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 Loading
app/src/main/res/layouts/mastodon/layout/drawer_status.xml +45 −2 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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>