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 8c00be2284..8d9b5ec370 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -8,10 +8,14 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import org.joinmastodon.android.E; import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.api.requests.markers.SaveMarkers; import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline; import org.joinmastodon.android.api.session.AccountSessionManager; +import org.joinmastodon.android.events.StatusCountersUpdatedEvent; +import org.joinmastodon.android.events.StatusDeletedEvent; +import org.joinmastodon.android.events.StatusUpdatedEvent; import org.joinmastodon.android.model.CacheablePaginatedResponse; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.Status; @@ -23,9 +27,11 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import me.grishka.appkit.api.Callback; @@ -58,6 +64,7 @@ protected void doLoadData(int offset, int count){ public void onSuccess(CacheablePaginatedResponse> result){ if(getActivity()==null) return; boolean empty=result.items.isEmpty(); + if(result.isFromCache()) refreshData(result.items); maxID=result.maxID; AccountSessionManager.get(accountID).filterStatuses(result.items, getFilterContext()); onDataLoaded(result.items, !empty); @@ -67,6 +74,29 @@ public void onSuccess(CacheablePaginatedResponse> result){ }); } + private void refreshData(List cachedList){ + new GetHomeTimeline(maxID, null, cachedList.size(), null, getSession().getLocalPreferences().timelineReplyVisibility).setCallback(new Callback<>(){ + @Override + public void onSuccess(List result){ + Map refreshed=result.stream().collect(Collectors.toMap(Status::getID, Function.identity())); + for(Status cached : cachedList){ + if(refreshed.containsKey(cached.id)){ + Status updated=refreshed.get(cached.id); + if(updated.editedAt!=null && cached.editedAt!=null && updated.editedAt.isAfter(cached.editedAt)) + E.post(new StatusUpdatedEvent(updated)); + else + E.post(new StatusCountersUpdatedEvent(updated)); + }else{ + E.post(new StatusDeletedEvent(cached.id, accountID)); + } + } + } + + @Override + public void onError(ErrorResponse ignored){} + }).exec(accountID); + } + @Override public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState);