feat: 메인 홈
- 오디션 배너 UI 추가
This commit is contained in:
		@@ -0,0 +1,54 @@
 | 
			
		||||
package kr.co.vividnext.sodalive.home
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.graphics.Bitmap
 | 
			
		||||
import android.graphics.drawable.Drawable
 | 
			
		||||
import android.widget.FrameLayout
 | 
			
		||||
import android.widget.ImageView
 | 
			
		||||
import com.bumptech.glide.Glide
 | 
			
		||||
import com.bumptech.glide.request.target.CustomTarget
 | 
			
		||||
import com.bumptech.glide.request.transition.Transition
 | 
			
		||||
import com.zhpan.bannerview.BaseBannerAdapter
 | 
			
		||||
import com.zhpan.bannerview.BaseViewHolder
 | 
			
		||||
import kr.co.vividnext.sodalive.R
 | 
			
		||||
import kr.co.vividnext.sodalive.audition.GetAuditionListItem
 | 
			
		||||
 | 
			
		||||
class AuditionBannerAdapter(
 | 
			
		||||
    private val context: Context,
 | 
			
		||||
    private val itemWidth: Int,
 | 
			
		||||
    private val itemHeight: Int,
 | 
			
		||||
    private val onClick: (Long) -> Unit
 | 
			
		||||
) : BaseBannerAdapter<GetAuditionListItem>() {
 | 
			
		||||
    override fun bindData(
 | 
			
		||||
        holder: BaseViewHolder<GetAuditionListItem>,
 | 
			
		||||
        data: GetAuditionListItem,
 | 
			
		||||
        position: Int,
 | 
			
		||||
        pageSize: Int
 | 
			
		||||
    ) {
 | 
			
		||||
        val ivBanner = holder.findViewById<ImageView>(R.id.iv_recommend_live)
 | 
			
		||||
        val layoutParams = ivBanner.layoutParams as FrameLayout.LayoutParams
 | 
			
		||||
 | 
			
		||||
        layoutParams.width = itemWidth
 | 
			
		||||
        layoutParams.height = itemHeight
 | 
			
		||||
 | 
			
		||||
        Glide
 | 
			
		||||
            .with(context)
 | 
			
		||||
            .asBitmap()
 | 
			
		||||
            .load(data.imageUrl)
 | 
			
		||||
            .into(object : CustomTarget<Bitmap>() {
 | 
			
		||||
                override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
 | 
			
		||||
                    ivBanner.layoutParams = layoutParams
 | 
			
		||||
                    ivBanner.setImageBitmap(resource)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                override fun onLoadCleared(placeholder: Drawable?) {
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
        ivBanner.setOnClickListener { onClick(data.id) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getLayoutId(viewType: Int): Int {
 | 
			
		||||
        return R.layout.item_recommend_live
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -32,6 +32,7 @@ import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBanner
 | 
			
		||||
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.audition.detail.AuditionDetailActivity
 | 
			
		||||
import kr.co.vividnext.sodalive.base.BaseFragment
 | 
			
		||||
import kr.co.vividnext.sodalive.common.Constants
 | 
			
		||||
import kr.co.vividnext.sodalive.common.LoadingDialog
 | 
			
		||||
@@ -69,6 +70,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
 | 
			
		||||
    private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
 | 
			
		||||
    private lateinit var originalSeriesAdapter: HomeSeriesAdapter
 | 
			
		||||
 | 
			
		||||
    private lateinit var auditionAdapter: AuditionBannerAdapter
 | 
			
		||||
 | 
			
		||||
    private val handler = Handler(Looper.getMainLooper())
 | 
			
		||||
 | 
			
		||||
    private val preferenceChangeListener =
 | 
			
		||||
@@ -158,6 +161,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
 | 
			
		||||
        setupLatestContent()
 | 
			
		||||
        setupContentBanner()
 | 
			
		||||
        setupOriginalSeries()
 | 
			
		||||
        setupAudition()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setupLiveView() {
 | 
			
		||||
@@ -510,8 +514,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
 | 
			
		||||
                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())
 | 
			
		||||
            .setIndicatorSliderWidth(10f.dpToPx().toInt(), 10f.dpToPx().toInt())
 | 
			
		||||
            .setIndicatorHeight(10f.dpToPx().toInt())
 | 
			
		||||
 | 
			
		||||
        viewModel.eventBannerListLiveData.observe(viewLifecycleOwner) {
 | 
			
		||||
            if (
 | 
			
		||||
@@ -570,10 +574,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
 | 
			
		||||
                        outRect.left = 0
 | 
			
		||||
                        outRect.right = 8f.dpToPx().toInt()
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    originalSeriesAdapter.itemCount - 1 -> {
 | 
			
		||||
                        outRect.left = 8f.dpToPx().toInt()
 | 
			
		||||
                        outRect.right = 0
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    else -> {
 | 
			
		||||
                        outRect.left = 8f.dpToPx().toInt()
 | 
			
		||||
                        outRect.right = 8f.dpToPx().toInt()
 | 
			
		||||
@@ -593,6 +599,63 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setupAudition() {
 | 
			
		||||
        val layoutParams = binding
 | 
			
		||||
            .eventBannerSlider
 | 
			
		||||
            .layoutParams as LinearLayout.LayoutParams
 | 
			
		||||
 | 
			
		||||
        val pagerWidth = screenWidth.toDouble()
 | 
			
		||||
        val pagerHeight = (pagerWidth * 120 / 352).roundToInt()
 | 
			
		||||
        layoutParams.width = pagerWidth.roundToInt()
 | 
			
		||||
        layoutParams.height = pagerHeight
 | 
			
		||||
 | 
			
		||||
        auditionAdapter = AuditionBannerAdapter(
 | 
			
		||||
            requireContext(),
 | 
			
		||||
            pagerWidth.roundToInt(),
 | 
			
		||||
            pagerHeight
 | 
			
		||||
        ) {
 | 
			
		||||
            startActivity(
 | 
			
		||||
                Intent(requireContext(), AuditionDetailActivity::class.java).apply {
 | 
			
		||||
                    putExtra(Constants.EXTRA_AUDITION_ID, it)
 | 
			
		||||
                }
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        binding
 | 
			
		||||
            .auditionSlider
 | 
			
		||||
            .layoutParams = layoutParams
 | 
			
		||||
 | 
			
		||||
        binding.auditionSlider.apply {
 | 
			
		||||
            adapter = auditionAdapter as BaseBannerAdapter<Any>
 | 
			
		||||
 | 
			
		||||
            setLifecycleRegistry(lifecycle)
 | 
			
		||||
            setScrollDuration(1000)
 | 
			
		||||
            setInterval(4 * 1000)
 | 
			
		||||
        }.create()
 | 
			
		||||
 | 
			
		||||
        binding
 | 
			
		||||
            .auditionSlider
 | 
			
		||||
            .setIndicatorView(binding.indicatorAudition)
 | 
			
		||||
            .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(10f.dpToPx().toInt(), 10f.dpToPx().toInt())
 | 
			
		||||
            .setIndicatorHeight(10f.dpToPx().toInt())
 | 
			
		||||
 | 
			
		||||
        viewModel.auditionListLiveData.observe(viewLifecycleOwner) {
 | 
			
		||||
            if (it.isNotEmpty()) {
 | 
			
		||||
                binding.llAudition.visibility = View.VISIBLE
 | 
			
		||||
                binding.auditionSlider.refreshData(it)
 | 
			
		||||
            } else {
 | 
			
		||||
                binding.llAudition.visibility = View.GONE
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun bindData() {
 | 
			
		||||
        viewModel.isLoading.observe(viewLifecycleOwner) {
 | 
			
		||||
            if (it) {
 | 
			
		||||
 
 | 
			
		||||
@@ -184,7 +184,7 @@
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_gravity="center"
 | 
			
		||||
                    android:layout_marginTop="6.7dp" />
 | 
			
		||||
                    android:layout_marginTop="28dp" />
 | 
			
		||||
            </LinearLayout>
 | 
			
		||||
 | 
			
		||||
            <LinearLayout
 | 
			
		||||
@@ -232,7 +232,7 @@
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:layout_gravity="center"
 | 
			
		||||
                    android:layout_marginTop="6.7dp" />
 | 
			
		||||
                    android:layout_marginTop="28dp" />
 | 
			
		||||
            </LinearLayout>
 | 
			
		||||
 | 
			
		||||
            <LinearLayout
 | 
			
		||||
 
 | 
			
		||||
@@ -7,5 +7,6 @@
 | 
			
		||||
        android:id="@+id/iv_recommend_live"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:scaleType="centerCrop"
 | 
			
		||||
        android:contentDescription="@null" />
 | 
			
		||||
</FrameLayout>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user