feat(main): 채팅 DM 필터 진입을 추가한다
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user