diff --git a/app/src/main/java/com/example/tampopo_client/models/ChatMessage.java b/app/src/main/java/com/example/tampopo_client/models/ChatMessage.java new file mode 100644 index 0000000..e46e3b4 --- /dev/null +++ b/app/src/main/java/com/example/tampopo_client/models/ChatMessage.java @@ -0,0 +1,29 @@ +package com.example.tampopo_client.models; + +public class ChatMessage { + private String senderId; // メッセージ送信者のID + private String content; // メッセージ本文 + + public ChatMessage() {} + + public ChatMessage(String senderId, String content) { + this.senderId = senderId; + this.content = content; + } + + public String getSenderId() { + return senderId; + } + + public void setSenderId(String senderId) { + this.senderId = senderId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/app/src/main/java/com/example/tampopo_client/models/Chatroom.java b/app/src/main/java/com/example/tampopo_client/models/Chatroom.java new file mode 100644 index 0000000..5781a4a --- /dev/null +++ b/app/src/main/java/com/example/tampopo_client/models/Chatroom.java @@ -0,0 +1,21 @@ +package com.example.tampopo_client.models; + +public class Chatroom { + private String chatroomId; // チャットルームのID + + public Chatroom() {} + + public Chatroom(String chatroomId) { + this.chatroomId = chatroomId; + } + + public String getChatroomId() { + return chatroomId; + } + + public String foundChatroomId(){return chatroomId;} + + public void setChatroomId(String chatroomId) { + this.chatroomId = chatroomId; + } +} diff --git a/app/src/main/java/com/example/tampopo_client/resources/ChatroomResource.java b/app/src/main/java/com/example/tampopo_client/resources/ChatroomResource.java new file mode 100644 index 0000000..d52908b --- /dev/null +++ b/app/src/main/java/com/example/tampopo_client/resources/ChatroomResource.java @@ -0,0 +1,56 @@ +package com.example.tampopo_client.resources; + +import com.example.tampopo_client.models.ChatMessage; +import com.example.tampopo_client.models.Chatroom; + +import java.util.List; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; + +public interface ChatroomResource { + + // チャットルームに入る + @POST("enterChatroom") + Call enterChatroom( + @Query("myId") String myId, + @Query("partnerId") String partnerId, + @Header("Authorization") String token + ); + //チャットルームを探す + @GET("foundChatroom") + Call getMyChatroom( + @Query("EnterUserId") String userId + ); + + // メッセージ送信 + @POST("sendMessage") + Call sendMessage( + @Header("Authorization") String token, + @Query("chatroomId") String chatroomId, + @Query("senderId") String senderId, + @Query("content") String content + ); + + // メッセージ一覧取得 + @GET("getMessages") + Call> getMessages( + @Header("Authorization") String token, + @Query("chatroomId") String chatroomId, + @Query("partnerId") String partnerId + ); + + // チャットルーム削除 + @DELETE("destroyChatroom") + Call destroyChatroom( + @Header("Authorization") String token, + @Query("chatroomId") String chatroomId, + @Query("userId") String userId + ); +} diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ChatroomViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ChatroomViewModel.java new file mode 100644 index 0000000..01f93f1 --- /dev/null +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ChatroomViewModel.java @@ -0,0 +1,180 @@ +package com.example.tampopo_client.viewmodels; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.example.tampopo_client.models.ChatMessage; +import com.example.tampopo_client.models.Chatroom; +import com.example.tampopo_client.resources.ChatroomResource; + +import java.util.ArrayList; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; + +public class ChatroomViewModel extends ViewModel { + + private final Retrofit retrofit; + private final ChatroomResource chatroomResource; + + private final MutableLiveData chatroomId = new MutableLiveData<>(); + private final MutableLiveData> chatMessages = new MutableLiveData<>(new ArrayList<>()); + private final MutableLiveData latestMessage = new MutableLiveData<>(); + private final MutableLiveData chatroomClosed = new MutableLiveData<>(); + + public ChatroomViewModel() { + this.retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + + this.chatroomResource = retrofit.create(ChatroomResource.class); + } + + // LiveData getter + public MutableLiveData getChatroomIdLiveData() { + return chatroomId; + } + + public MutableLiveData> getChatMessages() { + return chatMessages; + } + + public MutableLiveData getLatestMessageLiveData() { + return latestMessage; + } + + public MutableLiveData getChatroomClosed() { + return chatroomClosed; + } + + // 1. チャットルームに入る(入れる側) + public void enterChatroom(String myId, String partnerId, String token) { + //自分のIdと相手のidと自分tokenを送る + Call call = chatroomResource.enterChatroom(myId, partnerId, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + chatroomId.setValue(response.body().getChatroomId()); + } + }//サーバーからchatroomIdが送られてきてそれを保持する処理 + + @Override + public void onFailure(Call call, Throwable t) { + Log.e("ChatViewModel", "enterChatroom error: " + t.getMessage()); + } + }); + } + + //1.5自分がcahtroomに入っているのかを確認する + public void foundChatroom(String userId) { + Call call = chatroomResource.getMyChatroom(userId); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + chatroomId.setValue(response.body().getChatroomId()); + //これがあっているのか確認chatroomIdどんなうごきをするのか確認せよ + } else { + chatroomId.setValue(null); // どこにも入っていない場合 + chatroomClosed.setValue(true); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Log.e("ChatroomVM", "checkCurrentChatroom error: " + t.getMessage()); + } + }); + } + + // 2. メッセージ送信(リアルタイム風)送る側 + //自分のchatはmychatmesaageに変更するかも + public void sendMessage(String chatroomId, String senderId, String message, String token) { + //このメソッドは 指定したチャットルーム (chatroomId) に、あるユーザー (senderId) が、入力したメッセージ (message) を、認証トークン (token) を使って送信する役割です。 + Call call = chatroomResource.sendMessage(token, chatroomId, senderId, message); + //Retrofit を使って 「サーバーのAPIにメッセージ送信リクエストを作る」 メソッド。 + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful() && response.body() != null) { + ChatMessage newMessage = response.body(); + // 成功したらそのまま新しいメッセージをUIに流す + +// // 既存のメッセージリストを更新 + //受け取る側のコードっぽいので不要だと思ってます理由はnewMessageでUIを表示するのでそれ以外いらない +// //画面に表示されているメッセージリスト (chatMessages) を取り出し、そこに 新しいメッセージを追加して更新しています。 +// List current = chatMessages.getValue(); +// if (current == null) current = new ArrayList<>(); + + + // operationResult は表示不要なので更新しない + } + // 失敗した場合も「エラーです」とは出さない(履歴を残さない仕様) + } + + @Override + public void onFailure(Call call, Throwable t) { + // ネットワークエラーでも通知はしない(UI上に履歴が残らない通話風チャットだから) + // 必要なら内部ログにだけ残す + Log.e("ChatViewModel", "sendMessage error: " + t.getMessage()); + } + }); + } + + + // 3. 最新メッセージ取得(エラー時はUIに表示しない)受け取る側 + public void loadLatestMessage(String chatroomId, String partnerId, String token) { + Call> call = chatroomResource.getMessages(token, chatroomId, partnerId); + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful() && response.body() != null && !response.body().isEmpty()) { + // 最新メッセージだけ反映 + latestMessage.setValue(response.body().get(response.body().size() - 1)); + } + // else の場合は何もしない(UIにエラーを出さない) + } + + @Override + public void onFailure(Call> call, Throwable t) { + // ネットワークエラー時もUIには表示しない + Log.e("ChatViewModel", "loadLatestMessage error: " + t.getMessage()); + } + }); + } + + + // 4. チャットルーム削除 削除を実行した人の処理。削除された側の処理は含まれてません + public void destroyChatroom(String chatroomId, String userId, String token) { + Call call = chatroomResource.destroyChatroom(token, chatroomId, userId); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + // 成功でも失敗でも、画面を閉じる処理をUIに通知 + // 例えば LiveData を使って Activity/Fragment に伝える + chatroomClosed.setValue(true); + + // ログには残す + if (!response.isSuccessful()) { + Log.e("ChatViewModel", "destroyChatroom failed: " + response.code()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + // ネットワークエラーでも UI は閉じる + chatroomClosed.setValue(true); + Log.e("ChatViewModel", "destroyChatroom error: " + t.getMessage()); + } + }); + } +} +