From 387b31193f9b3c9b0d2c851789b1b4603fa43cd4 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 19 Oct 2023 21:42:17 +0200 Subject: [PATCH] hopefully unfuck removing statuses and reblogs --- .../android/fragments/StatusListFragment.java | 96 ++++++++++++------- .../joinmastodon/android/model/Status.java | 4 + .../ui/displayitems/StatusDisplayItem.java | 2 +- .../android/ui/utils/UiUtils.java | 3 - 4 files changed, 65 insertions(+), 40 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusListFragment.java index 8e0e2cc5e1..2175c9abed 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/StatusListFragment.java @@ -9,6 +9,7 @@ import org.joinmastodon.android.E; import org.joinmastodon.android.GlobalUserPreferences; +import org.joinmastodon.android.api.CacheController; import org.joinmastodon.android.api.session.AccountLocalPreferences; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent; @@ -31,6 +32,10 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.function.BiPredicate; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -176,56 +181,71 @@ protected void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){ } } - private void iterateRemoveStatus(List l, String id){ - Iterator it=l.iterator(); - while(it.hasNext()){ - if(it.next().getContentStatus().id.equals(id)){ - it.remove(); - } - } - } - - private void removeStatusDisplayItems(Status status, int index, int ancestorFirstIndex, int ancestorLastIndex, boolean deleteContent){ + private boolean removeStatusDisplayItems(String parentID, int firstIndex, int ancestorFirstIndex, int ancestorLastIndex){ // did we find an ancestor that is also the status' neighbor? - if(ancestorFirstIndex>=0 && ancestorLastIndex==index-1){ - for(int i=ancestorFirstIndex; i<=ancestorLastIndex; i++){ - StatusDisplayItem item=displayItems.get(i); - String id=deleteContent ? item.getContentID() : item.parentID; - // update ancestor to have no descendant anymore - if(id.equals(status.inReplyToId)) item.hasDescendantNeighbor=false; - } + if(ancestorFirstIndex>=0 && ancestorLastIndex==firstIndex-1){ + // update ancestor to have no descendant anymore + displayItems.subList(ancestorFirstIndex, ancestorLastIndex+1).forEach(i->i.hasDescendantNeighbor=false); adapter.notifyItemRangeChanged(ancestorFirstIndex, ancestorLastIndex-ancestorFirstIndex+1); } - if(index==-1) return; - int lastIndex; - for(lastIndex=index;lastIndex isToBeRemovedReblog=item->item!=null && item.reblog!=null + && item.reblog.id.equals(status.reblog.id) + && asm.isSelf(accountID, item.account); + final BiPredicate> isToBeRemovedContent=(parentId, contentIdSupplier)-> + parentId.equals(status.id) || contentIdSupplier.get().equals(status.id); + int ancestorFirstIndex=-1, ancestorLastIndex=-1; for(int i=0;i> removeStatusFromData=(list)->{ + Iterator it=list.iterator(); + while(it.hasNext()){ + Status s=it.next(); + if(unReblogging + ? isToBeRemovedReblog.test(s) + : isToBeRemovedContent.test(s.id, s::getContentStatusID)){ + it.remove(); + cache.deleteStatus(s.id); + } + } + }; + removeStatusFromData.accept(data); + removeStatusFromData.accept(preloadedData); } @Override @@ -296,10 +316,14 @@ public void onStatusDeleted(StatusDeletedEvent ev){ @Subscribe public void onReblogDeleted(ReblogDeletedEvent ev){ + AccountSessionManager asm=AccountSessionManager.getInstance(); if(!ev.accountID.equals(accountID)) return; for(Status item : data){ - if(item.getContentStatus().id.equals(ev.statusID) && item.reblog!=null){ + boolean itemIsOwnReblog=item.reblog!=null + && item.getContentStatusID().equals(ev.statusID) + && asm.isSelf(accountID, item.account); + if(itemIsOwnReblog){ removeStatus(item); break; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java index 1a67ad6597..eb13a43fcd 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java @@ -195,6 +195,10 @@ public Status getContentStatus(){ return reblog!=null ? reblog : this; } + public String getContentStatusID(){ + return getContentStatus().id; + } + public String getStrippedText(){ if(strippedText==null) strippedText=HtmlParser.strip(content); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 31f3b84258..71bfdf54f8 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -89,7 +89,7 @@ public StatusDisplayItem(String parentID, BaseStatusListFragment parentFragme } @NonNull - public String getContentID(){ + public String getContentStatusID(){ if(parentFragment instanceof StatusListFragment slf){ Status s=slf.getContentStatusByID(parentID); return s!=null ? s.id : parentID; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 29210f2f37..325618145c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -638,11 +638,8 @@ public static void confirmDeletePost(Activity activity, String accountID, Status @Override public void onSuccess(Status result) { resultCallback.accept(result); - CacheController cache=AccountSessionManager.get(accountID).getCacheController(); - cache.deleteStatus(s.id); E.post(new StatusDeletedEvent(s.id, accountID)); if(status!=s){ - cache.deleteStatus(status.id); E.post(new StatusDeletedEvent(status.id, accountID)); } }