새로운 콘텐츠 전체보기

- 무료 플래그를 추가하여 무료콘텐츠만 조회가 가능하도록 수정
This commit is contained in:
klaus 2025-02-14 18:30:26 +09:00
parent b331048dec
commit ef32eb70dd
8 changed files with 88 additions and 8 deletions

View File

@ -161,6 +161,7 @@ interface AudioContentApi {
@GET("/audio-content/main/new/all") @GET("/audio-content/main/new/all")
fun getNewContentAllOfTheme( fun getNewContentAllOfTheme(
@Query("isFree") isFree: Boolean,
@Query("theme") theme: String, @Query("theme") theme: String,
@Query("isAdultContentVisible") isAdultContentVisible: Boolean, @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
@Query("contentType") contentType: ContentType, @Query("contentType") contentType: ContentType,
@ -333,4 +334,12 @@ interface AudioContentApi {
@Query("size") size: Int, @Query("size") size: Int,
@Header("Authorization") authHeader: String @Header("Authorization") authHeader: String
): Single<ApiResponse<List<GetAudioContentMainItem>>> ): Single<ApiResponse<List<GetAudioContentMainItem>>>
@GET("/v2/audio-content/main/free/new-content-by-theme")
fun getNewFreeContentOfTheme(
@Query("theme") theme: String,
@Query("page") page: Int,
@Query("size") size: Int,
@Header("Authorization") authHeader: String
): Single<ApiResponse<List<GetAudioContentMainItem>>>
} }

View File

@ -147,11 +147,13 @@ class AudioContentRepository(
) )
fun getNewContentAllOfTheme( fun getNewContentAllOfTheme(
isFree: Boolean,
theme: String, theme: String,
page: Int, page: Int,
size: Int, size: Int,
token: String token: String
) = api.getNewContentAllOfTheme( ) = api.getNewContentAllOfTheme(
isFree = isFree,
theme = theme, theme = theme,
isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible, isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
contentType = ContentType.values()[SharedPreferenceManager.contentPreference], contentType = ContentType.values()[SharedPreferenceManager.contentPreference],

View File

@ -5,6 +5,8 @@ import android.graphics.Rect
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.annotation.OptIn
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
@ -19,6 +21,7 @@ import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.extensions.dpToPx
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
@OptIn(UnstableApi::class)
class AudioContentNewAllActivity : BaseActivity<ActivityAudioContentNewAllBinding>( class AudioContentNewAllActivity : BaseActivity<ActivityAudioContentNewAllBinding>(
ActivityAudioContentNewAllBinding::inflate ActivityAudioContentNewAllBinding::inflate
) { ) {
@ -29,12 +32,15 @@ class AudioContentNewAllActivity : BaseActivity<ActivityAudioContentNewAllBindin
private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter
private lateinit var newContentAdapter: AudioContentNewAllAdapter private lateinit var newContentAdapter: AudioContentNewAllAdapter
private var isFree: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
isFree = intent.getBooleanExtra(Constants.EXTRA_AUDIO_CONTENT_FREE, false)
bindData() bindData()
viewModel.getThemeList() viewModel.getThemeList()
viewModel.getNewContentList() viewModel.getNewContentList(isFree = isFree)
} }
override fun setupView() { override fun setupView() {
@ -49,7 +55,7 @@ class AudioContentNewAllActivity : BaseActivity<ActivityAudioContentNewAllBindin
private fun setupNewContentTheme() { private fun setupNewContentTheme() {
newContentThemeAdapter = AudioContentMainNewContentThemeAdapter { newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {
newContentAdapter.clear() newContentAdapter.clear()
viewModel.selectTheme(it) viewModel.selectTheme(it, isFree = isFree)
} }
binding.rvNewContentTheme.layoutManager = LinearLayoutManager( binding.rvNewContentTheme.layoutManager = LinearLayoutManager(
@ -125,7 +131,7 @@ class AudioContentNewAllActivity : BaseActivity<ActivityAudioContentNewAllBindin
if (!recyclerView.canScrollVertically(1) && if (!recyclerView.canScrollVertically(1) &&
lastVisibleItemPosition == itemTotalCount lastVisibleItemPosition == itemTotalCount
) { ) {
viewModel.getNewContentList() viewModel.getNewContentList(isFree)
} }
} }
}) })

View File

@ -38,12 +38,13 @@ class AudioContentNewAllViewModel(
private val size = 10 private val size = 10
private var selectedTheme = "" private var selectedTheme = ""
fun getNewContentList() { fun getNewContentList(isFree: Boolean = false) {
if (!_isLoading.value!! && !isLast) { if (!_isLoading.value!! && !isLast) {
_isLoading.value = true _isLoading.value = true
compositeDisposable.add( compositeDisposable.add(
repository.getNewContentAllOfTheme( repository.getNewContentAllOfTheme(
isFree = isFree,
theme = if (selectedTheme == "전체") { theme = if (selectedTheme == "전체") {
"" ""
} else { } else {
@ -118,10 +119,10 @@ class AudioContentNewAllViewModel(
) )
} }
fun selectTheme(theme: String) { fun selectTheme(theme: String, isFree: Boolean) {
isLast = false isLast = false
page = 1 page = 1
selectedTheme = theme selectedTheme = theme
getNewContentList() getNewContentList(isFree)
} }
} }

View File

@ -5,7 +5,9 @@ import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.TextView import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.annotation.OptIn
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
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
@ -21,6 +23,7 @@ import kr.co.vividnext.sodalive.databinding.ActivityAudioContentCurationBinding
import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
@OptIn(UnstableApi::class)
class AudioContentCurationActivity : BaseActivity<ActivityAudioContentCurationBinding>( class AudioContentCurationActivity : BaseActivity<ActivityAudioContentCurationBinding>(
ActivityAudioContentCurationBinding::inflate ActivityAudioContentCurationBinding::inflate
) { ) {

View File

@ -290,7 +290,9 @@ class AudioContentMainTabFreeFragment : BaseFragment<FragmentAudioContentMainTab
} }
private fun setupNewContentTheme() { private fun setupNewContentTheme() {
newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {} newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {
viewModel.getNewFreeContentOfTheme(theme = it)
}
binding.rvNewContentTheme.layoutManager = LinearLayoutManager( binding.rvNewContentTheme.layoutManager = LinearLayoutManager(
context, context,
@ -336,7 +338,14 @@ class AudioContentMainTabFreeFragment : BaseFragment<FragmentAudioContentMainTab
private fun setupNewContent() { private fun setupNewContent() {
binding.ivNewContentAll.setOnClickListener { binding.ivNewContentAll.setOnClickListener {
startActivity(Intent(requireContext(), AudioContentNewAllActivity::class.java)) startActivity(
Intent(
requireContext(),
AudioContentNewAllActivity::class.java
).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_FREE, true)
}
)
} }
newContentAdapter = AudioContentMainContentAdapter( newContentAdapter = AudioContentMainContentAdapter(

View File

@ -9,4 +9,16 @@ class AudioContentMainTabFreeRepository(private val api: AudioContentApi) {
size = size, size = size,
authHeader = token authHeader = token
) )
fun getNewContentOfTheme(
theme: String,
page: Int = 1,
size: Int = 10,
token: String
) = api.getNewFreeContentOfTheme(
theme = theme,
page = page - 1,
size = size,
authHeader = token
)
} }

View File

@ -92,4 +92,42 @@ class AudioContentMainTabFreeViewModel(
) )
) )
} }
fun getNewFreeContentOfTheme(theme: String) {
_isLoading.value = true
compositeDisposable.add(
repository.getNewContentOfTheme(
theme = if (theme == "전체") {
""
} else {
theme
},
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
if (it.success && it.data != null) {
_newContentListLiveData.value = it.data!!
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)
} else {
_toastLiveData.postValue(
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
)
}
}
_isLoading.value = false
},
{
it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
_isLoading.value = false
}
)
)
}
} }