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..fb6ca60 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 @@ -64,7 +64,7 @@ userResource = retrofit.create(UserResource.class); friendToActivitiesLiveData = new HashMap<>(); - friendUserIdsLiveData = new MutableLiveData<>(List.of()); + friendUserIdsLiveData = new MutableLiveData<>(new ArrayList<>()); myLatestActivityLiveData = new MutableLiveData<>(null); userActivityStatusChangeListeners = new ArrayList<>(); @@ -109,8 +109,9 @@ }); // 自分のフレンドの最新のアクティビティを取得して更新する - if (friendUserIdsLiveData.isInitialized() && friendUserIdsLiveData.getValue() != null) { - for (String userId : friendUserIdsLiveData.getValue()) { + List friendUserIds = friendUserIdsLiveData.getValue(); + if (friendUserIds != null) { + for (String userId : friendUserIds) { pullLatestActivity(userId, activitiesResource, new ActivityFetchCallback() { @Override public void onSuccess(Activity activity) { @@ -119,17 +120,14 @@ @Override public void onFailure(Throwable throwable) { - Log.e(ActivityViewModel.class.getSimpleName(), "An error has occurred while fetching friend's latest activity.", throwable); + Log.e(ActivityViewModel.class.getSimpleName(), "An error has occurred while fetching friend's latest activity for " + userId, throwable); } }); } } - if (friendUserIdsLiveData.isInitialized()) { - // 最新のフレンドのユーザーIDを取得して更新する - // TODO: 適切なコールバックを使う必要あり - pullLatestFriendUserIds(myUserId, myToken); - } + // 最新のフレンドのユーザーIDを取得して更新する + pullLatestFriendUserIds(myUserId, myToken); }; } @@ -141,7 +139,7 @@ */ private void updateFriendToActivitiesLiveData(Activity latestActivity, String userId) { if (friendToActivitiesLiveData.get(userId) == null) { - friendToActivitiesLiveData.put(userId, new MutableLiveData<>(List.of())); + friendToActivitiesLiveData.put(userId, new MutableLiveData<>(new ArrayList<>())); } MutableLiveData> userActivitiesLiveData = friendToActivitiesLiveData.get(userId); assert userActivitiesLiveData != null; @@ -151,7 +149,8 @@ if (userActivities == null || userActivities.isEmpty()) { userActivitiesLiveData.postValue(List.of(latestActivity)); } else { - if (userActivities.get(0).getActivityId().equals(latestActivity.getActivityId())) { + // 内容が同じなら更新しない(不要なUI更新を避ける) + if (userActivities.get(0).getText().equals(latestActivity.getText())) { return; } @@ -167,10 +166,6 @@ * @param newActivity 新しいアクティビティのテキスト */ public void createActivity(String userId, String token, String newActivity) { - if (!myLatestActivityLiveData.isInitialized()) { - return; - } - Call createActivityCall = activitiesResource.addActivity(userId, token, newActivity); createActivityCall.enqueue(new Callback() { @Override @@ -218,7 +213,7 @@ fetchActivityCall.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { - if (response.isSuccessful()) { + if (response.isSuccessful() && response.body() != null) { Collection activities = response.body().values(); // アクティビティが存在しない場合は空のリスト if (activities == null || activities.isEmpty()) { return; @@ -261,28 +256,20 @@ @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful()) { - - // MEMO: 入れ込んだだけ - // フレンドのIDをアクティビティ更新順に並べ替える - List friendUserIds = friendUserIdsLiveData.getValue(); - if (friendUserIds == null || !friendUserIds.equals(response.body())) { - friendUserIdsLiveData.postValue(response.body()); + List friendUserIds = response.body(); + if (friendUserIds != null && !friendUserIds.equals(friendUserIdsLiveData.getValue())) { + friendUserIdsLiveData.postValue(friendUserIds); + + // 並び替えロジック SortedSet friends = new TreeSet<>(new Friend.UpdateTimeComparator()); - - assert friendUserIds != null; - friendUserIds.forEach(userId -> { - List activities = getActivitiesLiveDataFromUserId(userId).getValue(); - if (activities == null || activities.isEmpty()) { - return; + for (String id : friendUserIds) { + MutableLiveData> ld = friendToActivitiesLiveData.get(id); + if (ld != null && ld.getValue() != null && !ld.getValue().isEmpty()) { + friends.add(new Friend(id, ld.getValue().get(0).getUpdateTime())); } - - Activity latestActivity = activities.get(0); - friends.add(new Friend(userId, latestActivity.getUpdateTime())); - }); - - // 並び替えたフレンドのユーザーIDを順番に格納して更新する + } sortedFriendUserIds.clear(); - friends.forEach(friend -> sortedFriendUserIds.add(friend.getUserId())); + friends.forEach(f -> sortedFriendUserIds.add(f.getUserId())); } } } @@ -306,7 +293,7 @@ */ public MutableLiveData> getActivitiesLiveDataFromUserId(String userId) { if (!friendToActivitiesLiveData.containsKey(userId)) { - friendToActivitiesLiveData.put(userId, new MutableLiveData<>()); + friendToActivitiesLiveData.put(userId, new MutableLiveData<>(new ArrayList<>())); } return friendToActivitiesLiveData.get(userId); } @@ -355,7 +342,7 @@ public static class UpdateTimeComparator implements Comparator { @Override public int compare(Friend o1, Friend o2) { - return o1.getLatestUpdateTime().compareTo(o2.getLatestUpdateTime()); + return o2.getLatestUpdateTime().compareTo(o1.getLatestUpdateTime()); // 降順(新しい順) } } }