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..27b335d 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 @@ -4,8 +4,6 @@ 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.util.TypedValue; import android.view.View; @@ -47,14 +45,11 @@ import java.util.Map; public class MainActivity extends AppCompatActivity { - //public class MainActivity extends AppCompatActivity implements NotificationListener { private EditText editMessage; private ImageButton sendButton; private GridView wordGroup; private LinearLayout messageList; - //private List friendIds = List.of(); - //アクティビティの選択肢 private String[] words = {"ひまnow", "あそぼ!", "そろそろ会いたない〜?", "勉強なう", "電話しよ~", "お風呂入ってくる~", "今暇だよー!", "いそがしい~!!"}; private Button openDialogButton; private Map userViews = new HashMap<>(); @@ -66,9 +61,8 @@ UserViewModel userViewModel; Tampopo tampopo; - //追加しました! private ChatViewModel chatViewModel; - private final List recentUpdatedFriends = new ArrayList<>(); // 最新6人 + private final List recentUpdatedFriends = new ArrayList<>(); @Override @@ -82,9 +76,7 @@ return insets; }); - //疑似的な通知のためにchatViewModelを定義する chatViewModel = new ViewModelProvider(this).get(ChatViewModel.class); - //chatViewModel.addNotificationListener(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { @@ -96,10 +88,8 @@ } } - // TODO: CHANGE userViewModel = new ViewModelProvider(this).get(UserViewModel.class); - //メイン画面からフレンド一覧画面への遷移 ImageButton friendButton = (ImageButton) findViewById(R.id.friend); friendButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -108,15 +98,11 @@ } }); - //tampopoを宣言する tampopo = (Tampopo) getApplication(); - //activityViewModelを宣言する - ActivityViewModelFactory factory = new ActivityViewModelFactory(tampopo.getUserId(), tampopo.getToken()); // Factoryを使って、引数をコンストラクタにわたしつつViewModelを作成 + ActivityViewModelFactory factory = new ActivityViewModelFactory(tampopo.getUserId(), tampopo.getToken()); activityViewModel = new ViewModelProvider(this, factory).get(ActivityViewModel.class); - //追加しました!!!!!!!!!!! - // ChatViewModelを初期化する ChatViewModelFactory factory1 = new ChatViewModelFactory(tampopo.getUserId(), tampopo.getToken(), tampopo.getChatroomId()); chatViewModel = new ViewModelProvider(this, factory1).get(ChatViewModel.class); @@ -125,121 +111,26 @@ friendsLiveData.observe(this, new Observer>() { @Override public void onChanged(List friends) { - // フレンドの追加と削除 updateActivityView(friends); } }); - //アクティビティを投稿した人がアクティビティを更新しないか監視する - //なにかをクリックしたらここに飛んでくる - 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; -// 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); - settingButton. + settingButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Intent intent = new Intent(MainActivity.this, SettingActivity.class); + startActivity(intent); + } + }); - setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - Intent intent = new Intent(MainActivity.this, SettingActivity.class); - startActivity(intent); - } - }); - - messageList = - - findViewById(R.id.messageList); - -// ボタンを押すとダイアログ表示(トリガー用) - openDialogButton = - - findViewById(R.id.openDialogButton); - openDialogButton. - - setOnClickListener(v -> - - showInputDialog()); - + messageList = findViewById(R.id.messageList); + openDialogButton = findViewById(R.id.openDialogButton); + openDialogButton.setOnClickListener(v -> showInputDialog()); } @Override protected void onStart() { super.onStart(); - if (activityViewModel != null) { activityViewModel.startUpdating(1L); } @@ -251,7 +142,6 @@ @Override protected void onStop() { super.onStop(); - if (activityViewModel != null) { activityViewModel.stopUpdating(); } @@ -263,7 +153,6 @@ @Override protected void onDestroy() { super.onDestroy(); - if (activityViewModel != null) { activityViewModel.stopUpdating(); } @@ -274,35 +163,28 @@ private void showInputDialog() { - // カスタムビュー読み込み View dialogView = getLayoutInflater().inflate(R.layout.main_dialog, null); EditText editTextInput = dialogView.findViewById(R.id.editTextInput); GridView wordGrid = dialogView.findViewById(R.id.wordGrid); ImageButton sendButton = dialogView.findViewById(R.id.sendButton); - //tokenとuserIdを代入する String token = tampopo.getToken(); String userId = tampopo.getUserId(); - // 語群セット ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, words); wordGrid.setAdapter(adapter); - // 語群クリックで入力欄にセット wordGrid.setOnItemClickListener((parent, view, position, id) -> { editTextInput.setText(words[position]); - // 入力欄にフォーカス&キーボード表示 editTextInput.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.showSoftInput(editTextInput, InputMethodManager.SHOW_IMPLICIT); }); - // ダイアログ生成 AlertDialog dialog = new AlertDialog.Builder(this) .setView(dialogView) .create(); - // 送信ボタン処理 sendButton.setOnClickListener(v -> { String message = editTextInput.getText().toString().trim(); int length = message.length(); @@ -319,7 +201,7 @@ openDialogButton.setLineSpacing(4.0f, 1.2f); openDialogButton.setText(message); editTextInput.setText(""); - dialog.dismiss(); // ダイアログを閉じる + dialog.dismiss(); } else { openDialogButton.setText(""); } @@ -328,228 +210,51 @@ dialog.show(); } - //natty 仮のフレンド情報 - private int getUserIconResource(String userId) { - switch (userId) { - case "user01": - return R.drawable.friend01_icon; - case "user02": - return R.drawable.friend04_icon; - case "user03": - return R.drawable.friend03_icon; - default: - return R.drawable.default_icon; - } - } - - private void setupActivityObservers(List sortedFriendUserIds) { - for (String friendId : sortedFriendUserIds) { - FriendIconView userView = userViews.get(friendId); - if (userView == null) { - Log.w("MainActivity", "userViews に存在しません: " + friendId); - continue; - } - - MutableLiveData> activitiesLiveData = - activityViewModel.getActivitiesLiveDataFromUserId(friendId); - - activitiesLiveData.observeForever(new Observer>() { - @Override - public void onChanged(List activities) { - if (activities == null || activities.isEmpty()) return; - - Activity latest = activities.get(activities.size() - 1); - Log.d("ActivityUpdate", friendId + " 最新: " + latest.getText()); - - // FriendIconView の更新 - //userView.setComment(latest.getText()); - - // 最近更新したフレンドリストを更新(最大6人) - synchronized (sortedFriendUserIds) { - sortedFriendUserIds.remove(friendId); - sortedFriendUserIds.add(0, friendId); - - if (sortedFriendUserIds.size() > 6) { - sortedFriendUserIds.remove(sortedFriendUserIds.size() - 1); - } - } - - // 並び順をログ出力(デバッグ用) - Log.d("RecentFriends", "最新更新順: " + sortedFriendUserIds); - } - }); - } - } - private void updateActivityView(@NonNull List friends) { - ///natty ユーザごとにコメントの更新をする - LinearLayout messageList = findViewById(R.id.messageList); ConstraintLayout layout = findViewById(R.id.main); i = 0; for (String friendId : friends) { + if (i >= 6) break; + 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); -// } - // 新しいユーザなので、アイコン+コメントを作成 - //FriendIconView container = new FriendIconView(this); + if (userView == null) { + String nickname = userViewModel.getNickname(friendId); + userView = new FriendIconView(MainActivity.this, friendId, nickname, chatViewModel); + userView.setPadding(16, 16, 16, 16); + userView.setId(View.generateViewId()); + ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams( + ConstraintLayout.LayoutParams.WRAP_CONTENT, + ConstraintLayout.LayoutParams.WRAP_CONTENT + ); + userView.setLayoutParams(params); + layout.addView(userView); + userViews.put(friendId, userView); - new Thread(new Runnable() { - @Override - public void run() { - FriendIconView container = new FriendIconView(MainActivity.this, friendId, userViewModel.getNickname(friendId), chatViewModel); + MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId); + activitiesLiveData.observe(MainActivity.this, userView.getActivitiesObserver()); + } - Handler handler = new Handler(Looper.getMainLooper()); - handler.post(new Runnable() { - @Override - public void run() { - container.setPadding(16, 16, 16, 16); - container.setId(View.generateViewId()); + 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() + ); -// // ユーザのアイコン(固定) -// 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)); // ←ここがポイント + 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); - // Mapに登録、画面に追加 - userViews.put(friendId, container); -// userView = container; -// messageList.addView(container); - - 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.applyTo(layout); - - if (i < 6) { - 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()); - } - }); - - List sortedFriendUserIds = activityViewModel.getSortedFriendUserIds(); - 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); - } - } - } - } - }); - } - }).start(); + i++; } } } - -//プッシュ通知 -//private void showChatNotification(String friendName) { -//NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); - -//String channelId = "chat_channel"; - -// NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId) -// .setSmallIcon(R.drawable.default_icon) // 通知アイコン -// .setContentTitle("新しいチャット") -// .setContentText(friendName + " さんから通話があります") -// .setPriority(NotificationCompat.PRIORITY_HIGH) -// .setAutoCancel(true); // タップしたら消える -// NotificationChannel channel = new NotificationChannel( -// channelId, -// "Chat Notifications", -// NotificationManager.IMPORTANCE_HIGH -// ); -//notificationManager.createNotificationChannel(channel); - -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { -// if (ContextCompat.checkSelfPermission( -// this, -// android.Manifest.permission.POST_NOTIFICATIONS -// ) == PackageManager.PERMISSION_GRANTED) { -// Log.d("NotificationTest", "notify() 呼ばれた!!"); -// notificationManager.notify(0, builder.build()); -// } else { -// // 許可されていない → リクエストする -// ActivityCompat.requestPermissions( -// this, -// new String[]{android.Manifest.permission.POST_NOTIFICATIONS}, -// 1001 -// ); -// } -// } else { -// Log.d("NotificationTest", "notify() 呼ばれた!!"); -// notificationManager.notify(0, builder.build()); -// } -//} - -//通知を受信したときのダイアログ これが動いてます -//friendName+から通話があります。ってでるから通知が来たときのフレンドを変数に置く必要がある -// @Override -// public void onNotificationReceived() { -// // 通知を受信したときにダイアログを表示 -// runOnUiThread(() -> showChatNotification("user02")); -// } - -