feat(main): 채팅 DM 필터 진입을 추가한다

This commit is contained in:
2026-06-16 17:27:29 +09:00
parent 5f4140ea68
commit 0bb5796da1
3 changed files with 76 additions and 10 deletions

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.v2.main package kr.co.vividnext.sodalive.v2.main
import android.Manifest import android.Manifest
import android.content.Context
import android.content.ComponentName import android.content.ComponentName
import android.content.Intent import android.content.Intent
import android.os.Build 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.settings.notification.NotificationSettingsDialog
import kr.co.vividnext.sodalive.user.login.LoginActivity import kr.co.vividnext.sodalive.user.login.LoginActivity
import kr.co.vividnext.sodalive.v2.creator.channel.CreatorChannelActivity 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 kr.co.vividnext.sodalive.v2.main.home.HomeMainFragment
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragment
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.util.Locale import java.util.Locale
import kotlin.math.max import kotlin.math.max
@@ -103,6 +105,11 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
super.onNewIntent(intent) super.onNewIntent(intent)
setIntent(intent) setIntent(intent)
if (intent.hasExtra(EXTRA_CHAT_FILTER)) {
openChatWithInitialFilter()
return
}
if (isLoggedIn()) { if (isLoggedIn()) {
executeDeeplink(intent) executeDeeplink(intent)
} }
@@ -137,6 +144,9 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
} }
setupBottomNavigation() setupBottomNavigation()
if (intent.hasExtra(EXTRA_CHAT_FILTER)) {
viewModel.clickTab(MainV2Tab.CHAT)
}
} }
fun showLoginActivity() { fun showLoginActivity() {
@@ -156,6 +166,23 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
viewModel.clickTab(MainV2Tab.CHAT) 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() { private fun setupBottomNavigation() {
binding.bottomNavigation.setOnItemSelectedListener { item -> binding.bottomNavigation.setOnItemSelectedListener { item ->
when (item.itemId) { when (item.itemId) {
@@ -197,16 +224,20 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
} }
var fragment = fragmentManager.findFragmentByTag(tag) var fragment = fragmentManager.findFragmentByTag(tag)
val initialChatFilter = if (currentTab == MainV2Tab.CHAT) consumeInitialChatFilter() else null
if (fragment == null) { if (fragment == null) {
fragment = when (currentTab) { fragment = when (currentTab) {
MainV2Tab.HOME -> HomeMainFragment() MainV2Tab.HOME -> HomeMainFragment()
MainV2Tab.CONTENT -> ContentMainFragment() MainV2Tab.CONTENT -> ContentMainFragment()
MainV2Tab.CHAT -> ChatMainFragment() MainV2Tab.CHAT -> ChatMainFragment.newInstance(initialChatFilter)
MainV2Tab.MY -> MyPageFragment() MainV2Tab.MY -> MyPageFragment()
} }
fragmentTransaction.add(R.id.fl_container, fragment, tag) fragmentTransaction.add(R.id.fl_container, fragment, tag)
} else { } else {
fragmentTransaction.show(fragment) fragmentTransaction.show(fragment)
if (initialChatFilter != null) {
(fragment as? ChatMainFragment)?.selectFilter(initialChatFilter)
}
} }
fragmentTransaction.setPrimaryNavigationFragment(fragment) fragmentTransaction.setPrimaryNavigationFragment(fragment)
@@ -649,4 +680,15 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
private fun isLoggedIn(): Boolean { private fun isLoggedIn(): Boolean {
return SharedPreferenceManager.token.isNotBlank() && SharedPreferenceManager.token.length > 10 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)
}
}
}
} }

View File

@@ -26,6 +26,15 @@ class ChatMainFragment : BaseFragment<FragmentV2MainChatBinding>(
companion object { companion object {
private const val PAGINATION_THRESHOLD = 3 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() private val viewModel: ChatMainViewModel by viewModel()
@@ -37,12 +46,18 @@ class ChatMainFragment : BaseFragment<FragmentV2MainChatBinding>(
loadingDialog = LoadingDialog(requireActivity(), layoutInflater) loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
setupTitleBar() setupTitleBar()
setupFilterTabs() val initialFilter = getInitialFilter()
setupFilterTabs(initialFilter ?: ChatRoomFilter.ALL)
setupChatRooms() setupChatRooms()
bindViewModel() bindViewModel()
binding.btnChatFloating.setOnClickListener { } binding.btnChatFloating.setOnClickListener { }
viewModel.loadFirstPage() viewModel.loadFirstPage(initialFilter ?: ChatRoomFilter.ALL)
}
fun selectFilter(filter: ChatRoomFilter) {
selectFilterTab(filter)
viewModel.selectFilter(filter)
} }
private fun setupTitleBar() { private fun setupTitleBar() {
@@ -61,14 +76,14 @@ class ChatMainFragment : BaseFragment<FragmentV2MainChatBinding>(
) )
} }
private fun setupFilterTabs() { private fun setupFilterTabs(initialFilter: ChatRoomFilter) {
binding.viewChatFilterTabs.root.setMenus( binding.viewChatFilterTabs.root.setMenus(
listOf( listOf(
getString(R.string.screen_chat_filter_all), getString(R.string.screen_chat_filter_all),
getString(R.string.screen_chat_filter_ai), getString(R.string.screen_chat_filter_ai),
getString(R.string.screen_chat_filter_dm) getString(R.string.screen_chat_filter_dm)
), ),
selectedIndex = 0 selectedIndex = initialFilter.tabIndex
) )
binding.viewChatFilterTabs.root.setOnTabSelectedListener { index -> binding.viewChatFilterTabs.root.setOnTabSelectedListener { index ->
viewModel.selectFilter(ChatRoomFilter.fromTabIndex(index)) viewModel.selectFilter(ChatRoomFilter.fromTabIndex(index))
@@ -130,4 +145,13 @@ class ChatMainFragment : BaseFragment<FragmentV2MainChatBinding>(
ChatRoomType.DM -> startActivity(DmChatRoomActivity.newIntentByRoomId(requireContext(), item.roomId)) 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)
}
} }

View File

@@ -1,9 +1,9 @@
package kr.co.vividnext.sodalive.v2.main.chat.model package kr.co.vividnext.sodalive.v2.main.chat.model
enum class ChatRoomFilter(val apiValue: String) { enum class ChatRoomFilter(val apiValue: String, val tabIndex: Int) {
ALL("ALL"), ALL("ALL", 0),
AI("AI"), AI("AI", 1),
DM("DM"); DM("DM", 2);
companion object { companion object {
fun fromTabIndex(index: Int): ChatRoomFilter = when (index) { fun fromTabIndex(index: Int): ChatRoomFilter = when (index) {