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 62ed1f3..9476ab1 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 @@ -214,6 +214,81 @@ } /** + * 通話終了時の後片付け: 最新アクティビティが「通話中」であればそれを削除し、 + * 直前のアクティビティを最新としてLiveDataに反映する。 + * 相手ユーザーの更新はサーバ側の認可に依存するため、失敗してもアプリは落とさない。 + * + * @param userId 対象ユーザーID(自分またはフレンド) + * @param token 呼び出しユーザーの認証トークン + */ + public void endCallForUser(String userId, String token) { + try { + Call> fetchActivityCall = activitiesResource.getActivities(userId, "LATEST"); + fetchActivityCall.enqueue(new Callback>() { + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + if (!response.isSuccessful() || response.body() == null || response.body().isEmpty()) { + return; + } + + Activity latest = response.body().values().iterator().next(); + if (latest == null || latest.getText() == null) { + return; + } + + if (!"通話中".equals(latest.getText())) { + // 既に通話以外のステータスであれば何もしない + return; + } + + // 最新が通話中なら削除 + Call deleteCall = activitiesResource.deleteActivity(userId, latest.getActivityId(), token); + deleteCall.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + // 削除に成功/失敗に関わらず最新を取り直してLiveDataへ反映する + pullLatestActivity(userId, activitiesResource, new ActivityFetchCallback() { + @Override + public void onSuccess(Activity activity) { + if (userId.equals(myUserId)) { + myLatestActivityLiveData.postValue(activity); + } else { + // フレンド用のLiveDataに反映 + if (friendToActivitiesLiveData.get(userId) == null) { + friendToActivitiesLiveData.put(userId, new MutableLiveData<>(List.of())); + } + MutableLiveData> userActivitiesLiveData = friendToActivitiesLiveData.get(userId); + if (userActivitiesLiveData != null) { + userActivitiesLiveData.postValue(List.of(activity)); + } + } + } + + @Override + public void onFailure(Throwable throwable) { + Log.e(ActivityViewModel.class.getSimpleName(), "Failed to refresh latest activity after deletion.", throwable); + } + }); + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Log.e(ActivityViewModel.class.getSimpleName(), "Failed to delete call activity.", t); + } + }); + } + + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + Log.e(ActivityViewModel.class.getSimpleName(), "Failed to fetch latest activity for endCall.", t); + } + }); + } catch (Exception e) { + Log.e(ActivityViewModel.class.getSimpleName(), "Unexpected error in endCallForUser.", e); + } + } + + /** * 最新のユーザーのアクティビティを取得・更新する * * @param userId 取得対象のユーザーのID