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 c30407e..cef31d5 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 @@ -2,6 +2,7 @@ import com.example.tampopo_client.models.Activity; +import java.util.HashMap; import java.util.List; import retrofit2.Call; @@ -15,7 +16,7 @@ public interface ActivitiesResource { @GET("users/{user_id}/activities") - Call> getActivities(@Path("user_id") String userId, @Query("filter") String filter); + Call> getActivities(@Path("user_id") String userId, @Query("filter") String filter); @POST("users/{user_id}/activities") @FormUrlEncoded 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 08364f9..3df02a7 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 @@ -12,8 +12,13 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Comparator; import java.util.List; import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; import retrofit2.Call; import retrofit2.Callback; @@ -40,6 +45,8 @@ private final List userActivityStatusChangeListeners; + private final List sortedFriendUserIds = new ArrayList<>(); + /** * ActivityのViewModelを作成する。 * @@ -117,8 +124,9 @@ } } - // 最新のフレンドのユーザーIDを取得して更新する if (friendUserIdsLiveData.isInitialized()) { + // 最新のフレンドのユーザーIDを取得して更新する + // TODO: 適切なコールバックを使う必要あり pullLatestFriendUserIds(myUserId, myToken); } }; @@ -208,23 +216,23 @@ * @param callback アクティビティが取得された後に呼び出されるコールバック */ private void pullLatestActivity(String userId, ActivitiesResource resource, ActivityFetchCallback callback) { - Call> fetchActivityCall = resource.getActivities(userId, "LATEST"); - fetchActivityCall.enqueue(new Callback>() { + Call> fetchActivityCall = resource.getActivities(userId, "LATEST"); + fetchActivityCall.enqueue(new Callback>() { @Override - public void onResponse(@NonNull Call> call, @NonNull Response> response) { + public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful()) { - List activities = response.body(); // アクティビティが存在しない場合は空のリスト + Collection activities = response.body().values(); // アクティビティが存在しない場合は空のリスト if (activities == null || activities.isEmpty()) { return; } - Activity latestActivity = activities.get(0); + Activity latestActivity = activities.iterator().next(); callback.onSuccess(latestActivity); } } @Override - public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + 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); @@ -238,7 +246,7 @@ * @param dateTime 変換対象の日時(文字列) * @return 変換後の日時(LocalDateTime) */ - private LocalDateTime getDateTimeFromString(String dateTime) { + private static LocalDateTime getDateTimeFromString(String dateTime) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"); return LocalDateTime.parse(dateTime, formatter); } @@ -256,6 +264,26 @@ public void onResponse(@NonNull Call> call, @NonNull Response> response) { if (response.isSuccessful()) { friendUserIdsLiveData.postValue(response.body()); + + // MEMO: 入れ込んだだけ + // フレンドのIDをアクティビティ更新順に並べ替える + List friendUserIds = friendUserIdsLiveData.getValue(); + SortedSet friends = new TreeSet<>(new Friend.UpdateTimeComparator()); + + assert friendUserIds != null; + friendUserIds.forEach(userId -> { + List activities = getActivitiesLiveDataFromUserId(userId).getValue(); + if (activities == null || activities.isEmpty()) { + return; + } + + Activity latestActivity = activities.get(0); + friends.add(new Friend(userId, latestActivity.getUpdateTime())); + }); + + // 並び替えたフレンドのユーザーIDを順番に格納して更新する + sortedFriendUserIds.clear(); + friends.forEach(friend -> sortedFriendUserIds.add(friend.getUserId())); } } @@ -266,13 +294,6 @@ }); } - /** - * - */ - private void sortFriendsByLatestUpdateTime() { - - } - public MutableLiveData getMyLatestActivityLiveData() { return myLatestActivityLiveData; } @@ -299,6 +320,10 @@ return myToken; } + public List getSortedFriendUserIds() { + return sortedFriendUserIds; + } + public void addActivityStatusChangeObserver(UserActivityStatusChangeListener observer) { userActivityStatusChangeListeners.add(observer); } @@ -307,6 +332,31 @@ userActivityStatusChangeListeners.clear(); } + private static class Friend { + private final String userId; + private final LocalDateTime latestUpdateTime; + + public Friend(String userId, String latestUpdateTime) { + this.userId = userId; + this.latestUpdateTime = getDateTimeFromString(latestUpdateTime); + } + + public String getUserId() { + return userId; + } + + public LocalDateTime getLatestUpdateTime() { + return latestUpdateTime; + } + + public static class UpdateTimeComparator implements Comparator { + @Override + public int compare(Friend o1, Friend o2) { + return o1.getLatestUpdateTime().compareTo(o2.getLatestUpdateTime()); + } + } + } + private interface ActivityFetchCallback { void onSuccess(Activity activity); diff --git a/app/src/main/java/com/example/tampopo_client/views/ChatActivity.java b/app/src/main/java/com/example/tampopo_client/views/ChatActivity.java index c88c250..f8418bb 100644 --- a/app/src/main/java/com/example/tampopo_client/views/ChatActivity.java +++ b/app/src/main/java/com/example/tampopo_client/views/ChatActivity.java @@ -1,10 +1,12 @@ package com.example.tampopo_client.views; +import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; +import android.widget.ImageButton; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; @@ -22,7 +24,8 @@ //メンバー変数 private EditText senderMessage; private EditText receiverMessage; - private Button buttonSend; + private Button sendButton; + private Button backButton; Tampopo tampopo; @@ -38,7 +41,8 @@ senderMessage = findViewById(R.id.sender_message); receiverMessage = findViewById(R.id.receiver_message); - buttonSend = findViewById(R.id.buttonSend); + sendButton = findViewById(R.id.send_Button); + ImageButton backButton = findViewById(R.id.back_Button); receiverMessage.setKeyListener(null);//受信メッセージ編集不可 @@ -56,32 +60,44 @@ // } // }); -// String receiverText = senderMessage.getText().toString();//senderMessageにユーザーが入力した文字を取り出して、String型の 変数receiverText に入れる -// if (!receiverText.isEmpty()) { -// receiverMessage.setText(ChatroomViewModel.latestMessage); -// } - buttonSend.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - String senderText = senderMessage.getText().toString();//senderMessageにユーザーが入力した文字を取り出して、String型の 変数receiverText に入れる - if (!senderText.isEmpty()) { - String senderId = tampopo.getUserId(); - String token = tampopo.getToken(); - String chatroomId = tampopo.getChatroomId(); - chatroomViewModel.sendMessage(chatroomId, senderId, senderText, token); - senderMessage.setText(senderText);//送信欄に表示 - } - } - }); - - chatroomViewModel.getLatestMessageLiveData().observe(this, receiverText -> { - if (receiverText != null) { - receiverMessage.setText(receiverText.getContent()); + //メッセージ送信 + sendButton.setOnClickListener(new OnClickListener() { //sendButtonがクリックされたときの処理 + @Override + public void onClick(View view) { //ボタンがクリックされたときに実行される処理本体 + String senderText = senderMessage.getText().toString(); //senderMessageにユーザーが入力した文字を取り出して、String型の 変数receiverText に入れる + if (!senderText.isEmpty()) { //senderTextが空でなければ + String senderId = tampopo.getUserId(); + String token = tampopo.getToken(); + String chatroomId = tampopo.getChatroomId(); + chatroomViewModel.sendMessage(chatroomId, senderId, senderText, token); + senderMessage.setText(senderText);//自分のメッセージを送信欄に表示 + } } }); + //メッセージ受信 + chatroomViewModel.getLatestMessageLiveData().observe(this, chatMessage -> { + if (chatMessage != null) { + String myUserId = tampopo.getUserId(); // 自分のIDを取得 + String senderId = chatMessage.getSenderId(); //相手(メッセージ送信者)のIDを取得 + + if (!myUserId.equals(senderId)) { //自分のIDが相手のIDと異なっていれば,(相手からのメッセージと判断) + receiverMessage.setText(chatMessage.getContent());// 相手からのメッセージを受信欄に表示 + } + } + }); + + + //戻るボタン + backButton.setOnClickListener(new OnClickListener() { //backButtonがクリックされたときの処理 + public void onClick(View view) { //ボタンがクリックされたときに実行される処理本体 + Intent intent = new Intent(ChatActivity.this, MainActivity.class); //ChatActivity から MainActivity に画面遷移 + startActivity(intent); + } + }); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(Type.systemBars()); diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index ec31135..9a43176 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -41,7 +41,7 @@ app:layout_constraintVertical_bias="0.55" />