diff --git a/app/src/main/java/com/example/tampopo_client/models/FriendRequest.java b/app/src/main/java/com/example/tampopo_client/models/FriendRequest.java index 4f8f14b..3c1cf50 100644 --- a/app/src/main/java/com/example/tampopo_client/models/FriendRequest.java +++ b/app/src/main/java/com/example/tampopo_client/models/FriendRequest.java @@ -4,6 +4,8 @@ private Integer id; private String senderId; private String receiverId; + private String receiverName; + private String receiverIcon; public FriendRequest(){ //デフォルトコンストラクタを追加しました @@ -36,4 +38,20 @@ public void setReceiverId(String receiverId) { this.receiverId = receiverId; } + + public String getReceiverName() { + return receiverName; + } + + public void setReceiverName(String receiverName) { + this.receiverName = receiverName; + } + + public String getReceiverIcon() { + return receiverIcon; + } + + public void setReceiverIcon(String receiverIcon) { + this.receiverIcon = receiverIcon; + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/FriendSentRequestViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/FriendSentRequestViewModel.java index e74606d..954c9c1 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/FriendSentRequestViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/FriendSentRequestViewModel.java @@ -5,6 +5,7 @@ import com.example.tampopo_client.models.FriendRequest; import com.example.tampopo_client.resources.FriendRequestsResource; +import com.example.tampopo_client.resources.UserResource; import java.util.ArrayList; import java.util.List; @@ -22,6 +23,7 @@ // APIの窓口 private final FriendRequestsResource friendRequestsResource; + private final UserResource userResource; // 自分が送ったフレンド申請一覧 private final MutableLiveData> sentRequests; @@ -42,6 +44,7 @@ .build(); this.friendRequestsResource = retrofit.create(FriendRequestsResource.class); + this.userResource = retrofit.create(UserResource.class); this.sentRequests = new MutableLiveData<>(); this.operationResult = new MutableLiveData<>(); } @@ -78,7 +81,9 @@ } } - sentRequests.setValue(sentOnly); + // 各リクエストに対してユーザー情報を取得 + fetchUserInfoForRequests(sentOnly); + operationResult.setValue("Success (filtered " + sentOnly.size() + " requests)"); System.out.println("Success SetValue (filtered): " + sentOnly); } else { @@ -124,6 +129,78 @@ }); } + // 各FriendRequestに対してユーザー情報を取得するメソッド + private void fetchUserInfoForRequests(List requests) { + if (requests == null || requests.isEmpty()) { + sentRequests.setValue(requests); + return; + } + + int totalRequests = requests.size(); + final int[] completedRequests = {0}; + + for (FriendRequest req : requests) { + String receiverId = req.getReceiverId(); + if (receiverId == null) { + completedRequests[0]++; + if (completedRequests[0] == totalRequests) { + sentRequests.setValue(requests); + } + continue; + } + + // ニックネームを取得 + Call nameCall = userResource.getName(receiverId); + nameCall.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + req.setReceiverName(response.body()); + } + checkAndUpdateLiveData(); + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("Failed to fetch name for " + receiverId + ": " + t.getMessage()); + checkAndUpdateLiveData(); + } + + private void checkAndUpdateLiveData() { + completedRequests[0]++; + if (completedRequests[0] == totalRequests * 2) { + sentRequests.setValue(requests); + } + } + }); + + // アイコンを取得 + Call iconCall = userResource.getIcon(receiverId); + iconCall.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + req.setReceiverIcon(response.body()); + } + checkAndUpdateLiveData(); + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("Failed to fetch icon for " + receiverId + ": " + t.getMessage()); + checkAndUpdateLiveData(); + } + + private void checkAndUpdateLiveData() { + completedRequests[0]++; + if (completedRequests[0] == totalRequests * 2) { + sentRequests.setValue(requests); + } + } + }); + } + } + // サーバーからフレンド申請を削除するメソッド public void deleteFriendRequest(String friendRequestId, String token) { Call call = friendRequestsResource.deleteFriendRequest(friendRequestId, token); diff --git a/app/src/main/java/com/example/tampopo_client/views/MyFriendSentRequestRecyclerViewAdapter.java b/app/src/main/java/com/example/tampopo_client/views/MyFriendSentRequestRecyclerViewAdapter.java index 618df01..48b75f6 100644 --- a/app/src/main/java/com/example/tampopo_client/views/MyFriendSentRequestRecyclerViewAdapter.java +++ b/app/src/main/java/com/example/tampopo_client/views/MyFriendSentRequestRecyclerViewAdapter.java @@ -10,9 +10,12 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.bumptech.glide.Glide; + import com.example.tampopo_client.R; import com.example.tampopo_client.models.FriendRequest; import com.example.tampopo_client.viewmodels.FriendSentRequestViewModel; @@ -57,8 +60,28 @@ public void onBindViewHolder(final ViewHolder holder, int position) { // 現在の位置の FriendRequest を取得して ViewHolder に保持させる holder.mItem = items.get(position); - // 受信者ID(receiverId)を TextView に表示する - holder.mContentView.setText(items.get(position).getReceiverId()); + FriendRequest request = items.get(position); + + // ニックネームを表示(存在すれば) + if (request.getReceiverName() != null && !request.getReceiverName().isEmpty()) { + holder.mContentView.setText(request.getReceiverName()); + } else { + holder.mContentView.setText("名前未設定"); + } + + // ユーザーIDを表示 + holder.mUserIdView.setText(request.getReceiverId()); + + // アイコンを表示(Glideを使用) + if (request.getReceiverIcon() != null && !request.getReceiverIcon().isEmpty()) { + Glide.with(holder.mImageView.getContext()) + .load(request.getReceiverIcon()) + .placeholder(R.drawable.friend) + .error(R.drawable.friend) + .into(holder.mImageView); + } else { + holder.mImageView.setImageResource(R.drawable.friend); + } // 「申請中」ボタンを押した時の処理 holder.pendingButton.setOnClickListener(v -> { @@ -82,7 +105,10 @@ // メッセージテキスト TextView tvMessage = dialog.findViewById(R.id.tv_message); - tvMessage.setText(friendRequest.getReceiverId() + " さんへの申請を取りやめますか?"); + String displayName = friendRequest.getReceiverName() != null && !friendRequest.getReceiverName().isEmpty() + ? friendRequest.getReceiverName() + : friendRequest.getReceiverId(); + tvMessage.setText(displayName + " さんへの申請を取りやめますか?"); // 削除ボタン Button btnDelete = dialog.findViewById(R.id.btn_delete); @@ -106,6 +132,8 @@ public class ViewHolder extends RecyclerView.ViewHolder { // TextView:表示される友達の名前 public final TextView mContentView; + public final TextView mUserIdView; + public final ImageView mImageView; // 表示する1つのFriendRequestを保持 public FriendRequest mItem; public View pendingButton; @@ -116,6 +144,8 @@ super(binding.getRoot()); // fragment_friend_sent.xml 内の TextView(contentというid)に対応する変数をセット mContentView = binding.content; + mUserIdView = binding.userId; + mImageView = binding.imageView2; pendingButton = binding.PendingButton; }