diff --git a/app/build.gradle b/app/build.gradle index 83ede27e..95d99f3d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -111,4 +111,8 @@ dependencies { implementation "com.google.dagger:hilt-android:2.44" kapt "com.google.dagger:hilt-compiler:2.44" + //Socket +// implementation 'com.github.nkzawa:socket.io-client:0.3.0' + implementation 'io.socket:socket.io-client:2.1.0' + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 02c743f6..f429dadb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + diff --git a/app/src/main/java/com/farm/farmus_application/di/AppModule.kt b/app/src/main/java/com/farm/farmus_application/di/AppModule.kt index 0978e82b..094b531c 100644 --- a/app/src/main/java/com/farm/farmus_application/di/AppModule.kt +++ b/app/src/main/java/com/farm/farmus_application/di/AppModule.kt @@ -21,7 +21,8 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object AppModule { - private const val baseUrl = "http://118.67.135.247:80/" +// private const val baseUrl = "http://118.67.135.247:80/" + const val baseUrl = "https://www.farmus.kro.kr/" private val jwtToken = UserPrefsStorage.accessToken ?: "" @Provides diff --git a/app/src/main/java/com/farm/farmus_application/ui/farm/ReserveFarmListFragment.kt b/app/src/main/java/com/farm/farmus_application/ui/farm/ReserveFarmListFragment.kt index fed8005c..d8179c64 100644 --- a/app/src/main/java/com/farm/farmus_application/ui/farm/ReserveFarmListFragment.kt +++ b/app/src/main/java/com/farm/farmus_application/ui/farm/ReserveFarmListFragment.kt @@ -1,6 +1,7 @@ package com.farm.farmus_application.ui.farm import android.os.Bundle +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View @@ -87,6 +88,7 @@ class ReserveFarmListFragment : Fragment() { recentAdapter.registerAdapterDataObserver(emptyDataObserve) farmListViewModel.currentFarmList.observe(viewLifecycleOwner) { + Log.d("CurrentFarmList:",it.toString()) recentAdapter.submitList(it.result) } diff --git a/app/src/main/java/com/farm/farmus_application/ui/message/ClientChatFragment.kt b/app/src/main/java/com/farm/farmus_application/ui/message/ClientChatFragment.kt index ce3d1513..ab9c47f4 100644 --- a/app/src/main/java/com/farm/farmus_application/ui/message/ClientChatFragment.kt +++ b/app/src/main/java/com/farm/farmus_application/ui/message/ClientChatFragment.kt @@ -1,6 +1,8 @@ package com.farm.farmus_application.ui.message +import android.annotation.SuppressLint import android.content.Context +import android.nfc.Tag import android.os.Bundle import android.util.Log import androidx.fragment.app.Fragment @@ -11,12 +13,27 @@ import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import android.widget.PopupMenu import androidx.recyclerview.widget.LinearLayoutManager +import com.farm.farmus_application.MyApplication import com.farm.farmus_application.R import com.farm.farmus_application.databinding.FragmentClientChatBinding +import com.farm.farmus_application.di.AppModule import com.farm.farmus_application.repository.UserPrefsStorage import com.farm.farmus_application.ui.MainActivity import com.farm.farmus_application.ui.message.adapter.ClientChatRVAdapter import com.farm.farmus_application.utilities.JWTUtils +import io.socket.client.IO +import io.socket.client.Socket +import io.socket.emitter.Emitter +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.json.JSONException +import org.json.JSONObject +import java.net.URISyntaxException +import java.text.SimpleDateFormat +import java.util.Locale class ClientChatFragment : Fragment() { @@ -25,24 +42,28 @@ class ClientChatFragment : Fragment() { private val binding get() = _binding!! private val jwtToken = UserPrefsStorage.accessToken private val name = JWTUtils.decoded(jwtToken.toString())?.tokenBody?.name ?: "" - + private var mSocket: Socket? = null + private val onMessageReceived = Emitter.Listener { args -> + Log.d(TAG, "update 이벤트 수신처리") + } // TODO : 임시 데이터. 사용 예시 private val chatMessages = ArrayList().apply { - // senderId 와 receivedId가 "0", "0"일 때는 날짜 업데이트를 하게 구현되어있음(rvAdapter와 함께 봐야함) - // 기능 구현시 그 부분을 고려해서 수정필요. -// add(ChatMessage("0", "0", "2023년 01월 08일", "00:00")) - - // 일반 대화 임시 데이터 add(ChatMessage(name, "내가 보냄", "오후 2:16")) add(ChatMessage("kong", "상대방이 보냄", "오후 3:10")) } private lateinit var clientChatRVAdapter: ClientChatRVAdapter + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + settingSocket() + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentClientChatBinding.inflate(inflater, container, false) + mSocket?.connect() return binding.root } @@ -58,7 +79,28 @@ class ClientChatFragment : Fragment() { _binding = null } + private fun settingSocket() { + try { + mSocket = IO.socket("http://118.67.135.247:80") + Log.d(TAG,"${mSocket?.id()}") + } catch (e: URISyntaxException) { + Log.d(TAG,"${e.message}") + } +// CoroutineScope(Dispatchers.IO).launch { +// try { +// mSocket = IO.socket("https://www.farmus.kro.kr") +// mSocket.connect() +// } catch (e: Exception) { +// withContext(Dispatchers.Main) { +// Log.d(TAG,"${e.message}") +// } +// } +// } +// mSocket.on("update", onMessageReceived) + } + private fun init() { + initSendButton() initRecyclerView() initBackButton() initMoreButton() @@ -66,6 +108,26 @@ class ClientChatFragment : Fragment() { // TODO: 추가할 초기화가 있다면 초기화 } + private fun initSendButton() { + + binding.commonChatLayout.buttonSendMsg.setOnClickListener { + // sendMessage() + // 클라이언트에서 메시지를 서버로 전송 + val message = binding.commonChatLayout.edittextSendMsg.text.toString() + val name = name + val data = JSONObject().apply { +// put("name", name) +// put("message", message) + put("type","message") + put("message",message) + } + Log.d(TAG,"${mSocket?.connected()}") +// mSocket.emit("send", data) + clientChatRVAdapter.addMessage(ChatMessage(name,message,"00:00")) + binding.commonChatLayout.edittextSendMsg.text.clear() + } + } + private fun initRecyclerView() { // TODO : sender(현 사용자)의 id를 잘 전달해야함 clientChatRVAdapter = ClientChatRVAdapter(chatMessages) @@ -88,13 +150,13 @@ class ClientChatFragment : Fragment() { private fun initBackButton() { binding.toolbarLayout.toolbarWithTitleAndMoreBackButton.setOnClickListener { hideKeyboard() - + // keyboard를 숨긴 후에 back되도록 (keyboard hide가 안된 것이 이전 화면에 영향을 줌) it.postDelayed({ activity?.supportFragmentManager?.apply { beginTransaction().remove(this@ClientChatFragment).commit() popBackStack() - } + } }, 100) // 100초 뒤에 처리됨 } } @@ -120,4 +182,19 @@ class ClientChatFragment : Fragment() { imm?.hideSoftInputFromWindow(view?.windowToken, 0) } + + private fun settingTime() { + val currentTime = System.currentTimeMillis() + val dateFormat = SimpleDateFormat("yyyy년 MM월 dd일", Locale.KOREA) + val timeFormat = SimpleDateFormat("aa hh:mm", Locale.KOREA) + println(dateFormat.format(currentTime)) + println(timeFormat.format(currentTime)) + } + + override fun onDestroy() { + super.onDestroy() + // Socket 연결 해제 + mSocket?.disconnect() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/farm/farmus_application/ui/message/adapter/ClientChatRVAdapter.kt b/app/src/main/java/com/farm/farmus_application/ui/message/adapter/ClientChatRVAdapter.kt index c1c64d4b..a8f660f4 100644 --- a/app/src/main/java/com/farm/farmus_application/ui/message/adapter/ClientChatRVAdapter.kt +++ b/app/src/main/java/com/farm/farmus_application/ui/message/adapter/ClientChatRVAdapter.kt @@ -13,7 +13,7 @@ import com.farm.farmus_application.utilities.JWTUtils // TODO : chatMessages List를 어떻게 받는 가에 따라서 파라미터로 처리가 안될 수도 있음 // TODO : 구현시 나의 채팅 상대방 프로필 이미지를 끌어오는 방법이 필요함 -class ClientChatRVAdapter(private val chatMessages: List) : +class ClientChatRVAdapter(private val chatMessages: ArrayList) : RecyclerView.Adapter() { private val jwtToken = UserPrefsStorage.accessToken @@ -84,6 +84,11 @@ class ClientChatRVAdapter(private val chatMessages: List) : } } + fun addMessage(item: ChatMessage) { + chatMessages.add(item) + notifyDataSetChanged() + } + class SentMessageViewHolder(private val binding: ItemContainerSentMessageBinding) : RecyclerView.ViewHolder(binding.root) { fun setData(chatMessage: ChatMessage) { diff --git a/app/src/main/res/layout/fragment_farm_tab1.xml b/app/src/main/res/layout/fragment_farm_tab1.xml index 40a51958..68294985 100644 --- a/app/src/main/res/layout/fragment_farm_tab1.xml +++ b/app/src/main/res/layout/fragment_farm_tab1.xml @@ -23,21 +23,32 @@ android:textColor="@color/text_second" app:layout_constraintTop_toTopOf="parent" /> - - - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@id/text_recent"> + + + + + + + + app:layout_constraintTop_toBottomOf="@id/current_list_container" />