From 50e313cff01a5cb801f672bd3bf2524bd8d29693 Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 13 Oct 2023 02:22:03 +0200 Subject: [PATCH] fix gap max_id when post before gap is filtered hopefully fixes sk22#856 --- .../android/api/CacheController.java | 5 +++-- .../android/api/session/AccountSession.java | 4 ++-- .../android/fragments/HomeTimelineFragment.java | 17 +++++++++-------- .../org/joinmastodon/android/model/Status.java | 2 +- .../ui/displayitems/GapStatusDisplayItem.java | 4 ++++ .../ui/displayitems/StatusDisplayItem.java | 2 +- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java index cc65eb682..0a743a13a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; import me.grishka.appkit.api.Callback; @@ -69,7 +70,7 @@ public class CacheController{ Status status=MastodonAPIController.gson.fromJson(cursor.getString(0), Status.class); status.postprocess(); int flags=cursor.getInt(1); - status.hasGapAfter=((flags & POST_FLAG_GAP_AFTER)!=0); + status.hasGapAfter=((flags & POST_FLAG_GAP_AFTER)!=0) ? status.id : null; newMaxID=status.id; result.add(status); }while(cursor.moveToNext()); @@ -113,7 +114,7 @@ public class CacheController{ values.put("id", s.id); values.put("json", MastodonAPIController.gson.toJson(s)); int flags=0; - if(s.hasGapAfter) + if(Objects.equals(s.hasGapAfter, s.id)) flags|=POST_FLAG_GAP_AFTER; values.put("flags", flags); values.put("time", s.createdAt.getEpochSecond()); diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java index 14ce14612..e75b5c6d4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java @@ -280,14 +280,14 @@ public class AccountSession{ if(filterStatusContainingObject(o, extractor, context, profile)){ Status s=extractor.apply(o); removeUs.add(o); - if(s!=null && s.hasGapAfter && i>0){ + if(s!=null && s.hasGapAfter!=null && i>0){ // oops, we're about to remove an item that has a gap after... // gotta find the previous status that's not also about to be removed for(int j=i-1; j>=0; j--){ T p=objects.get(j); Status prev=extractor.apply(objects.get(j)); if(prev!=null && !removeUs.contains(p)){ - prev.hasGapAfter=true; + prev.hasGapAfter=s.hasGapAfter; break; } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java index b15f03733..4af622235 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -140,7 +140,7 @@ public class HomeTimelineFragment extends StatusListFragment { if(!data.isEmpty() && last.id.equals(data.get(0).id)){ // This part intersects with the existing one toAdd=new ArrayList<>(result.subList(0, result.size()-1)); // Remove the already known last post }else{ - result.get(result.size()-1).hasGapAfter=true; + last.hasGapAfter=last.id; toAdd=result; } List existingIds=data.stream().map(Status::getID).collect(Collectors.toList()); @@ -176,10 +176,10 @@ public class HomeTimelineFragment extends StatusListFragment { gap.loading=true; dataLoading=true; - String maxID = null; - String minID = null; + String maxID=null; + String minID=null; if (downwards) { - maxID = item.getItemID(); + maxID=item.getItem().getMaxID(); } else { int gapPos=displayItems.indexOf(gap); StatusDisplayItem nextItem=displayItems.get(gapPos + 1); @@ -202,7 +202,7 @@ public class HomeTimelineFragment extends StatusListFragment { adapter.notifyItemRemoved(getMainAdapterOffset()+gapPos); Status gapStatus=getStatusByID(gap.parentID); if(gapStatus!=null){ - gapStatus.hasGapAfter=false; + gapStatus.hasGapAfter=null; AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putHomeTimeline(Collections.singletonList(gapStatus), false); } }else{ @@ -215,7 +215,7 @@ public class HomeTimelineFragment extends StatusListFragment { idsBelowGap.add(s.id); }else if(s.id.equals(gap.parentID)){ belowGap=true; - s.hasGapAfter=false; + s.hasGapAfter=null; AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putHomeTimeline(Collections.singletonList(s), false); }else{ gapPostIndex++; @@ -228,7 +228,8 @@ public class HomeTimelineFragment extends StatusListFragment { break; } if(endIndex==result.size()){ - result.get(result.size()-1).hasGapAfter=true; + Status last=result.get(result.size()-1); + last.hasGapAfter=last.id; }else{ result=result.subList(0, endIndex); } @@ -273,7 +274,7 @@ public class HomeTimelineFragment extends StatusListFragment { .filter(s->Objects.equals(s.id, gap.parentID)) .findFirst(); if (gapStatus.isPresent()) { - gapStatus.get().hasGapAfter=false; + gapStatus.get().hasGapAfter=null; AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putHomeTimeline(Collections.singletonList(gapStatus.get()), false); } targetList.clear(); 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 3ac230424..1e5bf017e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java @@ -100,7 +100,7 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{ public transient boolean spoilerRevealed; public transient boolean sensitiveRevealed; public transient boolean textExpanded, textExpandable; - public transient boolean hasGapAfter; + public transient String hasGapAfter; private transient String strippedText; public transient TranslationState translationState=TranslationState.HIDDEN; public transient Translation translation; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/GapStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/GapStatusDisplayItem.java index c5769f6c3..718263dd9 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/GapStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/GapStatusDisplayItem.java @@ -25,6 +25,10 @@ public class GapStatusDisplayItem extends StatusDisplayItem{ this.status=status; } + public String getMaxID(){ + return status.hasGapAfter; + } + @Override public Type getType(){ return Type.GAP; 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 6455fa82b..eed67ed73 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 @@ -293,7 +293,7 @@ public abstract class StatusDisplayItem{ footer=new FooterStatusDisplayItem(parentID, fragment, statusForContent, accountID); footer.hideCounts=hideCounts; items.add(footer); - if(status.hasGapAfter && !(fragment instanceof ThreadFragment)) + if(status.hasGapAfter!=null && !(fragment instanceof ThreadFragment)) items.add(new GapStatusDisplayItem(parentID, fragment, status)); } int i=1;