feat(series-all): 오직 보이스온에서만(오리지널 시리즈) 전체보기 추가

This commit is contained in:
2025-11-12 17:47:18 +09:00
parent ff16c70362
commit 51b81f2ab6
8 changed files with 74 additions and 31 deletions

View File

@@ -13,10 +13,11 @@ import retrofit2.http.Query
interface SeriesApi {
@GET("/audio-content/series")
fun getSeriesList(
@Query("creatorId") creatorId: Long,
@Query("creatorId") creatorId: Long?,
@Query("sortType") sortType: SeriesListAllViewModel.SeriesSortType,
@Query("isAdultContentVisible") isAdultContentVisible: Boolean,
@Query("contentType") contentType: ContentType,
@Query("isOriginal") isOriginal: Boolean?,
@Query("page") page: Int,
@Query("size") size: Int,
@Header("Authorization") authHeader: String

View File

@@ -33,7 +33,6 @@ class SeriesListAdapter(
binding.clCover.layoutParams = lp
binding.ivCover.load(item.coverImage) {
crossfade(true)
placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(5f.dpToPx()))
}

View File

@@ -9,9 +9,10 @@ import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.DifferentSpacingItemDecoration
import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.databinding.ActivitySeriesListAllBinding
import kr.co.vividnext.sodalive.extensions.dpToPx
import org.koin.android.ext.android.inject
import kotlin.math.roundToInt
@@ -27,25 +28,36 @@ class SeriesListAllActivity : BaseActivity<ActivitySeriesListAllBinding>(
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val creatorId = intent.getLongExtra(Constants.EXTRA_USER_ID, 0)
if (creatorId <= 0) {
Toast.makeText(applicationContext, "잘못된 요청입니다.", Toast.LENGTH_LONG).show()
finish()
}
val passedCreatorId = intent.getLongExtra(Constants.EXTRA_USER_ID, 0)
val isOriginal = intent.getBooleanExtra(Constants.EXTRA_IS_ORIGINAL, false)
bindData()
viewModel.creatorId = creatorId
viewModel.creatorId = if (passedCreatorId > 0) {
passedCreatorId
} else {
null
}
viewModel.isOriginal = if (isOriginal) {
true
} else {
null
}
viewModel.getSeriesList()
}
override fun setupView() {
loadingDialog = LoadingDialog(this, layoutInflater)
binding.toolbar.tvBack.text = "시리즈 전체보기"
binding.toolbar.tvBack.text =
if (intent.getBooleanExtra(Constants.EXTRA_IS_ORIGINAL, false)) {
"오직 보이스온에서만"
} else {
"시리즈 전체보기"
}
binding.toolbar.tvBack.setOnClickListener { finish() }
seriesAdapter = SeriesListAdapter(
itemWidth = ((screenWidth - (13.3 * 3)) / 3).roundToInt(),
itemWidth = ((screenWidth - 24f.dpToPx() * 2 - 16f.dpToPx()) / 2f).roundToInt(),
onClickItem = {
startActivity(
Intent(applicationContext, SeriesDetailActivity::class.java).apply {
@@ -57,20 +69,13 @@ class SeriesListAllActivity : BaseActivity<ActivitySeriesListAllBinding>(
isVisibleCreator = false
)
val spanCount = 3
val horizontalSpacing = 20
val verticalSpacing = 100
val spanCount = 2
val spacingPx = 16f.dpToPx().toInt()
val recyclerView = binding.rvSeriesAll
recyclerView.layoutManager = GridLayoutManager(this, spanCount)
recyclerView.addItemDecoration(
DifferentSpacingItemDecoration(
spanCount = spanCount,
horizontalSpacing = horizontalSpacing,
verticalSpacing = verticalSpacing,
includeEdge = true
)
GridSpacingItemDecoration(spanCount, spacingPx, true)
)
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {

View File

@@ -28,7 +28,8 @@ class SeriesListAllViewModel(private val repository: SeriesRepository) : BaseVie
val seriesListLiveData: LiveData<List<GetSeriesListResponse.SeriesListItem>>
get() = _seriesListLiveData
var creatorId = 0L
var creatorId: Long? = null
var isOriginal: Boolean? = null
var isLast = false
var page = 1
private val size = 10
@@ -40,6 +41,7 @@ class SeriesListAllViewModel(private val repository: SeriesRepository) : BaseVie
compositeDisposable.add(
repository.getSeriesList(
creatorId = creatorId,
isOriginal = isOriginal,
sortType = SeriesSortType.NEWEST,
page = page,
size = size,

View File

@@ -5,7 +5,8 @@ import kr.co.vividnext.sodalive.settings.ContentType
class SeriesRepository(private val api: SeriesApi) {
fun getSeriesList(
creatorId: Long,
creatorId: Long?,
isOriginal: Boolean?,
sortType: SeriesListAllViewModel.SeriesSortType,
page: Int,
size: Int,
@@ -14,7 +15,8 @@ class SeriesRepository(private val api: SeriesApi) {
creatorId = creatorId,
sortType = sortType,
isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
contentType = ContentType.entries[SharedPreferenceManager.contentPreference],
isOriginal = isOriginal,
page = page - 1,
size = size,
authHeader = token

View File

@@ -93,4 +93,7 @@ object Constants {
const val EXTRA_ALARM_ID = "alarm_id"
const val EXTRA_ROULETTE_AVAILABLE_ACTIVE = "roulette_available_active"
// Series List All options
const val EXTRA_IS_ORIGINAL = "extra_is_original"
}

View File

@@ -642,6 +642,19 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
})
recyclerView.adapter = originalSeriesAdapter
binding.tvSeriesOriginalAll.setOnClickListener {
// ‘오직 보이스온에서만’ 전체보기: isOriginal=true로 시리즈 전체보기 화면 진입
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(
Intent(requireContext(), kr.co.vividnext.sodalive.audio_content.series.SeriesListAllActivity::class.java).apply {
putExtra(kr.co.vividnext.sodalive.common.Constants.EXTRA_IS_ORIGINAL, true)
}
)
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
}
viewModel.originalAudioDramaListLiveData.observe(viewLifecycleOwner) {
if (it.isNotEmpty()) {
binding.llSeriesOriginal.visibility = View.VISIBLE

View File

@@ -199,16 +199,34 @@
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/tv_series_original"
<!-- 제목과 전체보기 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="24dp">
<TextView
android:id="@+id/tv_series_original"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/pretendard_bold"
android:text="오직 보이스온에서만"
android:textColor="@color/white"
android:textSize="24sp" />
<TextView
android:id="@+id/tv_series_original_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/pretendard_regular"
android:text="전체보기"
android:textColor="#90A4AE"
android:textSize="14sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_series_original"
android:layout_width="match_parent"