diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..07cf77d 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,6 +4,14 @@ 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..a24da24 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; @@ -389,26 +392,34 @@ 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); -// } + // 既存のフレンドの場合は、Observerを登録するだけ(Viewは作成しない) + if (userView != null) { + // 既にObserverが登録済みの場合はスキップ + if (observedFriendIds.contains(friendId)) { + continue; + } + + // 既にViewが存在する場合は、Observerだけを登録 + 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登録済みとしてマーク + observedFriendIds.add(friendId); + continue; + } + // 新しいユーザなので、アイコン+コメントを作成 - //FriendIconView container = new FriendIconView(this); - - new Thread(new Runnable() { @Override public void run() { @@ -421,31 +432,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,7 +464,7 @@ i++; } - // TODO: CHANGE + // 新規作成したViewに対してObserverを登録 activitiesLiveData.observe(MainActivity.this, activities -> { if (activities == null || activities.isEmpty()) return; @@ -482,6 +477,8 @@ Log.d("ActivityUpdate", friendId + " のコメントを更新: " + latest.getText()); } }); + // Observer登録済みとしてマーク + observedFriendIds.add(friendId); List sortedFriendUserIds = activityViewModel.getSortedFriendUserIds(); int size = sortedFriendUserIds.size();