diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b589d56..b86273d 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..1b50529 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,6 +4,14 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 8978d23..74dd639 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,7 @@ + - + 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 9911876..fcaa661 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 @@ -43,8 +43,10 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; public class MainActivity extends AppCompatActivity { //public class MainActivity extends AppCompatActivity implements NotificationListener { @@ -58,6 +60,7 @@ private String[] words = {"ひまnow", "あそぼ!", "そろそろ会いたない〜?", "勉強なう", "電話しよ~", "お風呂入ってくる~", "今暇だよー!", "いそがしい~!!"}; private Button openDialogButton; private Map userViews = new HashMap<>(); + private Set observedFriendIds = new HashSet<>(); // Observer登録済みのフレンドIDを追跡 private int[] marginTopInDp = {90, 100, 300, 450, 480, 310, 1000}; private int[] marginStartInDp = {0, 250, 0, 90, 200, 280, 1000}; private int i = 0; @@ -127,49 +130,33 @@ public void onChanged(List friends) { // フレンドの追加と削除 updateActivityView(friends); + + // 各フレンドのアクティビティ更新を監視 + for (String friendId : friends) { + // 既にObserverが登録済みの場合はスキップ + if (observedFriendIds.contains(friendId)) { + continue; + } + + MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId); + activitiesLiveData.observe(MainActivity.this, activities -> { + if (activities == null || activities.isEmpty()) return; + + Activity latest = activities.get(0); + + // UIスレッドで安全に更新 + FriendIconView friendView = userViews.get(friendId); + if (friendView != null) { + friendView.setComment(latest.getText()); + Log.d("ActivityUpdate", friendId + " のコメントを更新: " + latest.getText()); + } + }); + // Observer登録済みとしてマーク + observedFriendIds.add(friendId); + } } }); - //アクティビティを投稿した人がアクティビティを更新しないか監視する - //なにかをクリックしたらここに飛んでくる - for (String friendId : userViews.keySet()) { - //final String updateFriendId = friendId; - MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId); - //MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId); - - //FriendIconView friendView = userViews.get(friendId); - //if (friendView == null) continue; - - activitiesLiveData.observeForever(new Observer>() { - //アクティビティを更新したらonChangedが呼び出される - @Override - public void onChanged(List activities) { - // 更新したフレンドの再登場,更新してないフレンドの退場 - //更新した人を見つけてFriendIconViewを呼び出して、 - List sortedFriendUserIds = activityViewModel.getSortedFriendUserIds();//アクティビティを更新した最新6人のリスト -// FriendIconView userView = userViews.get(friendId); -// if (userView != null && activities != null && !activities.isEmpty()) { -// //latestは最新のアクティビティを保持する -// Activity latest = activities.get(activities.size() - 1); -// } -// // 最新更新フレンドをリストに追加(最大6人保持) - int size = sortedFriendUserIds.size(); - List latestSix = sortedFriendUserIds.subList(Math.max(size - 6, 0), size); - - synchronized (recentUpdatedFriends) { - if (latestSix.contains(friendId)) { - recentUpdatedFriends.remove(friendId); - recentUpdatedFriends.add(0, friendId); - if (recentUpdatedFriends.size() > 6) { - recentUpdatedFriends.remove(recentUpdatedFriends.size() - 1); - } - } - } -//スレッド処理をいれて更新できるようにする - } - }); - } - // for (String friendId : userViews.keySet()) { // final String updateFriendId = friendId; @@ -389,26 +376,13 @@ i = 0; for (String friendId : friends) { FriendIconView userView = userViews.get(friendId); - //userViews.put(friendId, null); - MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId); -// for (String friendId : sortedFriendUserIds) { -// FriendIconView userView = userViews.get(friendId); -// MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId); - //nattyもしnullだったらって処理入れた気がする -// if (userView == null) { -// userView = new FriendIconView( -// MainActivity.this, -// friendId, -// userViewModel.getNickname(friendId), -// chatViewModel -// ); -// userViews.put(friendId, userView); -// } + // 既存のフレンドの場合はスキップ(Viewは既に作成済み、ObserverはonCreate()で登録済み) + if (userView != null) { + continue; + } + // 新しいユーザなので、アイコン+コメントを作成 - //FriendIconView container = new FriendIconView(this); - - new Thread(new Runnable() { @Override public void run() { @@ -421,31 +395,15 @@ 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)); // ←ここがポイント // Mapに登録、画面に追加 userViews.put(friendId, container); -// userView = container; -// messageList.addView(container); ConstraintSet set = new ConstraintSet(); set.clone(layout); @@ -469,19 +427,7 @@ i++; } - // TODO: CHANGE - activitiesLiveData.observe(MainActivity.this, activities -> { - if (activities == null || activities.isEmpty()) return; - - Activity latest = activities.get(activities.size() - 1); - - // UIスレッドで安全に更新 - FriendIconView friendView = userViews.get(friendId); - if (friendView != null) { - friendView.setComment(latest.getText()); - Log.d("ActivityUpdate", friendId + " のコメントを更新: " + latest.getText()); - } - }); + // Observerの登録はonCreate()のfriendUserIdsLiveDataのObserverで一括管理 List sortedFriendUserIds = activityViewModel.getSortedFriendUserIds(); int size = sortedFriendUserIds.size();