diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java index 3d15caf..0c74253 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java @@ -39,6 +39,7 @@ private final MutableLiveData myLatestActivityLiveData; // 自分の最新のアクティビティ private final Map>> friendToActivitiesLiveData; // <フレンドのユーザーID, フレンドのアクティビティのリスト> private final MutableLiveData> friendUserIdsLiveData; // フレンドのユーザーIDのリスト + private final MutableLiveData> allFriendsLatestActivitiesLiveData; // 全フレンドの最新アクティビティのリスト private final String myUserId; private final String myToken; @@ -65,6 +66,7 @@ friendToActivitiesLiveData = new HashMap<>(); friendUserIdsLiveData = new MutableLiveData<>(List.of()); myLatestActivityLiveData = new MutableLiveData<>(null); + allFriendsLatestActivitiesLiveData = new MutableLiveData<>(new ArrayList<>()); // 初期化 userActivityStatusChangeListeners = new ArrayList<>(); } @@ -109,11 +111,13 @@ // 自分のフレンドの最新のアクティビティを取得して更新する if (friendUserIdsLiveData.isInitialized() && friendUserIdsLiveData.getValue() != null) { + List latestActivities = new ArrayList<>(); for (String userId : friendUserIdsLiveData.getValue()) { pullLatestActivity(userId, activitiesResource, new ActivityFetchCallback() { @Override public void onSuccess(Activity activity) { updateFriendToActivitiesLiveData(activity, userId); + latestActivities.add(activity); } @Override @@ -122,6 +126,7 @@ } }); } + allFriendsLatestActivitiesLiveData.postValue(latestActivities); } if (friendUserIdsLiveData.isInitialized()) { @@ -314,6 +319,10 @@ return friendUserIdsLiveData; } + public MutableLiveData> getAllFriendsLatestActivitiesLiveData() { + return allFriendsLatestActivitiesLiveData; + } + public String getMyUserId() { return myUserId; } 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..baa2bf0 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 @@ -44,10 +44,7 @@ import com.google.android.material.imageview.ShapeableImageView; import com.example.tampopo_client.viewmodels.ActivityViewModelFactory; import com.example.tampopo_client.viewmodels.ChatViewModel; -import com.example.tampopo_client.viewmodels.ChatViewModelFactory; import com.example.tampopo_client.viewmodels.NotificationListener; -import com.example.tampopo_client.viewmodels.UserViewModel; -import com.google.android.material.imageview.ShapeableImageView; import java.util.ArrayList; import java.util.HashMap; @@ -130,55 +127,16 @@ //追加しました!!!!!!!!!!! // ChatViewModelを初期化する - ChatViewModelFactory factory1 = new ChatViewModelFactory(tampopo.getUserId(), tampopo.getToken(), tampopo.getChatroomId()); + ChatViewModelFactory factory1 = new ChatViewModelFactory(tampopo.getUserId(), tampopo.getToken()); chatViewModel = new ViewModelProvider(this, factory1).get(ChatViewModel.class); - MutableLiveData> friendsLiveData = activityViewModel.getFriendUserIdsLiveData(); - - friendsLiveData.observe(this, new Observer>() { + activityViewModel.getAllFriendsLatestActivitiesLiveData().observe(this, new Observer>() { @Override - public void onChanged(List friends) { - // フレンドの追加と削除 - updateActivityView(friends); + public void onChanged(List activities) { + updateActivityView(activities); } }); - - 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); - } - } - - } - }); - } - //メイン画面から設定画面への遷移 ImageButton settingButton = (ImageButton) findViewById(R.id.setting); settingButton.setOnClickListener(new View.OnClickListener() { @@ -301,60 +259,32 @@ } } - private void updateActivityView(List friends) { - ///natty ユーザごとにコメントの更新をする - LinearLayout messageList = findViewById(R.id.messageList); + private void updateActivityView(List activities) { ConstraintLayout layout = findViewById(R.id.main); i = 0; - for (String friendId : friends) { - -// String friendId = entry.getUserId(); -// Activity activity = entry; + for (Activity activity : activities) { + String friendId = activity.getUserId(); 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()); + userView = new FriendIconView(this, friendId, "", chatViewModel); + userView.setId(View.generateViewId()); ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT ); - container.setLayoutParams(params); + userView.setLayoutParams(params); - layout.addView(container); - -// // ユーザのアイコン(固定) -// 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)); // ←ここがポイント - - // Mapに登録、画面に追加 - userViews.put(friendId, container); - userView = container; - //messageList.addView(container); - - // TODO: CHANGE - activitiesLiveData.observeForever(container.getActivitiesObserver()); + layout.addView(userView); + userViews.put(friendId, userView); } + userView.setComment(activity.getText()); + ConstraintSet set = new ConstraintSet(); set.clone(layout); int marginTopInPx = (int) TypedValue.applyDimension( @@ -373,7 +303,7 @@ set.applyTo(layout); - if(i<6){ + if(i < 6){ i++; } }