feat(main): 홈 크리에이터 FAB를 추가한다
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
package kr.co.vividnext.sodalive.v2.main
|
||||
|
||||
import kr.co.vividnext.sodalive.settings.notification.MemberRole
|
||||
|
||||
object MainHomeFabVisibilityPolicy {
|
||||
fun shouldShow(
|
||||
currentTab: MainV2Tab?,
|
||||
isLoginAllowed: Boolean,
|
||||
role: String
|
||||
): Boolean {
|
||||
return currentTab == MainV2Tab.HOME &&
|
||||
isLoginAllowed &&
|
||||
role == MemberRole.CREATOR.name
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
package kr.co.vividnext.sodalive.v2.main
|
||||
|
||||
import android.animation.Animator
|
||||
import android.animation.AnimatorListenerAdapter
|
||||
import android.animation.ValueAnimator
|
||||
import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.BroadcastReceiver
|
||||
@@ -12,10 +15,13 @@ import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.view.View
|
||||
import android.view.animation.Interpolator
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.net.toUri
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import androidx.lifecycle.repeatOnLifecycle
|
||||
@@ -37,14 +43,17 @@ import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService
|
||||
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
|
||||
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerFragment
|
||||
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService
|
||||
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
|
||||
import kr.co.vividnext.sodalive.audition.AuditionActivity
|
||||
import kr.co.vividnext.sodalive.base.BaseActivity
|
||||
import kr.co.vividnext.sodalive.common.Constants
|
||||
import kr.co.vividnext.sodalive.common.LoadingDialog
|
||||
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
||||
import kr.co.vividnext.sodalive.databinding.ActivityMainV2Binding
|
||||
import kr.co.vividnext.sodalive.explorer.profile.creator_community.write.CreatorCommunityWriteActivity
|
||||
import kr.co.vividnext.sodalive.extensions.dpToPx
|
||||
import kr.co.vividnext.sodalive.live.LiveViewModel
|
||||
import kr.co.vividnext.sodalive.live.room.create.LiveRoomCreateActivity
|
||||
import kr.co.vividnext.sodalive.main.EventPopupDialogFragment
|
||||
import kr.co.vividnext.sodalive.message.MessageActivity
|
||||
import kr.co.vividnext.sodalive.mypage.MyPageFragment
|
||||
@@ -63,6 +72,8 @@ import kr.co.vividnext.sodalive.v2.content.action.handleContentAction
|
||||
import kr.co.vividnext.sodalive.v2.creator.action.CreatorActionCommand
|
||||
import kr.co.vividnext.sodalive.v2.creator.action.handleCreatorAction
|
||||
import kr.co.vividnext.sodalive.v2.live.action.LiveActionCoordinator
|
||||
import kr.co.vividnext.sodalive.v2.live.action.LiveCreationResult
|
||||
import kr.co.vividnext.sodalive.v2.live.action.resolveLiveCreationResult
|
||||
import kr.co.vividnext.sodalive.v2.main.chat.ChatMainFragment
|
||||
import kr.co.vividnext.sodalive.v2.main.chat.model.ChatRoomFilter
|
||||
import kr.co.vividnext.sodalive.v2.main.content.ContentMainFragment
|
||||
@@ -101,6 +112,26 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
|
||||
private var playerStateJob: Job? = null
|
||||
private var isDeferredRouteLoading = false
|
||||
private var isLiveEntryLoading = false
|
||||
private var isMainHomeFabExpanded: Boolean = false
|
||||
private var isMainHomeFabAnimating: Boolean = false
|
||||
private val communityWriteLauncher = registerForActivityResult(
|
||||
ActivityResultContracts.StartActivityForResult()
|
||||
) { result ->
|
||||
if (result.resultCode == RESULT_OK) {
|
||||
findHomeMainFragment()?.refreshHome()
|
||||
}
|
||||
}
|
||||
private val liveRoomCreateLauncher = registerForActivityResult(
|
||||
ActivityResultContracts.StartActivityForResult()
|
||||
) { result ->
|
||||
handleLiveCreationResult(
|
||||
resolveLiveCreationResult(
|
||||
isSuccessful = result.resultCode == RESULT_OK,
|
||||
roomId = result.data?.getLongExtra(Constants.EXTRA_ROOM_ID, 0L),
|
||||
channelName = result.data?.getStringExtra(Constants.EXTRA_ROOM_CHANNEL_NAME)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -200,6 +231,7 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
|
||||
}
|
||||
|
||||
setupLiveEntryObservers()
|
||||
setupMainHomeFabClickListeners()
|
||||
setupBottomNavigation()
|
||||
if (intent.hasExtra(EXTRA_CHAT_FILTER)) {
|
||||
selectChatTabWithLoginGuard()
|
||||
@@ -225,6 +257,22 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleLiveCreationResult(result: LiveCreationResult) {
|
||||
when (result) {
|
||||
LiveCreationResult.Ignored -> Unit
|
||||
LiveCreationResult.RefreshOnly -> findHomeMainFragment()?.refreshHome()
|
||||
LiveCreationResult.Created -> {
|
||||
findHomeMainFragment()?.refreshHome()
|
||||
showToast(getString(R.string.creator_channel_live_created_message))
|
||||
}
|
||||
|
||||
is LiveCreationResult.Enter -> {
|
||||
findHomeMainFragment()?.refreshHome()
|
||||
liveActionCoordinator.enterLiveRoom(result.roomId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun openChatTab() {
|
||||
selectChatTabWithLoginGuard()
|
||||
}
|
||||
@@ -296,7 +344,11 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
|
||||
binding.bottomNavigation.selectedItemId = itemId
|
||||
}
|
||||
|
||||
if (tab != MainV2Tab.HOME) {
|
||||
collapseMainHomeFab(animate = false)
|
||||
}
|
||||
changeFragment(tab)
|
||||
updateMainHomeFabVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,6 +389,133 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupMainHomeFabClickListeners() {
|
||||
binding.mainHomeFabButton.setOnClickListener { expandMainHomeFab() }
|
||||
binding.mainHomeFabDim.setOnClickListener { collapseMainHomeFab() }
|
||||
binding.mainHomeFabCloseButton.setOnClickListener { collapseMainHomeFab() }
|
||||
binding.mainHomeFabCommunityButton.setOnClickListener { onMainHomeFabCommunityClicked() }
|
||||
binding.mainHomeFabAudioButton.setOnClickListener { onMainHomeFabAudioClicked() }
|
||||
binding.mainHomeFabLiveButton.setOnClickListener { onMainHomeFabLiveClicked() }
|
||||
}
|
||||
|
||||
private fun expandMainHomeFab() {
|
||||
if (isMainHomeFabAnimating) return
|
||||
if (isMainHomeFabExpanded) return
|
||||
if (!isMainHomeFabAvailable()) return
|
||||
|
||||
isMainHomeFabExpanded = true
|
||||
animateMainHomeFab(expand = true)
|
||||
}
|
||||
|
||||
private fun collapseMainHomeFab(animate: Boolean = true) {
|
||||
if (isMainHomeFabAnimating) return
|
||||
if (!isMainHomeFabExpanded) {
|
||||
updateMainHomeFabVisibility()
|
||||
return
|
||||
}
|
||||
|
||||
isMainHomeFabExpanded = false
|
||||
if (animate) {
|
||||
animateMainHomeFab(expand = false)
|
||||
} else {
|
||||
updateMainHomeFabVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
private fun animateMainHomeFab(expand: Boolean) {
|
||||
isMainHomeFabAnimating = true
|
||||
binding.mainHomeFabDim.isVisible = true
|
||||
binding.mainHomeFabExpandedContainer.isVisible = true
|
||||
binding.mainHomeFabButton.isVisible = true
|
||||
val start = if (expand) 0f else 1f
|
||||
val end = if (expand) 1f else 0f
|
||||
ValueAnimator.ofFloat(start, end).apply {
|
||||
duration = MAIN_HOME_FAB_ANIMATION_DURATION_MS
|
||||
interpolator = SpringInterpolator(
|
||||
mass = MAIN_HOME_FAB_SPRING_MASS,
|
||||
stiffness = MAIN_HOME_FAB_SPRING_STIFFNESS,
|
||||
damping = MAIN_HOME_FAB_SPRING_DAMPING
|
||||
)
|
||||
addUpdateListener { animator ->
|
||||
val value = animator.animatedValue as Float
|
||||
binding.mainHomeFabDim.alpha = value
|
||||
binding.mainHomeFabExpandedContainer.alpha = value
|
||||
binding.mainHomeFabExpandedContainer.scaleX = value
|
||||
binding.mainHomeFabExpandedContainer.scaleY = value
|
||||
binding.mainHomeFabButton.alpha = 1f - value
|
||||
}
|
||||
addListener(
|
||||
onEnd = {
|
||||
isMainHomeFabAnimating = false
|
||||
updateMainHomeFabVisibility()
|
||||
}
|
||||
)
|
||||
start()
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateMainHomeFabVisibility() {
|
||||
val shouldShowMainHomeFab = MainHomeFabVisibilityPolicy.shouldShow(
|
||||
currentTab = viewModel.currentTab.value,
|
||||
isLoginAllowed = isV2AccessAllowed(AccessRequirement.Login),
|
||||
role = SharedPreferenceManager.role
|
||||
)
|
||||
binding.mainHomeFabDim.isVisible = shouldShowMainHomeFab && isMainHomeFabExpanded
|
||||
binding.mainHomeFabExpandedContainer.isVisible = shouldShowMainHomeFab && isMainHomeFabExpanded
|
||||
binding.mainHomeFabButton.isVisible = shouldShowMainHomeFab && !isMainHomeFabExpanded
|
||||
if (!shouldShowMainHomeFab) {
|
||||
isMainHomeFabExpanded = false
|
||||
}
|
||||
if (!binding.mainHomeFabExpandedContainer.isVisible) {
|
||||
binding.mainHomeFabDim.alpha = 1f
|
||||
binding.mainHomeFabExpandedContainer.alpha = 1f
|
||||
binding.mainHomeFabExpandedContainer.scaleX = 1f
|
||||
binding.mainHomeFabExpandedContainer.scaleY = 1f
|
||||
binding.mainHomeFabButton.alpha = 1f
|
||||
}
|
||||
}
|
||||
|
||||
private fun isMainHomeFabAvailable(): Boolean {
|
||||
return MainHomeFabVisibilityPolicy.shouldShow(
|
||||
currentTab = viewModel.currentTab.value,
|
||||
isLoginAllowed = isV2AccessAllowed(AccessRequirement.Login),
|
||||
role = SharedPreferenceManager.role
|
||||
)
|
||||
}
|
||||
|
||||
private fun runMainHomeFabAction(action: () -> Unit) {
|
||||
collapseMainHomeFab(animate = false)
|
||||
ensureV2Access(AccessRequirement.Login) {
|
||||
if (isMainHomeFabAvailable()) {
|
||||
action()
|
||||
} else {
|
||||
updateMainHomeFabVisibility()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun onMainHomeFabCommunityClicked() {
|
||||
runMainHomeFabAction {
|
||||
communityWriteLauncher.launch(Intent(this, CreatorCommunityWriteActivity::class.java))
|
||||
}
|
||||
}
|
||||
|
||||
private fun onMainHomeFabAudioClicked() {
|
||||
runMainHomeFabAction {
|
||||
startActivity(Intent(this, AudioContentUploadActivity::class.java))
|
||||
}
|
||||
}
|
||||
|
||||
private fun onMainHomeFabLiveClicked() {
|
||||
runMainHomeFabAction {
|
||||
liveRoomCreateLauncher.launch(Intent(this, LiveRoomCreateActivity::class.java))
|
||||
}
|
||||
}
|
||||
|
||||
private fun findHomeMainFragment(): HomeMainFragment? {
|
||||
return supportFragmentManager.findFragmentByTag(MainV2Tab.HOME.toString()) as? HomeMainFragment
|
||||
}
|
||||
|
||||
private fun observePlayerState() {
|
||||
playerStateJob = lifecycleScope.launch {
|
||||
repeatOnLifecycle(Lifecycle.State.STARTED) {
|
||||
@@ -546,9 +725,17 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
|
||||
|
||||
private fun getMemberInfo() {
|
||||
if (isV2AccessAllowed(AccessRequirement.Login)) {
|
||||
viewModel.getMemberInfo(context = applicationContext) {
|
||||
notificationSettingsDialog.show(screenWidth)
|
||||
}
|
||||
viewModel.getMemberInfo(
|
||||
context = applicationContext,
|
||||
showNotificationSettingsDialog = {
|
||||
notificationSettingsDialog.show(screenWidth)
|
||||
},
|
||||
onMemberInfoUpdated = {
|
||||
updateMainHomeFabVisibility()
|
||||
}
|
||||
)
|
||||
} else {
|
||||
updateMainHomeFabVisibility()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -894,7 +1081,30 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
|
||||
}
|
||||
}
|
||||
|
||||
private fun ValueAnimator.addListener(onEnd: () -> Unit) {
|
||||
addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationEnd(animation: Animator) = onEnd()
|
||||
})
|
||||
}
|
||||
|
||||
private class SpringInterpolator(
|
||||
private val mass: Float,
|
||||
private val stiffness: Float,
|
||||
private val damping: Float
|
||||
) : Interpolator {
|
||||
override fun getInterpolation(input: Float): Float {
|
||||
val angularFrequency = kotlin.math.sqrt(stiffness / mass)
|
||||
val decay = kotlin.math.exp(-damping / (2f * mass) * input)
|
||||
val oscillation = kotlin.math.cos(angularFrequency * input)
|
||||
return (1f - decay * oscillation).coerceIn(0f, 1f)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val MAIN_HOME_FAB_ANIMATION_DURATION_MS = 260L
|
||||
private const val MAIN_HOME_FAB_SPRING_MASS = 1f
|
||||
private const val MAIN_HOME_FAB_SPRING_STIFFNESS = 256f
|
||||
private const val MAIN_HOME_FAB_SPRING_DAMPING = 24f
|
||||
private const val EXTRA_CHAT_FILTER: String = "extra_chat_filter"
|
||||
const val EXTRA_AUDIO_NOTIFICATION_ROUTE: String = "extra_audio_notification_route"
|
||||
const val ROUTE_AUDIO_PLAYER: String = "audio_player"
|
||||
|
||||
@@ -78,7 +78,11 @@ class MainV2ViewModel(
|
||||
)
|
||||
}
|
||||
|
||||
fun getMemberInfo(context: Context, showNotificationSettingsDialog: () -> Unit) {
|
||||
fun getMemberInfo(
|
||||
context: Context,
|
||||
showNotificationSettingsDialog: () -> Unit,
|
||||
onMemberInfoUpdated: () -> Unit = {}
|
||||
) {
|
||||
compositeDisposable.add(
|
||||
userRepository.getMemberInfo(token = "Bearer ${SharedPreferenceManager.token}")
|
||||
.subscribeOn(Schedulers.io())
|
||||
@@ -136,6 +140,7 @@ class MainV2ViewModel(
|
||||
params = params
|
||||
)
|
||||
FirebaseTracking.login("email")
|
||||
onMemberInfoUpdated()
|
||||
}
|
||||
},
|
||||
{}
|
||||
|
||||
@@ -159,6 +159,10 @@ class HomeMainFragment : BaseFragment<FragmentV2MainHomeBinding>(
|
||||
homeRecommendationViewModel.loadRecommendations()
|
||||
}
|
||||
|
||||
fun refreshHome() {
|
||||
homeRecommendationViewModel.loadRecommendations()
|
||||
}
|
||||
|
||||
private fun setupTitleBarActions() {
|
||||
binding.viewHomeTitleBar.ivTitleBarCash.setOnClickListener {
|
||||
openWithLoginGuard(CanChargeActivity::class.java)
|
||||
|
||||
@@ -105,4 +105,131 @@
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:menu="@menu/menu_main_v2_bottom_navigation" />
|
||||
|
||||
<View
|
||||
android:id="@+id/main_home_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/main_home_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_toTopOf="@+id/cl_mini_player"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:visibility="visible">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/main_home_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/main_home_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/main_home_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/main_home_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/main_home_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_toTopOf="@+id/cl_mini_player"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
tools:visibility="visible">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="38dp"
|
||||
android:layout_height="38dp"
|
||||
android:contentDescription="@null"
|
||||
android:src="@drawable/ic_plus_no_bg" />
|
||||
</FrameLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
package kr.co.vividnext.sodalive.v2.main
|
||||
|
||||
import kr.co.vividnext.sodalive.settings.notification.MemberRole
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class MainHomeFabVisibilityPolicyTest {
|
||||
|
||||
@Test
|
||||
fun `홈 탭 로그인 크리에이터이면 FAB를 표시한다`() {
|
||||
val shouldShow = MainHomeFabVisibilityPolicy.shouldShow(
|
||||
currentTab = MainV2Tab.HOME,
|
||||
isLoginAllowed = true,
|
||||
role = MemberRole.CREATOR.name
|
||||
)
|
||||
|
||||
assertTrue(shouldShow)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `홈 탭이어도 로그인하지 않았으면 FAB를 숨긴다`() {
|
||||
val shouldShow = MainHomeFabVisibilityPolicy.shouldShow(
|
||||
currentTab = MainV2Tab.HOME,
|
||||
isLoginAllowed = false,
|
||||
role = MemberRole.CREATOR.name
|
||||
)
|
||||
|
||||
assertFalse(shouldShow)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `홈 탭이어도 일반 유저이면 FAB를 숨긴다`() {
|
||||
val shouldShow = MainHomeFabVisibilityPolicy.shouldShow(
|
||||
currentTab = MainV2Tab.HOME,
|
||||
isLoginAllowed = true,
|
||||
role = MemberRole.USER.name
|
||||
)
|
||||
|
||||
assertFalse(shouldShow)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `크리에이터여도 홈 탭이 아니면 FAB를 숨긴다`() {
|
||||
val shouldShow = MainHomeFabVisibilityPolicy.shouldShow(
|
||||
currentTab = MainV2Tab.CONTENT,
|
||||
isLoginAllowed = true,
|
||||
role = MemberRole.CREATOR.name
|
||||
)
|
||||
|
||||
assertFalse(shouldShow)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user