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(