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 e618897b..42fb51cb 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 @@ -103,6 +103,7 @@ class CreatorChannelActivity : private var lastSelectedCreatorChannelTabPosition: Int? = null private var isOwnerFabExpanded: Boolean = false private var isOwnerFabAnimating: Boolean = false + private var isDonationFloatingButtonVisible: Boolean = false private lateinit var loadingDialog: LoadingDialog private val baseTitleBarHeight: Int by lazy { 60.dpToPx().toInt() } private val liveCoordinator: CreatorChannelLiveCoordinator by lazy { @@ -189,6 +190,9 @@ class CreatorChannelActivity : binding.ownerFabCommunityButton.setOnClickListener { onOwnerFabCommunityClicked() } binding.ownerFabAudioButton.setOnClickListener { onOwnerFabAudioClicked() } binding.ownerFabLiveButton.setOnClickListener { onOwnerFabLiveClicked() } + binding.btnCreatorChannelDonationWrite.setOnClickListener { + findDonationFragment()?.onCreatorChannelDonationFloatingButtonClicked() + } binding.btnCreatorChannelOwnerCta.setOnClickListener { onOwnerCtaClicked() } binding.tvChatButton.setOnClickListener { currentHeader?.characterId?.let { characterId -> homeActionDelegate?.createChatRoom(characterId) } @@ -419,6 +423,7 @@ class CreatorChannelActivity : collapseOwnerFab(animate = false) } updateOwnerFabVisibility() + updateDonationFloatingButtonVisibility() updateOwnerCtaVisibility() updateCreatorChannelTabViewportHeight() updateViewPagerHeight() @@ -453,6 +458,7 @@ class CreatorChannelActivity : bindHeader(header) bindTitleBar(header) updateOwnerFabVisibility() + updateDonationFloatingButtonVisibility() updateOwnerCtaVisibility() if (binding.viewPager.currentItem == CreatorChannelTab.Audio.ordinal) { binding.viewPager.post { @@ -565,6 +571,11 @@ class CreatorChannelActivity : } } + override fun onCreatorChannelDonationFloatingButtonVisibilityChanged(isVisible: Boolean) { + isDonationFloatingButtonVisible = isVisible + updateDonationFloatingButtonVisibility() + } + override fun onCreatorChannelDonationRequested( onSubmit: (can: Int, isSecret: Boolean, message: String) -> Unit ) { @@ -817,6 +828,14 @@ class CreatorChannelActivity : } } + private fun updateDonationFloatingButtonVisibility() { + val shouldShowDonationFloatingButton = + isDonationFloatingButtonVisible && + currentHeader?.isOwner != true && + binding.viewPager.currentItem == CreatorChannelTab.Donation.ordinal + binding.btnCreatorChannelDonationWrite.isVisible = shouldShowDonationFloatingButton + } + private fun onOwnerFabCommunityClicked() { collapseOwnerFab(animate = false) communityWriteLauncher.launch(Intent(this, CreatorCommunityWriteActivity::class.java)) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationFragment.kt index f20a1a2d..200d2557 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationFragment.kt @@ -34,6 +34,9 @@ class CreatorChannelDonationFragment : BaseFragment + viewModel.postChannelDonation(can, isSecret, message) + } + } + private fun setupDonationList() = with(binding.rvCreatorChannelDonation) { layoutManager = LinearLayoutManager(requireContext()) adapter = donationAdapter @@ -66,11 +75,6 @@ class CreatorChannelDonationFragment : BaseFragment - viewModel.postChannelDonation(can, isSecret, message) - } - } btnCreatorChannelDonationEmptyWrite.setOnClickListener { host.onCreatorChannelDonationRequested { can, isSecret, message -> viewModel.postChannelDonation(can, isSecret, message) @@ -99,7 +103,7 @@ class CreatorChannelDonationFragment : BaseFragment Unit) fun onCreatorChannelDonationRankingAllClicked() fun onCreatorChannelDonationCompleted() diff --git a/app/src/main/res/layout/activity_creator_channel.xml b/app/src/main/res/layout/activity_creator_channel.xml index db3e09ad..528a7581 100644 --- a/app/src/main/res/layout/activity_creator_channel.xml +++ b/app/src/main/res/layout/activity_creator_channel.xml @@ -382,6 +382,31 @@ + + + + + - 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 c909f6cd..97d4499c 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 @@ -428,6 +428,8 @@ class CreatorChannelActivitySourceTest { val adapter = projectFile( "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/CreatorChannelPagerAdapter.kt" ).readText() + val activityLayout = projectFile("app/src/main/res/layout/activity_creator_channel.xml").readText() + val donationFragmentLayout = projectFile("app/src/main/res/layout/fragment_creator_channel_donation.xml").readText() assertTrue(adapter.contains("CreatorChannelDonationFragment.newInstance(creatorId)")) assertTrue(source.contains("CreatorChannelDonationFragment.Host")) @@ -444,6 +446,20 @@ class CreatorChannelActivitySourceTest { assertTrue(source.contains("homeActionDelegate?.refreshHome()")) assertTrue(source.contains("UserProfileDonationAllViewActivity::class.java")) assertTrue(source.contains("putExtra(Constants.EXTRA_USER_ID, creatorId)")) + assertTrue(activityLayout.contains("android:id=\"@+id/btn_creator_channel_donation_write\"")) + assertTrue(activityLayout.contains("android:layout_width=\"66dp\"")) + assertTrue(activityLayout.contains("android:layout_height=\"66dp\"")) + assertTrue(activityLayout.contains("android:layout_marginEnd=\"@dimen/spacing_14\"")) + assertTrue(activityLayout.contains("android:layout_marginBottom=\"@dimen/spacing_14\"")) + assertTrue(activityLayout.contains("android:padding=\"@dimen/spacing_14\"")) + assertTrue(activityLayout.contains("app:layout_constraintBottom_toBottomOf=\"parent\"")) + assertTrue(activityLayout.contains("app:layout_constraintEnd_toEndOf=\"parent\"")) + assertTrue(activityLayout.contains("android:layout_width=\"38dp\"")) + assertTrue(source.contains("private var isDonationFloatingButtonVisible: Boolean = false")) + assertTrue(source.contains("updateDonationFloatingButtonVisibility()")) + assertTrue(source.contains("findDonationFragment()?.onCreatorChannelDonationFloatingButtonClicked()")) + assertTrue(donationFragmentLayout.contains("btn_creator_channel_donation_empty_write")) + assertFalse(donationFragmentLayout.contains("btn_creator_channel_donation_write")) } @Test diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationActionTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationActionTest.kt index cfd10348..994585b3 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationActionTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationActionTest.kt @@ -33,12 +33,14 @@ class CreatorChannelDonationActionTest { } @Test - fun `후원 fragment source는 owner일 때 floating button을 숨기고 후원 요청을 ViewModel에 전달한다`() { + fun `후원 fragment source는 content owner 상태에 따라 Activity floating button 표시를 요청한다`() { val fragment = projectFile( "app/src/main/java/kr/co/vividnext/sodalive/v2/creator/channel/donation/CreatorChannelDonationFragment.kt" ).readText() - assertTrue(fragment.contains("btnCreatorChannelDonationWrite.isVisible = !state.isOwner")) + assertTrue(fragment.contains("fun onCreatorChannelDonationFloatingButtonClicked()")) + assertTrue(fragment.contains("host.onCreatorChannelDonationFloatingButtonVisibilityChanged(!state.isOwner)")) + assertTrue(fragment.contains("host.onCreatorChannelDonationFloatingButtonVisibilityChanged(false)")) assertTrue(fragment.contains("host.onCreatorChannelDonationRequested { can, isSecret, message ->")) assertTrue(fragment.contains("viewModel.postChannelDonation(can, isSecret, message)")) assertTrue(fragment.contains("viewModel.consumeDonationSuccessEvent()")) @@ -53,7 +55,7 @@ class CreatorChannelDonationActionTest { assertTrue(fragment.contains("btnCreatorChannelDonationEmptyWrite.setOnClickListener")) assertTrue(fragment.contains("btnCreatorChannelDonationEmptyWrite.isVisible = !state.isOwner")) - assertTrue(fragment.contains("btnCreatorChannelDonationWrite.isVisible = false")) + assertTrue(fragment.contains("host.onCreatorChannelDonationFloatingButtonVisibilityChanged(false)")) assertTrue(fragment.contains("host.onCreatorChannelDonationRequested { can, isSecret, message ->")) assertTrue(fragment.contains("viewModel.postChannelDonation(can, isSecret, message)")) }