From 0bb5796da1a830fa2a5696f017b611c2ee941164 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 16 Jun 2026 17:27:29 +0900 Subject: [PATCH] =?UTF-8?q?feat(main):=20=EC=B1=84=ED=8C=85=20DM=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=A7=84=EC=9E=85=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/v2/main/MainV2Activity.kt | 46 ++++++++++++++++++- .../sodalive/v2/main/chat/ChatMainFragment.kt | 32 +++++++++++-- .../v2/main/chat/model/ChatRoomFilter.kt | 8 ++-- 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt index d7d91ed9..fecd2942 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/MainV2Activity.kt @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.v2.main import android.Manifest +import android.content.Context import android.content.ComponentName import android.content.Intent import android.os.Build @@ -47,11 +48,12 @@ import kr.co.vividnext.sodalive.settings.event.EventDetailActivity import kr.co.vividnext.sodalive.settings.notification.NotificationSettingsDialog import kr.co.vividnext.sodalive.user.login.LoginActivity import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivity +import kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragment +import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomFilter import kr.co.vividnext.sodalive.v2.main.home.HomeMainFragment import kotlinx.coroutines.Job import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch -import kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragment import org.koin.android.ext.android.inject import java.util.Locale import kotlin.math.max @@ -103,6 +105,11 @@ class MainV2Activity : BaseActivity(ActivityMainV2Binding super.onNewIntent(intent) setIntent(intent) + if (intent.hasExtra(EXTRA_CHAT_FILTER)) { + openChatWithInitialFilter() + return + } + if (isLoggedIn()) { executeDeeplink(intent) } @@ -137,6 +144,9 @@ class MainV2Activity : BaseActivity(ActivityMainV2Binding } setupBottomNavigation() + if (intent.hasExtra(EXTRA_CHAT_FILTER)) { + viewModel.clickTab(MainV2Tab.CHAT) + } } fun showLoginActivity() { @@ -156,6 +166,23 @@ class MainV2Activity : BaseActivity(ActivityMainV2Binding viewModel.clickTab(MainV2Tab.CHAT) } + private fun consumeInitialChatFilter(): ChatRoomFilter? { + return intent.getStringExtra(EXTRA_CHAT_FILTER) + ?.let { runCatching { ChatRoomFilter.valueOf(it) }.getOrNull() } + .also { intent.removeExtra(EXTRA_CHAT_FILTER) } + } + + private fun openChatWithInitialFilter() { + if (viewModel.currentTab.value == MainV2Tab.CHAT) { + val filter = consumeInitialChatFilter() ?: return + (supportFragmentManager.findFragmentByTag(MainV2Tab.CHAT.toString()) as? ChatMainFragment) + ?.selectFilter(filter) + return + } + + viewModel.clickTab(MainV2Tab.CHAT) + } + private fun setupBottomNavigation() { binding.bottomNavigation.setOnItemSelectedListener { item -> when (item.itemId) { @@ -197,16 +224,20 @@ class MainV2Activity : BaseActivity(ActivityMainV2Binding } var fragment = fragmentManager.findFragmentByTag(tag) + val initialChatFilter = if (currentTab == MainV2Tab.CHAT) consumeInitialChatFilter() else null if (fragment == null) { fragment = when (currentTab) { MainV2Tab.HOME -> HomeMainFragment() MainV2Tab.CONTENT -> ContentMainFragment() - MainV2Tab.CHAT -> ChatMainFragment() + MainV2Tab.CHAT -> ChatMainFragment.newInstance(initialChatFilter) MainV2Tab.MY -> MyPageFragment() } fragmentTransaction.add(R.id.fl_container, fragment, tag) } else { fragmentTransaction.show(fragment) + if (initialChatFilter != null) { + (fragment as? ChatMainFragment)?.selectFilter(initialChatFilter) + } } fragmentTransaction.setPrimaryNavigationFragment(fragment) @@ -649,4 +680,15 @@ class MainV2Activity : BaseActivity(ActivityMainV2Binding private fun isLoggedIn(): Boolean { return SharedPreferenceManager.token.isNotBlank() && SharedPreferenceManager.token.length > 10 } + + companion object { + private const val EXTRA_CHAT_FILTER: String = "extra_chat_filter" + + fun newChatDmIntent(context: Context): Intent { + return Intent(context, MainV2Activity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + putExtra(EXTRA_CHAT_FILTER, ChatRoomFilter.DM.name) + } + } + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt index 74dd4c42..077b9342 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt @@ -26,6 +26,15 @@ class ChatMainFragment : BaseFragment( companion object { private const val PAGINATION_THRESHOLD = 3 + private const val ARG_INITIAL_FILTER = "arg_initial_filter" + + fun newInstance(initialFilter: ChatRoomFilter? = null): ChatMainFragment { + return ChatMainFragment().apply { + arguments = Bundle().apply { + initialFilter?.let { putString(ARG_INITIAL_FILTER, it.name) } + } + } + } } private val viewModel: ChatMainViewModel by viewModel() @@ -37,12 +46,18 @@ class ChatMainFragment : BaseFragment( loadingDialog = LoadingDialog(requireActivity(), layoutInflater) setupTitleBar() - setupFilterTabs() + val initialFilter = getInitialFilter() + setupFilterTabs(initialFilter ?: ChatRoomFilter.ALL) setupChatRooms() bindViewModel() binding.btnChatFloating.setOnClickListener { } - viewModel.loadFirstPage() + viewModel.loadFirstPage(initialFilter ?: ChatRoomFilter.ALL) + } + + fun selectFilter(filter: ChatRoomFilter) { + selectFilterTab(filter) + viewModel.selectFilter(filter) } private fun setupTitleBar() { @@ -61,14 +76,14 @@ class ChatMainFragment : BaseFragment( ) } - private fun setupFilterTabs() { + private fun setupFilterTabs(initialFilter: ChatRoomFilter) { binding.viewChatFilterTabs.root.setMenus( listOf( getString(R.string.screen_chat_filter_all), getString(R.string.screen_chat_filter_ai), getString(R.string.screen_chat_filter_dm) ), - selectedIndex = 0 + selectedIndex = initialFilter.tabIndex ) binding.viewChatFilterTabs.root.setOnTabSelectedListener { index -> viewModel.selectFilter(ChatRoomFilter.fromTabIndex(index)) @@ -130,4 +145,13 @@ class ChatMainFragment : BaseFragment( ChatRoomType.DM -> startActivity(DmChatRoomActivity.newIntentByRoomId(requireContext(), item.roomId)) } } + + private fun getInitialFilter(): ChatRoomFilter? { + return arguments?.getString(ARG_INITIAL_FILTER) + ?.let { runCatching { ChatRoomFilter.valueOf(it) }.getOrNull() } + } + + private fun selectFilterTab(filter: ChatRoomFilter) { + binding.viewChatFilterTabs.root.selectTab(filter.tabIndex) + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomFilter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomFilter.kt index 9c852d02..4ca7b207 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomFilter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/model/ChatRoomFilter.kt @@ -1,9 +1,9 @@ package kr.co.vividnext.sodalive.v2.main.chat.model -enum class ChatRoomFilter(val apiValue: String) { - ALL("ALL"), - AI("AI"), - DM("DM"); +enum class ChatRoomFilter(val apiValue: String, val tabIndex: Int) { + ALL("ALL", 0), + AI("AI", 1), + DM("DM", 2); companion object { fun fromTabIndex(index: Int): ChatRoomFilter = when (index) {