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.player.AudioContentPlayerService
 | 
				
			||||||
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
 | 
					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.audition.detail.AuditionDetailActivity
 | 
				
			||||||
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
 | 
				
			||||||
import kr.co.vividnext.sodalive.common.LoadingDialog
 | 
					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 contentBannerAdapter: AudioContentMainBannerAdapter
 | 
				
			||||||
    private lateinit var originalSeriesAdapter: HomeSeriesAdapter
 | 
					    private lateinit var originalSeriesAdapter: HomeSeriesAdapter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private lateinit var auditionAdapter: AuditionBannerAdapter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private val handler = Handler(Looper.getMainLooper())
 | 
					    private val handler = Handler(Looper.getMainLooper())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private val preferenceChangeListener =
 | 
					    private val preferenceChangeListener =
 | 
				
			||||||
@@ -158,6 +161,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
 | 
				
			|||||||
        setupLatestContent()
 | 
					        setupLatestContent()
 | 
				
			||||||
        setupContentBanner()
 | 
					        setupContentBanner()
 | 
				
			||||||
        setupOriginalSeries()
 | 
					        setupOriginalSeries()
 | 
				
			||||||
 | 
					        setupAudition()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun setupLiveView() {
 | 
					    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_909090),
 | 
				
			||||||
                ContextCompat.getColor(requireContext(), R.color.color_3bb9f1)
 | 
					                ContextCompat.getColor(requireContext(), R.color.color_3bb9f1)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .setIndicatorSliderWidth(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
 | 
					            .setIndicatorSliderWidth(10f.dpToPx().toInt(), 10f.dpToPx().toInt())
 | 
				
			||||||
            .setIndicatorHeight(4f.dpToPx().toInt())
 | 
					            .setIndicatorHeight(10f.dpToPx().toInt())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        viewModel.eventBannerListLiveData.observe(viewLifecycleOwner) {
 | 
					        viewModel.eventBannerListLiveData.observe(viewLifecycleOwner) {
 | 
				
			||||||
            if (
 | 
					            if (
 | 
				
			||||||
@@ -570,10 +574,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
 | 
				
			|||||||
                        outRect.left = 0
 | 
					                        outRect.left = 0
 | 
				
			||||||
                        outRect.right = 8f.dpToPx().toInt()
 | 
					                        outRect.right = 8f.dpToPx().toInt()
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    originalSeriesAdapter.itemCount - 1 -> {
 | 
					                    originalSeriesAdapter.itemCount - 1 -> {
 | 
				
			||||||
                        outRect.left = 8f.dpToPx().toInt()
 | 
					                        outRect.left = 8f.dpToPx().toInt()
 | 
				
			||||||
                        outRect.right = 0
 | 
					                        outRect.right = 0
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    else -> {
 | 
					                    else -> {
 | 
				
			||||||
                        outRect.left = 8f.dpToPx().toInt()
 | 
					                        outRect.left = 8f.dpToPx().toInt()
 | 
				
			||||||
                        outRect.right = 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() {
 | 
					    private fun bindData() {
 | 
				
			||||||
        viewModel.isLoading.observe(viewLifecycleOwner) {
 | 
					        viewModel.isLoading.observe(viewLifecycleOwner) {
 | 
				
			||||||
            if (it) {
 | 
					            if (it) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -184,7 +184,7 @@
 | 
				
			|||||||
                    android:layout_width="match_parent"
 | 
					                    android:layout_width="match_parent"
 | 
				
			||||||
                    android:layout_height="wrap_content"
 | 
					                    android:layout_height="wrap_content"
 | 
				
			||||||
                    android:layout_gravity="center"
 | 
					                    android:layout_gravity="center"
 | 
				
			||||||
                    android:layout_marginTop="6.7dp" />
 | 
					                    android:layout_marginTop="28dp" />
 | 
				
			||||||
            </LinearLayout>
 | 
					            </LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <LinearLayout
 | 
					            <LinearLayout
 | 
				
			||||||
@@ -232,7 +232,7 @@
 | 
				
			|||||||
                    android:layout_width="match_parent"
 | 
					                    android:layout_width="match_parent"
 | 
				
			||||||
                    android:layout_height="wrap_content"
 | 
					                    android:layout_height="wrap_content"
 | 
				
			||||||
                    android:layout_gravity="center"
 | 
					                    android:layout_gravity="center"
 | 
				
			||||||
                    android:layout_marginTop="6.7dp" />
 | 
					                    android:layout_marginTop="28dp" />
 | 
				
			||||||
            </LinearLayout>
 | 
					            </LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <LinearLayout
 | 
					            <LinearLayout
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,5 +7,6 @@
 | 
				
			|||||||
        android:id="@+id/iv_recommend_live"
 | 
					        android:id="@+id/iv_recommend_live"
 | 
				
			||||||
        android:layout_width="match_parent"
 | 
					        android:layout_width="match_parent"
 | 
				
			||||||
        android:layout_height="wrap_content"
 | 
					        android:layout_height="wrap_content"
 | 
				
			||||||
 | 
					        android:scaleType="centerCrop"
 | 
				
			||||||
        android:contentDescription="@null" />
 | 
					        android:contentDescription="@null" />
 | 
				
			||||||
</FrameLayout>
 | 
					</FrameLayout>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user