From 32d61d98080a0aab4f563fe93df64a176800f850 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 15 Jul 2025 06:34:41 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=ED=99=88=20-=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=B0=B0=EB=84=88=20UI=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/home/HomeFragment.kt | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt index f38d3b37..81d11fcf 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.home import android.content.Intent import android.content.SharedPreferences import android.graphics.Rect +import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.Looper @@ -10,6 +11,7 @@ import android.text.SpannableString import android.text.Spanned import android.text.style.ForegroundColorSpan import android.view.View +import android.widget.LinearLayout import android.widget.Toast import androidx.annotation.OptIn import androidx.core.content.ContextCompat @@ -17,12 +19,18 @@ import androidx.media3.common.util.UnstableApi import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager 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.audio_content.AudioContentPlayService 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.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.series.detail.SeriesDetailActivity import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity import kr.co.vividnext.sodalive.base.BaseFragment 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.main.MainActivity 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 org.koin.android.ext.android.inject import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import kotlin.math.roundToInt @OptIn(UnstableApi::class) class HomeFragment : BaseFragment(FragmentHomeBinding::inflate) { @@ -56,6 +66,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl private lateinit var latestContentThemeAdapter: HomeContentThemeAdapter private lateinit var homeContentAdapter: HomeContentAdapter + private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter private val handler = Handler(Looper.getMainLooper()) @@ -144,6 +155,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl setupLiveView() setupSectionCreator() setupLatestContent() + setupContentBanner() } private fun setupLiveView() { @@ -414,6 +426,90 @@ class HomeFragment : BaseFragment(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 + + 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() { viewModel.isLoading.observe(viewLifecycleOwner) { if (it) {