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
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>(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>(ActivityMainV2Binding
}
setupBottomNavigation()
if (intent.hasExtra(EXTRA_CHAT_FILTER)) {
viewModel.clickTab(MainV2Tab.CHAT)
}
}
fun showLoginActivity() {
@@ -156,6 +166,23 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(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>(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>(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)
}
}
}
}

View File

@@ -26,6 +26,15 @@ class ChatMainFragment : BaseFragment<FragmentV2MainChatBinding>(
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<FragmentV2MainChatBinding>(
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<FragmentV2MainChatBinding>(
)
}
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<FragmentV2MainChatBinding>(
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
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) {