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 31b884f..2c455f2 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 @@ -9,7 +9,6 @@ import com.example.tampopo_client.resources.ActivitiesResource; import com.example.tampopo_client.resources.UserResource; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -19,8 +18,6 @@ import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; -// NOTE: MainActivityでLiveDataをobserveし表示する - /** * アクティビティを扱うためのViewModel * @@ -31,8 +28,9 @@ private final ActivitiesResource activitiesResource; private final UserResource userResource; - private final MutableLiveData> activitiesLiveData; // key=userId, value=activity - private final MutableLiveData> friendUserIdsLiveData; + private final Map>> friendToActivitiesLiveData; // key=userId + private final MutableLiveData> friendUserIdsLiveData; // フレンドのユーザーIDのリスト + private final MutableLiveData myLatestActivityLiveData; // 自分の最新のアクティビティ private final String userId; private final String token; @@ -42,29 +40,26 @@ this.token = token; // Retrofitの初期化 - final Retrofit retrofit = new Retrofit.Builder() - .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/") - .addConverterFactory(JacksonConverterFactory.create()) - .build(); + final Retrofit retrofit = new Retrofit.Builder().baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/").addConverterFactory(JacksonConverterFactory.create()).build(); activitiesResource = retrofit.create(ActivitiesResource.class); userResource = retrofit.create(UserResource.class); - // LiveDataの初期化 - activitiesLiveData = new MutableLiveData<>(Map.of()); + friendToActivitiesLiveData = Map.of(); friendUserIdsLiveData = new MutableLiveData<>(List.of()); + myLatestActivityLiveData = new MutableLiveData<>(); } @Override public Runnable onUpdate() { return () -> { - if (activitiesLiveData == null || friendUserIdsLiveData == null) { + if (friendToActivitiesLiveData == null || friendUserIdsLiveData == null || myLatestActivityLiveData == null) { return; } // 最新のアクティビティを取得して更新する if (friendUserIdsLiveData.isInitialized() && friendUserIdsLiveData.getValue() != null) { for (String userId : friendUserIdsLiveData.getValue()) { - pullLatestActivity(userId); + pullLatestActivity(userId, activitiesResource, friendToActivitiesLiveData); } } @@ -79,6 +74,10 @@ } 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 @@ -86,24 +85,16 @@ if (response.isSuccessful()) { String createdActivityId = response.body(); - // TODO: 仮作成なので改善必須 + // TODO: 仮作成なので改善したい Call getActivityCall = activitiesResource.getActivity(userId, createdActivityId); getActivityCall.enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - Map activities = activitiesLiveData.getValue(); - if (activities == null) { - activities = new HashMap<>(); - } - Activity createdActivity = response.body(); - if (activities.containsKey(userId)) { - activities.replace(userId, createdActivity); - } else { - activities.put(userId, createdActivity); + if (createdActivity == null) { + return; } - - activitiesLiveData.postValue(activities); + myLatestActivityLiveData.postValue(createdActivity); } @Override @@ -126,28 +117,42 @@ /** * 最新のユーザーのアクティビティを取得・更新する * - * @param userId 取得対象のユーザーのID + * @param userId 取得対象のユーザーのID + * @param resource アクティビティのリソース + * @param friendToActivitiesLiveData フレンドのユーザーIDからアクティビティへの写像のライブデータ */ - private void pullLatestActivity(String userId) { - Call> fetchActivityCall = activitiesResource.getActivities(userId, "LATEST"); + private void pullLatestActivity(String userId, ActivitiesResource resource, Map>> friendToActivitiesLiveData) { + Call> fetchActivityCall = resource.getActivities(userId, "LATEST"); fetchActivityCall.enqueue(new Callback>() { @Override public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful()) { - List fetchedActivities = response.body(); - if (fetchedActivities != null) { - Activity latestActivity = response.body().get(0); - Map activities = activitiesLiveData.getValue(); - if (activities == null) { - activities = new HashMap<>(); - } - if (activities.containsKey(userId)) { - activities.replace(userId, latestActivity); - } else { - activities.put(userId, latestActivity); - } + List fetchedActivities = response.body(); // アクティビティが存在しない場合は空のリスト + if (fetchedActivities == null) { + return; + } - activitiesLiveData.postValue(activities); + if (friendToActivitiesLiveData.get(userId) == null) { + friendToActivitiesLiveData.put(userId, new MutableLiveData<>(List.of())); + } + MutableLiveData> userActivitiesLiveData = friendToActivitiesLiveData.get(userId); + assert userActivitiesLiveData != null; + + List userActivities = userActivitiesLiveData.getValue(); + if (userActivities == null) { + return; + } + if (fetchedActivities.isEmpty()) { + return; + } + + if (userActivities.isEmpty()) { + userActivitiesLiveData.postValue(fetchedActivities); + } else { + if (userActivities.equals(fetchedActivities)) { + return; + } + userActivitiesLiveData.postValue(fetchedActivities); } } } @@ -182,8 +187,12 @@ }); } - public MutableLiveData> getActivitiesLiveData() { - return activitiesLiveData; + public MutableLiveData getMyLatestActivityLiveData() { + return myLatestActivityLiveData; + } + + public MutableLiveData> getActivitiesLiveDataFromUserId(String userId) { + return friendToActivitiesLiveData.get(userId); } public MutableLiveData> getFriendUserIdsLiveData() {