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