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 08364f9..795e04d 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 @@ -12,8 +12,11 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; import retrofit2.Call; import retrofit2.Callback; @@ -40,6 +43,8 @@ private final List userActivityStatusChangeListeners; + private final List sortedFriendUserIds = new ArrayList<>(); + /** * ActivityのViewModelを作成する。 * @@ -117,8 +122,9 @@ } } - // 最新のフレンドのユーザーIDを取得して更新する if (friendUserIdsLiveData.isInitialized()) { + // 最新のフレンドのユーザーIDを取得して更新する + // TODO: 適切なコールバックを使う必要あり pullLatestFriendUserIds(myUserId, myToken); } }; @@ -238,7 +244,7 @@ * @param dateTime 変換対象の日時(文字列) * @return 変換後の日時(LocalDateTime) */ - private LocalDateTime getDateTimeFromString(String dateTime) { + private static LocalDateTime getDateTimeFromString(String dateTime) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); return LocalDateTime.parse(dateTime, formatter); } @@ -256,6 +262,26 @@ public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful()) { friendUserIdsLiveData.postValue(response.body()); + + // MEMO: 入れ込んだだけ + // フレンドのIDをアクティビティ更新順に並べ替える + List friendUserIds = friendUserIdsLiveData.getValue(); + SortedSet friends = new TreeSet<>(new Friend.UpdateTimeComparator()); + + assert friendUserIds != null; + friendUserIds.forEach(userId -> { + List activities = getActivitiesLiveDataFromUserId(userId).getValue(); + if (activities == null || activities.isEmpty()) { + return; + } + + Activity latestActivity = activities.get(0); + friends.add(new Friend(userId, latestActivity.getUpdateTime())); + }); + + // 並び替えたフレンドのユーザーIDを順番に格納して更新する + sortedFriendUserIds.clear(); + friends.forEach(friend -> sortedFriendUserIds.add(friend.getUserId())); } } @@ -266,13 +292,6 @@ }); } - /** - * - */ - private void sortFriendsByLatestUpdateTime() { - - } - public MutableLiveData getMyLatestActivityLiveData() { return myLatestActivityLiveData; } @@ -299,6 +318,10 @@ return myToken; } + public List getSortedFriendUserIds() { + return sortedFriendUserIds; + } + public void addActivityStatusChangeObserver(UserActivityStatusChangeListener observer) { userActivityStatusChangeListeners.add(observer); } @@ -307,6 +330,31 @@ userActivityStatusChangeListeners.clear(); } + private static class Friend { + private final String userId; + private final LocalDateTime latestUpdateTime; + + public Friend(String userId, String latestUpdateTime) { + this.userId = userId; + this.latestUpdateTime = getDateTimeFromString(latestUpdateTime); + } + + public String getUserId() { + return userId; + } + + public LocalDateTime getLatestUpdateTime() { + return latestUpdateTime; + } + + public static class UpdateTimeComparator implements Comparator { + @Override + public int compare(Friend o1, Friend o2) { + return o1.getLatestUpdateTime().compareTo(o2.getLatestUpdateTime()); + } + } + } + private interface ActivityFetchCallback { void onSuccess(Activity activity);