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 index 74622ba..fdea4da 100644 --- a/app/src/main/java/com/example/tampopo_client/models/Chatroom.java +++ b/app/src/main/java/com/example/tampopo_client/models/Chatroom.java @@ -1,49 +1,148 @@ package com.example.tampopo_client.models; +import java.util.ArrayList; +import java.util.List; + public class Chatroom { - private String chatroomId; // チャットルームのID - private String partnerUserId; // 相手ユーザーID - private String user1Id; // 1人目のユーザーID - private String user2Id; // 2人目のユーザーID - public Chatroom() {} - public Chatroom(String chatroomId, String user1Id, String user2Id) { - this.chatroomId = chatroomId; + private String chatRoomId; + private String user0Id; + private String user1Id; +// private String newContent; +// private String chatRoomNumber; // サーバーにも存在するので保持 + private List message = new ArrayList<>(); + private List messages = new ArrayList<>(); + private List users = new ArrayList<>(); + private boolean empty; + + // --- コンストラクタ --- + public Chatroom() { + } + + public Chatroom(String chatRoomId, String user0Id, String user1Id) { + this.chatRoomId = chatRoomId; + this.user0Id = user0Id; this.user1Id = user1Id; - this.user2Id = user2Id; + this.users.add(user0Id); + this.users.add(user1Id); } - - public Chatroom(String chatroomId,String partnerUserId) { - this.chatroomId = chatroomId; - this.partnerUserId = partnerUserId; + // --- Getter / Setter --- + public String getChatRoomId() { + return chatRoomId; } - public String getChatroomId() { - return chatroomId; + public void setChatRoomId(String chatRoomId) { + this.chatRoomId = chatRoomId; } - public void setChatroomId(String chatroomId) { - this.chatroomId = chatroomId; + public String getUser0Id() { + return user0Id; + } + + public void setUser0Id(String user0Id) { + this.user0Id = user0Id; } public String getUser1Id() { return user1Id; } - - - public String getUser2Id() { - return user2Id; + public void setUser1Id(String user1Id) { + this.user1Id = user1Id; } +// public String getNewContent() { +// return newContent; +// } +// +// public void setNewContent(String newContent) { +// this.newContent = newContent; +// } +// +// public String getChatRoomNumber() { +// return chatRoomNumber; +// } +// +// public void setChatRoomNumber(String chatRoomNumber) { +// this.chatRoomNumber = chatRoomNumber; +// } - public String getPartnerUserId() { - return partnerUserId; + public List getMessage() { + return message; } - public void setPartnerUserId(String partnerUserId) { - this.partnerUserId = partnerUserId; + public void setMessage(List message) { + this.message = message; } -} + public List getMessages() { + return messages; + } + + public void setMessages(List messages) { + this.messages = messages; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + // --- メッセージ追加 --- + public void addMessage(String senderId, String content) { + message.add(new Message(senderId, content)); + } + + // --- ユーザー操作 --- + public void addUser(String userId) { + if (!users.contains(userId)) { + users.add(userId); + } + } + + public boolean removeUser(String userId) { + return users.remove(userId); + } + + public boolean isEmpty() { + return empty; + } + + public void setEmpty(boolean empty) { + this.empty = empty; + } + + // --- 内部クラス Message --- + public static class Message { + private String senderId; + private String content; + + public Message() { + } + + public Message(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; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java index d286253..76fef14 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java @@ -114,12 +114,12 @@ // =============================== // 1. チャットルームに入る(かける側) // =============================== - public String enterChatroom(String myId, String partnerId, String token) { - Call call = chatroomResource.enterChatroom(myId, partnerId, token); + public String enterChatroom(String user0Id, String user1Id, String token) { + Call call = chatroomResource.enterChatroom(user0Id, user1Id, token); try { Response response = call.execute(); if (response.isSuccessful() && response.body() != null) { - return response.body().getChatroomId(); + return response.body().getChatRoomId(); } else { return null; } @@ -151,8 +151,12 @@ if (response.isSuccessful() && response.body() != null) { Chatroom chatroom = response.body(); - chatroomIdLiveData.setValue(chatroom.getChatroomId()); - chatFriendToMeLiveData.setValue(chatroom.getPartnerUserId()); + chatroomIdLiveData.setValue(chatroom.getChatRoomId()); + chatFriendToMeLiveData.setValue( + userId.equals(chatroom.getUser0Id()) + ? chatroom.getUser1Id() + : chatroom.getUser0Id() + ); } else { chatroomIdLiveData.setValue(null); chatroomClosed.setValue(true); diff --git a/app/src/main/java/com/example/tampopo_client/views/MainActivity.java b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java index f6b4111..a477013 100644 --- a/app/src/main/java/com/example/tampopo_client/views/MainActivity.java +++ b/app/src/main/java/com/example/tampopo_client/views/MainActivity.java @@ -8,6 +8,8 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -70,8 +72,8 @@ private String[] words = {"ひまnow", "あそぼ!", "そろそろ会いたない〜?", "勉強なう", "電話しよ~", "お風呂入ってくる~", "今暇だよー!", "いそがしい~!!"}; private Button openDialogButton; private Map userViews = new HashMap<>(); - private int[] marginTopInDp = {90,100,300,450,480,310,1000}; - private int[] marginStartInDp = {0,250,0,90,200,280,1000}; + private int[] marginTopInDp = {90, 100, 300, 450, 480, 310, 1000}; + private int[] marginStartInDp = {0, 250, 0, 90, 200, 280, 1000}; private int i = 0; ActivityViewModel activityViewModel; @@ -83,7 +85,6 @@ private final List recentUpdatedFriends = new ArrayList<>(); // 最新6人 - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -140,44 +141,84 @@ public void onChanged(List friends) { // フレンドの追加と削除 updateActivityView(friends); + + for (String friendId : userViews.keySet()) { + final String updateFriendId = friendId; + MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId); + //MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId); + + FriendIconView friendView = userViews.get(friendId); + if (friendView == null) continue; + + activitiesLiveData.observeForever(new Observer>() { + @Override + public void onChanged(List activities) { + // 更新したフレンドの再登場,更新してないフレンドの退場 + //更新した人を見つけてFriendIconViewを呼び出して、 + FriendIconView userView = userViews.get(updateFriendId); + if (userView != null && activities != null && !activities.isEmpty()) { + Activity latest = activities.get(activities.size() - 1); + String updateFriendId = latest.getUserId(); + } + //フレンドの位置決め + // 最新更新フレンドをリストに追加(最大6人保持) + List list = activityViewModel.getSortedFriendUserIds(); + int size = list.size(); + List latestSix = list.subList(Math.max(size - 6, 0), size); + + synchronized (recentUpdatedFriends) { + if (latestSix.contains(updateFriendId)) { + recentUpdatedFriends.remove(updateFriendId); + recentUpdatedFriends.add(0, updateFriendId); + if (recentUpdatedFriends.size() > 6) { + recentUpdatedFriends.remove(recentUpdatedFriends.size() - 1); + } + } + } + + } + }); + } } }); - - for (String friendId : userViews.keySet()) { - final String updateFriendId = friendId; - MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId); - //MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId); - - FriendIconView friendView = userViews.get(friendId); - if (friendView == null) continue; - //activitiesLiveData.observeForever(friendView); - activitiesLiveData.observeForever(new Observer>() { - @Override - public void onChanged(List activities) { - // 更新したフレンドの再登場,更新してないフレンドの退場 - //更新した人を見つけてFriendIconViewを呼び出して、 - FriendIconView userView = userViews.get(updateFriendId); - if (userView != null && activities != null && !activities.isEmpty()) { - Activity latest = activities.get(activities.size() - 1); - } - //フレンドの位置決め - // 最新更新フレンドをリストに追加(最大6人保持) - synchronized (recentUpdatedFriends) { - // すでに存在する場合は削除して再追加(重複防止) - recentUpdatedFriends.remove(updateFriendId); - // 先頭に追加(最近更新した人ほど前) - recentUpdatedFriends.add(0, updateFriendId); - - // 6人を超えたら古いものを削除 - if (recentUpdatedFriends.size() > 6) { - recentUpdatedFriends.remove(recentUpdatedFriends.size() - 1); - } - } - - } - }); - } +// for (String friendId : userViews.keySet()) { +// final String updateFriendId = friendId; +// MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId); +// //MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId); +// +// FriendIconView friendView = userViews.get(friendId); +// if (friendView == null) continue; +// +// activitiesLiveData.observeForever(new Observer>() { +// @Override +// public void onChanged(List activities) { +// // 更新したフレンドの再登場,更新してないフレンドの退場 +// //更新した人を見つけてFriendIconViewを呼び出して、 +// FriendIconView userView = userViews.get(updateFriendId); +// if (userView != null && activities != null && !activities.isEmpty()) { +// Activity latest = activities.get(activities.size() - 1); +// String updateFriendId = latest.getUserId(); +// } +// //フレンドの位置決め +// // 最新更新フレンドをリストに追加(最大6人保持) +// List list = activityViewModel.getSortedFriendUserIds(); +// int size = list.size(); +// List latestSix = list.subList(Math.max(size - 6, 0), size); +// +// synchronized (recentUpdatedFriends) { +// if (latestSix.contains(updateFriendId)) { +// recentUpdatedFriends.remove(updateFriendId); +// recentUpdatedFriends.add(0, updateFriendId); +// if (recentUpdatedFriends.size() > 6) { +// recentUpdatedFriends.remove(recentUpdatedFriends.size() - 1); +// } +// } +// } +// +// } +// }); +// } //メイン画面から設定画面への遷移 ImageButton settingButton = (ImageButton) findViewById(R.id.setting); @@ -308,73 +349,81 @@ i = 0; for (String friendId : friends) { - -// String friendId = entry.getUserId(); -// Activity activity = entry; - FriendIconView userView = userViews.get(friendId); MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId); if (userView == null) { - // 新しいユーザなので、アイコン+コメントを作成 - FriendIconView container = new FriendIconView(this); - container.setPadding(16, 16, 16, 16); - container.setId(View.generateViewId()); + //FriendIconView container = new FriendIconView(this); - ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams( - ConstraintLayout.LayoutParams.WRAP_CONTENT, - ConstraintLayout.LayoutParams.WRAP_CONTENT - ); - container.setLayoutParams(params); - layout.addView(container); + new Thread(new Runnable() { + @Override + public void run() { + FriendIconView container = new FriendIconView(MainActivity.this, friendId, userViewModel.getNickname(friendId), chatViewModel); -// // ユーザのアイコン(固定) -// ShapeableImageView iconView = new ShapeableImageView(this); -// iconView.setLayoutParams(new LinearLayout.LayoutParams(100, 100)); -// iconView.setScaleType(ImageView.ScaleType.CENTER_CROP); -// iconView.setStrokeColor(ContextCompat.getColorStateList(this, R.color.red)); -// iconView.setStrokeWidth(2f); -// iconView.setShapeAppearanceModel( -// iconView.getShapeAppearanceModel().toBuilder() -// .setAllCornerSizes(50) // 丸く -// .build() -// ); + Handler handler = new Handler(Looper.getMainLooper()); + handler.post(new Runnable() { + @Override + public void run() { + container.setPadding(16, 16, 16, 16); + container.setId(View.generateViewId()); + +// // ユーザのアイコン(固定) +// ShapeableImageView iconView = new ShapeableImageView(MainActivity.this); +// iconView.setLayoutParams(new LinearLayout.LayoutParams(100, 100)); +// iconView.setScaleType(ImageView.ScaleType.CENTER_CROP); +// iconView.setStrokeColor(ContextCompat.getColorStateList(MainActivity.this, R.color.red)); +// iconView.setStrokeWidth(2f); +// iconView.setShapeAppearanceModel( +// iconView.getShapeAppearanceModel().toBuilder() +// .setAllCornerSizes(50) // 丸く +// .build() +// ); + ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.WRAP_CONTENT, + ConstraintLayout.LayoutParams.WRAP_CONTENT + ); + container.setLayoutParams(params); + layout.addView(container); // -// // ユーザIDに応じてアイコンリソースを決定(仮にハードコード or マッピング) -// iconView.setImageResource(getUserIconResource(friendId)); // ←ここがポイント +// // ユーザIDに応じてアイコンリソースを決定(仮にハードコード or マッピング) +// iconView.setImageResource(getUserIconResource(friendId)); // ←ここがポイント - // Mapに登録、画面に追加 - userViews.put(friendId, container); - userView = container; - //messageList.addView(container); + // Mapに登録、画面に追加 + userViews.put(friendId, container); +// userView = container; +// messageList.addView(container); - // TODO: CHANGE - activitiesLiveData.observeForever(container.getActivitiesObserver()); - } + ConstraintSet set = new ConstraintSet(); + set.clone(layout); + int marginTopInPx = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + marginTopInDp[i], + getResources().getDisplayMetrics() + ); + int marginStartInPx = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, + marginStartInDp[i], + getResources().getDisplayMetrics() + ); - ConstraintSet set = new ConstraintSet(); - set.clone(layout); - int marginTopInPx = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - marginTopInDp[i], - getResources().getDisplayMetrics() - ); - int marginStartInPx = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - marginStartInDp[i], - getResources().getDisplayMetrics() - ); + set.connect(container.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, marginTopInPx); + set.connect(container.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, marginStartInPx); - set.connect(userView.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, marginTopInPx); - set.connect(userView.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, marginStartInPx); + set.applyTo(layout); - set.applyTo(layout); + if (i < 6) { + i++; + } - if(i<6){ - i++; + // TODO: CHANGE + activitiesLiveData.observeForever(container.getActivitiesObserver()); + } + }); + } + }).start(); } } } @@ -425,7 +474,5 @@ public void onNotificationReceived() { // 通知を受信したときにダイアログを表示 runOnUiThread(() -> showChatNotification("user02")); - // アイコンを赤枠に - //runOnUiThread(() -> highlightUserIcon("user01")); } } \ No newline at end of file