diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/GetLatestFinishedLiveResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/GetLatestFinishedLiveResponse.kt new file mode 100644 index 00000000..124f5221 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/GetLatestFinishedLiveResponse.kt @@ -0,0 +1,13 @@ +package kr.co.vividnext.sodalive.live + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName + +@Keep +data class GetLatestFinishedLiveResponse( + @SerializedName("memberId") val memberId: Long, + @SerializedName("nickname") val nickname: String, + @SerializedName("profileImageUrl") val profileImageUrl: String, + @SerializedName("title") val title: String, + @SerializedName("timeAgo") val timeAgo: String +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LatestFinishedLiveAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LatestFinishedLiveAdapter.kt new file mode 100644 index 00000000..cb4a8a8b --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LatestFinishedLiveAdapter.kt @@ -0,0 +1,57 @@ +package kr.co.vividnext.sodalive.live + +import android.annotation.SuppressLint +import android.content.Context +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import kr.co.vividnext.sodalive.databinding.ItemLatestFinishedLiveBinding + +class LatestFinishedLiveAdapter( + private val onClick: (Long) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + override fun onCreateViewHolder(parent: android.view.ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + parent.context, + ItemLatestFinishedLiveBinding.inflate( + android.view.LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.count() + + @SuppressLint("NotifyDataSetChanged") + fun addItems(items: List) { + this.items.clear() + this.items.addAll(items) + notifyDataSetChanged() + } + + inner class ViewHolder( + private val context: Context, + private val binding: ItemLatestFinishedLiveBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: GetLatestFinishedLiveResponse) { + Glide + .with(context) + .load(item.profileImageUrl) + .apply(RequestOptions.circleCropTransform()) + .into(binding.ivProfile) + + binding.tvNickname.text = item.nickname + binding.tvTimeAgo.text = item.timeAgo + binding.tvTitle.text = item.title + binding.root.setOnClickListener { onClick(item.memberId) } + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt index 4f1cfd48..9e10c141 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt @@ -233,4 +233,9 @@ interface LiveApi { @Path("id") id: Long, @Header("Authorization") authHeader: String ): Single> + + @GET("/live/room/latest-finished-live") + fun getLatestFinishedLive( + @Header("Authorization") authHeader: String + ): Flowable>> } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt index 22b56bac..9e4a8f4c 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt @@ -161,6 +161,7 @@ class LiveFragment : BaseFragment(FragmentLiveBinding::infl setupCommunityPost() setupRecommendLive() setupRecommendChannel() + setupLatestFinishedLiveChannel() setupLiveReservation() } @@ -348,6 +349,60 @@ class LiveFragment : BaseFragment(FragmentLiveBinding::infl } } + private fun setupLatestFinishedLiveChannel() { + val adapter = LatestFinishedLiveAdapter { + startActivity( + Intent( + requireContext(), + UserProfileActivity::class.java + ).apply { + putExtra(Constants.EXTRA_USER_ID, it) + } + ) + } + + val recyclerView = binding.rvLatestFinishedLiveChannel + recyclerView.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.HORIZONTAL, + false + ) + + recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.left = 0 + outRect.right = 8f.dpToPx().toInt() + } + + liveRecommendChannelAdapter.itemCount - 1 -> { + outRect.left = 8f.dpToPx().toInt() + outRect.right = 0 + } + + else -> { + outRect.left = 8f.dpToPx().toInt() + outRect.right = 8f.dpToPx().toInt() + } + } + } + }) + + recyclerView.adapter = adapter + + viewModel.latestFinishedLiveListLiveData.observe(viewLifecycleOwner) { + adapter.addItems(it) + } + } + @SuppressLint("NotifyDataSetChanged") private fun setupLiveNow() { binding diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt index 2acea0ad..0d29135a 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt @@ -261,4 +261,8 @@ class LiveRepository( roomId, authHeader = token ) + + fun getLatestFinishedLive(token: String) = api.getLatestFinishedLive( + authHeader = token + ) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt index dd63d632..78a171c0 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt @@ -8,8 +8,14 @@ import kr.co.vividnext.sodalive.settings.event.GetEventResponse @Keep data class LiveSummary( - @SerializedName("liveNow") val liveNow: ApiResponse>, - @SerializedName("liveReservation") val liveReservation: ApiResponse>, - @SerializedName("event") val event: ApiResponse, - @SerializedName("recommendLive") val recommendLive: ApiResponse>, + @SerializedName("liveNow") + val liveNow: ApiResponse>, + @SerializedName("liveReservation") + val liveReservation: ApiResponse>, + @SerializedName("event") + val event: ApiResponse, + @SerializedName("recommendLive") + val recommendLive: ApiResponse>, + @SerializedName("latestFinishedLive") + val latestFinishedLive: ApiResponse> ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt index 4e2c6849..6f96cd6c 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt @@ -61,6 +61,11 @@ class LiveViewModel( val communityPostItemLiveData: LiveData> get() = _communityPostItemLiveData + private val _latestFinishedLiveListLiveData = + MutableLiveData>() + val latestFinishedLiveListLiveData: LiveData> + get() = _latestFinishedLiveListLiveData + var page = 1 var isLast = false private val pageSize = 10 @@ -157,6 +162,10 @@ class LiveViewModel( token = "Bearer ${SharedPreferenceManager.token}" ) + val latestFinishedLive = repository.getLatestFinishedLive( + token = "Bearer ${SharedPreferenceManager.token}" + ) + _isLoading.postValue(true) compositeDisposable.add( @@ -165,7 +174,9 @@ class LiveViewModel( liveReservation, event, recommendLive, - ) { t1, t2, t3, t4 -> LiveSummary(t1, t2, t3, t4) } + latestFinishedLive + ) { t1, t2, t3, t4, t5 -> LiveSummary(t1, t2, t3, t4, t5) } + .subscribeOn(Schedulers.io()) .subscribe( { val now = it.liveNow @@ -223,6 +234,17 @@ class LiveViewModel( _recommendLiveData.postValue(emptyList()) } + val latestFinishedLiveResponse = it.latestFinishedLive + if ( + latestFinishedLiveResponse.success && + latestFinishedLiveResponse.data != null + ) { + val data = latestFinishedLiveResponse.data!! + _latestFinishedLiveListLiveData.postValue(data) + } else { + _latestFinishedLiveListLiveData.postValue(emptyList()) + } + _isLoading.postValue(false) }, { diff --git a/app/src/main/res/drawable-mdpi/img_live.png b/app/src/main/res/drawable-mdpi/img_live.png deleted file mode 100644 index 0b4409d7..00000000 Binary files a/app/src/main/res/drawable-mdpi/img_live.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/rank1.png b/app/src/main/res/drawable-mdpi/rank1.png deleted file mode 100644 index 84be27e1..00000000 Binary files a/app/src/main/res/drawable-mdpi/rank1.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/rank2.png b/app/src/main/res/drawable-mdpi/rank2.png deleted file mode 100644 index 8cd5c37b..00000000 Binary files a/app/src/main/res/drawable-mdpi/rank2.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/rank3.png b/app/src/main/res/drawable-mdpi/rank3.png deleted file mode 100644 index f40761dd..00000000 Binary files a/app/src/main/res/drawable-mdpi/rank3.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/rank1.png b/app/src/main/res/drawable-xxhdpi/rank1.png new file mode 100644 index 00000000..a650229c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/rank1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/rank2.png b/app/src/main/res/drawable-xxhdpi/rank2.png new file mode 100644 index 00000000..98ce0832 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/rank2.png differ diff --git a/app/src/main/res/drawable-xxhdpi/rank3.png b/app/src/main/res/drawable-xxhdpi/rank3.png new file mode 100644 index 00000000..d52fc8ae Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/rank3.png differ diff --git a/app/src/main/res/drawable/circle_background.xml b/app/src/main/res/drawable/circle_background.xml index d79e1a92..b16b7c44 100644 --- a/app/src/main/res/drawable/circle_background.xml +++ b/app/src/main/res/drawable/circle_background.xml @@ -1,5 +1,8 @@ - + + diff --git a/app/src/main/res/drawable/img_live.xml b/app/src/main/res/drawable/img_live.xml new file mode 100644 index 00000000..53d6711f --- /dev/null +++ b/app/src/main/res/drawable/img_live.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_live.xml b/app/src/main/res/layout/fragment_live.xml index 41eb2f6e..4fc1ea2d 100644 --- a/app/src/main/res/layout/fragment_live.xml +++ b/app/src/main/res/layout/fragment_live.xml @@ -102,6 +102,39 @@ android:layout_height="wrap_content" android:layout_marginBottom="48dp" /> + + + + + + + + + + diff --git a/app/src/main/res/layout/item_latest_finished_live.xml b/app/src/main/res/layout/item_latest_finished_live.xml new file mode 100644 index 00000000..383dcd5f --- /dev/null +++ b/app/src/main/res/layout/item_latest_finished_live.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + +