From 23da341e10fd23998775d8fb06da0c64f0669aa8 Mon Sep 17 00:00:00 2001 From: edv-Shin Date: Sun, 16 Nov 2025 18:14:30 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=ED=98=84=EC=9E=AC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=ED=95=9C=20=EC=B1=84=ED=8C=85=EB=B0=A9=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=98=A8=20=EC=95=8C=EB=A6=BC=EC=9D=B8=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=83=9D=EB=9E=B5=20#390?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../undabang/di/RepositoryModule.kt | 20 ++++++++++++++++++ .../fcm/ChatRoomStateRepositoryImpl.kt | 18 ++++++++++++++++ .../com/project200/undabang/fcm/FcmService.kt | 7 +++++++ .../common/utils/ChatRoomStateRepository.kt | 21 +++++++++++++++++++ .../chattingRoom/ChattingRoomFragment.kt | 19 +++++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 app/src/main/java/com/project200/undabang/di/RepositoryModule.kt create mode 100644 app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt create mode 100644 common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt diff --git a/app/src/main/java/com/project200/undabang/di/RepositoryModule.kt b/app/src/main/java/com/project200/undabang/di/RepositoryModule.kt new file mode 100644 index 00000000..2b228da6 --- /dev/null +++ b/app/src/main/java/com/project200/undabang/di/RepositoryModule.kt @@ -0,0 +1,20 @@ +package com.project200.undabang.di + +import com.project200.common.utils.ChatRoomStateRepository +import com.project200.undabang.fcm.ChatRoomStateRepositoryImpl +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +abstract class RepositoryModule { + + @Binds + @Singleton + abstract fun bindChatRoomStateRepository( + impl: ChatRoomStateRepositoryImpl + ): ChatRoomStateRepository +} \ No newline at end of file diff --git a/app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt b/app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt new file mode 100644 index 00000000..471417e1 --- /dev/null +++ b/app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt @@ -0,0 +1,18 @@ +package com.project200.undabang.fcm + +import com.project200.common.utils.ChatRoomStateRepository +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ChatRoomStateRepositoryImpl @Inject constructor() : ChatRoomStateRepository { + + private val _activeChatRoomId = MutableStateFlow(null) + override val activeChatRoomId = _activeChatRoomId.asStateFlow() + + override fun setActiveChatRoomId(roomId: Long?) { + _activeChatRoomId.value = roomId + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project200/undabang/fcm/FcmService.kt b/app/src/main/java/com/project200/undabang/fcm/FcmService.kt index fe811ba9..664f208a 100644 --- a/app/src/main/java/com/project200/undabang/fcm/FcmService.kt +++ b/app/src/main/java/com/project200/undabang/fcm/FcmService.kt @@ -11,6 +11,7 @@ import androidx.core.net.toUri import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage import com.project200.common.constants.FcmConstants.KEY_FCM_TOKEN +import com.project200.common.utils.ChatRoomStateRepository import com.project200.common.utils.EncryptedPrefs import com.project200.undabang.fcm.FcmConstant.CHAT_NOTI_CHANNEL_ID import com.project200.undabang.fcm.FcmConstant.CHAT_NOTI_CHANNEL_NAME @@ -24,6 +25,9 @@ class FcmService : FirebaseMessagingService() { @EncryptedPrefs lateinit var sharedPreferences: SharedPreferences + @Inject + lateinit var chatRoomStateRepository: ChatRoomStateRepository + /** * 새로운 FCM 토큰이 발급되거나 갱신될 때 호출됩니다. * 이 토큰은 백엔드 서버로 전송되어 특정 기기에 알림을 보내는 데 사용됩니다. @@ -62,6 +66,9 @@ class FcmService : FirebaseMessagingService() { if (chatRoomId == null || nickname == null || memberId == null) return + // 현재 활성화된 채팅방과 동일한 채팅방에서 온 알림이면 무시 + if (chatRoomId.toLong() == chatRoomStateRepository.activeChatRoomId.value) return + // 알림 식별을 위한 고유 ID val uniqueId = chatRoomId.hashCode() diff --git a/common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt b/common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt new file mode 100644 index 00000000..fa0066b3 --- /dev/null +++ b/common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt @@ -0,0 +1,21 @@ +package com.project200.common.utils + +import kotlinx.coroutines.flow.StateFlow + +/** + * 앱 전체에서 현재 활성화된 채팅방의 상태를 관리하는 리포지토리 인터페이스 + */ +interface ChatRoomStateRepository { + + /** + * 현재 활성화된 채팅방의 ID를 StateFlow 형태로 제공합니다. + * 활성화된 채팅방이 없으면 null입니다. + */ + val activeChatRoomId: StateFlow + + /** + * 현재 활성화된 채팅방의 ID를 설정합니다. + * @param roomId 채팅방에서 나갈 때는 null을 전달합니다. + */ + fun setActiveChatRoomId(roomId: Long?) +} \ No newline at end of file diff --git a/feature/chatting/src/main/java/com/project200/feature/chatting/chattingRoom/ChattingRoomFragment.kt b/feature/chatting/src/main/java/com/project200/feature/chatting/chattingRoom/ChattingRoomFragment.kt index 298faefd..cb29cfbe 100644 --- a/feature/chatting/src/main/java/com/project200/feature/chatting/chattingRoom/ChattingRoomFragment.kt +++ b/feature/chatting/src/main/java/com/project200/feature/chatting/chattingRoom/ChattingRoomFragment.kt @@ -22,6 +22,7 @@ import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar +import com.project200.common.utils.ChatRoomStateRepository import com.project200.common.utils.CommonDateTimeFormatters.YYYY_MM_DD_KR import com.project200.feature.chatting.chattingRoom.adapter.ChatRVAdapter import com.project200.feature.chatting.utils.KeyboardVisibilityHelper @@ -38,6 +39,7 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import java.time.LocalDate +import javax.inject.Inject @AndroidEntryPoint class ChattingRoomFragment : BindingFragment(R.layout.fragment_chatting_room), KeyboardControlInterface { @@ -45,6 +47,9 @@ class ChattingRoomFragment : BindingFragment(R.layo private lateinit var chatAdapter: ChatRVAdapter private val args: ChattingRoomFragmentArgs by navArgs() + @Inject + lateinit var chatRoomStateRepository: ChatRoomStateRepository + // 이전 메시지 로드 상태를 추적하는 플래그 private var isPaging = false @@ -383,6 +388,20 @@ class ChattingRoomFragment : BindingFragment(R.layo super.onDestroyView() } + override fun onResume() { + super.onResume() + // 현재 채팅방을 활성 채팅방으로 설정 + chatRoomStateRepository.setActiveChatRoomId(args.roomId) + } + + override fun onPause() { + super.onPause() + // 채팅방을 나갈 때 활성 채팅방 ID를 null로 설정 + if (chatRoomStateRepository.activeChatRoomId.value == args.roomId) { + chatRoomStateRepository.setActiveChatRoomId(null) + } + } + companion object { const val POLLING_PERIOD = 2000L } From 0c19fa44c448fb9dabf8fe21a199a48c140ae51f Mon Sep 17 00:00:00 2001 From: edv-Shin Date: Mon, 24 Nov 2025 01:53:17 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20ktlint=20=EB=AC=B8=EB=B2=95=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20#390?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project200/undabang/di/RepositoryModule.kt | 7 ++----- .../undabang/fcm/ChatRoomStateRepositoryImpl.kt | 15 ++++++++------- .../common/utils/ChatRoomStateRepository.kt | 3 +-- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/project200/undabang/di/RepositoryModule.kt b/app/src/main/java/com/project200/undabang/di/RepositoryModule.kt index 2b228da6..a1fbadac 100644 --- a/app/src/main/java/com/project200/undabang/di/RepositoryModule.kt +++ b/app/src/main/java/com/project200/undabang/di/RepositoryModule.kt @@ -11,10 +11,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) abstract class RepositoryModule { - @Binds @Singleton - abstract fun bindChatRoomStateRepository( - impl: ChatRoomStateRepositoryImpl - ): ChatRoomStateRepository -} \ No newline at end of file + abstract fun bindChatRoomStateRepository(impl: ChatRoomStateRepositoryImpl): ChatRoomStateRepository +} diff --git a/app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt b/app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt index 471417e1..25710cdc 100644 --- a/app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt +++ b/app/src/main/java/com/project200/undabang/fcm/ChatRoomStateRepositoryImpl.kt @@ -7,12 +7,13 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class ChatRoomStateRepositoryImpl @Inject constructor() : ChatRoomStateRepository { +class ChatRoomStateRepositoryImpl + @Inject + constructor() : ChatRoomStateRepository { + private val _activeChatRoomId = MutableStateFlow(null) + override val activeChatRoomId = _activeChatRoomId.asStateFlow() - private val _activeChatRoomId = MutableStateFlow(null) - override val activeChatRoomId = _activeChatRoomId.asStateFlow() - - override fun setActiveChatRoomId(roomId: Long?) { - _activeChatRoomId.value = roomId + override fun setActiveChatRoomId(roomId: Long?) { + _activeChatRoomId.value = roomId + } } -} \ No newline at end of file diff --git a/common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt b/common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt index fa0066b3..b988d0df 100644 --- a/common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt +++ b/common/src/main/java/com/project200/common/utils/ChatRoomStateRepository.kt @@ -6,7 +6,6 @@ import kotlinx.coroutines.flow.StateFlow * 앱 전체에서 현재 활성화된 채팅방의 상태를 관리하는 리포지토리 인터페이스 */ interface ChatRoomStateRepository { - /** * 현재 활성화된 채팅방의 ID를 StateFlow 형태로 제공합니다. * 활성화된 채팅방이 없으면 null입니다. @@ -18,4 +17,4 @@ interface ChatRoomStateRepository { * @param roomId 채팅방에서 나갈 때는 null을 전달합니다. */ fun setActiveChatRoomId(roomId: Long?) -} \ No newline at end of file +}