diff --git a/app/src/main/java/com/example/tampopo_client/Tampopo.java b/app/src/main/java/com/example/tampopo_client/Tampopo.java index 4708cbd..895975a 100644 --- a/app/src/main/java/com/example/tampopo_client/Tampopo.java +++ b/app/src/main/java/com/example/tampopo_client/Tampopo.java @@ -11,6 +11,7 @@ private String userId; private String password; private String chatroomId; + private String chatFriendId; private String mailaddress; private String nickname; private String icon; @@ -44,6 +45,13 @@ public void setChatroomId(String ChatroomId) { this.chatroomId = ChatroomId; } + public String getChatFriendId() { + return chatFriendId; + } + + public void setChatFriendId(String ChatFriendId) { + this.chatFriendId = ChatFriendId; + } public String getMailaddress() { return mailaddress; } diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java index 1b360d7..d286253 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ChatViewModel.java @@ -8,6 +8,8 @@ import com.example.tampopo_client.models.ChatMessage; import com.example.tampopo_client.models.Chatroom; import com.example.tampopo_client.resources.ChatroomResource; + +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -27,11 +29,10 @@ private final MutableLiveData> chatMessages = new MutableLiveData<>(new ArrayList<>()); private final MutableLiveData latestMessage = new MutableLiveData<>(); private final MutableLiveData chatroomClosed = new MutableLiveData<>(); - private final HashMap> chatFriendToFriendLiveData = new HashMap<>(); // 通話中(リアルタイム監視用) private final MutableLiveData chatFriendToMeLiveData = new MutableLiveData<>(); - private final MutableLiveData chatToFriendLiveData = new MutableLiveData<>(); + // ===== 以下は追加部分(Handlerループ) ===== private final Handler handler = new Handler(Looper.getMainLooper()); @@ -108,29 +109,37 @@ return chatFriendToMeLiveData; } - public MutableLiveData getChatToFriendLiveData() { - return chatToFriendLiveData; - } + // =============================== // 1. チャットルームに入る(かける側) // =============================== - public void enterChatroom(String myId, String partnerId, String token) { + public String enterChatroom(String myId, String partnerId, String token) { Call call = chatroomResource.enterChatroom(myId, partnerId, token); - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful() && response.body() != null) { - chatroomIdLiveData.setValue(response.body().getChatroomId()); - Log.d("ChatVM", "enterChatroom success → chatroomId: " + response.body().getChatroomId()); - } + try { + Response response = call.execute(); + if (response.isSuccessful() && response.body() != null) { + return response.body().getChatroomId(); + } else { + return null; } - - @Override - public void onFailure(Call call, Throwable t) { - Log.e("ChatVM", "enterChatroom error: " + t.getMessage()); - } - }); + } catch (IOException e) { + throw new RuntimeException(e); + } +// call.enqueue(new Callback() { +// @Override +// public void onResponse(Call call, Response response) { +// if (response.isSuccessful() && response.body() != null) { +// chatroomIdLiveData.setValue(response.body().getChatroomId()); +// Log.d("ChatVM", "enterChatroom success → chatroomId: " + response.body().getChatroomId()); +// } +// } +// +// @Override +// public void onFailure(Call call, Throwable t) { +// Log.e("ChatVM", "enterChatroom error: " + t.getMessage()); +// } +// }); } // 1.5 自分がchatroomに入っているのか確認する @@ -157,46 +166,7 @@ }); } - // =============================== - // 1.55 現在通話中のペアを確認 - // =============================== - public void fetchActiveChatPair(String userId, String token) { - Call call = chatroomResource.getMyChatroom(userId, token); - call.enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful() && response.body() != null) { - Chatroom activeRoom = response.body(); - chatroomIdLiveData.setValue(activeRoom.getChatroomId()); - String user1 = activeRoom.getUser1Id(); - String user2 = activeRoom.getUser2Id(); - - // ログインユーザーが user1 の場合 - if (userId.equals(user1)) { - chatFriendToMeLiveData.setValue(user2); // もう一方のユーザーを LiveData にセット - // HashMap にもセット - chatFriendToFriendLiveData.put(userId, new MutableLiveData<>(user2)); - } - // ログインユーザーが user2 の場合 - else if (userId.equals(user2)) { - chatToFriendLiveData.setValue(user1); // もう一方のユーザーを LiveData にセット - chatFriendToFriendLiveData.put(userId, new MutableLiveData<>(user1)); - } - - Log.d("ChatVM", "Active pair found: " + user1 + " ↔ " + user2); - } else { - chatroomIdLiveData.setValue(null); - chatroomClosed.setValue(true); - } - } - - @Override - public void onFailure(Call call, Throwable t) { - Log.e("ChatVM", "fetchActiveChatPair error: " + t.getMessage()); - } - }); - } // =============================== diff --git a/app/src/main/java/com/example/tampopo_client/views/FriendIconView.java b/app/src/main/java/com/example/tampopo_client/views/FriendIconView.java index 2d461a6..0fb5746 100644 --- a/app/src/main/java/com/example/tampopo_client/views/FriendIconView.java +++ b/app/src/main/java/com/example/tampopo_client/views/FriendIconView.java @@ -34,7 +34,6 @@ private String friendUserNickname; private ChatViewModel chatViewModel; - // TODO: CHANGE //ActivityLiveData private final Observer> activitiesObserver = new Observer>() { @Override @@ -46,13 +45,6 @@ } }; - //userLiveData - private final Observer userObserver = new Observer() { - @Override - public void onChanged(String user) { - } - }; - //chatLiveData private final Observer chatObserver = new Observer() { @Override @@ -72,7 +64,7 @@ return chatObserver; } - public FriendIconView(Context context, String friendUserId,String friendUserNickname, ChatViewModel chatViewModel) { + public FriendIconView(Context context, String friendUserId, String friendUserNickname, ChatViewModel chatViewModel) { this(context); this.friendUserId = friendUserId; this.friendUserNickname = friendUserNickname; @@ -106,15 +98,6 @@ mFriendIcon = findViewById(R.id.friend_icon); mFriendChatNotification = findViewById(R.id.chat_notification); - //true(チャット通知が来た時)なら表示 - if (chatNotification) { - mFriendChatNotification.setVisibility(View.VISIBLE); - } - //false(チャット通知が来ていない)なら非表示 - else { - mFriendChatNotification.setVisibility(View.GONE); - } - //iconを押したらチャットを始めることができる(チャットのダイアログができたらFriendActivityを変更) mFriendIcon.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -122,7 +105,7 @@ if (chatNotification) { answeringCallDialog(getContext(), FriendIconView.this.friendUserNickname); } // 通話をかける場合 - else if(!chatNotification){ + else if (!chatNotification) { showCallRequestDialog(getContext(), FriendIconView.this.friendUserNickname); } } @@ -130,7 +113,7 @@ } //通話に出る際のダイアログの表示 - public void answeringCallDialog(Context context, String fromUserNickname){ + public void answeringCallDialog(Context context, String fromUserNickname) { Dialog fromDialog = new Dialog(context); fromDialog.setContentView(R.layout.dialog_chat_receved); fromDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); @@ -151,6 +134,7 @@ // 通話を開始する Tampopo tampopo = (Tampopo) ((MainActivity) getContext()).getApplication(); // String chatroomId = chatViewModel.enterChatroom(tampopo.getUserId(), friendUserId, tampopo.getToken()); + tampopo.setChatFriendId(friendUserId); // ChatActivityに画面遷移する Context ctx = getContext(); @@ -184,7 +168,9 @@ // 通話を開始する Tampopo tampopo = (Tampopo) ((MainActivity) getContext()).getApplication(); -// String chatroomId = chatViewModel.enterChatroom(tampopo.getUserId(), friendUserId, tampopo.getToken()); + String chatroomId = chatViewModel.enterChatroom(tampopo.getUserId(), friendUserId, tampopo.getToken()); + tampopo.setChatroomId(chatroomId); + tampopo.setChatFriendId(friendUserId); // ChatActivityに画面遷移する Context ctx = getContext(); @@ -232,21 +218,6 @@ } } -// public void setActivityLiveDataObserver(String uid, ActivityViewModel viewModel){ -// activityObserver = new Observer>() { - - // TODO: CHANGE -// @Override -// public void onChanged(List activityList) { -// if (activityList != null && !activityList.isEmpty()) { -// Activity act = activityList.get(0); -// friendActivity = act.getText(); -// setAccount(act.getUserId()); -// } -// } -// }; -// viewModel.getActivitiesLiveDataFromUserId(uid).observeForever(activityObserver); -// } /** * FriendIconViewのアイコン画像を更新する @@ -257,24 +228,5 @@ Glide.with(getContext()).load(iconUrl).into(getImageView()); } - //uidを引数にカスタムビューにニックネーム,コメント,アイコンをセットする -// public void setAccount(String uid, String iconUrl) { -// this.userId = uid; -// setNickname("nitta"); -// //String imageUrl = "http://nitta-lab-www.is.konan-u.ac.jp/tampopo-data/icon" + uid + ".jpg"; -// Glide.with(getContext()).load(iconUrl).into(getImageView()); -// } - public void setChatNotification(boolean chat) { - //チャットを終了するときのonclickで一緒にsetChatNotification(false)もする(アイコン周りの赤丸を消す) - //true(チャット通知が来た時)なら表示 - chatNotification = chat; - if (chat) { - mFriendChatNotification.setVisibility(View.VISIBLE); - } - //false(チャット通知が来ていない)なら非表示 - else { - mFriendChatNotification.setVisibility(View.GONE); - } - } } 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 06af26e..a2225ee 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,7 +1,9 @@ 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.content.pm.PackageManager; import android.os.Build; @@ -18,6 +20,8 @@ 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; @@ -37,6 +41,9 @@ import com.example.tampopo_client.Tampopo; import com.example.tampopo_client.models.Activity; import com.example.tampopo_client.viewmodels.ActivityViewModel; +import com.example.tampopo_client.viewmodels.ChatViewModelFactory; +import com.example.tampopo_client.viewmodels.UserViewModel; +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; @@ -49,11 +56,25 @@ import java.util.List; import java.util.Map; +import android.util.TypedValue; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; + 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<>(); + 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; UserViewModel userViewModel; @@ -208,6 +229,8 @@ } }); + messageList = findViewById(R.id.messageList); + // ボタンを押すとダイアログ表示(トリガー用) openDialogButton = findViewById(R.id.openDialogButton); openDialogButton.setOnClickListener(v -> showInputDialog()); @@ -322,7 +345,9 @@ private void updateActivityView(List friends) { ///natty ユーザごとにコメントの更新をする LinearLayout messageList = findViewById(R.id.messageList); + ConstraintLayout layout = findViewById(R.id.main); + i = 0; for (String friendId : friends) { FriendIconView userView = userViews.get(friendId); MutableLiveData> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId); @@ -343,25 +368,33 @@ @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() +// // ユーザのアイコン(固定) +// 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 ); - - // ユーザIDに応じてアイコンリソースを決定(仮にハードコード or マッピング) - iconView.setImageResource(getUserIconResource(friendId)); // ←ここがポイント + container.setLayoutParams(params); + layout.addView(container); +// +// // ユーザIDに応じてアイコンリソースを決定(仮にハードコード or マッピング) +// iconView.setImageResource(getUserIconResource(friendId)); // ←ここがポイント // Mapに登録、画面に追加 userViews.put(friendId, container); - messageList.addView(container); +// userView = container; +// messageList.addView(container); // TODO: CHANGE activitiesLiveData.observeForever(container.getActivitiesObserver()); @@ -370,6 +403,29 @@ } }).start(); } + + FriendIconView userView2 = userViews.get(friendId); + 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(userView2.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, marginTopInPx); + set.connect(userView2.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, marginStartInPx); + + set.applyTo(layout); + + if (i < 6) { + i++; + } } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d02c831..3b1ce58 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -82,34 +82,6 @@ app:layout_constraintVertical_bias="0.38" app:srcCompat="@drawable/comment" /> - - - - - - - \ No newline at end of file