diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..cc6abec 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,6 +4,14 @@ diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java index 455723a..10e914d 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java @@ -146,17 +146,30 @@ MutableLiveData> userActivitiesLiveData = friendToActivitiesLiveData.get(userId); assert userActivitiesLiveData != null; + // 常に最新のアクティビティで上書きする。 + // + // 以前は「ID・テキスト・更新時刻が完全一致している場合は更新をスキップ」することで + // LiveData の無駄な更新を抑制していたが、バックエンドの実装やデータ形式の違いにより + // 期待どおりに差分検知ができていない可能性がある。 + // + // ここでは挙動の確実性を優先し、サーバから最新アクティビティが取得できたタイミングでは + // 必ず LiveData を更新するようにする。 + // (同じ内容であっても UI 側に再通知されるだけなので副作用は小さい) + List userActivities = userActivitiesLiveData.getValue(); if (userActivities == null || userActivities.isEmpty()) { - userActivitiesLiveData.postValue(List.of(latestActivity)); + // 初回またはこれまでアクティビティが無い場合はそのまま反映 + Log.d(ActivityViewModel.class.getSimpleName(), "updateFriendToActivitiesLiveData: initial set for user=" + userId + + ", activityId=" + latestActivity.getActivityId() + ", text=" + latestActivity.getText()); } else { - if (userActivities.get(0).getActivityId().equals(latestActivity.getActivityId())) { - return; - } - - userActivitiesLiveData.postValue(List.of(latestActivity)); + Activity previousLatest = userActivities.get(0); + Log.d(ActivityViewModel.class.getSimpleName(), "updateFriendToActivitiesLiveData: overwrite for user=" + userId + + " from activityId=" + previousLatest.getActivityId() + " to activityId=" + latestActivity.getActivityId()); } + + // 最新アクティビティのみを保持するリストとして常に上書きする + userActivitiesLiveData.postValue(List.of(latestActivity)); } /** diff --git a/app/src/main/java/com/example/tampopo_client/views/MainActivity.java b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java index 9911876..3b52a93 100644 --- a/app/src/main/java/com/example/tampopo_client/views/MainActivity.java +++ b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java @@ -468,20 +468,10 @@ if (i < 6) { i++; } - - // TODO: CHANGE - activitiesLiveData.observe(MainActivity.this, activities -> { - if (activities == null || activities.isEmpty()) return; - - Activity latest = activities.get(activities.size() - 1); - - // UIスレッドで安全に更新 - FriendIconView friendView = userViews.get(friendId); - if (friendView != null) { - friendView.setComment(latest.getText()); - Log.d("ActivityUpdate", friendId + " のコメントを更新: " + latest.getText()); - } - }); + // FriendIconView 自身が持つアクティビティ監視用 Observer を利用して + // 各フレンドの最新アクティビティが更新されたタイミングで + // 吹き出しコメントが自動的に変わるようにする + activitiesLiveData.observe(MainActivity.this, container.getActivitiesObserver()); List sortedFriendUserIds = activityViewModel.getSortedFriendUserIds(); int size = sortedFriendUserIds.size();