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 14bf304..8c9c602 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 @@ -1,6 +1,11 @@ package com.example.tampopo_client.views; +import android.app.Dialog; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -9,12 +14,16 @@ import android.widget.EditText; import android.widget.GridView; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; @@ -27,7 +36,9 @@ import com.example.tampopo_client.models.Activity; import com.example.tampopo_client.viewmodels.ActivityViewModel; import com.example.tampopo_client.viewmodels.UserViewModel; +import com.google.android.material.imageview.ShapeableImageView; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,6 +52,7 @@ //アクティビティの選択肢 private String[] words = {"ひまnow", "あそぼ!", "そろそろ会いたない〜?", "勉強なう", "電話しよ~", "お風呂入ってくる~", "今暇だよー!", "いそがしい~!!"}; private Button openDialogButton; + private Map userViews = new HashMap<>(); ActivityViewModel activityViewModel; Tampopo tampopo; @@ -83,10 +95,10 @@ // } // }); - MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveData(); - activitiesLiveData.observe(this, new Observer>() { + MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveData(); + activitiesLiveData.observe(this, new Observer>() { @Override - public void onChanged(Map activities) { + public void onChanged(Map activities) { updateActivityView(activities); } }); @@ -114,6 +126,25 @@ // ボタンを押すとダイアログ表示(トリガー用) openDialogButton = findViewById(R.id.openDialogButton); openDialogButton.setOnClickListener(v -> showInputDialog()); + + // 仮データを作る(ユーザID、コメント) + Map mockActivities = new HashMap<>(); + mockActivities.put("user01", new Activity("user01", "act01","ひま〜", "2025-09-25 10:00" )); + mockActivities.put("user02", new Activity("user02", "act02","勉強してるよ", "2025-09-25 10:01")); + mockActivities.put("user03", new Activity("user03", "act03","ねむい〜", "2025-09-25 10:02")); + + + // 表示を更新 + updateActivityView(mockActivities); + + // 疑似通知ボタン chat申請後ダイアログを表示するため、それの疑似的な申請コード + //まだ動くかわからない + //Button testNotificationButton = findViewById(R.id.openDialogButton); // 既存のボタンを利用 + //testNotificationButton.setOnClickListener(v -> { + // 本来は通知を受信したタイミングで呼ばれる + // showCallRequestDialog(MainActivity.this, "user01"); + //}); + } private void showInputDialog() { @@ -171,12 +202,78 @@ dialog.show(); } + //natty 仮のフレンド情報 + private int getUserIconResource(String userId) { + switch (userId) { + case "user01": + return R.drawable.friend01_icon; + case "user02": + return R.drawable.friend02_icon; + case "user03": + return R.drawable.friend03_icon; + default: + return R.drawable.default_icon; + } + } + private void updateActivityView(Map activities) { - TextView comment = this.findViewById(R.id.friend01_comment); - for (Activity ac: activities.values()) { - comment.setText(ac.getText()); + //TextView comment = this.findViewById(R.id.friend01_comment); + //for (Activity ac: activities.values()) { + // comment.setText(ac.getText()); + //} + + ///natty ユーザごとにコメントの更新をする + LinearLayout messageList = findViewById(R.id.messageList); + + for (Map.Entry entry : activities.entrySet()) { + String userId = entry.getKey(); + Activity activity = entry.getValue(); + + View userView = userViews.get(userId); + + if (userView == null) { + // 新しいユーザなので、アイコン+コメントを作成 + LinearLayout container = new LinearLayout(this); + container.setOrientation(LinearLayout.HORIZONTAL); + container.setPadding(16, 16, 16, 16); + + // ユーザのアイコン(固定) + 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(userId)); // ←ここがポイント + + // コメント部分 + TextView commentView = new TextView(this); + commentView.setTextSize(16); + commentView.setPadding(16, 0, 0, 0); + commentView.setText(activity.getText()); + + // コンテナに追加 + container.addView(iconView); + container.addView(commentView); + + // Mapに登録、画面に追加 + userViews.put(userId, container); + messageList.addView(container); + + } else { + // 既に表示されている → コメントだけ更新 + TextView commentView = (TextView) ((LinearLayout) userView).getChildAt(1); + commentView.setText(activity.getText()); + } } + } // if (activities == null || friendIds == null) return; // // messageList.removeAllViews(); // 表示をリセット @@ -192,6 +289,63 @@ // messageList.addView(textView); // } // } + + //natty + //通知が来たときに赤丸をつける + //通知はまだできてないからいったん赤丸を表示させるっていうの書く + //この下のコードが赤丸がつくコード + //iconView.setStrokeColor(ContextCompat.getColorStateList(this, R.color.red)); + + //プッシュ通知 + private void showChatNotification(String friendName) { + NotificationManager notificationManager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + + String channelId = "chat_channel"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel( + channelId, + "Chat Notifications", + NotificationManager.IMPORTANCE_HIGH + ); + notificationManager.createNotificationChannel(channel); + } + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId) + .setSmallIcon(R.drawable.default_icon) // 通知アイコン + .setContentTitle("新しいチャット") + .setContentText(friendName + " さんから通話があります") + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true); // タップしたら消える + + //notificationManager.notify(1, builder.build()); + } + + //通話が来たときのダイアログ + // 通話リクエストを受け取った時に呼び出すダイアログ + public void showCallRequestDialog(Context context, String fromUserName) { + Dialog dialog = new Dialog(context); + dialog.setContentView(R.layout.dialog_chat_receved); + dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); + dialog.getWindow().setDimAmount(0.5f); + + // メッセージテキスト + TextView tvMessage = dialog.findViewById(R.id.tv_message); + tvMessage.setText(fromUserName + " さんから通話リクエストが届いています。\n通話を開始しますか?"); + + // 開始ボタン + Button btnStart = dialog.findViewById(R.id.btn_start); + btnStart.setOnClickListener(v -> { + Toast.makeText(context, "通話を開始しました", Toast.LENGTH_SHORT).show(); + dialog.dismiss(); + // TODO: 実際の通話開始処理をここに書く + }); + + // キャンセルボタン + Button btnCancel = dialog.findViewById(R.id.btn_cancel); + btnCancel.setOnClickListener(v -> dialog.dismiss()); + + dialog.show(); } } \ No newline at end of file