fix(main): 콘텐츠와 대화 title bar 이동을 연결한다

This commit is contained in:
2026-06-30 16:12:16 +09:00
parent d1a0cf27a7
commit 3c66ea986f
4 changed files with 104 additions and 10 deletions

View File

@@ -1,5 +1,6 @@
package kr.co.vividnext.sodalive.v2.main.chat package kr.co.vividnext.sodalive.v2.main.chat
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
@@ -12,6 +13,9 @@ import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.chat.talk.room.ChatRoomActivity import kr.co.vividnext.sodalive.chat.talk.room.ChatRoomActivity
import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.databinding.FragmentV2MainChatBinding import kr.co.vividnext.sodalive.databinding.FragmentV2MainChatBinding
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
import kr.co.vividnext.sodalive.search.SearchActivity
import kr.co.vividnext.sodalive.v2.main.ensureMainV2NavigationAllowed
import kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomActivity import kr.co.vividnext.sodalive.v2.main.chat.dm.DmChatRoomActivity
import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomFilter import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomFilter
import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomListUiItem import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomListUiItem
@@ -63,8 +67,11 @@ class ChatMainFragment : BaseFragment<FragmentV2MainChatBinding>(
private fun setupTitleBar() { private fun setupTitleBar() {
binding.viewChatTitleBar.tvTitleBarTitle.setText(R.string.tab_chat) binding.viewChatTitleBar.tvTitleBarTitle.setText(R.string.tab_chat)
binding.viewChatTitleBar.ivTitleBarMenu.setImageResource(R.drawable.ic_bar_cash) binding.viewChatTitleBar.ivTitleBarMenu.setImageResource(R.drawable.ic_bar_cash)
binding.viewChatTitleBar.llTitleBarActions.addView( binding.viewChatTitleBar.ivTitleBarMenu.setOnClickListener {
ImageView(requireContext()).apply { openWithLoginGuard(CanChargeActivity::class.java)
}
val searchAction = ImageView(requireContext()).apply {
setImageResource(R.drawable.ic_bar_search) setImageResource(R.drawable.ic_bar_search)
layoutParams = LinearLayout.LayoutParams( layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT,
@@ -73,7 +80,16 @@ class ChatMainFragment : BaseFragment<FragmentV2MainChatBinding>(
marginStart = resources.getDimensionPixelSize(R.dimen.spacing_14) marginStart = resources.getDimensionPixelSize(R.dimen.spacing_14)
} }
} }
) searchAction.setOnClickListener {
openWithLoginGuard(SearchActivity::class.java)
}
binding.viewChatTitleBar.llTitleBarActions.addView(searchAction)
}
private fun openWithLoginGuard(activityClass: Class<*>) {
ensureMainV2NavigationAllowed {
startActivity(Intent(requireContext(), activityClass))
}
} }
private fun setupFilterTabs(initialFilter: ChatRoomFilter) { private fun setupFilterTabs(initialFilter: ChatRoomFilter) {

View File

@@ -13,6 +13,7 @@ import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.base.BaseFragment
@@ -23,6 +24,8 @@ import kr.co.vividnext.sodalive.databinding.FragmentV2MainContentBinding
import kr.co.vividnext.sodalive.databinding.ViewSectionTitleBinding import kr.co.vividnext.sodalive.databinding.ViewSectionTitleBinding
import kr.co.vividnext.sodalive.extensions.moneyFormat import kr.co.vividnext.sodalive.extensions.moneyFormat
import kr.co.vividnext.sodalive.home.SeriesPublishedDaysOfWeek import kr.co.vividnext.sodalive.home.SeriesPublishedDaysOfWeek
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
import kr.co.vividnext.sodalive.search.SearchActivity
import kr.co.vividnext.sodalive.v2.common.data.ContentSort import kr.co.vividnext.sodalive.v2.common.data.ContentSort
import kr.co.vividnext.sodalive.v2.creator.channel.model.toLabelResId import kr.co.vividnext.sodalive.v2.creator.channel.model.toLabelResId
import kr.co.vividnext.sodalive.v2.creator.channel.ui.CreatorChannelSortPopup import kr.co.vividnext.sodalive.v2.creator.channel.ui.CreatorChannelSortPopup
@@ -113,6 +116,7 @@ class ContentMainFragment : BaseFragment<FragmentV2MainContentBinding>(
setUpAllTypeTabs() setUpAllTypeTabs()
setUpAllDayFilter() setUpAllDayFilter()
setUpAllSortButton() setUpAllSortButton()
setupTitleBarActions()
showContentTab(CONTENT_TAB_RECOMMENDATION) showContentTab(CONTENT_TAB_RECOMMENDATION)
setUpSectionTitles() setUpSectionTitles()
setUpAdapters() setUpAdapters()
@@ -129,6 +133,24 @@ class ContentMainFragment : BaseFragment<FragmentV2MainContentBinding>(
super.onDestroyView() super.onDestroyView()
} }
private fun setupTitleBarActions() {
binding.viewContentTitleBar.ivTitleBarCash.setOnClickListener {
openWithLoginGuard(CanChargeActivity::class.java)
}
binding.viewContentTitleBar.ivTitleBarSearch.setOnClickListener {
openWithLoginGuard(SearchActivity::class.java)
}
binding.viewContentTitleBar.ivTitleBarStorage.setOnClickListener {
openWithLoginGuard(AudioContentBoxActivity::class.java)
}
}
private fun openWithLoginGuard(activityClass: Class<*>) {
ensureMainV2NavigationAllowed {
startActivity(Intent(requireContext(), activityClass))
}
}
fun selectAllTab(type: MainContentAllType, sort: ContentSort = ContentSort.LATEST) { fun selectAllTab(type: MainContentAllType, sort: ContentSort = ContentSort.LATEST) {
pendingAllTabSelection = ContentAllTabSelection(type, sort) pendingAllTabSelection = ContentAllTabSelection(type, sort)
if (view != null) { if (view != null) {

View File

@@ -0,0 +1,27 @@
package kr.co.vividnext.sodalive.v2.main.chat
import org.junit.Assert.assertTrue
import org.junit.Test
import java.io.File
class ChatMainTitleBarActionSourceTest {
@Test
fun `대화 title bar 우측 아이콘은 기존 목적지로 이동한다`() {
val source = projectFile(
"app/src/main/java/kr/co/vividnext/sodalive/v2/main/chat/ChatMainFragment.kt"
).readText()
assertTrue(source.contains("ivTitleBarMenu.setOnClickListener"))
assertTrue(source.contains("searchAction.setOnClickListener"))
assertTrue(source.contains("ensureMainV2NavigationAllowed"))
assertTrue(source.contains("CanChargeActivity::class.java"))
assertTrue(source.contains("SearchActivity::class.java"))
}
private fun projectFile(relativePath: String): File {
val candidates = listOf(File(relativePath), File("../$relativePath"))
return candidates.firstOrNull { it.exists() }
?: error("Project file not found: $relativePath")
}
}

View File

@@ -0,0 +1,29 @@
package kr.co.vividnext.sodalive.v2.main.content
import org.junit.Assert.assertTrue
import org.junit.Test
import java.io.File
class ContentMainTitleBarActionSourceTest {
@Test
fun `콘텐츠 title bar 우측 아이콘은 기존 목적지로 이동한다`() {
val source = projectFile(
"app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragment.kt"
).readText()
assertTrue(source.contains("viewContentTitleBar.ivTitleBarCash.setOnClickListener"))
assertTrue(source.contains("viewContentTitleBar.ivTitleBarSearch.setOnClickListener"))
assertTrue(source.contains("viewContentTitleBar.ivTitleBarStorage.setOnClickListener"))
assertTrue(source.contains("ensureMainV2NavigationAllowed"))
assertTrue(source.contains("CanChargeActivity::class.java"))
assertTrue(source.contains("SearchActivity::class.java"))
assertTrue(source.contains("AudioContentBoxActivity::class.java"))
}
private fun projectFile(relativePath: String): File {
val candidates = listOf(File(relativePath), File("../$relativePath"))
return candidates.firstOrNull { it.exists() }
?: error("Project file not found: $relativePath")
}
}