diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..6ea2813 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,6 +4,14 @@ 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 939f0b7..726fe9c 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 @@ -1,10 +1,18 @@ package com.example.tampopo_client.models; +import com.fasterxml.jackson.annotation.JsonProperty; + public class FriendRequest { private Integer id; + @JsonProperty("sender-id") private String senderId; + @JsonProperty("receiver-id") private String receiverId; + // Jackson のデシリアライズのためにデフォルトコンストラクタが必要 + public FriendRequest() { + } + public FriendRequest(String senderId, String receiverId) { this.senderId = senderId; this.receiverId = receiverId; diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/FriendReceivedRequestViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/FriendReceivedRequestViewModel.java index 2542cc1..8b402ac 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/FriendReceivedRequestViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/FriendReceivedRequestViewModel.java @@ -1,11 +1,13 @@ package com.example.tampopo_client.viewmodels; +import android.util.Log; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import com.example.tampopo_client.models.FriendRequest; import com.example.tampopo_client.resources.FriendRequestsResource; +import java.util.ArrayList; import java.util.List; import retrofit2.Call; @@ -13,86 +15,88 @@ import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; -import retrofit2.converter.scalars.ScalarsConverterFactory; public class FriendReceivedRequestViewModel extends ViewModel { - //サーバー(API)と通信するためのツール private final Retrofit retrofit; - //APIの窓口 private final FriendRequestsResource friendRequestsResource; - //自分が受け取った申請 private final MutableLiveData> receivedRequests; - //通信結果の状態 private final MutableLiveData operationResult; public FriendReceivedRequestViewModel() { - this.retrofit = new Retrofit.Builder() .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/") - .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(JacksonConverterFactory.create()) .build(); + this.friendRequestsResource = retrofit.create(FriendRequestsResource.class); - this.receivedRequests = new MutableLiveData<>(); + this.receivedRequests = new MutableLiveData<>(new ArrayList<>()); this.operationResult = new MutableLiveData<>(); } - //viewがobserve出来るように public MutableLiveData> getReceivedRequestsLiveData() { return receivedRequests; } - //サーバーから受け取ったFriendReceivedRequestのデータを格納してキャッシュしていくぞ - public void loadReceivedRequests(String token) { - //tokenを渡して、受信フレンド申請一覧を取得するHTTPリクエスト(Webのサーバーに対して何かをお願いするメッセージ」)を作る準備をしている + public void loadReceivedRequests(String token, String myUserId) { + if (myUserId == null || myUserId.isEmpty()) { + Log.e("FriendVM", "myUserId is null or empty"); + return; + } + Call> call = friendRequestsResource.getFriendRequests(token); - //call.enqueueでサーバーへ送信(何を?) call.enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { if (response.isSuccessful()) { - //通信が成功したらLiveDataへのキャッシュ - receivedRequests.setValue(response.body()); + List allRequests = response.body(); + List receivedOnly = new ArrayList<>(); + + Log.d("FriendVM", "Total requests received from server: " + (allRequests != null ? allRequests.size() : 0)); + + if (allRequests != null) { + for (FriendRequest req : allRequests) { + String receiver = req.getReceiverId(); + Log.d("FriendVM", "Checking request: Sender=" + req.getSenderId() + ", Receiver=" + receiver + " against MyID=" + myUserId); + + // 比較をより堅牢に(トリムして大文字小文字を無視しない場合でも一致を確認) + if (receiver != null && receiver.trim().equals(myUserId.trim())) { + receivedOnly.add(req); + } + } + } + + receivedRequests.setValue(receivedOnly); + Log.d("FriendVM", "Filtered requests for current user: " + receivedOnly.size()); operationResult.setValue("Success"); - System.out.println("Success SetValue" + response.body()); } else { operationResult.setValue("Error: " + response.code()); - System.out.println("response error"); + Log.e("FriendVM", "Server returned error: " + response.code()); } } @Override public void onFailure(Call> call, Throwable t) { operationResult.setValue("Network error: " + t.getMessage()); - System.out.println("ネットワークエラー: " + t); + Log.e("FriendVM", "Network failure", t); } }); } - // フレンドリクエスト削除メソッド + public void deleteFriendRequest(String friendRequestId, String token) { Call call = friendRequestsResource.deleteFriendRequest(friendRequestId, token); - call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.isSuccessful()) { operationResult.setValue("Friend request deleted successfully."); - loadReceivedRequests(token); // 削除後、一覧を更新 - System.out.println("Deleted friend request ID: " + friendRequestId); } else { operationResult.setValue("Error deleting request: " + response.code()); - System.out.println("Error deleting request: " + response.code()); } } - @Override public void onFailure(Call call, Throwable t) { operationResult.setValue("Network error: " + t.getMessage()); - System.out.println("Network error: " + t); } }); } -} - - - +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tampopo_client/views/FriendReceivedFragment.java b/app/src/main/java/com/example/tampopo_client/views/FriendReceivedFragment.java index b5a8976..ac9bebe 100644 --- a/app/src/main/java/com/example/tampopo_client/views/FriendReceivedFragment.java +++ b/app/src/main/java/com/example/tampopo_client/views/FriendReceivedFragment.java @@ -1,65 +1,44 @@ package com.example.tampopo_client.views; -import android.content.Context; import android.os.Bundle; - -import androidx.fragment.app.Fragment; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.example.tampopo_client.R; import com.example.tampopo_client.Tampopo; import com.example.tampopo_client.models.FriendRequest; -import com.example.tampopo_client.viewmodels.FriendSentRequestViewModel; -import com.example.tampopo_client.views.placeholder.FriendRequestContent; -import com.example.tampopo_client.viewmodels.FriendViewModel; import com.example.tampopo_client.viewmodels.FriendReceivedRequestViewModel; +import com.example.tampopo_client.viewmodels.FriendViewModel; +import com.example.tampopo_client.views.placeholder.FriendRequestContent; +import java.util.ArrayList; import java.util.List; -/** - * A fragment representing a list of Items. - */ public class FriendReceivedFragment extends Fragment { - // TODO: Customize parameter argument names - private static final String ARG_COLUMN_COUNT = "column-count"; - // TODO: Customize parameters - private int mColumnCount = 1; - private Tampopo tampopo; + private MyFriendRequestRecyclerViewAdapter adapter; - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ public FriendReceivedFragment() { } - // TODO: Customize parameter initialization - @SuppressWarnings("unused") - public static FriendReceivedFragment newInstance(int columnCount) { - FriendReceivedFragment fragment = new FriendReceivedFragment(); - Bundle args = new Bundle(); - args.putInt(ARG_COLUMN_COUNT, columnCount); - fragment.setArguments(args); - return fragment; + public static FriendReceivedFragment newInstance() { + return new FriendReceivedFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - if (getArguments() != null) { - mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT); - } + tampopo = (Tampopo) getActivity().getApplication(); } @Override @@ -67,45 +46,48 @@ Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_friend_received_list, container, false); - FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); - - tampopo = (Tampopo) getActivity().getApplication(); - String receiverId = tampopo.getUserId(); - String token = tampopo.getToken(); - - - // Add some sample items. -// for (int i = 1; i <= 30; i++) -// FriendRequestContent.addItem(new FriendRequestContent.FriendRequestItem(Integer.toString(i), "ユーザ名" + i)); - - // Set the adapter if (view instanceof RecyclerView) { - Context context = view.getContext(); RecyclerView recyclerView = (RecyclerView) view; - if (mColumnCount <= 1) { - recyclerView.setLayoutManager(new LinearLayoutManager(context)); - } else { - recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); - } - recyclerView.setAdapter(new MyFriendRequestRecyclerViewAdapter(FriendRequestContent.ITEMS, friendViewModel, receiverId, token)); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + + FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class); + + // アダプターを初期化 + adapter = new MyFriendRequestRecyclerViewAdapter( + new ArrayList<>(), + friendViewModel, + tampopo.getUserId(), + tampopo.getToken() + ); + recyclerView.setAdapter(adapter); } return view; } @Override - public void onViewCreated(View view, Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - FriendReceivedRequestViewModel friendReceivedRequestViewModel = new ViewModelProvider(this).get(FriendReceivedRequestViewModel.class); - friendReceivedRequestViewModel.loadReceivedRequests(tampopo.getToken()); - friendReceivedRequestViewModel.getReceivedRequestsLiveData().observe(getViewLifecycleOwner(), new Observer>() { - - // LiveData に変更があったとき(新しい友達リクエストのリストが届いたとき)に呼ばれるメソッド - @Override - public void onChanged(List friendRequests) { - for (FriendRequest f: friendRequests) { - FriendRequestContent.addItem(new FriendRequestContent.FriendRequestItem(f.getSenderId(), "ユーザー名")); + + FriendReceivedRequestViewModel viewModel = new ViewModelProvider(this).get(FriendReceivedRequestViewModel.class); + + // データの監視 + viewModel.getReceivedRequestsLiveData().observe(getViewLifecycleOwner(), friendRequests -> { + Log.d("FriendFragment", "Received updated requests list, size: " + (friendRequests != null ? friendRequests.size() : 0)); + + if (friendRequests != null) { + List displayItems = new ArrayList<>(); + for (FriendRequest req : friendRequests) { + // IDと表示名(とりあえずID)を設定 + displayItems.add(new FriendRequestContent.FriendRequestItem(req.getSenderId(), req.getSenderId())); + } + + if (adapter != null) { + adapter.setItems(displayItems); } } }); + + // データの読み込み + viewModel.loadReceivedRequests(tampopo.getToken(), tampopo.getUserId()); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java b/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java index 4b7c836..611703b 100644 --- a/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java +++ b/app/src/main/java/com/example/tampopo_client/views/MyFriendRequestRecyclerViewAdapter.java @@ -20,7 +20,7 @@ public class MyFriendRequestRecyclerViewAdapter extends RecyclerView.Adapter { // 表示するFriendRequestItemのリスト(アダプターのデータ) - private final List mValues; + private List mValues; private FriendViewModel friendViewModel; private String receiverId; @@ -70,6 +70,11 @@ return mValues.size(); } + public void setItems(List items) { + this.mValues = items; + notifyDataSetChanged(); + } + // 各行(View)を保持するための ViewHolder クラス public class ViewHolder extends RecyclerView.ViewHolder { // TextView:表示される友達の名前