feat: 메인 홈
- 이벤트 배너 UI 추가
This commit is contained in:
@@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.home
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
@@ -10,6 +11,7 @@ import android.text.SpannableString
|
|||||||
import android.text.Spanned
|
import android.text.Spanned
|
||||||
import android.text.style.ForegroundColorSpan
|
import android.text.style.ForegroundColorSpan
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.widget.LinearLayout
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.annotation.OptIn
|
import androidx.annotation.OptIn
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
@@ -17,12 +19,18 @@ import androidx.media3.common.util.UnstableApi
|
|||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.zhpan.bannerview.BaseBannerAdapter
|
||||||
|
import com.zhpan.indicator.enums.IndicatorSlideMode
|
||||||
|
import com.zhpan.indicator.enums.IndicatorStyle
|
||||||
import kr.co.vividnext.sodalive.R
|
import kr.co.vividnext.sodalive.R
|
||||||
import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService
|
import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService
|
||||||
import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllActivity
|
import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllActivity
|
||||||
import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
|
import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
|
||||||
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
|
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
|
||||||
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService
|
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
|
||||||
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
|
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
|
||||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||||
import kr.co.vividnext.sodalive.common.Constants
|
import kr.co.vividnext.sodalive.common.Constants
|
||||||
@@ -38,11 +46,13 @@ import kr.co.vividnext.sodalive.live.room.dialog.LivePaymentDialog
|
|||||||
import kr.co.vividnext.sodalive.live.room.dialog.LiveRoomPasswordDialog
|
import kr.co.vividnext.sodalive.live.room.dialog.LiveRoomPasswordDialog
|
||||||
import kr.co.vividnext.sodalive.main.MainActivity
|
import kr.co.vividnext.sodalive.main.MainActivity
|
||||||
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
|
import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
|
||||||
|
import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
|
||||||
import kr.co.vividnext.sodalive.settings.notification.MemberRole
|
import kr.co.vividnext.sodalive.settings.notification.MemberRole
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@OptIn(UnstableApi::class)
|
@OptIn(UnstableApi::class)
|
||||||
class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate) {
|
class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::inflate) {
|
||||||
@@ -56,6 +66,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
private lateinit var latestContentThemeAdapter: HomeContentThemeAdapter
|
private lateinit var latestContentThemeAdapter: HomeContentThemeAdapter
|
||||||
|
|
||||||
private lateinit var homeContentAdapter: HomeContentAdapter
|
private lateinit var homeContentAdapter: HomeContentAdapter
|
||||||
|
private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
|
||||||
|
|
||||||
private val handler = Handler(Looper.getMainLooper())
|
private val handler = Handler(Looper.getMainLooper())
|
||||||
|
|
||||||
@@ -144,6 +155,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
setupLiveView()
|
setupLiveView()
|
||||||
setupSectionCreator()
|
setupSectionCreator()
|
||||||
setupLatestContent()
|
setupLatestContent()
|
||||||
|
setupContentBanner()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupLiveView() {
|
private fun setupLiveView() {
|
||||||
@@ -414,6 +426,90 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setupContentBanner() {
|
||||||
|
val layoutParams = binding
|
||||||
|
.eventBannerSlider
|
||||||
|
.layoutParams as LinearLayout.LayoutParams
|
||||||
|
|
||||||
|
val pagerWidth = screenWidth.toDouble()
|
||||||
|
val pagerHeight = (pagerWidth * 0.53).roundToInt()
|
||||||
|
layoutParams.width = pagerWidth.roundToInt()
|
||||||
|
layoutParams.height = pagerHeight
|
||||||
|
|
||||||
|
contentBannerAdapter = AudioContentMainBannerAdapter(
|
||||||
|
requireContext(),
|
||||||
|
pagerWidth.roundToInt(),
|
||||||
|
pagerHeight
|
||||||
|
) {
|
||||||
|
when (it.type) {
|
||||||
|
AudioContentBannerType.EVENT -> {
|
||||||
|
startActivity(
|
||||||
|
Intent(requireContext(), EventDetailActivity::class.java).apply {
|
||||||
|
putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioContentBannerType.CREATOR -> {
|
||||||
|
startActivity(
|
||||||
|
Intent(requireContext(), UserProfileActivity::class.java).apply {
|
||||||
|
putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioContentBannerType.SERIES -> {
|
||||||
|
startActivity(
|
||||||
|
Intent(requireContext(), SeriesDetailActivity::class.java).apply {
|
||||||
|
putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioContentBannerType.LINK -> {
|
||||||
|
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
binding
|
||||||
|
.eventBannerSlider
|
||||||
|
.layoutParams = layoutParams
|
||||||
|
|
||||||
|
binding.eventBannerSlider.apply {
|
||||||
|
adapter = contentBannerAdapter as BaseBannerAdapter<Any>
|
||||||
|
|
||||||
|
setLifecycleRegistry(lifecycle)
|
||||||
|
setScrollDuration(1000)
|
||||||
|
setInterval(4 * 1000)
|
||||||
|
}.create()
|
||||||
|
|
||||||
|
binding
|
||||||
|
.eventBannerSlider
|
||||||
|
.setIndicatorView(binding.indicatorEventBanner)
|
||||||
|
.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
|
||||||
|
.setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
|
||||||
|
.setIndicatorVisibility(View.GONE)
|
||||||
|
.setIndicatorSliderColor(
|
||||||
|
ContextCompat.getColor(requireContext(), R.color.color_909090),
|
||||||
|
ContextCompat.getColor(requireContext(), R.color.color_3bb9f1)
|
||||||
|
)
|
||||||
|
.setIndicatorSliderWidth(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
|
||||||
|
.setIndicatorHeight(4f.dpToPx().toInt())
|
||||||
|
|
||||||
|
viewModel.eventBannerListLiveData.observe(viewLifecycleOwner) {
|
||||||
|
if (
|
||||||
|
SharedPreferenceManager.token.isBlank() ||
|
||||||
|
(contentBannerAdapter.itemCount <= 0 && it.isEmpty())
|
||||||
|
) {
|
||||||
|
binding.llBanner.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
binding.llBanner.visibility = View.VISIBLE
|
||||||
|
binding.eventBannerSlider.refreshData(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun bindData() {
|
private fun bindData() {
|
||||||
viewModel.isLoading.observe(viewLifecycleOwner) {
|
viewModel.isLoading.observe(viewLifecycleOwner) {
|
||||||
if (it) {
|
if (it) {
|
||||||
|
|||||||
Reference in New Issue
Block a user