diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
index 282a04b2..ee65d6c6 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt
@@ -53,6 +53,7 @@ class CreatorChannelActivity :
private var statusBarHeight: Int = 0
private var tabLayoutMediator: TabLayoutMediator? = null
private var pageChangeCallback: ViewPager2.OnPageChangeCallback? = null
+ private var isOwnerFabExpanded: Boolean = false
private val baseTitleBarHeight: Int by lazy { 60.dpToPx().toInt() }
override val shouldApplySystemBarTopInset: Boolean = false
@@ -76,6 +77,9 @@ class CreatorChannelActivity :
binding.ivMore.setOnClickListener { onMoreClicked() }
binding.layoutFollowCapsule.setOnClickListener { onFollowCapsuleClicked() }
binding.ivBell.setOnClickListener { onBellClicked() }
+ binding.ownerFabButton.setOnClickListener { expandOwnerFab() }
+ binding.ownerFabDim.setOnClickListener { collapseOwnerFab() }
+ binding.ownerFabCloseButton.setOnClickListener { collapseOwnerFab() }
binding.tvChatButton.setOnClickListener {
currentHeader?.characterId?.let { characterId -> homeActionDelegate?.createChatRoom(characterId) }
}
@@ -266,6 +270,10 @@ class CreatorChannelActivity :
}
val callback = object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
+ if (position != CreatorChannelTab.Home.ordinal) {
+ isOwnerFabExpanded = false
+ }
+ updateOwnerFabVisibility()
updateViewPagerHeight()
}
}
@@ -277,6 +285,7 @@ class CreatorChannelActivity :
currentHeader = header
bindHeader(header)
bindTitleBar(header)
+ updateOwnerFabVisibility()
}
override fun onCreatorChannelFollowProgressChanged(inProgress: Boolean) {
@@ -310,6 +319,24 @@ class CreatorChannelActivity :
updateViewPagerHeight()
}
+ private fun expandOwnerFab() {
+ isOwnerFabExpanded = true
+ updateOwnerFabVisibility()
+ }
+
+ private fun collapseOwnerFab() {
+ isOwnerFabExpanded = false
+ updateOwnerFabVisibility()
+ }
+
+ private fun updateOwnerFabVisibility() {
+ val shouldShowOwnerFab =
+ currentHeader?.isOwner == true && binding.viewPager.currentItem == CreatorChannelTab.Home.ordinal
+ binding.ownerFabDim.isVisible = shouldShowOwnerFab && isOwnerFabExpanded
+ binding.ownerFabExpandedContainer.isVisible = shouldShowOwnerFab && isOwnerFabExpanded
+ binding.ownerFabButton.isVisible = shouldShowOwnerFab && !isOwnerFabExpanded
+ }
+
override fun onCreatorChannelDonationClicked() {
val header = currentHeader ?: return
if (header.isOwner) return
diff --git a/app/src/main/res/layout/activity_creator_channel.xml b/app/src/main/res/layout/activity_creator_channel.xml
index 25c5ac7b..27b99bac 100644
--- a/app/src/main/res/layout/activity_creator_channel.xml
+++ b/app/src/main/res/layout/activity_creator_channel.xml
@@ -237,4 +237,132 @@
tools:visibility="visible" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt
index 4a3df00e..d700fe75 100644
--- a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt
+++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivitySourceTest.kt
@@ -1375,6 +1375,55 @@ class CreatorChannelActivitySourceTest {
assertTrue(adapter.contains("marginEnd = if (index == item.items.lastIndex) 0 else 16.dp()"))
}
+ @Test
+ fun `Phase 13 owner FAB source는 본인 홈 탭 기본 확장 layout을 가진다`() {
+ val layout = projectFile("app/src/main/res/layout/activity_creator_channel.xml").readText()
+ val source = projectFile(
+ "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelActivity.kt"
+ ).readText()
+ val strings = projectFile("app/src/main/res/values/strings.xml").readText()
+
+ assertTrue(layout.contains("android:id=\"@+id/owner_fab_dim\""))
+ assertTrue(layout.contains("android:background=\"#66000000\""))
+ assertTrue(layout.contains("android:id=\"@+id/owner_fab_expanded_container\""))
+ assertTrue(layout.contains("android:id=\"@+id/owner_fab_button\""))
+ assertTrue(layout.contains("android:layout_marginEnd=\"@dimen/spacing_14\""))
+ assertTrue(layout.contains("android:layout_marginBottom=\"@dimen/spacing_14\""))
+ assertTrue(layout.contains("@drawable/bg_creator_channel_owner_fab"))
+ assertTrue(layout.contains("@drawable/bg_creator_channel_owner_fab_live"))
+ assertTrue(layout.contains("@drawable/bg_creator_channel_owner_fab_close"))
+ assertTrue(layout.contains("@drawable/ic_new_upload_community_post"))
+ assertTrue(layout.contains("@drawable/ic_new_upload_audio"))
+ assertTrue(layout.contains("@drawable/ic_new_create_live"))
+ assertTrue(layout.contains("@drawable/ic_new_x_black"))
+ assertTrue(layout.indexOf("@+id/owner_fab_community_button") < layout.indexOf("@+id/owner_fab_audio_button"))
+ assertTrue(layout.indexOf("@+id/owner_fab_audio_button") < layout.indexOf("@+id/owner_fab_live_button"))
+ assertTrue(layout.indexOf("@+id/owner_fab_live_button") < layout.indexOf("@+id/owner_fab_close_button"))
+ assertTrue(layout.contains("android:layout_width=\"66dp\""))
+ assertTrue(layout.contains("android:layout_height=\"66dp\""))
+ assertTrue(layout.contains("android:layout_width=\"38dp\""))
+ assertTrue(layout.contains("android:layout_height=\"38dp\""))
+ assertFalse(layout.contains("android:minWidth=\"172dp\""))
+ assertFalse(layout.contains("android:minWidth=\"92dp\""))
+ assertFalse(layout.contains("android:text=\"@string/creator_channel_owner_fab_community\""))
+ assertFalse(layout.contains("android:text=\"@string/creator_channel_owner_fab_audio\""))
+ assertFalse(layout.contains("android:text=\"@string/creator_channel_owner_fab_live\""))
+ assertFalse(layout.contains("android:text=\"@string/creator_channel_owner_fab_close\""))
+ assertTrue(strings.contains("name=\"creator_channel_owner_fab_community\">커뮤니티 글 올리기"))
+ assertTrue(strings.contains("name=\"creator_channel_owner_fab_audio\">오디오 콘텐츠 올리기"))
+ assertTrue(strings.contains("name=\"creator_channel_owner_fab_live\">라이브 만들기"))
+ assertTrue(strings.contains("name=\"creator_channel_owner_fab_close\">닫기"))
+ assertTrue(source.contains("private var isOwnerFabExpanded: Boolean = false"))
+ assertTrue(source.contains("updateOwnerFabVisibility()"))
+ assertTrue(source.contains("currentHeader?.isOwner == true && binding.viewPager.currentItem == CreatorChannelTab.Home.ordinal"))
+ assertTrue(source.contains("binding.ownerFabDim.setOnClickListener { collapseOwnerFab() }"))
+ assertTrue(source.contains("binding.ownerFabCloseButton.setOnClickListener { collapseOwnerFab() }"))
+ assertTrue(source.contains("binding.ownerFabButton.setOnClickListener { expandOwnerFab() }"))
+ assertTrue(source.contains("binding.ownerFabDim.isVisible = shouldShowOwnerFab && isOwnerFabExpanded"))
+ assertTrue(source.contains("binding.ownerFabExpandedContainer.isVisible = shouldShowOwnerFab && isOwnerFabExpanded"))
+ assertTrue(source.contains("binding.ownerFabButton.isVisible = shouldShowOwnerFab && !isOwnerFabExpanded"))
+ }
+
@Test
fun `남은 section item layouts는 legacy generic card id를 제거한다`() {
val layoutNames = listOf(