feat(creator): 본인 홈 FAB를 추가한다
This commit is contained in:
@@ -53,6 +53,7 @@ class CreatorChannelActivity :
|
|||||||
private var statusBarHeight: Int = 0
|
private var statusBarHeight: Int = 0
|
||||||
private var tabLayoutMediator: TabLayoutMediator? = null
|
private var tabLayoutMediator: TabLayoutMediator? = null
|
||||||
private var pageChangeCallback: ViewPager2.OnPageChangeCallback? = null
|
private var pageChangeCallback: ViewPager2.OnPageChangeCallback? = null
|
||||||
|
private var isOwnerFabExpanded: Boolean = false
|
||||||
private val baseTitleBarHeight: Int by lazy { 60.dpToPx().toInt() }
|
private val baseTitleBarHeight: Int by lazy { 60.dpToPx().toInt() }
|
||||||
|
|
||||||
override val shouldApplySystemBarTopInset: Boolean = false
|
override val shouldApplySystemBarTopInset: Boolean = false
|
||||||
@@ -76,6 +77,9 @@ class CreatorChannelActivity :
|
|||||||
binding.ivMore.setOnClickListener { onMoreClicked() }
|
binding.ivMore.setOnClickListener { onMoreClicked() }
|
||||||
binding.layoutFollowCapsule.setOnClickListener { onFollowCapsuleClicked() }
|
binding.layoutFollowCapsule.setOnClickListener { onFollowCapsuleClicked() }
|
||||||
binding.ivBell.setOnClickListener { onBellClicked() }
|
binding.ivBell.setOnClickListener { onBellClicked() }
|
||||||
|
binding.ownerFabButton.setOnClickListener { expandOwnerFab() }
|
||||||
|
binding.ownerFabDim.setOnClickListener { collapseOwnerFab() }
|
||||||
|
binding.ownerFabCloseButton.setOnClickListener { collapseOwnerFab() }
|
||||||
binding.tvChatButton.setOnClickListener {
|
binding.tvChatButton.setOnClickListener {
|
||||||
currentHeader?.characterId?.let { characterId -> homeActionDelegate?.createChatRoom(characterId) }
|
currentHeader?.characterId?.let { characterId -> homeActionDelegate?.createChatRoom(characterId) }
|
||||||
}
|
}
|
||||||
@@ -266,6 +270,10 @@ class CreatorChannelActivity :
|
|||||||
}
|
}
|
||||||
val callback = object : ViewPager2.OnPageChangeCallback() {
|
val callback = object : ViewPager2.OnPageChangeCallback() {
|
||||||
override fun onPageSelected(position: Int) {
|
override fun onPageSelected(position: Int) {
|
||||||
|
if (position != CreatorChannelTab.Home.ordinal) {
|
||||||
|
isOwnerFabExpanded = false
|
||||||
|
}
|
||||||
|
updateOwnerFabVisibility()
|
||||||
updateViewPagerHeight()
|
updateViewPagerHeight()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -277,6 +285,7 @@ class CreatorChannelActivity :
|
|||||||
currentHeader = header
|
currentHeader = header
|
||||||
bindHeader(header)
|
bindHeader(header)
|
||||||
bindTitleBar(header)
|
bindTitleBar(header)
|
||||||
|
updateOwnerFabVisibility()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreatorChannelFollowProgressChanged(inProgress: Boolean) {
|
override fun onCreatorChannelFollowProgressChanged(inProgress: Boolean) {
|
||||||
@@ -310,6 +319,24 @@ class CreatorChannelActivity :
|
|||||||
updateViewPagerHeight()
|
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() {
|
override fun onCreatorChannelDonationClicked() {
|
||||||
val header = currentHeader ?: return
|
val header = currentHeader ?: return
|
||||||
if (header.isOwner) return
|
if (header.isOwner) return
|
||||||
|
|||||||
@@ -237,4 +237,132 @@
|
|||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/owner_fab_dim"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:background="#66000000"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/owner_fab_expanded_container"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_14"
|
||||||
|
android:layout_marginBottom="@dimen/spacing_14"
|
||||||
|
android:gravity="end"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/owner_fab_community_button"
|
||||||
|
android:layout_width="66dp"
|
||||||
|
android:layout_height="66dp"
|
||||||
|
android:background="@drawable/bg_creator_channel_owner_fab"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="@string/creator_channel_owner_fab_community"
|
||||||
|
android:elevation="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:padding="@dimen/spacing_14">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="38dp"
|
||||||
|
android:layout_height="38dp"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
android:src="@drawable/ic_new_upload_community_post" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/owner_fab_audio_button"
|
||||||
|
android:layout_width="66dp"
|
||||||
|
android:layout_height="66dp"
|
||||||
|
android:layout_marginTop="@dimen/spacing_14"
|
||||||
|
android:background="@drawable/bg_creator_channel_owner_fab"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="@string/creator_channel_owner_fab_audio"
|
||||||
|
android:elevation="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:padding="@dimen/spacing_14">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="38dp"
|
||||||
|
android:layout_height="38dp"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
android:src="@drawable/ic_new_upload_audio" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/owner_fab_live_button"
|
||||||
|
android:layout_width="66dp"
|
||||||
|
android:layout_height="66dp"
|
||||||
|
android:layout_marginTop="@dimen/spacing_14"
|
||||||
|
android:background="@drawable/bg_creator_channel_owner_fab_live"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="@string/creator_channel_owner_fab_live"
|
||||||
|
android:elevation="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:padding="@dimen/spacing_14">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="38dp"
|
||||||
|
android:layout_height="38dp"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
android:src="@drawable/ic_new_create_live" />
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/owner_fab_close_button"
|
||||||
|
android:layout_width="66dp"
|
||||||
|
android:layout_height="66dp"
|
||||||
|
android:layout_marginTop="@dimen/spacing_14"
|
||||||
|
android:background="@drawable/bg_creator_channel_owner_fab_close"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="@string/creator_channel_owner_fab_close"
|
||||||
|
android:elevation="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:padding="@dimen/spacing_14">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="38dp"
|
||||||
|
android:layout_height="38dp"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
android:src="@drawable/ic_new_x_black" />
|
||||||
|
</FrameLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/owner_fab_button"
|
||||||
|
android:layout_width="66dp"
|
||||||
|
android:layout_height="66dp"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_14"
|
||||||
|
android:layout_marginBottom="@dimen/spacing_14"
|
||||||
|
android:background="@drawable/bg_creator_channel_owner_fab"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="@string/creator_channel_owner_fab_open"
|
||||||
|
android:elevation="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:padding="@dimen/spacing_14"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/iv_owner_fab_icon"
|
||||||
|
android:layout_width="38dp"
|
||||||
|
android:layout_height="38dp"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
android:src="@drawable/ic_plus_no_bg" />
|
||||||
|
</FrameLayout>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|||||||
@@ -1375,6 +1375,55 @@ class CreatorChannelActivitySourceTest {
|
|||||||
assertTrue(adapter.contains("marginEnd = if (index == item.items.lastIndex) 0 else 16.dp()"))
|
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
|
@Test
|
||||||
fun `남은 section item layouts는 legacy generic card id를 제거한다`() {
|
fun `남은 section item layouts는 legacy generic card id를 제거한다`() {
|
||||||
val layoutNames = listOf(
|
val layoutNames = listOf(
|
||||||
|
|||||||
Reference in New Issue
Block a user