diff --git a/app/src/main/java/com/example/tampopo_client/resources/ActivitiesResource.java b/app/src/main/java/com/example/tampopo_client/resources/ActivitiesResource.java index 7df8292..c30407e 100644 --- a/app/src/main/java/com/example/tampopo_client/resources/ActivitiesResource.java +++ b/app/src/main/java/com/example/tampopo_client/resources/ActivitiesResource.java @@ -31,8 +31,8 @@ Call getText(@Path("user_id") String userId, @Path("activity_id") String activityId); @GET("users/{user_id}/activities/{activity_id}/updated-time") - Call getUpdatedTime(@Path("user_id") String userId, @Path("activity_id") String activityId); + Call getUpdatedTime(@Path("user_id") String userId, @Path("activity_id") String activityId); @GET("users/{user_id}/activities/last-updated-time") - Call getLastUpdatedTime(@Path("user_id") String userId, @Path("activity_id") String activityId); + Call getLastUpdatedTime(@Path("user_id") String userId, @Path("activity_id") String activityId); } diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivitiesFetchCallback.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivitiesFetchCallback.java new file mode 100644 index 0000000..ad6ca5f --- /dev/null +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivitiesFetchCallback.java @@ -0,0 +1,11 @@ +package com.example.tampopo_client.viewmodels; + +import com.example.tampopo_client.models.Activity; + +import java.util.List; + +public interface ActivitiesFetchCallback { + void onSuccess(List activities); + + void onFailure(Throwable throwable); +} 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 1ca748b..e2ad02a 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,6 +9,7 @@ import com.example.tampopo_client.resources.ActivitiesResource; import com.example.tampopo_client.resources.UserResource; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -29,18 +30,24 @@ private final ActivitiesResource activitiesResource; private final UserResource userResource; + private final MutableLiveData myLatestActivityLiveData; // 自分の最新のアクティビティ private final Map>> friendToActivitiesLiveData; // <フレンドのユーザーID, フレンドのアクティビティのリスト> private final MutableLiveData> friendUserIdsLiveData; // フレンドのユーザーIDのリスト - private final MutableLiveData myLatestActivityLiveData; // 自分の最新のアクティビティ - private final String userId; - private final String token; + private final String myUserId; + private final String myToken; private final List userActivityStatusChangeObservers; - public ActivityViewModel(String userId, String token) { - this.userId = userId; - this.token = token; + /** + * ActivityのViewModelを作成する。 + * + * @param myUserId 自身のユーザーID + * @param myToken 自身の認証用トークン + */ + public ActivityViewModel(String myUserId, String myToken) { + this.myUserId = myUserId; + this.myToken = myToken; // Retrofitの初期化 final Retrofit retrofit = new Retrofit.Builder().baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/").addConverterFactory(JacksonConverterFactory.create()).build(); @@ -49,7 +56,7 @@ friendToActivitiesLiveData = Map.of(); friendUserIdsLiveData = new MutableLiveData<>(List.of()); - myLatestActivityLiveData = new MutableLiveData<>(); + myLatestActivityLiveData = new MutableLiveData<>(null); userActivityStatusChangeObservers = new ArrayList<>(); } @@ -61,21 +68,79 @@ return; } - // 最新のアクティビティを取得して更新する + // 自分の最新のアクティビティを取得する + pullLatestActivity(myUserId, activitiesResource, new ActivityFetchCallback() { + @Override + public void onSuccess(Activity activity) { + Activity prevActivity = myLatestActivityLiveData.getValue(); + + // アクティビティが更新されていない場合は、経過時間を追加する + if (activity.equals(prevActivity)) { + // TODO: 実装する必要がある + return; + } + + // 自分の新しいアクティビティをLiveDataに反映する + myLatestActivityLiveData.postValue(activity); + } + + @Override + public void onFailure(Throwable throwable) { + Log.e(ActivityViewModel.class.getSimpleName(), "An error has occurred while fetching my latest activity."); + } + }); + + // 自分のフレンドの最新のアクティビティを取得して更新する if (friendUserIdsLiveData.isInitialized() && friendUserIdsLiveData.getValue() != null) { for (String userId : friendUserIdsLiveData.getValue()) { - pullLatestActivity(userId, activitiesResource, friendToActivitiesLiveData); + pullLatestActivity(userId, activitiesResource, new ActivityFetchCallback() { + @Override + public void onSuccess(Activity activity) { + updateFriendToActivitiesLiveData(activity, userId); + } + + @Override + public void onFailure(Throwable throwable) { + Log.e(ActivityViewModel.class.getSimpleName(), "An error has occurred while fetching friend's latest activity.", throwable); + } + }); } } // 最新のフレンドのユーザーIDを取得して更新する if (friendUserIdsLiveData.isInitialized()) { - pullLatestFriendUserIds(userId, token); + pullLatestFriendUserIds(myUserId, myToken); + } + }; + } + + /** + * ユーザIDからそのユーザーのアクティビティのリストのライブデータを取得し、最新のアクティビティに更新する + * + * @param latestActivity 最新のアクティビティ + * @param userId 更新対象のユーザーID + */ + private void updateFriendToActivitiesLiveData(Activity latestActivity, String userId) { + 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 (userActivities.isEmpty()) { + userActivitiesLiveData.postValue(List.of(latestActivity)); + } else { + if (userActivities.equals(List.of(latestActivity))) { + return; } - // Logging - Log.d(ActivityViewModel.class.getSimpleName(), "Polling data from the server."); - }; + userActivitiesLiveData.postValue(List.of(latestActivity)); + } } /** @@ -128,56 +193,40 @@ /** * 最新のユーザーのアクティビティを取得・更新する * - * @param userId 取得対象のユーザーのID - * @param resource アクティビティのリソース - * @param friendToActivitiesLiveData フレンドのアクティビティのリストのライブデータ + * @param userId 取得対象のユーザーのID + * @param resource アクティビティのリソース + * @param callback アクティビティが取得された後に呼び出されるコールバック */ - private void pullLatestActivity(String userId, ActivitiesResource resource, Map>> friendToActivitiesLiveData) { + private void pullLatestActivity(String userId, ActivitiesResource resource, ActivityFetchCallback callback) { 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) { + List activities = response.body(); // アクティビティが存在しない場合は空のリスト + if (activities == null || activities.isEmpty()) { return; } - 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; - } - // TODO: fetchedActivitiesから最新のアクティビティを取得する <- 共通のメソッドを作成してもよい - // TODO: 現在の日時と最新のアクティビティの更新日時が24以上異なればアクティビティのステータス変更を通知する(1回だけ) - // TODO: - userActivitiesLiveData.postValue(fetchedActivities); - } + Activity latestActivity = activities.get(0); + callback.onSuccess(latestActivity); } } @Override public void onFailure(@NonNull Call> call, @NonNull Throwable t) { Log.e(ActivityViewModel.class.getSimpleName(), "An error has occurred while fetching the latest activity.", t); + + callback.onFailure(t); } }); } + private LocalDateTime getDateTimeFromString(String dateTime) { + // TODO: 実装する必要がある + return null; + } + /** * 最新の自分のフレンドのユーザーIDをすべて取得・更新する。 * @@ -219,11 +268,25 @@ return friendUserIdsLiveData; } - public String getUserId() { - return userId; + public String getMyUserId() { + return myUserId; } - public String getToken() { - return token; + public String getMyToken() { + return myToken; + } + + public void addActivityStatusChangeObserver(UserActivityStatusChangeObserver observer) { + userActivityStatusChangeObservers.add(observer); + } + + public void clearActivityStatusChangeObservers() { + userActivityStatusChangeObservers.clear(); + } + + private interface ActivityFetchCallback { + void onSuccess(Activity activity); + + void onFailure(Throwable throwable); } }