Skip to content

Commit 8571305

Browse files
committed
users can now delete their own posts + fixes auth issues with create feed post view
1 parent e3550a3 commit 8571305

File tree

6 files changed

+109
-27
lines changed

6 files changed

+109
-27
lines changed

app/src/main/java/com/fastcomments/FeedExampleActivity.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ protected void onCreate(Bundle savedInstanceState) {
6262

6363
// Initialize the Feed SDK
6464
feedSDK = new FastCommentsFeedSDK(config);
65-
66-
// Set user info for the example
67-
UserSessionInfo userInfo = new UserSessionInfo();
68-
userInfo.setDisplayName("Example User");
69-
userInfo.setAvatarSrc("https://staticm.fastcomments.com/1639362726066-DSC_0841.JPG");
70-
feedSDK.setCurrentUser(userInfo);
7165

7266
// Find the feed view in the layout
7367
feedView = findViewById(R.id.feedView);
@@ -182,9 +176,7 @@ private void setupPostCreationView() {
182176
// Set FAB click listener
183177
createPostFab.setOnClickListener(v -> {
184178
// Configure post creation view and prepare it for showing
185-
postCreateView.setVisibility(View.VISIBLE);
186-
postCreateView.setClickable(true);
187-
postCreateView.setEnabled(true);
179+
postCreateView.show();
188180
createPostFab.setVisibility(View.GONE);
189181

190182
// Apply animation to slide it down

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ activityCompose = "1.8.0"
1010
composeBom = "2024.04.01"
1111
appcompat = "1.7.0"
1212
material = "1.12.0"
13-
fastcomments = "0.0.11"
13+
fastcomments = "0.0.18"
1414
constraintlayout = "2.1.4"
1515
swiperefreshlayout = "1.1.0"
1616

libraries/sdk/src/main/java/com/fastcomments/sdk/FastCommentsFeedSDK.java

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ private void loadFeedPosts(FCCallback<PublicFeedPostsResponse> callback) {
288288
api.getFeedPostsPublic(config.tenantId)
289289
.afterId(lastPostId)
290290
.limit(pageSize)
291-
.sso(config.sso)
291+
.sso(config.getSSOToken())
292292
.includeUserInfo(lastPostId == null) // only include for initial req
293293
.executeAsync(new ApiCallback<GetFeedPostsPublic200Response>() {
294294
@Override
@@ -547,7 +547,7 @@ public void likePost(String postId, FCCallback<FeedPost> callback) {
547547
reactParams.reactType("l");
548548

549549
api.reactFeedPostPublic(config.tenantId, postId, reactParams)
550-
.sso(config.sso)
550+
.sso(config.getSSOToken())
551551
.isUndo(isUndo)
552552
.executeAsync(new ApiCallback<ReactFeedPostPublic200Response>() {
553553
@Override
@@ -926,7 +926,7 @@ public void createPost(CreateFeedPostParams params, FCCallback<FeedPost> callbac
926926

927927
api.createFeedPostPublic(config.tenantId, params)
928928
.broadcastId(broadcastId)
929-
.sso(config.sso)
929+
.sso(config.getSSOToken())
930930
.executeAsync(new ApiCallback<CreateFeedPostPublic200Response>() {
931931
@Override
932932
public void onFailure(ApiException e, int statusCode, Map<String, List<String>> responseHeaders) {
@@ -1038,9 +1038,13 @@ private void handleLiveEvent(LiveEvent eventData) {
10381038
}
10391039

10401040
mainHandler.post(() -> {
1041-
// Ignore other event types for now
1041+
// Handle different types of live events
10421042
if (eventType == NEW_FEED_POST) {
10431043
handleNewFeedPost(eventData);
1044+
} else if (eventType == LiveEventType.DELETED_FEED_POST) {
1045+
handleDeletedFeedPost(eventData);
1046+
} else if (eventType == LiveEventType.UPDATED_FEED_POST) {
1047+
handleUpdatedFeedPost(eventData);
10441048
}
10451049
});
10461050
} catch (Exception e) {
@@ -1099,7 +1103,7 @@ public void getFeedPostsStats(List<String> postIds, FCCallback<GetFeedPostsStats
10991103

11001104
try {
11011105
api.getFeedPostsStats(config.tenantId, postIds)
1102-
.sso(config.sso)
1106+
.sso(config.getSSOToken())
11031107
.executeAsync(new ApiCallback<GetFeedPostsStats200Response>() {
11041108
@Override
11051109
public void onFailure(ApiException e, int statusCode, Map<String, List<String>> responseHeaders) {
@@ -1167,15 +1171,50 @@ private void handleDeletedFeedPost(LiveEvent eventData) {
11671171

11681172
// Get the feed post ID from the event
11691173
String postId = eventData.getFeedPost().getId();
1174+
boolean wasRemoved = false;
11701175

11711176
// Remove the post from our list if it exists
11721177
for (int i = 0; i < feedPosts.size(); i++) {
11731178
FeedPost post = feedPosts.get(i);
1174-
if (post.getId() != null && post.getId().equals(postId)) {
1179+
if (post != null && post.getId() != null && post.getId().equals(postId)) {
11751180
feedPosts.remove(i);
1181+
// Also remove from our lookup maps
1182+
postsById.remove(postId);
1183+
likeCounts.remove(postId);
1184+
wasRemoved = true;
1185+
// Break after removing to avoid index issues
11761186
break;
11771187
}
11781188
}
1189+
1190+
if (wasRemoved) {
1191+
// Log deletion for debugging
1192+
Log.d("FastCommentsFeedSDK", "Post with ID " + postId + " was deleted via live event");
1193+
1194+
// Notify any callback listeners about the post deletion
1195+
// This allows the UI to update when a post is deleted by someone else
1196+
if (onPostDeletedListener != null) {
1197+
onPostDeletedListener.onPostDeleted(postId);
1198+
}
1199+
}
1200+
}
1201+
1202+
/**
1203+
* Interface for notifying when a post is deleted via live event
1204+
*/
1205+
public interface OnPostDeletedListener {
1206+
void onPostDeleted(String postId);
1207+
}
1208+
1209+
private OnPostDeletedListener onPostDeletedListener;
1210+
1211+
/**
1212+
* Set a listener to be notified when posts are deleted via live events
1213+
*
1214+
* @param listener The listener to notify
1215+
*/
1216+
public void setOnPostDeletedListener(OnPostDeletedListener listener) {
1217+
this.onPostDeletedListener = listener;
11791218
}
11801219

11811220
/**
@@ -1231,7 +1270,7 @@ public void deleteFeedPost(String postId, FCCallback<APIEmptyResponse> callback)
12311270

12321271
try {
12331272
api.deleteFeedPostPublic(config.tenantId, postId)
1234-
.sso(config.sso)
1273+
.sso(config.getSSOToken())
12351274
.executeAsync(new ApiCallback<DeleteFeedPostPublic200Response>() {
12361275
@Override
12371276
public void onFailure(ApiException e, int statusCode, Map<String, List<String>> responseHeaders) {

libraries/sdk/src/main/java/com/fastcomments/sdk/FastCommentsFeedView.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,18 @@ public void setSDK(FastCommentsFeedSDK sdk) {
274274
if (adapter == null) {
275275
initAdapter(getContext());
276276
}
277+
278+
// Register for post deletion events from live WebSocket
279+
sdk.setOnPostDeletedListener(postId -> {
280+
handler.post(() -> {
281+
// Update adapter with the current list from SDK
282+
// This ensures the adapter's list is in sync with the SDK after a post is deleted
283+
adapter.updatePosts(sdk.getFeedPosts());
284+
285+
// Log for debugging
286+
Log.d("FastCommentsFeedView", "Received post deletion event for post ID: " + postId);
287+
});
288+
});
277289
}
278290

279291
/**
@@ -904,8 +916,9 @@ public boolean onSuccess(APIEmptyResponse response) {
904916
android.widget.Toast.LENGTH_SHORT
905917
).show();
906918

907-
// Update adapter - removal happens in the SDK
908-
adapter.notifyDataSetChanged();
919+
// Update adapter with the current list from SDK
920+
// This ensures the adapter's internal list matches the SDK's list
921+
adapter.updatePosts(sdk.getFeedPosts());
909922
});
910923
return CONSUME;
911924
}

libraries/sdk/src/main/java/com/fastcomments/sdk/FeedPostCreateView.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,15 +172,22 @@ public void afterTextChanged(Editable s) {
172172
linkPreviewContainer.setVisibility(GONE);
173173
postErrorTextView.setVisibility(GONE);
174174
postProgressBar.setVisibility(GONE);
175+
176+
// Set current user info if available
177+
if (sdk != null && sdk.getCurrentUser() != null) {
178+
UserSessionInfo userInfo = sdk.getCurrentUser();
179+
setCurrentUser(userInfo);
180+
} else {
181+
// Default state for anonymous user
182+
formUserNameTextView.setText(R.string.anonymous);
183+
AvatarFetcher.fetchTransformInto(getContext(), R.drawable.default_avatar, formAvatarImageView);
184+
}
175185
}
176186

177-
/**
178-
* Set the SDK instance
179-
*
180-
* @param sdk FastCommentsFeedSDK instance
181-
*/
182-
public void setSDK(FastCommentsFeedSDK sdk) {
183-
this.sdk = sdk;
187+
public void show() {
188+
setVisibility(View.VISIBLE);
189+
setClickable(true);
190+
setEnabled(true);
184191

185192
// Set current user info if available
186193
if (sdk != null && sdk.getCurrentUser() != null) {
@@ -193,6 +200,15 @@ public void setSDK(FastCommentsFeedSDK sdk) {
193200
}
194201
}
195202

203+
/**
204+
* Set the SDK instance
205+
*
206+
* @param sdk FastCommentsFeedSDK instance
207+
*/
208+
public void setSDK(FastCommentsFeedSDK sdk) {
209+
this.sdk = sdk;
210+
}
211+
196212
/**
197213
* Set the listener for post creation events
198214
*
@@ -212,6 +228,8 @@ private void setCurrentUser(UserSessionInfo userInfo) {
212228
// Set user name
213229
if (userInfo.getDisplayName() != null && !userInfo.getDisplayName().isEmpty()) {
214230
formUserNameTextView.setText(userInfo.getDisplayName());
231+
} else if(userInfo.getUsername() != null && !userInfo.getUsername().isEmpty()) {
232+
formUserNameTextView.setText(userInfo.getUsername());
215233
} else {
216234
formUserNameTextView.setText(R.string.anonymous);
217235
}

libraries/sdk/src/main/java/com/fastcomments/sdk/FeedPostsAdapter.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.content.Context;
44
import android.text.Html;
55
import android.text.format.DateUtils;
6+
import android.util.Log;
67
import android.view.LayoutInflater;
78
import android.view.View;
89
import android.view.ViewGroup;
@@ -31,6 +32,7 @@
3132
import java.time.OffsetDateTime;
3233
import java.time.format.DateTimeFormatter;
3334
import java.time.format.FormatStyle;
35+
import java.util.ArrayList;
3436
import java.util.List;
3537
import java.util.Locale;
3638

@@ -162,11 +164,29 @@ public int getItemCount() {
162164
return feedPosts.size();
163165
}
164166

167+
/**
168+
* Updates the adapter with a new list of posts
169+
* This is called when posts are added, removed, or changed
170+
*
171+
* @param newPosts The new list of posts to display
172+
*/
165173
public void updatePosts(List<FeedPost> newPosts) {
174+
if (newPosts == null) {
175+
return;
176+
}
177+
178+
// Create a new ArrayList to avoid reference issues
179+
List<FeedPost> updatedPosts = new ArrayList<>(newPosts);
180+
181+
// Clear and update the adapter's internal list
166182
this.feedPosts.clear();
167-
this.feedPosts.addAll(newPosts);
183+
this.feedPosts.addAll(updatedPosts);
184+
185+
// Notify adapter that all data has changed
168186
notifyDataSetChanged();
169187

188+
// Log the update for debugging
189+
Log.d("FeedPostsAdapter", "Updated posts list with " + updatedPosts.size() + " posts");
170190
}
171191

172192

0 commit comments

Comments
 (0)