Add favorite reaction in right place + fix issues

This commit is contained in:
Jacocococo 2024-08-19 17:04:47 +02:00
parent 3266a490be
commit 1ad2257bb1
3 changed files with 30 additions and 8 deletions

View file

@ -281,7 +281,6 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
reactions.updateReactions(ev.reactions);
}
}
n.status.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));

View file

@ -292,7 +292,6 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
reactions.updateReactions(ev.reactions);
}
}
s.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));

View file

@ -47,6 +47,8 @@ import org.joinmastodon.android.ui.utils.TextDrawable;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.EmojiReactionButton;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
@ -69,6 +71,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
private final boolean hideEmpty, forAnnouncement, playGifs;
private final String accountID;
private static final float ALPHA_DISABLED=0.55f;
private boolean forceShow=false;
public EmojiReactionsStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status, String accountID, boolean hideEmpty, boolean forAnnouncement) {
super(parentID, parentFragment);
@ -97,6 +100,10 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
}
public boolean isHidden(){
if(forceShow){
forceShow=false;
return false;
}
return status.reactions.isEmpty() && hideEmpty;
}
@ -325,11 +332,14 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
}
public void updateReactions(List<EmojiReaction> reactions){
item.status.reactions=new ArrayList<>(item.status.reactions); // I don't know how, but this seemingly fixes a bug
List<EmojiReaction> toRemove=new ArrayList<>();
for(int i=0;i<item.status.reactions.size();i++){
EmojiReaction reaction=item.status.reactions.get(i);
Optional<EmojiReaction> newReactionOptional=reactions.stream().filter(r->r.name.equals(reaction.name)).findFirst();
if(newReactionOptional.isEmpty()){ // deleted reactions
adapter.notifyItemRemoved(i);
toRemove.add(reaction);
continue;
}
@ -343,25 +353,39 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
item.setActionProgressVisible(reactionHolder, true);
}
}else{
item.status.reactions.set(i, newReaction);
adapter.notifyItemChanged(i);
}
}
}
Collections.reverse(toRemove);
for(EmojiReaction r:toRemove){
int index=item.status.reactions.indexOf(r);
item.status.reactions.remove(index);
adapter.notifyItemRemoved(index);
}
boolean pendingAddReaction=false;
for(EmojiReaction reaction:reactions){
for(int i=0;i<reactions.size();i++){
EmojiReaction reaction=reactions.get(i);
if(item.status.reactions.stream().anyMatch(r->r.name.equals(reaction.name)))
continue;
// new reactions
if(reaction.pendingChange){
pendingAddReaction=true;
item.forceShow=true;
continue;
}
int pos=item.status.reactions.size();
item.status.reactions.add(pos, reaction);
adapter.notifyItemInserted(pos);
boolean previouslyEmpty=item.status.reactions.isEmpty();
item.status.reactions.add(i, reaction);
if(previouslyEmpty)
adapter.notifyItemChanged(i);
else
adapter.notifyItemInserted(i);
RecyclerView.SmoothScroller scroller=new LinearSmoothScroller(list.getContext());
scroller.setTargetPosition(pos);
scroller.setTargetPosition(i);
list.getLayoutManager().startSmoothScroll(scroller);
}
if(pendingAddReaction){