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 1a3589e..06af26e 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 @@ -6,6 +6,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; @@ -118,44 +120,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); @@ -288,30 +330,45 @@ if (userView == null) { // 新しいユーザなので、アイコン+コメントを作成 - FriendIconView container = new FriendIconView(this); - container.setPadding(16, 16, 16, 16); + //FriendIconView container = new FriendIconView(this); - // ユーザのアイコン(固定) - 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() - ); - // ユーザIDに応じてアイコンリソースを決定(仮にハードコード or マッピング) - iconView.setImageResource(getUserIconResource(friendId)); // ←ここがポイント + new Thread(new Runnable() { + @Override + public void run() { + FriendIconView container = new FriendIconView(MainActivity.this, friendId, userViewModel.getNickname(friendId), chatViewModel); - // Mapに登録、画面に追加 - userViews.put(friendId, container); - messageList.addView(container); + Handler handler = new Handler(Looper.getMainLooper()); + handler.post(new Runnable() { + @Override + public void run() { + container.setPadding(16, 16, 16, 16); - // TODO: CHANGE - activitiesLiveData.observeForever(container.getActivitiesObserver()); + // ユーザのアイコン(固定) + 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() + ); + + // ユーザIDに応じてアイコンリソースを決定(仮にハードコード or マッピング) + iconView.setImageResource(getUserIconResource(friendId)); // ←ここがポイント + + // Mapに登録、画面に追加 + userViews.put(friendId, container); + messageList.addView(container); + + // TODO: CHANGE + activitiesLiveData.observeForever(container.getActivitiesObserver()); + } + }); + } + }).start(); } } } @@ -362,7 +419,5 @@ public void onNotificationReceived() { // 通知を受信したときにダイアログを表示 runOnUiThread(() -> showChatNotification("user02")); - // アイコンを赤枠に - //runOnUiThread(() -> highlightUserIcon("user01")); } } \ No newline at end of file