diff --git a/app/src/main/java/com/andkjyk/wetube_v0/Adapter/AddPlaylistAdapter.java b/app/src/main/java/com/andkjyk/wetube_v0/Adapter/AddPlaylistAdapter.java index e1fa08b..dd89a96 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/Adapter/AddPlaylistAdapter.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/Adapter/AddPlaylistAdapter.java @@ -85,7 +85,6 @@ public void onClick(DialogInterface dialogInterface, int i) { }).setNegativeButton("취소", null); AlertDialog alert = alt_bld.create(); alert.show(); - } } }); diff --git a/app/src/main/java/com/andkjyk/wetube_v0/AddPlaylistActivity.java b/app/src/main/java/com/andkjyk/wetube_v0/AddPlaylistActivity.java index 67402d6..a6f2284 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/AddPlaylistActivity.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/AddPlaylistActivity.java @@ -41,6 +41,7 @@ public class AddPlaylistActivity extends AppCompatActivity { private AddPlaylistAdapter adapter; private ImageView left_icon; private SearchView searchView; + private String roomCode; private ArrayList searchedItemList = new ArrayList<>(); @@ -52,6 +53,10 @@ protected void onCreate(Bundle savedInstanceState) { left_icon = findViewById(R.id.left_icon); searchView = findViewById(R.id.searchView); + Intent intent = getIntent(); + roomCode = intent.getExtras().getString("roomCode"); + System.out.println("룸코드: " + roomCode); + left_icon.setOnClickListener(new View.OnClickListener() { @Override @@ -197,6 +202,7 @@ public void prettyPrint(Iterator iteratorSearchResults, String que data.setPublisher(listPublisher.get(i)); data.setThumbnailURL(listThumbnail.get(i)); data.setId(listId.get(i)); + data.setRoomCode(roomCode); searchedItemList.add(data); } diff --git a/app/src/main/java/com/andkjyk/wetube_v0/ChatFragment.java b/app/src/main/java/com/andkjyk/wetube_v0/ChatFragment.java index dfb5d54..3b746c1 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/ChatFragment.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/ChatFragment.java @@ -31,13 +31,11 @@ public class ChatFragment extends Fragment { - private Socket mSocket; private Gson gson = new Gson(); private RecyclerView chatRecyclerView; private RecyclerView.LayoutManager layoutManager; private ChatAdapter chatAdapter; String room_code, host_name, user_name; - int room_pos; public ChatFragment() { // Required empty public constructor @@ -58,12 +56,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, } private void init(View view){ - try { - mSocket = IO.socket("http://3.37.36.38:3000/"); - Log.d("SOCKET", "Connection success : " + mSocket.id()); - } catch (URISyntaxException e) { - e.printStackTrace(); - } chatRecyclerView = (RecyclerView) view.findViewById(R.id.rv_chat); chatRecyclerView.setHasFixedSize(true); @@ -104,25 +96,18 @@ public void onClick(View v) { } }); - mSocket.connect(); + // socket.io 연결 + ((RoomActivity) getActivity()).mSocket.connect(); - mSocket.on(Socket.EVENT_CONNECT, args -> { - mSocket.emit("enter", gson.toJson(new RoomData(user_name, room_code))); //room_code, room_pos 어떻게 처리할지 생각하기 - }); - mSocket.on("update", args -> { + // socket.io 메세지 받아오기 + ((RoomActivity) getActivity()).mSocket.on("update", args -> { MessageData data = gson.fromJson(args[0].toString(), MessageData.class); - addChat(data); + if(getActivity() != null){ + addChat(data); + } }); } - @Override - public void onDestroy() { - super.onDestroy(); - // 액티비티가 소멸될 때 연결을 해제, 검색액티비티에서 돌아왔을 때 채팅이 남는지 확인하고, 안남으면 수정 필요할듯? - mSocket.emit("exit", gson.toJson(new RoomData(user_name, room_code))); - mSocket.disconnect(); - } - // 리사이클러뷰에 채팅 추가 private void addChat(MessageData data) { getActivity().runOnUiThread(() -> { @@ -141,9 +126,10 @@ private void addChat(MessageData data) { }); } + private void sendMessage(View view) { EditText msg = view.findViewById(R.id.editText); - mSocket.emit("newMessage", gson.toJson(new MessageData("MESSAGE", + ((RoomActivity) getActivity()).mSocket.emit("newMessage", gson.toJson(new MessageData("MESSAGE", user_name, room_code, msg.getText().toString(), System.currentTimeMillis()))); Log.d("MESSAGE", new MessageData("MESSAGE", user_name, room_code+"", msg.getText().toString(), System.currentTimeMillis()).toString()); @@ -156,4 +142,5 @@ private void sendMessage(View view) { private String toDate(long currentMiliis) { return new SimpleDateFormat("a hh:mm").format(new Date(currentMiliis)); } + } \ No newline at end of file diff --git a/app/src/main/java/com/andkjyk/wetube_v0/Model/PlaylistItem.java b/app/src/main/java/com/andkjyk/wetube_v0/Model/PlaylistItem.java index 597801f..df0ece2 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/Model/PlaylistItem.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/Model/PlaylistItem.java @@ -2,15 +2,16 @@ public class PlaylistItem { - private String plVideoName, plPublisher, plVideoId, plThumbnailURL; + private String plVideoName, plPublisher, plVideoId, plThumbnailURL, plRoomCode; public PlaylistItem(){}; - public PlaylistItem(String videoName, String publisher, String videoId, String thumbnailURL){ + public PlaylistItem(String videoName, String publisher, String videoId, String thumbnailURL, String roomCode){ this.plVideoName = videoName; this.plPublisher = publisher; this.plVideoId = videoId; this.plThumbnailURL = thumbnailURL; + this.plRoomCode = roomCode; } public String getPlVideoName(){ @@ -25,6 +26,8 @@ public String getPlPublisher(){ public String getPlThumbnailURL() { return plThumbnailURL; } + public String getPlRoomCode() { return plRoomCode; } + public void setPlVideoName(String plVideoName){ this.plVideoName = plVideoName; } @@ -36,4 +39,6 @@ public void setPlPublisher(String plPublisher){ public void setPlVideoId(String plVideoName) { this.plVideoId = plVideoName; } public void setPlThumbnailURL(String plThumbnailURL) { this.plThumbnailURL = plThumbnailURL; } + + public void setPlRoomCode(String plRoomCode) { this.plRoomCode = plRoomCode; } } diff --git a/app/src/main/java/com/andkjyk/wetube_v0/Model/SearchedVideoItem.java b/app/src/main/java/com/andkjyk/wetube_v0/Model/SearchedVideoItem.java index 35a143c..0ae61f7 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/Model/SearchedVideoItem.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/Model/SearchedVideoItem.java @@ -5,6 +5,7 @@ public class SearchedVideoItem { private String publisher; private String thumbnailURL; private String id; + private String roomCode; public String getId() { return id; @@ -18,6 +19,8 @@ public String getTitle() { return title; } + public String getRoomCode() { return roomCode; } + public void setTitle(String title) { this.title = title; } @@ -37,4 +40,6 @@ public String getThumbnailURL() { public void setThumbnailURL(String thumbnail) { this.thumbnailURL = thumbnail; } + + public void setRoomCode(String roomCode) { this.roomCode = roomCode; } } diff --git a/app/src/main/java/com/andkjyk/wetube_v0/PlaylistFragment.java b/app/src/main/java/com/andkjyk/wetube_v0/PlaylistFragment.java index eff9298..8d31dc4 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/PlaylistFragment.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/PlaylistFragment.java @@ -31,6 +31,7 @@ public class PlaylistFragment extends Fragment { private int ADDPLAYLIST_REQUEST_CODE = 208; private ArrayList plItemList = new ArrayList<>(); + String roomCode; public PlaylistFragment() { // Required empty public constructor @@ -45,7 +46,8 @@ public void onActivityResult(int requestCode, int resultCode, @Nullable Intent d String publisher = data.getStringExtra("s_publisher"); String thumbnailUrl = data.getStringExtra("s_thumbnailUrl"); String title = data.getStringExtra("s_title"); - plAdapter.addItem(new PlaylistItem(title, publisher, videoId, thumbnailUrl)); + + plAdapter.addItem(new PlaylistItem(title, publisher, videoId, thumbnailUrl, roomCode)); plAdapter.notifyDataSetChanged(); } } @@ -65,7 +67,11 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + Bundle bundle = getArguments(); + roomCode = bundle.getString("roomCode"); + Intent intent = new Intent(getActivity(), AddPlaylistActivity.class); + intent.putExtra("roomCode", roomCode); startActivityForResult(intent, ADDPLAYLIST_REQUEST_CODE); //startActivity(intent); } @@ -124,6 +130,7 @@ private void getData(){ data.setPlPublisher(listPlPublisher.get(i)); data.setPlVideoId(listPlVideoId.get(i)); data.setPlThumbnailURL(listPlThumbnailURL.get(i)); + data.setPlRoomCode(roomCode); plItemList.add(data); } diff --git a/app/src/main/java/com/andkjyk/wetube_v0/RoomActivity.java b/app/src/main/java/com/andkjyk/wetube_v0/RoomActivity.java index 77b407c..9adcb5a 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/RoomActivity.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/RoomActivity.java @@ -1,26 +1,60 @@ package com.andkjyk.wetube_v0; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ImageView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.andkjyk.wetube_v0.Adapter.ChatAdapter; +import com.andkjyk.wetube_v0.Model.ChatItem; +import com.andkjyk.wetube_v0.Model.ChatType; +import com.andkjyk.wetube_v0.Model.MessageData; +import com.andkjyk.wetube_v0.Model.RoomData; +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.JsonObjectRequest; +import com.android.volley.toolbox.Volley; import com.google.android.material.tabs.TabLayout; +import com.google.gson.Gson; import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer; import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener; import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.views.YouTubePlayerView; +import org.json.JSONException; +import org.json.JSONObject; + +import java.net.URISyntaxException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import io.socket.client.IO; +import io.socket.client.Socket; + public class RoomActivity extends AppCompatActivity { + public Socket mSocket; + private Gson gson = new Gson(); + private ImageView left_icon; Fragment frag_playlist, frag_users, frag_chat; String room_title, room_code, host_name, user_name; boolean isHost; + private RecyclerView chatRecyclerView; + private RecyclerView.LayoutManager layoutManager; + private ChatAdapter chatAdapter; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -38,18 +72,20 @@ protected void onCreate(Bundle savedInstanceState) { room_title = intent.getStringExtra("roomTitle"); room_code = intent.getStringExtra("roomCode"); host_name = intent.getStringExtra("hostName"); + user_name = host_name; isHost = true; } else if(SenderActivity.equals("Main")){ user_name = intent.getStringExtra("userName"); host_name = intent.getStringExtra("hostName"); room_code = intent.getStringExtra("roomCode"); + isHost = false; + postUser(); } else if(SenderActivity.equals("AddPlaylist")) { // AddPlaylist에서 뒤로가기 했을 때 // 백엔드 작업 후 수정 } else { System.out.println("RoomActivity가 intent를 제대로 받아오지 못함"); } - left_icon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -58,6 +94,20 @@ public void onClick(View v) { } }); + // socket.io 서버 연결 + try { + mSocket = IO.socket("http://3.37.36.38:3000/"); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + mSocket.connect(); + + // 입장메세지 띄우기 위해 방 정보 서버에 보냄 + mSocket.on(Socket.EVENT_CONNECT, args -> { + //System.out.println("아아아아아아ㅏ아아아 enter"); + mSocket.emit("enter", gson.toJson(new RoomData(user_name, room_code))); + }); // YouTube Video 띄우는 부분 YouTubePlayerView youTubePlayerView = findViewById(R.id.video); @@ -72,7 +122,6 @@ public void onReady(@NonNull YouTubePlayer youTubePlayer) { }); - frag_chat = new ChatFragment(); frag_users = new UsersFragment(); frag_playlist = new PlaylistFragment(); @@ -100,6 +149,7 @@ public void onTabSelected(TabLayout.Tab tab) { Bundle bundle = new Bundle(); bundle.putBoolean("isHost", isHost); + bundle.putString("roomCode", room_code); if(isHost == true){ bundle.putString("host_name", host_name); }else{ @@ -121,4 +171,88 @@ public void onTabReselected(TabLayout.Tab tab) { } }); } + + // 리사이클러뷰에 채팅 추가 + void addChat(MessageData data) { + this.runOnUiThread(() -> { + if (data.getType().equals("ENTER") || data.getType().equals("EXIT")) { + chatAdapter.addItem(new ChatItem(data.getFrom(), data.getContent(), toDate(data.getSendTime()), ChatType.CENTER_MESSAGE)); + chatRecyclerView.scrollToPosition(chatAdapter.getItemCount() - 1); + } else { + if (user_name.equals(data.getFrom())) { + chatAdapter.addItem(new ChatItem(data.getFrom(), data.getContent(), toDate(data.getSendTime()), ChatType.RIGHT_MESSAGE)); + chatRecyclerView.scrollToPosition(chatAdapter.getItemCount() - 1); + } else { + chatAdapter.addItem(new ChatItem(data.getFrom(), data.getContent(), toDate(data.getSendTime()), ChatType.LEFT_MESSAGE)); + chatRecyclerView.scrollToPosition(chatAdapter.getItemCount() - 1); + } + } + }); + } + + // System.currentTimeMillis를 몇시:몇분 am/pm 형태의 문자열로 반환 + private String toDate(long currentMiliis) { + return new SimpleDateFormat("a hh:mm").format(new Date(currentMiliis)); + } + + private void postUser() { + String url = "http://3.37.36.38:3000/user"; + RequestQueue requestQueue = Volley.newRequestQueue(this); + requestQueue.start(); + + JSONObject params = new JSONObject(); + + try { + params.put("userName", user_name); + params.put("roomCode", room_code); + } catch (JSONException e){ + e.printStackTrace(); + } + + JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, url, params, + response -> { + Toast.makeText(getApplicationContext(), "msg from server : " + response, Toast.LENGTH_LONG).show(); + }, error -> { + Toast.makeText(getApplicationContext(), "fail : msg from server", Toast.LENGTH_LONG).show(); + }); + + requestQueue.add(jsonObjReq); + } + + @Override + protected void onStop() { + super.onStop(); + + //퇴장(뒤로가기 혹은 앱 종료) 시 퇴장메세지 띄움 + mSocket.emit("exit", gson.toJson(new RoomData(user_name, room_code))); + mSocket.disconnect(); + + Intent intent = new Intent(RoomActivity.this, MainActivity.class); + startActivity(intent); + } + + /* + @Override + protected void onDestroy() { + super.onDestroy(); + + AlertDialog.Builder alt_bld = new AlertDialog.Builder(RoomActivity.this, R.style.AlertDialogStyle); + alt_bld.setMessage("퇴장하시겠습니까?").setCancelable(false).setPositiveButton("확인", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if(!isHost){ + // 호스트가 퇴장할 때 + System.out.println("호스트다아아아"); + + } else{ + // 게스트가 퇴장할 때 + System.out.println("게스트다아아아"); + } + } + }).setNegativeButton("취소", null); + AlertDialog alert = alt_bld.create(); + alert.show(); + } + + */ } \ No newline at end of file diff --git a/app/src/main/java/com/andkjyk/wetube_v0/UsersFragment.java b/app/src/main/java/com/andkjyk/wetube_v0/UsersFragment.java index 5d090a7..dc4d383 100644 --- a/app/src/main/java/com/andkjyk/wetube_v0/UsersFragment.java +++ b/app/src/main/java/com/andkjyk/wetube_v0/UsersFragment.java @@ -21,7 +21,9 @@ import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; +import org.json.JSONArray; import org.json.JSONException; +import org.json.JSONObject; import java.util.ArrayList; @@ -37,6 +39,7 @@ public class UsersFragment extends Fragment { private String host_name, user_name; private ArrayList user = new ArrayList<>(); private boolean isHost; + private int user_size = 0; public UsersFragment() { // Required empty public constructor @@ -52,7 +55,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_users, container, false); - getUser(); getData(); Bundle bundle = getArguments(); @@ -64,6 +66,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, host_name = bundle.getString("host_name"); tv_my_name.setText(host_name); host_icon = view.findViewById(R.id.host_icon); + user_name = host_name; }else{ host_name = bundle.getString("host_name"); user_name = bundle.getString("user_name"); @@ -90,38 +93,53 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, } private void getData(){ - userItems.clear(); - ArrayList list = new ArrayList<>(); - int len = user.size(); - - for(int i = 0; i < len; i++){ - list.add(user.get(i)); - } - - for(int i = 0; i < len; i++){ - UserItem data = new UserItem(); - data.setUserName(list.get(i)); - userItems.add(data); - } - } - - private void getUser() { String url = "http://3.37.36.38:3000/user"; RequestQueue requestQueue = Volley.newRequestQueue(getContext()); - requestQueue.start(); JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null, response -> { try { - user = (ArrayList) response.get("user"); + JSONArray users = response.getJSONArray("users"); + //System.out.println("user_size = " + user_size + " userSize = " + response.getInt("userSize")); + user_size = response.getInt("userSize"); + user.clear(); + for(int i = 0; i < user_size; i++) { + user.add(users.getJSONObject(i).getString("userName")); + } + Toast.makeText(getContext(), "user: " + user , Toast.LENGTH_LONG).show(); + + ArrayList list = new ArrayList<>(); + int len = user.size(); + //System.out.println("length: "+user.size()); + + userItems.clear(); + list.clear(); + + for(int i = 0; i < len; i++){ + list.add(user.get(i)); + //System.out.println("user list ["+i+"] : "+user.get(i)+"/"+user.get(i)); + } + + for(int i = 0; i < len; i++){ + //System.out.println("user list ["+i+"] : "+user.get(i)); + if(!user_name.equals(list.get(i))){ + UserItem data = new UserItem(); + data.setUserName(list.get(i)); + userItems.add(data); + //System.out.println("userItems: "+userItems.get(i).getUserName()); + } + } + usersAdapter.addItems(userItems); + usersAdapter.notifyDataSetChanged(); + } catch (JSONException e) { + Toast.makeText(getContext(), "get user fail" , Toast.LENGTH_LONG).show(); e.printStackTrace(); } - Toast.makeText(getContext(), "msg from server => user: " + user , Toast.LENGTH_LONG).show(); }, error -> { Toast.makeText(getContext(), "fail : msg from server", Toast.LENGTH_LONG).show(); }); - requestQueue.add(jsonObjReq); + } } diff --git a/app/src/main/res/layout/fragment_users.xml b/app/src/main/res/layout/fragment_users.xml index 80a0043..10a50db 100644 --- a/app/src/main/res/layout/fragment_users.xml +++ b/app/src/main/res/layout/fragment_users.xml @@ -9,7 +9,7 @@ + android:scrollbars="vertical" />