diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e18f1a14..4a055a12 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -161,7 +161,6 @@
-
@@ -177,14 +176,6 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt
index 332f2467..bedbef6b 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentApi.kt
@@ -7,7 +7,6 @@ import kr.co.vividnext.sodalive.audio_content.all.by_theme.GetContentByThemeResp
import kr.co.vividnext.sodalive.audio_content.comment.GetAudioContentCommentListResponse
import kr.co.vividnext.sodalive.audio_content.comment.ModifyCommentRequest
import kr.co.vividnext.sodalive.audio_content.comment.RegisterAudioContentCommentRequest
-import kr.co.vividnext.sodalive.audio_content.curation.GetCurationContentResponse
import kr.co.vividnext.sodalive.audio_content.detail.GetAudioContentDetailResponse
import kr.co.vividnext.sodalive.audio_content.detail.PutAudioContentLikeRequest
import kr.co.vividnext.sodalive.audio_content.detail.PutAudioContentLikeResponse
@@ -16,18 +15,9 @@ import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentCurationResponse
import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRanking
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.alarm.GetContentMainTabAlarmResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.asmr.GetContentMainTabAsmrResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.content.GetContentMainTabContentResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.free.GetContentMainTabLiveFreeResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.home.GetContentMainTabHomeResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.replay.GetContentMainTabLiveReplayResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.series.GetContentMainTabSeriesResponse
import kr.co.vividnext.sodalive.audio_content.order.GetAudioContentOrderListResponse
import kr.co.vividnext.sodalive.audio_content.order.OrderRequest
import kr.co.vividnext.sodalive.audio_content.player.GenerateUrlResponse
-import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
import kr.co.vividnext.sodalive.audio_content.upload.theme.GetAudioContentThemeResponse
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.explorer.profile.GetAudioContentListResponse
@@ -190,17 +180,6 @@ interface AudioContentApi {
@Header("Authorization") authHeader: String
): Single>
- @GET("/audio-content/curation/{id}")
- fun getAudioContentListByCurationId(
- @Path("id") id: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Query("page") page: Int,
- @Query("size") size: Int,
- @Query("sort-type") sort: AudioContentViewModel.Sort,
- @Header("Authorization") authHeader: String
- ): Single>
-
@GET("/audio-content/main/theme")
fun getNewContentThemeList(
@Query("isAdultContentVisible") isAdultContentVisible: Boolean,
@@ -257,187 +236,4 @@ interface AudioContentApi {
@Path("id") contentId: Long,
@Header("Authorization") authHeader: String
): Single>
-
- @GET("/v2/audio-content/main/home")
- fun getContentMainHome(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/home/popular-content-by-creator")
- fun getPopularContentByCreator(
- @Query("creatorId") creatorId: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/home/content/ranking")
- fun getContentMainHomeContentRanking(
- @Query("sort-type") sortType: String,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/series")
- fun getContentMainSeries(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/series/original")
- fun getOriginalAudioDramaList(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Query("page") page: Int,
- @Query("size") size: Int,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/series/recommend-by-genre")
- fun getRecommendSeriesListByGenre(
- @Query("genreId") genreId: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/series/recommend-series-by-creator")
- fun getRecommendSeriesByCreator(
- @Query("creatorId") creatorId: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/series/completed-rank")
- fun getCompletedSeries(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Query("page") page: Int,
- @Query("size") size: Int,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/content")
- fun getContentMainContent(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/content/new-content-by-theme")
- fun getContentMainNewContentOfTheme(
- @Query("theme") theme: String,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/content/ranking")
- fun getDailyContentRanking(
- @Query("sort-type") sortType: String,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/content/popular-content-by-creator")
- fun getContentMainContentPopularContentByCreator(
- @Query("creatorId") creatorId: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/alarm")
- fun getContentMainAlarm(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/alarm/all")
- fun getContentMainAlarmAll(
- @Query("theme") theme: String,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Query("page") page: Int,
- @Query("size") size: Int,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/asmr")
- fun getContentMainAsmr(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/asmr/popular-content-by-creator")
- fun getPopularAsmrContentByCreator(
- @Query("creatorId") creatorId: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/replay")
- fun getContentMainReplay(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/replay/popular-content-by-creator")
- fun getPopularReplayContentByCreator(
- @Query("creatorId") creatorId: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/free")
- fun getContentMainFree(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>
-
- @GET("/v2/audio-content/main/free/introduce-creator")
- fun getIntroduceCreatorList(
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Query("page") page: Int,
- @Query("size") size: Int,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/free/new-content-by-theme")
- fun getNewFreeContentOfTheme(
- @Query("theme") theme: String,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Query("page") page: Int,
- @Query("size") size: Int,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/free/popular-content-by-creator")
- fun getPopularFreeContentByCreator(
- @Query("creatorId") creatorId: Long,
- @Query("isAdultContentVisible") isAdultContentVisible: Boolean,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
-
- @GET("/v2/audio-content/main/content/recommend-content-by-tag")
- fun getRecommendedContentByTag(
- @Query("tag") tag: String,
- @Query("contentType") contentType: ContentType,
- @Header("Authorization") authHeader: String
- ): Single>>
}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentRepository.kt
index 57b572c1..9fadeecc 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentRepository.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/AudioContentRepository.kt
@@ -6,7 +6,6 @@ import kr.co.vividnext.sodalive.audio_content.donation.AudioContentDonationReque
import kr.co.vividnext.sodalive.audio_content.order.OrderRequest
import kr.co.vividnext.sodalive.audio_content.order.OrderType
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.explorer.ExplorerApi
import kr.co.vividnext.sodalive.settings.ContentType
import okhttp3.MultipartBody
import okhttp3.RequestBody
@@ -14,25 +13,8 @@ import java.util.TimeZone
class AudioContentRepository(
private val api: AudioContentApi,
- private val categoryApi: CategoryApi,
- private val explorerApi: ExplorerApi
+ private val categoryApi: CategoryApi
) {
- fun getAudioContentListByCurationId(
- curationId: Long,
- page: Int,
- size: Int,
- sort: AudioContentViewModel.Sort = AudioContentViewModel.Sort.NEWEST,
- token: String
- ) = api.getAudioContentListByCurationId(
- id = curationId,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- page = page - 1,
- size = size,
- sort = sort,
- authHeader = token
- )
-
fun getAudioContentList(
id: Long,
categoryId: Long,
@@ -127,13 +109,6 @@ class AudioContentRepository(
token: String
) = api.likeContent(request, authHeader = token)
- fun getNewContentOfTheme(theme: String, token: String) = api.getNewContentOfTheme(
- theme = theme,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
fun getNewContentAllOfTheme(
isFree: Boolean,
theme: String,
@@ -184,16 +159,6 @@ class AudioContentRepository(
authHeader = token
)
- fun getCurationList(page: Int, size: Int, token: String) = api.getCurationList(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- page = page - 1,
- size = size,
- authHeader = token
- )
-
- fun getMainBannerList(token: String) = api.getMainBannerList(authHeader = token)
- fun getMainOrderList(token: String) = api.getMainOrderList(authHeader = token)
fun pinContent(
audioContentId: Long,
token: String
@@ -224,6 +189,4 @@ class AudioContentRepository(
sort = sort,
authHeader = token
)
-
- fun getCreatorRank(token: String) = explorerApi.getCreatorRank(authHeader = token)
}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/AudioContentCurationActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/AudioContentCurationActivity.kt
deleted file mode 100644
index b76502b6..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/AudioContentCurationActivity.kt
+++ /dev/null
@@ -1,178 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.curation
-
-import android.annotation.SuppressLint
-import android.content.Intent
-import android.os.Bundle
-import android.widget.TextView
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.AudioContentViewModel
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllAdapter
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.base.BaseActivity
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.ActivityAudioContentCurationBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import org.koin.android.ext.android.inject
-
-@OptIn(UnstableApi::class)
-class AudioContentCurationActivity : BaseActivity(
- ActivityAudioContentCurationBinding::inflate
-) {
-
- private val viewModel: AudioContentCurationViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var adapter: AudioContentNewAllAdapter
-
- private var curationId: Long = 0
- private lateinit var title: String
-
- override fun onCreate(savedInstanceState: Bundle?) {
- title = intent.getStringExtra(Constants.EXTRA_AUDIO_CONTENT_CURATION_TITLE) ?: ""
- curationId = intent.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_CURATION_ID, 0)
- super.onCreate(savedInstanceState)
-
- if (title.isBlank() || curationId <= 0) {
- Toast.makeText(applicationContext, "잘못된 요청입니다.", Toast.LENGTH_LONG).show()
- finish()
- }
-
- bindData()
- viewModel.getContentList(curationId = curationId)
- }
-
- override fun setupView() {
- loadingDialog = LoadingDialog(this, layoutInflater)
- binding.toolbar.tvBack.text = title
- binding.toolbar.tvBack.setOnClickListener { finish() }
-
- val spanCount = 3
- val spacing = 40
- adapter = AudioContentNewAllAdapter(
- itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 3,
- onClickItem = {
- startActivity(
- Intent(this, AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(this, UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvCuration.layoutManager = GridLayoutManager(this, spanCount)
- binding.rvCuration.addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, true))
-
- binding.rvCuration.addOnScrollListener(object : RecyclerView.OnScrollListener() {
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
- super.onScrolled(recyclerView, dx, dy)
-
- val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!
- .findLastCompletelyVisibleItemPosition()
- val itemTotalCount = recyclerView.adapter!!.itemCount - 1
-
- // 스크롤이 끝에 도달했는지 확인
- if (!recyclerView.canScrollVertically(1) &&
- lastVisibleItemPosition == itemTotalCount
- ) {
- viewModel.getContentList(curationId)
- }
- }
- })
-
- binding.rvCuration.adapter = adapter
-
- binding.tvSortNewest.setOnClickListener {
- viewModel.changeSort(AudioContentViewModel.Sort.NEWEST)
- }
-
- binding.tvSortPriceLow.setOnClickListener {
- viewModel.changeSort(AudioContentViewModel.Sort.PRICE_LOW)
- }
-
- binding.tvSortPriceHigh.setOnClickListener {
- viewModel.changeSort(AudioContentViewModel.Sort.PRICE_HIGH)
- }
- }
-
- @SuppressLint("NotifyDataSetChanged")
- private fun bindData() {
- viewModel.toastLiveData.observe(this) {
- it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.isLoading.observe(this) {
- if (it) {
- loadingDialog.show(screenWidth, "")
- } else {
- loadingDialog.dismiss()
- }
- }
-
- viewModel.contentListLiveData.observe(this) {
- if (viewModel.page - 1 == 1) {
- adapter.clear()
- binding.rvCuration.scrollToPosition(0)
- }
-
- binding.tvTotalCount.text = "${it.totalCount}"
- adapter.addItems(it.items)
- }
-
- viewModel.sort.observe(this) {
- deselectSort()
- selectSort(
- when (it) {
- AudioContentViewModel.Sort.PRICE_HIGH -> {
- binding.tvSortPriceHigh
- }
-
- AudioContentViewModel.Sort.PRICE_LOW -> {
- binding.tvSortPriceLow
- }
-
- else -> {
- binding.tvSortNewest
- }
- }
- )
-
- viewModel.getContentList(curationId = curationId)
- }
- }
-
- private fun deselectSort() {
- val color = ContextCompat.getColor(
- applicationContext,
- R.color.color_88e2e2e2
- )
-
- binding.tvSortNewest.setTextColor(color)
- binding.tvSortPriceLow.setTextColor(color)
- binding.tvSortPriceHigh.setTextColor(color)
- }
-
- private fun selectSort(view: TextView) {
- view.setTextColor(
- ContextCompat.getColor(
- applicationContext,
- R.color.color_e2e2e2
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/AudioContentCurationViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/AudioContentCurationViewModel.kt
deleted file mode 100644
index c8f5c752..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/AudioContentCurationViewModel.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.curation
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.AudioContentRepository
-import kr.co.vividnext.sodalive.audio_content.AudioContentViewModel
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentCurationViewModel(
- private val repository: AudioContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _contentListLiveData = MutableLiveData()
- val contentListLiveData: LiveData
- get() = _contentListLiveData
-
- private val _sort = MutableLiveData(AudioContentViewModel.Sort.NEWEST)
- val sort: LiveData
- get() = _sort
-
- private var isLast = false
- var page = 1
- private val size = 10
-
- fun getContentList(curationId: Long) {
- if (!_isLoading.value!! && !isLast) {
- _isLoading.value = true
-
- compositeDisposable.add(
- repository.getAudioContentListByCurationId(
- curationId = curationId,
- page = page,
- size = size,
- sort = _sort.value!!,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- if (it.data.items.isNotEmpty()) {
- page += 1
- _contentListLiveData.postValue(it.data!!)
- } else {
- isLast = true
- }
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
- }
-
- fun changeSort(sort: AudioContentViewModel.Sort) {
- page = 1
- isLast = false
- _sort.postValue(sort)
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/GetCurationContentResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/GetCurationContentResponse.kt
deleted file mode 100644
index f23994be..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/curation/GetCurationContentResponse.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.curation
-
-import androidx.annotation.Keep
-import com.google.gson.annotations.SerializedName
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-
-@Keep
-data class GetCurationContentResponse(
- @SerializedName("totalCount") val totalCount: Int,
- @SerializedName("items") val items: List
-)
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainContentAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainContentAdapter.kt
deleted file mode 100644
index 4bc53d82..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainContentAdapter.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main
-
-import android.annotation.SuppressLint
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainBinding
-
-class AudioContentMainContentAdapter(
- private val onClickItem: (Long) -> Unit,
- private val onClickCreator: (Long) -> Unit,
-) : RecyclerView.Adapter() {
-
- private val items = mutableListOf()
-
- override fun onCreateViewHolder(
- parent: ViewGroup,
- viewType: Int
- ) = AudioContentMainItemViewHolder(
- ItemAudioContentMainBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- ),
- onClickItem = onClickItem,
- onClickCreator = onClickCreator
- )
-
- override fun getItemCount() = items.size
-
- override fun onBindViewHolder(holder: AudioContentMainItemViewHolder, position: Int) {
- holder.bind(items[position])
- }
-
- @SuppressLint("NotifyDataSetChanged")
- fun addItems(items: List) {
- this.items.clear()
- this.items.addAll(items)
- notifyDataSetChanged()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainFragment.kt
deleted file mode 100644
index da55fc50..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainFragment.kt
+++ /dev/null
@@ -1,737 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main
-
-import android.annotation.SuppressLint
-import android.content.Intent
-import android.graphics.Color
-import android.graphics.Rect
-import android.net.Uri
-import android.os.Bundle
-import android.text.SpannableString
-import android.text.Spanned
-import android.text.style.ForegroundColorSpan
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.zhpan.bannerview.BaseBannerAdapter
-import com.zhpan.indicator.enums.IndicatorSlideMode
-import com.zhpan.indicator.enums.IndicatorStyle
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllActivity
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentRankingAllActivity
-import kr.co.vividnext.sodalive.audio_content.all.by_theme.AudioContentAllByThemeActivity
-import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
-import kr.co.vividnext.sodalive.audio_content.curation.AudioContentCurationActivity
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerViewModel
-import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCurationAdapter
-import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCurationViewModel
-import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
-import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentViewModel
-import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainCreatorRankingViewModel
-import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter
-import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingViewModel
-import kr.co.vividnext.sodalive.audio_content.main.recommend_series.AudioContentMainRecommendSeriesViewModel
-import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
-import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
-import kr.co.vividnext.sodalive.base.BaseFragment
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainBinding
-import kr.co.vividnext.sodalive.explorer.ExplorerSectionAdapter
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.explorer.profile.series.UserProfileSeriesListAdapter
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.main.MainActivity
-import kr.co.vividnext.sodalive.mypage.alarm.AlarmListActivity
-import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
-import kr.co.vividnext.sodalive.settings.notification.MemberRole
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@OptIn(UnstableApi::class)
-class AudioContentMainFragment : BaseFragment(
- FragmentAudioContentMainBinding::inflate
-) {
- private val creatorRankViewModel: AudioContentMainCreatorRankingViewModel by inject()
- private lateinit var creatorRankAdaptor: ExplorerSectionAdapter
-
- private val recommendSeriesViewModel: AudioContentMainRecommendSeriesViewModel by inject()
- private lateinit var seriesAdapter: UserProfileSeriesListAdapter
-
- private val bannerViewModel: AudioContentMainBannerViewModel by inject()
- private lateinit var bannerAdapter: AudioContentMainBannerAdapter
-
- private val newContentViewModel: AudioContentMainNewContentViewModel by inject()
- private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var newContentAdapter: AudioContentMainContentAdapter
-
- private val contentRankingViewModel: AudioContentMainRankingViewModel by inject()
- private lateinit var contentRankingSortAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var contentRankingAdapter: AudioContentMainRankingAdapter
-
- private val curationViewModel: AudioContentMainCurationViewModel by inject()
- private lateinit var curationAdapter: AudioContentMainCurationAdapter
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- setupView()
-
- curationViewModel.getCurationList()
- bannerViewModel.getMainBannerList()
- newContentViewModel.getThemeList()
- creatorRankViewModel.getCreatorRank()
- newContentViewModel.getNewContentOfTheme("전체")
- contentRankingViewModel.getContentRanking()
- contentRankingViewModel.getContentRankingSortType()
- recommendSeriesViewModel.getRecommendSeriesList()
- }
-
- private fun setupView() {
- if (SharedPreferenceManager.role == MemberRole.CREATOR.name) {
- binding.llUploadContent.visibility = View.VISIBLE
- binding.llUploadContent.setOnClickListener {
- startActivity(
- Intent(
- requireActivity(),
- AudioContentUploadActivity::class.java
- )
- )
- }
- } else {
- binding.llUploadContent.visibility = View.GONE
- }
-
- setupCreatorRank()
- setupRecommendSeries()
- setupBanner()
- setupNewContentTheme()
- setupNewContent()
- setupContentRankingSortType()
- setupContentRanking()
- setupCuration()
-
- binding.llShortPlay.setOnClickListener {
- startActivity(
- Intent(requireContext(), AudioContentAllByThemeActivity::class.java).apply {
- putExtra(Constants.EXTRA_THEME_ID, 11L)
- }
- )
- }
-
- binding.llMorningCall.setOnClickListener {
- startActivity(
- Intent(requireContext(), AudioContentAllByThemeActivity::class.java).apply {
- putExtra(Constants.EXTRA_THEME_ID, 12L)
- }
- )
- }
-
- binding.ivContentKeep.setOnClickListener {
- startActivity(
- Intent(
- requireContext(),
- AudioContentBoxActivity::class.java
- )
- )
- }
-
- binding.ivAlarm.setOnClickListener {
- startActivity(
- Intent(
- requireActivity(),
- AlarmListActivity::class.java
- )
- )
- }
-
- binding.flSearchChannel.setOnClickListener {
- }
- }
-
- private fun setupCreatorRank() {
- creatorRankAdaptor = ExplorerSectionAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- },
- isVisibleRanking = true
- )
-
- binding.rvCreatorRank.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvCreatorRank.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 = 6.7f.dpToPx().toInt()
- }
-
- creatorRankAdaptor.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCreatorRank.adapter = creatorRankAdaptor
-
- creatorRankViewModel.creatorRankLiveData.observe(viewLifecycleOwner) {
- binding.tvDesc.text = it.desc
- binding.tvCreatorRankTitle.text = if (
- !it.coloredTitle.isNullOrBlank() &&
- !it.color.isNullOrBlank()
- ) {
- val spStr = SpannableString(it.title)
-
- try {
- spStr.setSpan(
- ForegroundColorSpan(
- Color.parseColor("#${it.color}")
- ),
- it.title.indexOf(it.coloredTitle),
- it.title.indexOf(it.coloredTitle) + it.coloredTitle.length,
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
- )
-
- spStr
- } catch (e: IllegalArgumentException) {
- it.title
- }
- } else {
- it.title
- }
-
- creatorRankAdaptor.addItems(it.creators)
- if (creatorRankAdaptor.itemCount <= 0 && it.creators.isEmpty()) {
- binding.llCreatorRank.visibility = View.GONE
- binding.rvCreatorRank.visibility = View.GONE
- } else {
- binding.llCreatorRank.visibility = View.VISIBLE
- binding.rvCreatorRank.visibility = View.VISIBLE
- }
- }
-
- creatorRankViewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
- }
-
- private fun setupRecommendSeries() {
- seriesAdapter = UserProfileSeriesListAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- },
- isVisibleCreator = true
- )
-
- val recyclerView = binding.rvRecommendSeries
- 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 = 6.7f.dpToPx().toInt()
- }
-
- seriesAdapter.itemCount - 1 -> {
- outRect.right = 0
- outRect.left = 6.7f.dpToPx().toInt()
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- recyclerView.adapter = seriesAdapter
-
- recommendSeriesViewModel.seriesListLiveData.observe(viewLifecycleOwner) {
- seriesAdapter.addItems(it)
- binding.llRecommendSeries.visibility = if (
- seriesAdapter.itemCount <= 0 && it.isEmpty()
- ) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
-
- recommendSeriesViewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
-
- binding.llRecommendSeriesRefresh.setOnClickListener {
- seriesAdapter.clear()
- recommendSeriesViewModel.getRecommendSeriesList()
- }
- }
-
- private fun setupBanner() {
- val layoutParams = binding
- .rvBanner
- .layoutParams as LinearLayout.LayoutParams
-
- val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx()
- val pagerHeight = (pagerWidth * 0.53).roundToInt()
- layoutParams.width = pagerWidth.roundToInt()
- layoutParams.height = pagerHeight
-
- bannerAdapter = AudioContentMainBannerAdapter(
- requireContext(),
- pagerWidth.roundToInt(),
- pagerHeight
- ) {
- when (it.type) {
- AudioContentBannerType.EVENT -> {
- startActivity(
- Intent(requireContext(), EventDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
- }
- )
- }
-
- AudioContentBannerType.CREATOR -> {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
- }
- )
- }
-
- AudioContentBannerType.SERIES -> {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
- }
- )
- }
-
- AudioContentBannerType.LINK -> {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
- }
- }
- }
-
- binding
- .rvBanner
- .layoutParams = layoutParams
-
- binding.rvBanner.apply {
- adapter = bannerAdapter as BaseBannerAdapter
-
- setLifecycleRegistry(lifecycle)
- setScrollDuration(1000)
- setInterval(4 * 1000)
- }.create()
-
- binding
- .rvBanner
- .setIndicatorView(binding.indicatorBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- bannerViewModel.bannerLiveData.observe(viewLifecycleOwner) {
- if (bannerAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.rvBanner.visibility = View.GONE
- binding.indicatorBanner.visibility = View.GONE
- } else {
- binding.rvBanner.visibility = View.VISIBLE
- binding.indicatorBanner.visibility = View.VISIBLE
- binding.rvBanner.refreshData(it)
- }
- }
-
- bannerViewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
- }
-
- private fun setupNewContentTheme() {
- newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {
- newContentViewModel.getNewContentOfTheme(theme = it)
- }
-
- binding.rvNewContentTheme.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContentTheme.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 = 4f.dpToPx().toInt()
- }
-
- newContentThemeAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContentTheme.adapter = newContentThemeAdapter
-
- newContentViewModel.themeListLiveData.observe(viewLifecycleOwner) {
- binding.llNewContent.visibility = View.VISIBLE
- newContentThemeAdapter.addItems(it)
- }
- }
-
- private fun setupNewContent() {
- binding.ivNewContentAll.setOnClickListener {
- startActivity(Intent(requireContext(), AudioContentNewAllActivity::class.java))
- }
-
- newContentAdapter = AudioContentMainContentAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvNewContent.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContent.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 = 6.7f.dpToPx().toInt()
- }
-
- newContentAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContent.adapter = newContentAdapter
-
- newContentViewModel.newContentListLiveData.observe(viewLifecycleOwner) {
- newContentAdapter.addItems(it)
- }
-
- newContentViewModel.isLoading.observe(viewLifecycleOwner) {
- binding.pbNewContent.visibility = if (it) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- newContentViewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
- }
-
- private fun setupContentRankingSortType() {
- contentRankingSortAdapter = AudioContentMainNewContentThemeAdapter {
- contentRankingViewModel.getContentRanking(sort = it)
- }
-
- binding.rvContentRankingSort.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvContentRankingSort.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 = 4f.dpToPx().toInt()
- }
-
- contentRankingSortAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvContentRankingSort.adapter = contentRankingSortAdapter
-
- contentRankingViewModel.contentRankingSortListLiveData.observe(viewLifecycleOwner) {
- binding.llContentRanking.visibility = View.VISIBLE
- contentRankingSortAdapter.addItems(it)
- }
- }
-
- @SuppressLint("SetTextI18n")
- private fun setupContentRanking() {
- binding.ivContentRankingAll.setOnClickListener {
- startActivity(Intent(requireContext(), AudioContentRankingAllActivity::class.java))
- }
-
- contentRankingAdapter = AudioContentMainRankingAdapter(
- width = (screenWidth * 0.66).toInt()
- ) {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- }
-
- binding.rvContentRanking.layoutManager = GridLayoutManager(
- context,
- 3,
- GridLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvContentRanking.addItemDecoration(object : RecyclerView.ItemDecoration() {
- override fun getItemOffsets(
- outRect: Rect,
- view: View,
- parent: RecyclerView,
- state: RecyclerView.State
- ) {
- super.getItemOffsets(outRect, view, parent, state)
- outRect.top = 13.3f.dpToPx().toInt()
- outRect.bottom = 13.3f.dpToPx().toInt()
- outRect.left = 13.3f.dpToPx().toInt()
- outRect.right = 13.3f.dpToPx().toInt()
- }
- })
-
- binding.rvContentRanking.adapter = contentRankingAdapter
-
- contentRankingViewModel.contentRankingLiveData.observe(viewLifecycleOwner) {
- binding.llContentRanking.visibility = View.VISIBLE
- binding.tvDate.text = "${it.startDate}~${it.endDate}"
- contentRankingAdapter.addItems(it.items)
- }
-
- contentRankingViewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
- }
-
- private fun setupCuration() {
- curationAdapter = AudioContentMainCurationAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- },
-
- onClickCurationMore = { curationId, title ->
- startActivity(
- Intent(requireContext(), AudioContentCurationActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_CURATION_ID, curationId)
- putExtra(Constants.EXTRA_AUDIO_CONTENT_CURATION_TITLE, title)
- }
- )
- }
- )
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.VERTICAL,
- false
- )
-
- binding.rvCuration.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.top = 40f.dpToPx().toInt()
- outRect.bottom = 20f.dpToPx().toInt()
- }
-
- curationAdapter.itemCount - 1 -> {
- outRect.top = 20f.dpToPx().toInt()
- outRect.bottom = 40f.dpToPx().toInt()
- }
-
- else -> {
- outRect.top = 20f.dpToPx().toInt()
- outRect.bottom = 20f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCuration.addOnScrollListener(object : RecyclerView.OnScrollListener() {
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
- super.onScrolled(recyclerView, dx, dy)
-
- val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!
- .findLastCompletelyVisibleItemPosition()
- val itemTotalCount = recyclerView.adapter!!.itemCount - 1
-
- // 스크롤이 끝에 도달했는지 확인
- if (!recyclerView.canScrollVertically(1) &&
- lastVisibleItemPosition == itemTotalCount
- ) {
- curationViewModel.getCurationList()
- }
- }
- })
-
- binding.rvCuration.adapter = curationAdapter
-
- curationViewModel.curationListLiveData.observe(viewLifecycleOwner) {
- if (curationViewModel.page == 2) {
- curationAdapter.clear()
- }
-
- curationAdapter.addItems(it)
-
- binding.rvCuration.visibility = if (curationAdapter.itemCount <= 0 && it.isEmpty()) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
-
- curationViewModel.isLoading.observe(viewLifecycleOwner) {
- binding.pbCuration.visibility = if (it) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
-
- curationViewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainItemViewHolder.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainItemViewHolder.kt
deleted file mode 100644
index 63d6ce08..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainItemViewHolder.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main
-
-import android.view.View
-import androidx.recyclerview.widget.RecyclerView
-import coil.load
-import coil.transform.CircleCropTransformation
-import coil.transform.RoundedCornersTransformation
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainBinding
-import kr.co.vividnext.sodalive.extensions.dpToPx
-
-class AudioContentMainItemViewHolder(
- private val binding: ItemAudioContentMainBinding,
- private val onClickItem: (Long) -> Unit,
- private val onClickCreator: (Long) -> Unit
-) : RecyclerView.ViewHolder(binding.root) {
- fun bind(item: GetAudioContentMainItem) {
- binding.ivPoint.visibility = if (item.isPointAvailable) {
- View.VISIBLE
- } else {
- View.GONE
- }
-
- binding.ivAudioContentCoverImage.load(item.coverImageUrl) {
- crossfade(true)
- placeholder(R.drawable.ic_place_holder)
- transformations(RoundedCornersTransformation(2.7f.dpToPx()))
- }
-
- binding.ivAudioContentCreator.load(item.creatorProfileImageUrl) {
- crossfade(true)
- placeholder(R.drawable.ic_place_holder)
- transformations(CircleCropTransformation())
- }
-
- binding.tvAudioContentTitle.text = item.title
- binding.tvAudioContentCreatorNickname.text = item.creatorNickname
-
- binding.ivAudioContentCreator.setOnClickListener { onClickCreator(item.creatorId) }
- binding.root.setOnClickListener { onClickItem(item.contentId) }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt
index da3be4f2..15c1a787 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt
@@ -4,13 +4,6 @@ import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName
import kr.co.vividnext.sodalive.settings.event.EventItem
-@Keep
-data class ContentCreatorResponse(
- @SerializedName("creatorId") val creatorId: Long,
- @SerializedName("creatorNickname") val creatorNickname: String,
- @SerializedName("creatorProfileImageUrl") val creatorProfileImageUrl: String
-)
-
@Keep
data class GetAudioContentMainItem(
@SerializedName("contentId") val contentId: Long,
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerViewModel.kt
deleted file mode 100644
index ae3f52a0..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerViewModel.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.banner
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.AudioContentRepository
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentMainBannerViewModel(
- private val repository: AudioContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _bannerLiveData = MutableLiveData>()
- val bannerLiveData: LiveData>
- get() = _bannerLiveData
-
- fun getMainBannerList() {
- compositeDisposable.add(
- repository.getMainBannerList(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _bannerLiveData.postValue(it.data!!)
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "배너를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- }
- },
- {
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue(
- "배너를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationAdapter.kt
deleted file mode 100644
index 7a8aa8e2..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationAdapter.kt
+++ /dev/null
@@ -1,102 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.curation
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.graphics.Rect
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentCurationResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainCurationBinding
-import kr.co.vividnext.sodalive.extensions.dpToPx
-
-class AudioContentMainCurationAdapter(
- private val onClickItem: (Long) -> Unit,
- private val onClickCreator: (Long) -> Unit,
- private val onClickCurationMore: (Long, String) -> Unit
-) : RecyclerView.Adapter() {
-
- private val items = mutableListOf()
-
- inner class ViewHolder(
- private val context: Context,
- private val binding: ItemAudioContentMainCurationBinding
- ) : RecyclerView.ViewHolder(binding.root) {
- fun bind(item: GetAudioContentCurationResponse) {
- binding.tvTitle.text = item.title
- binding.tvDesc.text = item.description
- binding.ivAll.setOnClickListener { onClickCurationMore(item.curationId, item.title) }
- setAudioContentList(item.audioContents)
- }
-
- private fun setAudioContentList(audioContents: List) {
- val adapter = AudioContentMainContentAdapter(onClickItem, onClickCreator)
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
- if (binding.rvCuration.itemDecorationCount == 0) {
- binding.rvCuration.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 = 6.7f.dpToPx().toInt()
- }
-
- adapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
- }
- binding.rvCuration.adapter = adapter
- adapter.addItems(audioContents)
- }
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
- parent.context,
- ItemAudioContentMainCurationBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- )
- )
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.bind(items[position])
- }
-
- override fun getItemCount() = items.size
-
- @SuppressLint("NotifyDataSetChanged")
- fun addItems(items: List) {
- this.items.addAll(items)
- notifyDataSetChanged()
- }
-
- fun clear() {
- this.items.clear()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationViewModel.kt
deleted file mode 100644
index 50aa4c15..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationViewModel.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.curation
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.AudioContentRepository
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentCurationResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentMainCurationViewModel(
- private val repository: AudioContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _curationListLiveData = MutableLiveData>()
- val curationListLiveData: LiveData>
- get() = _curationListLiveData
-
- var page = 1
- var isLast = false
- private val pageSize = 10
-
- fun getCurationList() {
- if (!_isLoading.value!! && !isLast) {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getCurationList(
- page = page,
- size = pageSize,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- page += 1
-
- if (it.data.isNotEmpty()) {
- _curationListLiveData.postValue(it.data!!)
- } else {
- _curationListLiveData.postValue(listOf())
- isLast = true
- }
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "큐레이션을 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue(
- "큐레이션을 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- )
- )
- }
- }
-
- fun refresh() {
- page = 1
- isLast = false
- getCurationList()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentViewModel.kt
deleted file mode 100644
index 48d46cb7..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentViewModel.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.new_content
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.AudioContentRepository
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentMainNewContentViewModel(
- private val repository: AudioContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _newContentListLiveData = MutableLiveData>()
- val newContentListLiveData: LiveData>
- get() = _newContentListLiveData
-
- private var _themeListLiveData = MutableLiveData>()
- val themeListLiveData: LiveData>
- get() = _themeListLiveData
-
- fun getThemeList() {
- compositeDisposable.add(
- repository.getNewContentThemeList(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- val themeList = listOf("전체").union(it.data).toList()
- _themeListLiveData.postValue(themeList)
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getNewContentOfTheme(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
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/order/AudioContentMainOrderListViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/order/AudioContentMainOrderListViewModel.kt
deleted file mode 100644
index f43db2e5..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/order/AudioContentMainOrderListViewModel.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.order
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.AudioContentRepository
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentMainOrderListViewModel(
- private val repository: AudioContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _orderListLiveData = MutableLiveData>()
- val orderListLiveData: LiveData>
- get() = _orderListLiveData
-
- fun getOrderList() {
- compositeDisposable.add(
- repository.getMainOrderList(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _orderListLiveData.postValue(it.data!!)
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "주문정보를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- }
- },
- {
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue(
- "주문정보를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainCreatorRankingViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainCreatorRankingViewModel.kt
deleted file mode 100644
index 7fdcab16..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainCreatorRankingViewModel.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.ranking
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.AudioContentRepository
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.explorer.GetExplorerSectionResponse
-
-class AudioContentMainCreatorRankingViewModel(
- private val repository: AudioContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private val _creatorRankLiveData = MutableLiveData()
- val creatorRankLiveData: LiveData
- get() = _creatorRankLiveData
-
- fun getCreatorRank() {
- compositeDisposable.add(
- repository
- .getCreatorRank(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _creatorRankLiveData.value = it.data!!
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "인기 크리에이터를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- }
- },
- {
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue(
- "인기 크리에이터를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingAdapter.kt
deleted file mode 100644
index c0fad45a..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingAdapter.kt
+++ /dev/null
@@ -1,66 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.ranking
-
-import android.annotation.SuppressLint
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.recyclerview.widget.RecyclerView
-import coil.load
-import coil.transform.RoundedCornersTransformation
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainRankingBinding
-import kr.co.vividnext.sodalive.extensions.dpToPx
-
-class AudioContentMainRankingAdapter(
- private val width: Int,
- private val onClickItem: (Long) -> Unit
-) : RecyclerView.Adapter() {
-
- inner class AudioContentMainRankingItemViewHolder(
- private val binding: ItemAudioContentMainRankingBinding
- ) : RecyclerView.ViewHolder(binding.root) {
- @SuppressLint("SetTextI18n")
- fun bind(item: GetAudioContentRankingItem, index: Int) {
- val lp = binding.root.layoutParams
- lp.width = width
- binding.root.layoutParams = lp
-
- binding.root.setOnClickListener { onClickItem(item.contentId) }
- binding.tvTitle.text = item.title
- binding.tvRank.text = "${index + 1}"
- binding.tvNickname.text = item.creatorNickname
-
- binding.ivCover.load(item.coverImageUrl) {
- crossfade(true)
- placeholder(R.drawable.ic_place_holder)
- transformations(RoundedCornersTransformation(2.7f.dpToPx()))
- }
- }
- }
-
- private val items = mutableListOf()
-
- @SuppressLint("NotifyDataSetChanged")
- fun addItems(items: List) {
- this.items.clear()
- this.items.addAll(items)
- notifyDataSetChanged()
- }
-
- override fun onCreateViewHolder(
- parent: ViewGroup,
- viewType: Int
- ) = AudioContentMainRankingItemViewHolder(
- ItemAudioContentMainRankingBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- )
- )
-
- override fun getItemCount() = items.size
-
- override fun onBindViewHolder(holder: AudioContentMainRankingItemViewHolder, position: Int) {
- holder.bind(items[position], index = position)
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingViewModel.kt
deleted file mode 100644
index 6e24ffd0..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingViewModel.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.ranking
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.AudioContentRepository
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRanking
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentMainRankingViewModel(
- private val repository: AudioContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _contentRankingSortListLiveData = MutableLiveData>()
- val contentRankingSortListLiveData: LiveData>
- get() = _contentRankingSortListLiveData
-
- private var _contentRankingLiveData = MutableLiveData()
- val contentRankingLiveData: LiveData
- get() = _contentRankingLiveData
-
- fun getContentRankingSortType() {
- compositeDisposable.add(
- repository.getContentRankingSortType(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _contentRankingSortListLiveData.value = it.data!!
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
- },
- {
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getContentRanking(sort: String = "매출") {
- compositeDisposable.add(
- repository.getContentRanking(
- page = 1,
- size = 12,
- sortType = sort,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _contentRankingLiveData.value = it.data!!
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
- },
- {
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/recommend_series/AudioContentMainRecommendSeriesViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/recommend_series/AudioContentMainRecommendSeriesViewModel.kt
deleted file mode 100644
index 497c5993..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/recommend_series/AudioContentMainRecommendSeriesViewModel.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.recommend_series
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
-import kr.co.vividnext.sodalive.audio_content.series.SeriesRepository
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentMainRecommendSeriesViewModel(
- private val repository: SeriesRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _seriesListLiveData = MutableLiveData>()
- val seriesListLiveData: LiveData>
- get() = _seriesListLiveData
-
- fun getRecommendSeriesList() {
- compositeDisposable.add(
- repository
- .getRecommendSeriesList(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _seriesListLiveData.value = it.data!!
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "추천 시리즈를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- }
- },
- {
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue(
- "추천 시리즈를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
- "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
- )
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/AudioContentMainActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/AudioContentMainActivity.kt
deleted file mode 100644
index c5cf49aa..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/AudioContentMainActivity.kt
+++ /dev/null
@@ -1,418 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2
-
-import android.annotation.SuppressLint
-import android.content.BroadcastReceiver
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import android.content.SharedPreferences
-import android.graphics.Typeface
-import android.os.Build
-import android.os.Handler
-import android.os.Looper
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.core.content.res.ResourcesCompat
-import androidx.media3.common.MediaItem
-import androidx.media3.common.MediaMetadata
-import androidx.media3.common.Player
-import androidx.media3.common.util.UnstableApi
-import androidx.media3.session.MediaController
-import androidx.media3.session.SessionToken
-import coil.load
-import coil.transform.RoundedCornersTransformation
-import com.google.android.material.tabs.TabLayout
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService
-import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.v2.alarm.AudioContentMainTabAlarmFragment
-import kr.co.vividnext.sodalive.audio_content.main.v2.asmr.AudioContentMainTabAsmrFragment
-import kr.co.vividnext.sodalive.audio_content.main.v2.content.AudioContentMainTabContentFragment
-import kr.co.vividnext.sodalive.audio_content.main.v2.free.AudioContentMainTabFreeFragment
-import kr.co.vividnext.sodalive.audio_content.main.v2.replay.AudioContentMainTabReplayFragment
-import kr.co.vividnext.sodalive.audio_content.main.v2.series.AudioContentMainTabSeriesFragment
-import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerFragment
-import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService
-import kr.co.vividnext.sodalive.base.BaseActivity
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.databinding.ActivityAudioContentMainBinding
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.mypage.alarm.AlarmListActivity
-import kotlin.math.min
-
-enum class AudioContentMainTab {
- HOME, SERIES, CONTENT, ALARM, ASMR, REPLAY, FREE;
-
- companion object {
- fun fromOrdinal(ordinal: Int): AudioContentMainTab? {
- return values().getOrNull(ordinal)
- }
- }
-}
-
-@OptIn(UnstableApi::class)
-class AudioContentMainActivity : BaseActivity(
- ActivityAudioContentMainBinding::inflate
-) {
-
- private var fontBold: Typeface? = null
- private var fontMedium: Typeface? = null
-
- private var startTabPosition: AudioContentMainTab = AudioContentMainTab.SERIES
-
- private var mediaController: MediaController? = null
- private val handler = Handler(Looper.getMainLooper())
- private val audioContentReceiver = AudioContentReceiver()
-
- override fun onDestroy() {
- deInitMiniPlayer()
- SharedPreferenceManager.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
- super.onDestroy()
- }
-
- private fun showPlayerFragment() {
- val playerFragment = AudioContentPlayerFragment(screenWidth, arrayListOf())
- playerFragment.show(supportFragmentManager, playerFragment.tag)
- }
-
- @SuppressLint("UnspecifiedRegisterReceiverFlag")
- override fun onResume() {
- super.onResume()
- val intentFilter = IntentFilter(Constants.ACTION_MAIN_AUDIO_CONTENT_RECEIVER)
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
- registerReceiver(audioContentReceiver, intentFilter, Context.RECEIVER_NOT_EXPORTED)
- } else {
- registerReceiver(audioContentReceiver, intentFilter)
- }
-
- startService(
- Intent(this, AudioContentPlayService::class.java).apply {
- action = AudioContentPlayService.MusicAction.INIT.name
- }
- )
- }
-
- override fun onPause() {
- unregisterReceiver(audioContentReceiver)
- super.onPause()
- }
-
- override fun setupView() {
- startTabPosition = AudioContentMainTab.fromOrdinal(
- intent.getIntExtra(
- Constants.EXTRA_START_TAB_POSITION,
- AudioContentMainTab.SERIES.ordinal
- )
- ) ?: AudioContentMainTab.SERIES
-
- setupToolbar()
- loadFont()
- setupTabs()
-
- SharedPreferenceManager.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
- if (SharedPreferenceManager.isPlayerServiceRunning) {
- initAndVisibleMiniPlayer()
- } else {
- deInitMiniPlayer()
- }
- }
-
- private fun setupToolbar() {
- val toolbar = binding.toolbar
-
- toolbar.ivContentKeep.setOnClickListener {
- startActivity(
- Intent(
- applicationContext,
- AudioContentBoxActivity::class.java
- )
- )
- }
-
- toolbar.ivAlarm.setOnClickListener {
- startActivity(
- Intent(
- applicationContext,
- AlarmListActivity::class.java
- )
- )
- }
- }
-
- private fun loadFont() {
- fontBold = ResourcesCompat.getFont(this, R.font.gmarket_sans_bold)
- fontMedium = ResourcesCompat.getFont(this, R.font.gmarket_sans_medium)
- }
-
- private fun setupTabs() {
- val tabs = binding.tabs
- val tabTitles = listOf("홈", "시리즈", "단편", "모닝콜", "ASMR", "다시듣기", "무료")
- for (title in tabTitles) {
- tabs.addTab(tabs.newTab().setText(title))
- }
-
- tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
- override fun onTabSelected(tab: TabLayout.Tab) {
- val selectedTab = AudioContentMainTab.fromOrdinal(tab.position)
- if (selectedTab == null || selectedTab == AudioContentMainTab.HOME) finish()
-
- replaceFragment(selectedTab = selectedTab!!)
- tab.view.isSelected = true
- setTabFont(tab, fontBold)
- }
-
- override fun onTabUnselected(tab: TabLayout.Tab) {
- tab.view.isSelected = false
- setTabFont(tab, fontMedium)
- }
-
- override fun onTabReselected(tab: TabLayout.Tab) {
- }
- })
-
- tabs.getTabAt(startTabPosition.ordinal)?.let {
- it.select()
- scrollToTab(tabs, startTabPosition.ordinal)
- }
- replaceFragment(selectedTab = startTabPosition)
- }
-
- private fun scrollToTab(tabLayout: TabLayout, position: Int) {
- tabLayout.post {
- val layout = tabLayout.getChildAt(0) as ViewGroup
- val tabView = layout.getChildAt(position)
-
- // 화면 전체 너비
- val parentWidth = tabLayout.width
- // 선택한 탭의 중심 좌표
- val tabCenterX = tabView.left + tabView.width / 2
- // 스크롤 할 위치 = 탭의 중심을 화면 중앙에 배치
- val scrollToX = tabCenterX - parentWidth / 2
-
- tabLayout.scrollTo(min(tabView.left, scrollToX), 0)
- }
- }
-
- private fun replaceFragment(selectedTab: AudioContentMainTab) {
- val startFragment = when (selectedTab) {
- AudioContentMainTab.CONTENT -> AudioContentMainTabContentFragment()
- AudioContentMainTab.ALARM -> AudioContentMainTabAlarmFragment()
- AudioContentMainTab.ASMR -> AudioContentMainTabAsmrFragment()
- AudioContentMainTab.REPLAY -> AudioContentMainTabReplayFragment()
- AudioContentMainTab.FREE -> AudioContentMainTabFreeFragment()
- else -> AudioContentMainTabSeriesFragment()
- }
-
- supportFragmentManager.beginTransaction()
- .replace(
- R.id.fl_container,
- startFragment
- )
- .commit()
- }
-
- private fun setTabFont(tab: TabLayout.Tab, font: Typeface?) {
- (tab.view.getChildAt(1) as? TextView)?.typeface = font
- }
-
- private val preferenceChangeListener =
- SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
- // 특정 키에 대한 값이 변경될 때 UI 업데이트
- if (key == Constants.PREF_IS_PLAYER_SERVICE_RUNNING) {
- if (sharedPreferences.getBoolean(key, false)) {
- handler.postDelayed(
- {
- initAndVisibleMiniPlayer()
- },
- 1500
- )
- } else {
- deInitMiniPlayer()
- }
- }
- }
-
- private fun initAndVisibleMiniPlayer() {
- binding.clMiniPlayer.visibility = View.VISIBLE
- binding.clMiniPlayer.setOnClickListener { showPlayerFragment() }
- binding.ivPlayerStop.setOnClickListener {
- startService(
- Intent(applicationContext, AudioContentPlayerService::class.java).apply {
- action = "STOP_SERVICE"
- }
- )
- }
- connectPlayerService()
- }
-
- private fun connectPlayerService() {
- val componentName = ComponentName(applicationContext, AudioContentPlayerService::class.java)
- val sessionToken = SessionToken(applicationContext, componentName)
- val mediaControllerFuture =
- MediaController.Builder(applicationContext, sessionToken).buildAsync()
- mediaControllerFuture.addListener(
- {
- mediaController = mediaControllerFuture.get()
- setupMediaController()
- updateMediaMetadata(mediaController?.mediaMetadata)
-
- binding.ivPlayerPlayOrPause.setImageResource(
- if (mediaController!!.isPlaying) {
- R.drawable.ic_player_pause
- } else {
- R.drawable.ic_player_play
- }
- )
-
- binding.ivPlayerPlayOrPause.setOnClickListener {
- mediaController?.let {
- if (it.playWhenReady) {
- it.pause()
- } else {
- it.play()
- }
- }
- }
- },
- ContextCompat.getMainExecutor(applicationContext)
- )
- }
-
- private fun updateMediaMetadata(metadata: MediaMetadata?) {
- metadata?.let {
- binding.tvPlayerTitle.text = it.title
- binding.tvPlayerNickname.text = it.artist
-
- binding.ivPlayerCover.load(it.artworkUri) {
- crossfade(true)
- placeholder(R.drawable.ic_place_holder)
- transformations(RoundedCornersTransformation(4f))
- }
- }
- }
-
- private fun setupMediaController() {
- if (mediaController == null) {
- deInitMiniPlayer()
- return
- }
-
- mediaController!!.addListener(object : Player.Listener {
- override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
- updateMediaMetadata(mediaItem?.mediaMetadata)
- }
-
- override fun onPlayWhenReadyChanged(playWhenReady: Boolean, reason: Int) {
- binding.ivPlayerPlayOrPause.setImageResource(
- if (playWhenReady) {
- R.drawable.ic_player_pause
- } else {
- R.drawable.ic_player_play
- }
- )
- }
- })
- }
-
- private fun deInitMiniPlayer() {
- binding.clMiniPlayer.visibility = View.GONE
- mediaController?.release()
- mediaController = null
- }
-
- inner class AudioContentReceiver : BroadcastReceiver() {
- override fun onReceive(context: Context?, intent: Intent?) {
- val contentId = intent?.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_ID, 0)
- val title = intent?.getStringExtra(Constants.EXTRA_AUDIO_CONTENT_TITLE)
- val nickname = intent?.getStringExtra(Constants.EXTRA_NICKNAME)
- val coverImageUrl = intent?.getStringExtra(
- Constants.EXTRA_AUDIO_CONTENT_COVER_IMAGE_URL
- )
-
- val isPlaying = intent?.getBooleanExtra(Constants.EXTRA_AUDIO_CONTENT_PLAYING, false)
- val isShowing = intent?.getBooleanExtra(Constants.EXTRA_AUDIO_CONTENT_SHOWING, false)
-
- if (isShowing == true) {
- binding.rlMiniPlayer.visibility = View.VISIBLE
- if (contentId != null && contentId > 0) {
- binding.rlMiniPlayer.setOnClickListener {
- startActivity(
- Intent(applicationContext, AudioContentDetailActivity::class.java)
- .apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
- }
- )
- }
- }
-
- if (isPlaying == true) {
- binding.ivPlayOrPause.setImageResource(R.drawable.ic_noti_pause)
- binding.ivPlayOrPause.setOnClickListener {
- startService(
- Intent(
- this@AudioContentMainActivity,
- AudioContentPlayService::class.java
- ).apply {
- action = AudioContentPlayService.MusicAction.PAUSE.name
- }
- )
- }
- } else {
- binding.ivPlayOrPause.setImageResource(R.drawable.ic_noti_play)
- binding.ivPlayOrPause.setOnClickListener {
- startService(
- Intent(
- this@AudioContentMainActivity,
- AudioContentPlayService::class.java
- ).apply {
- action = AudioContentPlayService.MusicAction.PLAY.name
- }
- )
- }
- }
-
- binding.ivStop.setOnClickListener {
- startService(
- Intent(
- this@AudioContentMainActivity,
- AudioContentPlayService::class.java
- ).apply {
- action = AudioContentPlayService.MusicAction.STOP.name
- }
- )
- }
-
- if (!title.isNullOrBlank()) {
- binding.tvMiniPlayerTitle.text = title
- }
-
- if (!nickname.isNullOrBlank()) {
- binding.tvNickname.text = nickname
- }
-
- if (!coverImageUrl.isNullOrBlank()) {
- binding.ivCover.load(coverImageUrl) {
- crossfade(true)
- placeholder(R.drawable.bg_placeholder)
- transformations(RoundedCornersTransformation(5.3f.dpToPx()))
- }
- }
- } else {
- handler.post {
- binding.ivPlayOrPause.setImageResource(0)
- binding.ivCover.setImageResource(0)
- binding.tvMiniPlayerTitle.text = ""
- binding.tvNickname.text = ""
- binding.rlMiniPlayer.visibility = View.GONE
- binding.ivPlayOrPause.setOnClickListener {}
- }
- }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/AudioContentMainContentCurationAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/AudioContentMainContentCurationAdapter.kt
deleted file mode 100644
index bac2c9d5..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/AudioContentMainContentCurationAdapter.kt
+++ /dev/null
@@ -1,97 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.graphics.Rect
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainCurationBinding
-import kr.co.vividnext.sodalive.extensions.dpToPx
-
-class AudioContentMainContentCurationAdapter(
- private val onClickItem: (Long) -> Unit,
- private val onClickCreator: (Long) -> Unit
-) : RecyclerView.Adapter() {
-
- private val items = mutableListOf()
-
- inner class ViewHolder(
- private val context: Context,
- private val binding: ItemAudioContentMainCurationBinding
- ) : RecyclerView.ViewHolder(binding.root) {
- fun bind(item: GetContentCurationResponse) {
- binding.tvTitle.text = item.title
- binding.ivAll.visibility = View.GONE
- binding.tvDesc.visibility = View.GONE
- setAudioContentList(item.items)
- }
-
- private fun setAudioContentList(audioContents: List) {
- val adapter = AudioContentMainContentAdapter(onClickItem, onClickCreator)
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
- if (binding.rvCuration.itemDecorationCount == 0) {
- binding.rvCuration.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 = 6.7f.dpToPx().toInt()
- }
-
- adapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
- }
- binding.rvCuration.adapter = adapter
- adapter.addItems(audioContents)
- }
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
- parent.context,
- ItemAudioContentMainCurationBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- )
- )
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.bind(items[position])
- }
-
- override fun getItemCount() = items.size
-
- @SuppressLint("NotifyDataSetChanged")
- fun addItems(items: List) {
- this.items.clear()
- this.items.addAll(items)
- notifyDataSetChanged()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/ContentRankCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/ContentRankCreatorAdapter.kt
deleted file mode 100644
index 451045c7..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/ContentRankCreatorAdapter.kt
+++ /dev/null
@@ -1,89 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.core.content.ContextCompat
-import androidx.recyclerview.widget.RecyclerView
-import coil.load
-import coil.transform.CircleCropTransformation
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.databinding.ItemContentRankCreatorBinding
-
-class ContentRankCreatorAdapter(
- private val onClickItem: (Long) -> Unit,
-) : RecyclerView.Adapter() {
-
- private var selectedCreatorId: Long = 0
- private val items = mutableListOf()
-
- inner class ViewHolder(
- private val context: Context,
- private val binding: ItemContentRankCreatorBinding
- ) : RecyclerView.ViewHolder(binding.root) {
- @SuppressLint("NotifyDataSetChanged")
- fun bind(item: ContentCreatorResponse) {
- binding.root.setOnClickListener {
- if (selectedCreatorId != item.creatorId) {
- selectedCreatorId = item.creatorId
- onClickItem(item.creatorId)
- notifyDataSetChanged()
- }
- }
-
- binding.tvNickname.text = item.creatorNickname
- binding.ivProfile.load(item.creatorProfileImageUrl) {
- transformations(CircleCropTransformation())
- placeholder(R.drawable.ic_place_holder)
- crossfade(true)
- }
-
- if (item.creatorId == selectedCreatorId) {
- binding.ivBg.setImageResource(R.drawable.bg_round_corner_33_3_transparent_3bb9f1)
- binding.ivBg.visibility = View.VISIBLE
- binding.tvNickname.setTextColor(
- ContextCompat.getColor(
- context,
- R.color.color_3bb9f1
- )
- )
- } else {
- binding.ivBg.setImageResource(0)
- binding.ivBg.visibility = View.GONE
- binding.tvNickname.setTextColor(
- ContextCompat.getColor(
- context,
- R.color.color_bbbbbb
- )
- )
- }
- }
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
- parent.context,
- ItemContentRankCreatorBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- )
- )
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.bind(items[position])
- }
-
- override fun getItemCount() = items.size
-
- @SuppressLint("NotifyDataSetChanged")
- fun addItems(items: List) {
- this.items.addAll(items)
- if (this.items.isNotEmpty()) {
- this.selectedCreatorId = this.items[0].creatorId
- }
- notifyDataSetChanged()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/GetContentCurationResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/GetContentCurationResponse.kt
deleted file mode 100644
index fe39948b..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/GetContentCurationResponse.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2
-
-import androidx.annotation.Keep
-import com.google.gson.annotations.SerializedName
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-
-@Keep
-data class GetContentCurationResponse(
- @SerializedName("title") val title: String,
- @SerializedName("items") val items: List
-)
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/PopularContentByCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/PopularContentByCreatorAdapter.kt
deleted file mode 100644
index 95e3ad1e..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/PopularContentByCreatorAdapter.kt
+++ /dev/null
@@ -1,112 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.recyclerview.widget.RecyclerView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.load.MultiTransformation
-import com.bumptech.glide.load.resource.bitmap.CenterCrop
-import com.bumptech.glide.load.resource.bitmap.CircleCrop
-import com.bumptech.glide.load.resource.bitmap.RoundedCorners
-import com.bumptech.glide.request.RequestOptions
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainTabPopularContentBinding
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.extensions.moneyFormat
-
-class PopularContentByCreatorAdapter(
- private val itemWidth: Int,
- private val onClickItem: (Long) -> Unit,
- private val onClickCreator: (Long) -> Unit
-) : RecyclerView.Adapter() {
-
- private val items = mutableListOf()
-
- inner class ViewHolder(
- private val context: Context,
- private val binding: ItemAudioContentMainTabPopularContentBinding
- ) : RecyclerView.ViewHolder(binding.root) {
-
- fun bind(item: GetAudioContentRankingItem) {
- val lp = binding.ivCover.layoutParams as ConstraintLayout.LayoutParams
- lp.width = itemWidth
- lp.height = itemWidth
- binding.ivCover.layoutParams = lp
-
- binding.ivPoint.visibility = if (item.isPointAvailable) {
- View.VISIBLE
- } else {
- View.GONE
- }
-
- Glide
- .with(context)
- .load(item.coverImageUrl)
- .apply(
- RequestOptions().transform(
- MultiTransformation(
- CenterCrop(),
- RoundedCorners(5.3f.dpToPx().toInt())
- )
- )
- )
- .placeholder(R.drawable.bg_black)
- .into(binding.ivCover)
-
- Glide
- .with(context)
- .load(item.creatorProfileImageUrl)
- .apply(
- RequestOptions().transform(
- CircleCrop()
- )
- )
- .placeholder(R.drawable.bg_black)
- .into(binding.ivCreator)
-
- binding.tvTitle.text = item.title
- binding.tvNickname.text = item.creatorNickname
-
- if (item.price > 0) {
- binding.ivCan.visibility = View.VISIBLE
- binding.tvCan.text = item.price.moneyFormat()
- } else {
- binding.ivCan.visibility = View.GONE
- binding.tvCan.text = "무료"
- }
-
- binding.tvTime.text = item.duration
-
- binding.ivCover.setOnClickListener { onClickItem(item.contentId) }
- binding.ivCreator.setOnClickListener { onClickCreator(item.creatorId) }
- binding.tvNickname.setOnClickListener { onClickCreator(item.creatorId) }
- }
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
- parent.context,
- ItemAudioContentMainTabPopularContentBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- )
- )
-
- override fun getItemCount() = items.size
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.bind(items[position])
- }
-
- @SuppressLint("NotifyDataSetChanged")
- fun addItems(items: List) {
- this.items.clear()
- this.items.addAll(items)
- notifyDataSetChanged()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmFragment.kt
deleted file mode 100644
index e4ed85f8..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmFragment.kt
+++ /dev/null
@@ -1,388 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.alarm
-
-import android.content.Intent
-import android.graphics.Rect
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.zhpan.bannerview.BaseBannerAdapter
-import com.zhpan.indicator.enums.IndicatorSlideMode
-import com.zhpan.indicator.enums.IndicatorStyle
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
-import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainContentCurationAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.alarm.all.AlarmContentAllActivity
-import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
-import kr.co.vividnext.sodalive.base.BaseFragment
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabAlarmBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.live.event_banner.EventBannerAdapter
-import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@OptIn(UnstableApi::class)
-class AudioContentMainTabAlarmFragment : BaseFragment(
- FragmentAudioContentMainTabAlarmBinding::inflate
-) {
- private val viewModel: AudioContentMainTabAlarmViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
- private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var newContentAdapter: AudioContentMainContentAdapter
- private lateinit var curationAdapter: AudioContentMainContentCurationAdapter
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- setupView()
- bindData()
-
- viewModel.fetchData()
- }
-
- private fun setupView() {
- loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
-
- setupContentBanner()
- setupNewContentTheme()
- setupNewContent()
- setupEventBanner()
- setupCuration()
- }
-
- private fun setupContentBanner() {
- val layoutParams = binding
- .rvBanner
- .layoutParams as LinearLayout.LayoutParams
-
- val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx()
- val pagerHeight = (pagerWidth * 0.53).roundToInt()
- layoutParams.width = pagerWidth.roundToInt()
- layoutParams.height = pagerHeight
-
- contentBannerAdapter = AudioContentMainBannerAdapter(
- requireContext(),
- pagerWidth.roundToInt(),
- pagerHeight
- ) {
- when (it.type) {
- AudioContentBannerType.EVENT -> {
- startActivity(
- Intent(requireContext(), EventDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
- }
- )
- }
-
- AudioContentBannerType.CREATOR -> {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
- }
- )
- }
-
- AudioContentBannerType.SERIES -> {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
- }
- )
- }
-
- AudioContentBannerType.LINK -> {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
- }
- }
- }
-
- binding
- .rvBanner
- .layoutParams = layoutParams
-
- binding.rvBanner.apply {
- adapter = contentBannerAdapter as BaseBannerAdapter
-
- setLifecycleRegistry(lifecycle)
- setScrollDuration(1000)
- setInterval(4 * 1000)
- }.create()
-
- binding
- .rvBanner
- .setIndicatorView(binding.indicatorBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.contentBannerLiveData.observe(viewLifecycleOwner) {
- if (contentBannerAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.rvBanner.visibility = View.GONE
- binding.indicatorBanner.visibility = View.GONE
- } else {
- binding.rvBanner.visibility = View.VISIBLE
- binding.indicatorBanner.visibility = View.VISIBLE
- binding.rvBanner.refreshData(it)
- }
- }
- }
-
- private fun setupNewContentTheme() {
- newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {
- viewModel.getContentMainAlarm(it)
- }
-
- binding.rvNewContentTheme.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContentTheme.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 = 4f.dpToPx().toInt()
- }
-
- newContentThemeAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContentTheme.adapter = newContentThemeAdapter
-
- viewModel.themeListLiveData.observe(viewLifecycleOwner) {
- binding.llNewContent.visibility = View.VISIBLE
- newContentThemeAdapter.addItems(it)
- }
- }
-
- private fun setupNewContent() {
- binding.ivNewContentAll.setOnClickListener {
- startActivity(Intent(requireContext(), AlarmContentAllActivity::class.java))
- }
-
- newContentAdapter = AudioContentMainContentAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvNewContent.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContent.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 = 6.7f.dpToPx().toInt()
- }
-
- newContentAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContent.adapter = newContentAdapter
-
- viewModel.newContentListLiveData.observe(viewLifecycleOwner) {
- newContentAdapter.addItems(it)
- }
- }
-
- private fun setupEventBanner() {
- val imageSliderLp = binding.eventBannerSlider.layoutParams
- imageSliderLp.width = screenWidth
- imageSliderLp.height = (screenWidth * 300) / 1000
- binding.eventBannerSlider.layoutParams = imageSliderLp
-
- binding.eventBannerSlider.apply {
- adapter = EventBannerAdapter(requireContext()) {
- if (it.detailImageUrl != null) {
- val intent = Intent(requireActivity(), EventDetailActivity::class.java)
- intent.putExtra(Constants.EXTRA_EVENT, it)
- startActivity(intent)
- } else if (!it.link.isNullOrBlank()) {
- startActivity(
- Intent(
- Intent.ACTION_VIEW,
- Uri.parse(it.link)
- )
- )
- }
- } as BaseBannerAdapter
- setLifecycleRegistry(lifecycle)
- setScrollDuration(800)
- }.create()
-
- binding.eventBannerSlider
- .setIndicatorView(binding.indicatorEventBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.eventLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.eventBannerSlider.visibility = View.VISIBLE
- binding.indicatorEventBanner.visibility = View.VISIBLE
- binding.eventBannerSlider.refreshData(it)
- } else {
- binding.eventBannerSlider.visibility = View.GONE
- binding.indicatorEventBanner.visibility = View.GONE
- }
- }
- }
-
- private fun setupCuration() {
- curationAdapter = AudioContentMainContentCurationAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.VERTICAL,
- false
- )
-
- binding.rvCuration.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.top = 30f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
-
- curationAdapter.itemCount - 1 -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 30f.dpToPx().toInt()
- }
-
- else -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCuration.adapter = curationAdapter
-
- viewModel.curationListLiveData.observe(viewLifecycleOwner) {
- curationAdapter.addItems(it)
-
- binding.rvCuration.visibility = if (curationAdapter.itemCount <= 0 && it.isEmpty()) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
- }
-
- private fun bindData() {
- viewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.isLoading.observe(viewLifecycleOwner) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmRepository.kt
deleted file mode 100644
index 97009165..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmRepository.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.alarm
-
-import kr.co.vividnext.sodalive.audio_content.AudioContentApi
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.ContentType
-
-class AudioContentMainTabAlarmRepository(private val api: AudioContentApi) {
- fun getContentMainAlarm(token: String) = api.getContentMainAlarm(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getContentMainAlarmAll(
- theme: String,
- page: Int,
- size: Int,
- token: String
- ) = api.getContentMainAlarmAll(
- theme = theme,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- page = page - 1,
- size = size,
- authHeader = token
- )
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmViewModel.kt
deleted file mode 100644
index 9f162236..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/AudioContentMainTabAlarmViewModel.kt
+++ /dev/null
@@ -1,126 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.alarm
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.event.EventItem
-
-class AudioContentMainTabAlarmViewModel(
- private val repository: AudioContentMainTabAlarmRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _contentBannerLiveData = MutableLiveData>()
- val contentBannerLiveData: LiveData>
- get() = _contentBannerLiveData
-
- private var _newContentListLiveData = MutableLiveData>()
- val newContentListLiveData: LiveData>
- get() = _newContentListLiveData
-
- private var _themeListLiveData = MutableLiveData>()
- val themeListLiveData: LiveData>
- get() = _themeListLiveData
-
- private val _eventLiveData = MutableLiveData>()
- val eventLiveData: LiveData>
- get() = _eventLiveData
-
- private var _curationListLiveData = MutableLiveData>()
- val curationListLiveData: LiveData>
- get() = _curationListLiveData
-
- fun fetchData() {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getContentMainAlarm(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- val data = it.data
-
- _contentBannerLiveData.value = data.contentBannerList
-
- val themeList = listOf("전체").union(data.alarmThemeList).toList()
- _themeListLiveData.value = themeList
-
- _newContentListLiveData.value = data.newAlarmContentList
- _eventLiveData.value = data.eventBannerList.eventList
- _curationListLiveData.value = data.curationList
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getContentMainAlarm(selectedTheme: String) {
- _isLoading.value = true
-
- compositeDisposable.add(
- repository.getContentMainAlarmAll(
- theme = if (selectedTheme == "전체") {
- ""
- } else {
- selectedTheme
- },
- page = 1,
- size = 10,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _newContentListLiveData.value = it.data.items
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/GetContentMainTabAlarmResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/GetContentMainTabAlarmResponse.kt
deleted file mode 100644
index 764519d5..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/GetContentMainTabAlarmResponse.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.alarm
-
-import androidx.annotation.Keep
-import com.google.gson.annotations.SerializedName
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.settings.event.GetEventResponse
-
-@Keep
-data class GetContentMainTabAlarmResponse(
- @SerializedName("contentBannerList")
- val contentBannerList: List,
- @SerializedName("alarmThemeList")
- val alarmThemeList: List,
- @SerializedName("newAlarmContentList")
- val newAlarmContentList: List,
- @SerializedName("rankAlarmContentList")
- val rankAlarmContentList: List,
- @SerializedName("eventBannerList")
- val eventBannerList: GetEventResponse,
- @SerializedName("curationList")
- val curationList: List
-)
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/all/AlarmContentAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/all/AlarmContentAllActivity.kt
deleted file mode 100644
index b640a2b8..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/all/AlarmContentAllActivity.kt
+++ /dev/null
@@ -1,162 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.alarm.all
-
-import android.content.Intent
-import android.graphics.Rect
-import android.os.Bundle
-import android.view.View
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllAdapter
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
-import kr.co.vividnext.sodalive.base.BaseActivity
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.ActivityAlarmContentAllBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import org.koin.android.ext.android.inject
-
-@OptIn(UnstableApi::class)
-class AlarmContentAllActivity : BaseActivity(
- ActivityAlarmContentAllBinding::inflate
-) {
- private val viewModel: AlarmContentAllViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
-
- private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var newContentAdapter: AudioContentNewAllAdapter
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- bindData()
- viewModel.getContentMainAlarmAll()
-
- newContentThemeAdapter.addItems(listOf("전체", "모닝콜", "슬립콜", "알람"))
- }
-
- override fun setupView() {
- loadingDialog = LoadingDialog(this, layoutInflater)
- binding.toolbar.tvBack.text = "새로운 알람"
- binding.toolbar.tvBack.setOnClickListener { finish() }
-
- setupNewContentTheme()
- setupNewContent()
- }
-
- private fun setupNewContentTheme() {
- newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {
- newContentAdapter.clear()
- viewModel.selectTheme(it)
- }
-
- binding.rvNewContentTheme.layoutManager = LinearLayoutManager(
- this,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContentTheme.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 = 4f.dpToPx().toInt()
- }
-
- newContentThemeAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContentTheme.adapter = newContentThemeAdapter
- }
-
- private fun setupNewContent() {
- val spanCount = 3
- val spacing = 40
- newContentAdapter = AudioContentNewAllAdapter(
- itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 3,
- onClickItem = {
- startActivity(
- Intent(this, AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(this, UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvContent.layoutManager = GridLayoutManager(this, spanCount)
- binding.rvContent.addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, true))
-
- binding.rvContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
- super.onScrolled(recyclerView, dx, dy)
-
- val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!
- .findLastCompletelyVisibleItemPosition()
- val itemTotalCount = recyclerView.adapter!!.itemCount - 1
-
- // 스크롤이 끝에 도달했는지 확인
- if (!recyclerView.canScrollVertically(1) &&
- lastVisibleItemPosition == itemTotalCount
- ) {
- viewModel.getContentMainAlarmAll()
- }
- }
- })
-
- binding.rvContent.adapter = newContentAdapter
- }
-
- private fun bindData() {
- viewModel.isLoading.observe(this) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
-
- viewModel.toastLiveData.observe(this) {
- it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.newContentListLiveData.observe(this) {
- newContentAdapter.addItems(it)
- }
-
- viewModel.totalCountLiveData.observe(this) {
- binding.tvTotalCount.text = "$it"
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/all/AlarmContentAllViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/all/AlarmContentAllViewModel.kt
deleted file mode 100644
index 75e8b35f..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/alarm/all/AlarmContentAllViewModel.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.alarm.all
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.alarm.AudioContentMainTabAlarmRepository
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AlarmContentAllViewModel(
- private val repository: AudioContentMainTabAlarmRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _newContentListLiveData = MutableLiveData>()
- val newContentListLiveData: LiveData>
- get() = _newContentListLiveData
-
- private var _totalCountLiveData = MutableLiveData()
- val totalCountLiveData: LiveData
- get() = _totalCountLiveData
-
- private var isLast = false
- private var page = 1
- private val size = 10
- private var selectedTheme = ""
-
- fun getContentMainAlarmAll() {
- if (!_isLoading.value!! && !isLast) {
- _isLoading.value = true
-
- compositeDisposable.add(
- repository.getContentMainAlarmAll(
- theme = if (selectedTheme == "전체") {
- ""
- } else {
- selectedTheme
- },
- page = page,
- size = size,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- val data = it.data
- _totalCountLiveData.value = data.totalCount
- if (data.items.isNotEmpty()) {
- page += 1
- _newContentListLiveData.value = data.items
- } else {
- isLast = true
- }
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
- }
-
- fun selectTheme(theme: String) {
- isLast = false
- page = 1
- selectedTheme = theme
- getContentMainAlarmAll()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AsmrNewContentAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AsmrNewContentAllActivity.kt
deleted file mode 100644
index 9df19408..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AsmrNewContentAllActivity.kt
+++ /dev/null
@@ -1,116 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.asmr
-
-import android.annotation.SuppressLint
-import android.content.Intent
-import android.os.Bundle
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllAdapter
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllViewModel
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.base.BaseActivity
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.ActivityAsmrNewContentAllBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import org.koin.android.ext.android.inject
-
-@OptIn(UnstableApi::class)
-class AsmrNewContentAllActivity : BaseActivity(
- ActivityAsmrNewContentAllBinding::inflate
-) {
- private val viewModel: AudioContentNewAllViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
-
- private lateinit var newContentAdapter: AudioContentNewAllAdapter
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- bindData()
- viewModel.selectTheme(theme = "ASMR", isFree = false)
- }
-
- @SuppressLint("SetTextI18n")
- override fun setupView() {
- loadingDialog = LoadingDialog(this, layoutInflater)
- binding.toolbar.tvBack.text = "새로운 ASMR"
- binding.toolbar.tvBack.setOnClickListener { finish() }
-
- binding.tvNotice.text = "※ 최근 2주간 등록된 새로운 ASMR 입니다."
-
- setupNewContent()
- }
-
- private fun setupNewContent() {
- val spanCount = 3
- val spacing = 40
- newContentAdapter = AudioContentNewAllAdapter(
- itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 3,
- onClickItem = {
- startActivity(
- Intent(this, AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(this, UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvContent.layoutManager = GridLayoutManager(this, spanCount)
- binding.rvContent.addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, true))
-
- binding.rvContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
- super.onScrolled(recyclerView, dx, dy)
-
- val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!
- .findLastCompletelyVisibleItemPosition()
- val itemTotalCount = recyclerView.adapter!!.itemCount - 1
-
- // 스크롤이 끝에 도달했는지 확인
- if (!recyclerView.canScrollVertically(1) &&
- lastVisibleItemPosition == itemTotalCount
- ) {
- viewModel.getNewContentList()
- }
- }
- })
-
- binding.rvContent.adapter = newContentAdapter
- }
-
- private fun bindData() {
- viewModel.isLoading.observe(this) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
-
- viewModel.toastLiveData.observe(this) {
- it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.newContentListLiveData.observe(this) {
- newContentAdapter.addItems(it)
- }
-
- viewModel.newContentTotalCountLiveData.observe(this) {
- binding.tvTotalCount.text = "$it"
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt
deleted file mode 100644
index 09c3f9d0..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt
+++ /dev/null
@@ -1,449 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.asmr
-
-import android.content.Intent
-import android.graphics.Rect
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.zhpan.bannerview.BaseBannerAdapter
-import com.zhpan.indicator.enums.IndicatorSlideMode
-import com.zhpan.indicator.enums.IndicatorStyle
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainContentCurationAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
-import kr.co.vividnext.sodalive.base.BaseFragment
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabAsmrBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.live.event_banner.EventBannerAdapter
-import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@OptIn(UnstableApi::class)
-class AudioContentMainTabAsmrFragment : BaseFragment(
- FragmentAudioContentMainTabAsmrBinding::inflate
-) {
-
- private val viewModel: AudioContentMainTabAsmrViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
- private lateinit var newContentAdapter: AudioContentMainContentAdapter
- private lateinit var curationAdapter: AudioContentMainContentCurationAdapter
- private lateinit var contentRankCreatorAdapter: ContentRankCreatorAdapter
- private lateinit var popularContentByCreatorAdapter: PopularContentByCreatorAdapter
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- setupView()
- bindData()
-
- viewModel.fetchData()
- }
-
- private fun setupView() {
- loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
-
- setupContentBanner()
- setupNewContent()
- setupPopularContentCreator()
- setupPopularContentByCreator()
- setupEventBanner()
- setupCuration()
- }
-
- private fun setupContentBanner() {
- val layoutParams = binding
- .rvBanner
- .layoutParams as LinearLayout.LayoutParams
-
- val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx()
- val pagerHeight = (pagerWidth * 0.53).roundToInt()
- layoutParams.width = pagerWidth.roundToInt()
- layoutParams.height = pagerHeight
-
- contentBannerAdapter = AudioContentMainBannerAdapter(
- requireContext(),
- pagerWidth.roundToInt(),
- pagerHeight
- ) {
- when (it.type) {
- AudioContentBannerType.EVENT -> {
- startActivity(
- Intent(requireContext(), EventDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
- }
- )
- }
-
- AudioContentBannerType.CREATOR -> {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
- }
- )
- }
-
- AudioContentBannerType.SERIES -> {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
- }
- )
- }
-
- AudioContentBannerType.LINK -> {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
- }
- }
- }
-
- binding
- .rvBanner
- .layoutParams = layoutParams
-
- binding.rvBanner.apply {
- adapter = contentBannerAdapter as BaseBannerAdapter
-
- setLifecycleRegistry(lifecycle)
- setScrollDuration(1000)
- setInterval(4 * 1000)
- }.create()
-
- binding
- .rvBanner
- .setIndicatorView(binding.indicatorBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.contentBannerLiveData.observe(viewLifecycleOwner) {
- if (contentBannerAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.rvBanner.visibility = View.GONE
- binding.indicatorBanner.visibility = View.GONE
- } else {
- binding.rvBanner.visibility = View.VISIBLE
- binding.indicatorBanner.visibility = View.VISIBLE
- binding.rvBanner.refreshData(it)
- }
- }
- }
-
- private fun setupNewContent() {
- binding.ivNewContentAll.setOnClickListener {
- startActivity(
- Intent(requireContext(), AsmrNewContentAllActivity::class.java)
- )
- }
-
- newContentAdapter = AudioContentMainContentAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvNewContent.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContent.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 = 6.7f.dpToPx().toInt()
- }
-
- newContentAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContent.adapter = newContentAdapter
-
- viewModel.newContentListLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.llNewContent.visibility = View.VISIBLE
- newContentAdapter.addItems(it)
- } else {
- binding.llNewContent.visibility = View.GONE
- }
- }
- }
-
- private fun setupEventBanner() {
- val imageSliderLp = binding.eventBannerSlider.layoutParams
- imageSliderLp.width = screenWidth
- imageSliderLp.height = (screenWidth * 300) / 1000
- binding.eventBannerSlider.layoutParams = imageSliderLp
-
- binding.eventBannerSlider.apply {
- adapter = EventBannerAdapter(requireContext()) {
- if (it.detailImageUrl != null) {
- val intent = Intent(requireActivity(), EventDetailActivity::class.java)
- intent.putExtra(Constants.EXTRA_EVENT, it)
- startActivity(intent)
- } else if (!it.link.isNullOrBlank()) {
- startActivity(
- Intent(
- Intent.ACTION_VIEW,
- Uri.parse(it.link)
- )
- )
- }
- } as BaseBannerAdapter
- setLifecycleRegistry(lifecycle)
- setScrollDuration(800)
- }.create()
-
- binding.eventBannerSlider
- .setIndicatorView(binding.indicatorEventBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.eventLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.eventBannerSlider.visibility = View.VISIBLE
- binding.indicatorEventBanner.visibility = View.VISIBLE
- binding.eventBannerSlider.refreshData(it)
- } else {
- binding.eventBannerSlider.visibility = View.GONE
- binding.indicatorEventBanner.visibility = View.GONE
- }
- }
- }
-
- private fun setupCuration() {
- curationAdapter = AudioContentMainContentCurationAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.VERTICAL,
- false
- )
-
- binding.rvCuration.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.top = 30f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
-
- curationAdapter.itemCount - 1 -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 30f.dpToPx().toInt()
- }
-
- else -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCuration.adapter = curationAdapter
-
- viewModel.curationListLiveData.observe(viewLifecycleOwner) {
- curationAdapter.addItems(it)
-
- binding.rvCuration.visibility = if (curationAdapter.itemCount <= 0 && it.isEmpty()) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
- }
-
- private fun setupPopularContentCreator() {
- contentRankCreatorAdapter = ContentRankCreatorAdapter {
- binding.llNoItems.visibility = View.VISIBLE
- binding.rvRankingSalesCount.visibility = View.GONE
- viewModel.getPopularContentByCreator(it)
- }
-
- binding.rvRankingCreator.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvRankingCreator.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 = 11f.dpToPx().toInt()
- }
-
- contentRankCreatorAdapter.itemCount - 1 -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 11f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvRankingCreator.adapter = contentRankCreatorAdapter
-
- viewModel.contentCreatorListLiveData.observe(viewLifecycleOwner) {
- contentRankCreatorAdapter.addItems(it)
- if (contentRankCreatorAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.llCreatorContentRanking.visibility = View.GONE
- } else {
- binding.llCreatorContentRanking.visibility = View.VISIBLE
- }
- }
- }
-
- private fun setupPopularContentByCreator() {
- popularContentByCreatorAdapter = PopularContentByCreatorAdapter(
- itemWidth = ((screenWidth - 13.3f.dpToPx() * 3) / 2).toInt(),
- onClickItem = { contentId ->
- startActivity(
- Intent(requireActivity(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
- }
- )
- },
- onClickCreator = { creatorId ->
- startActivity(
- Intent(requireActivity(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, creatorId)
- }
- )
- }
- )
-
- val recyclerView = binding.rvRankingSalesCount
- recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
- recyclerView.addItemDecoration(
- GridSpacingItemDecoration(
- 2,
- 13.3f.dpToPx().toInt(),
- false
- )
- )
-
- recyclerView.adapter = popularContentByCreatorAdapter
-
- viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.llNoItems.visibility = View.GONE
- recyclerView.visibility = View.VISIBLE
- popularContentByCreatorAdapter.addItems(it)
- } else {
- binding.llNoItems.visibility = View.VISIBLE
- recyclerView.visibility = View.GONE
- }
- }
- }
-
- private fun bindData() {
- viewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.isLoading.observe(viewLifecycleOwner) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrRepository.kt
deleted file mode 100644
index 75343efe..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrRepository.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.asmr
-
-import kr.co.vividnext.sodalive.audio_content.AudioContentApi
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.ContentType
-
-class AudioContentMainTabAsmrRepository(private val api: AudioContentApi) {
- fun getContentMainAsmr(token: String) = api.getContentMainAsmr(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getPopularContentByCreator(
- creatorId: Long,
- token: String
- ) = api.getPopularAsmrContentByCreator(
- creatorId,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrViewModel.kt
deleted file mode 100644
index a5dea879..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrViewModel.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.asmr
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.event.EventItem
-
-class AudioContentMainTabAsmrViewModel(
- private val repository: AudioContentMainTabAsmrRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _contentBannerLiveData = MutableLiveData>()
- val contentBannerLiveData: LiveData>
- get() = _contentBannerLiveData
-
- private var _newContentListLiveData = MutableLiveData>()
- val newContentListLiveData: LiveData>
- get() = _newContentListLiveData
-
- private val _contentCreatorListLiveData = MutableLiveData>()
- val contentCreatorListLiveData: LiveData>
- get() = _contentCreatorListLiveData
-
- private val _salesCountRankContentListLiveData =
- MutableLiveData>()
- val salesCountRankContentListLiveData: LiveData>
- get() = _salesCountRankContentListLiveData
-
- private val _eventLiveData = MutableLiveData>()
- val eventLiveData: LiveData>
- get() = _eventLiveData
-
- private var _curationListLiveData = MutableLiveData>()
- val curationListLiveData: LiveData>
- get() = _curationListLiveData
-
- fun fetchData() {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getContentMainAsmr(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- val data = it.data
-
- _contentBannerLiveData.value = data.contentBannerList
- _newContentListLiveData.value = data.newAsmrContentList
- _contentCreatorListLiveData.value = data.creatorList
- _salesCountRankContentListLiveData.value =
- data.salesCountRankContentList
- _eventLiveData.value = data.eventBannerList.eventList
- _curationListLiveData.value = data.curationList
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getPopularContentByCreator(creatorId: Long) {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getPopularContentByCreator(
- creatorId = creatorId,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- _isLoading.value = false
- if (it.success && it.data != null) {
- _salesCountRankContentListLiveData.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("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/GetContentMainTabAsmrResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/GetContentMainTabAsmrResponse.kt
deleted file mode 100644
index ec162406..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/GetContentMainTabAsmrResponse.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.asmr
-
-import androidx.annotation.Keep
-import com.google.gson.annotations.SerializedName
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.settings.event.GetEventResponse
-
-@Keep
-data class GetContentMainTabAsmrResponse(
- @SerializedName("contentBannerList")
- val contentBannerList: List,
- @SerializedName("newAsmrContentList")
- val newAsmrContentList: List,
- @SerializedName("creatorList")
- val creatorList: List,
- @SerializedName("salesCountRankContentList")
- val salesCountRankContentList: List,
- @SerializedName("eventBannerList")
- val eventBannerList: GetEventResponse,
- @SerializedName("curationList")
- val curationList: List
-)
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentFragment.kt
deleted file mode 100644
index efa0af53..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentFragment.kt
+++ /dev/null
@@ -1,666 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.content
-
-import android.annotation.SuppressLint
-import android.content.Intent
-import android.graphics.Rect
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.zhpan.bannerview.BaseBannerAdapter
-import com.zhpan.indicator.enums.IndicatorSlideMode
-import com.zhpan.indicator.enums.IndicatorStyle
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllActivity
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllAdapter
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
-import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
-import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainContentCurationAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
-import kr.co.vividnext.sodalive.base.BaseFragment
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabContentBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.live.event_banner.EventBannerAdapter
-import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@OptIn(UnstableApi::class)
-class AudioContentMainTabContentFragment : BaseFragment(
- FragmentAudioContentMainTabContentBinding::inflate
-) {
- private val viewModel: AudioContentMainTabContentViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
- private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var newContentAdapter: AudioContentMainContentAdapter
- private lateinit var contentRankingSortAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var contentRankingAdapter: AudioContentMainRankingAdapter
- private lateinit var contentRankCreatorAdapter: ContentRankCreatorAdapter
- private lateinit var curationAdapter: AudioContentMainContentCurationAdapter
- private lateinit var popularContentByCreatorAdapter: PopularContentByCreatorAdapter
- private lateinit var contentTagAdapter: AudioContentMainTabContentTagAdapter
- private lateinit var contentByTagAdapter: AudioContentNewAllAdapter
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- setupView()
- bindData()
-
- viewModel.fetchData()
- }
-
- private fun setupView() {
- loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
-
- setupContentBanner()
- setupNewContentTheme()
- setupNewContent()
- setupContentRankingSortType()
- setupContentRanking()
- setupEventBanner()
- setupPopularContentCreator()
- setupPopularContentByCreator()
- setupContentTag()
- setupContentByTag()
- setupCuration()
- }
-
- private fun setupContentBanner() {
- val layoutParams = binding
- .rvBanner
- .layoutParams as LinearLayout.LayoutParams
-
- val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx()
- val pagerHeight = (pagerWidth * 0.53).roundToInt()
- layoutParams.width = pagerWidth.roundToInt()
- layoutParams.height = pagerHeight
-
- contentBannerAdapter = AudioContentMainBannerAdapter(
- requireContext(),
- pagerWidth.roundToInt(),
- pagerHeight
- ) {
- when (it.type) {
- AudioContentBannerType.EVENT -> {
- startActivity(
- Intent(requireContext(), EventDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
- }
- )
- }
-
- AudioContentBannerType.CREATOR -> {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
- }
- )
- }
-
- AudioContentBannerType.SERIES -> {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
- }
- )
- }
-
- AudioContentBannerType.LINK -> {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
- }
- }
- }
-
- binding
- .rvBanner
- .layoutParams = layoutParams
-
- binding.rvBanner.apply {
- adapter = contentBannerAdapter as BaseBannerAdapter
-
- setLifecycleRegistry(lifecycle)
- setScrollDuration(1000)
- setInterval(4 * 1000)
- }.create()
-
- binding
- .rvBanner
- .setIndicatorView(binding.indicatorBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.contentBannerLiveData.observe(viewLifecycleOwner) {
- if (contentBannerAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.rvBanner.visibility = View.GONE
- binding.indicatorBanner.visibility = View.GONE
- } else {
- binding.rvBanner.visibility = View.VISIBLE
- binding.indicatorBanner.visibility = View.VISIBLE
- binding.rvBanner.refreshData(it)
- }
- }
- }
-
- private fun setupNewContentTheme() {
- newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {
- viewModel.getNewContentOfTheme(theme = it)
- }
-
- binding.rvNewContentTheme.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContentTheme.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 = 4f.dpToPx().toInt()
- }
-
- newContentThemeAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContentTheme.adapter = newContentThemeAdapter
-
- viewModel.themeListLiveData.observe(viewLifecycleOwner) {
- binding.llNewContent.visibility = View.VISIBLE
- newContentThemeAdapter.addItems(it)
- }
- }
-
- private fun setupNewContent() {
- binding.ivNewContentAll.setOnClickListener {
- startActivity(Intent(requireContext(), AudioContentNewAllActivity::class.java))
- }
-
- newContentAdapter = AudioContentMainContentAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvNewContent.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContent.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 = 6.7f.dpToPx().toInt()
- }
-
- newContentAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContent.adapter = newContentAdapter
-
- viewModel.newContentListLiveData.observe(viewLifecycleOwner) {
- newContentAdapter.addItems(it)
- }
- }
-
- private fun setupContentRankingSortType() {
- contentRankingSortAdapter = AudioContentMainNewContentThemeAdapter {
- viewModel.getContentRanking(sort = it)
- }
-
- binding.rvContentRankingSort.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvContentRankingSort.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 = 4f.dpToPx().toInt()
- }
-
- contentRankingSortAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvContentRankingSort.adapter = contentRankingSortAdapter
-
- viewModel.contentRankingSortListLiveData.observe(viewLifecycleOwner) {
- binding.llContentRanking.visibility = View.VISIBLE
- contentRankingSortAdapter.addItems(it)
- }
- }
-
- @SuppressLint("SetTextI18n")
- private fun setupContentRanking() {
- contentRankingAdapter = AudioContentMainRankingAdapter(
- width = (screenWidth * 0.66).toInt()
- ) {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- }
-
- binding.rvContentRanking.layoutManager = GridLayoutManager(
- context,
- 3,
- GridLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvContentRanking.addItemDecoration(object : RecyclerView.ItemDecoration() {
- override fun getItemOffsets(
- outRect: Rect,
- view: View,
- parent: RecyclerView,
- state: RecyclerView.State
- ) {
- super.getItemOffsets(outRect, view, parent, state)
- outRect.top = 13.3f.dpToPx().toInt()
- outRect.bottom = 13.3f.dpToPx().toInt()
- outRect.left = 13.3f.dpToPx().toInt()
- outRect.right = 13.3f.dpToPx().toInt()
- }
- })
-
- binding.rvContentRanking.adapter = contentRankingAdapter
-
- viewModel.contentRankingLiveData.observe(viewLifecycleOwner) {
- binding.llContentRanking.visibility = View.VISIBLE
- contentRankingAdapter.addItems(it)
- }
- }
-
- private fun setupEventBanner() {
- val imageSliderLp = binding.eventBannerSlider.layoutParams
- imageSliderLp.width = screenWidth
- imageSliderLp.height = (screenWidth * 300) / 1000
- binding.eventBannerSlider.layoutParams = imageSliderLp
-
- binding.eventBannerSlider.apply {
- adapter = EventBannerAdapter(requireContext()) {
- if (it.detailImageUrl != null) {
- val intent = Intent(requireActivity(), EventDetailActivity::class.java)
- intent.putExtra(Constants.EXTRA_EVENT, it)
- startActivity(intent)
- } else if (!it.link.isNullOrBlank()) {
- startActivity(
- Intent(
- Intent.ACTION_VIEW,
- Uri.parse(it.link)
- )
- )
- }
- } as BaseBannerAdapter
- setLifecycleRegistry(lifecycle)
- setScrollDuration(800)
- }.create()
-
- binding.eventBannerSlider
- .setIndicatorView(binding.indicatorEventBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.eventLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.eventBannerSlider.visibility = View.VISIBLE
- binding.indicatorEventBanner.visibility = View.VISIBLE
- binding.eventBannerSlider.refreshData(it)
- } else {
- binding.eventBannerSlider.visibility = View.GONE
- binding.indicatorEventBanner.visibility = View.GONE
- }
- }
- }
-
- private fun setupPopularContentCreator() {
- contentRankCreatorAdapter = ContentRankCreatorAdapter {
- binding.llNoItems.visibility = View.VISIBLE
- binding.rvRankingSalesCount.visibility = View.GONE
- viewModel.getPopularContentByCreator(it)
- }
-
- binding.rvRankingCreator.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvRankingCreator.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 = 11f.dpToPx().toInt()
- }
-
- contentRankCreatorAdapter.itemCount - 1 -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 11f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvRankingCreator.adapter = contentRankCreatorAdapter
-
- viewModel.contentRankCreatorListLiveData.observe(viewLifecycleOwner) {
- contentRankCreatorAdapter.addItems(it)
- if (contentRankCreatorAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.llCreatorContentRanking.visibility = View.GONE
- } else {
- binding.llCreatorContentRanking.visibility = View.VISIBLE
- }
- }
- }
-
- private fun setupPopularContentByCreator() {
- popularContentByCreatorAdapter = PopularContentByCreatorAdapter(
- itemWidth = ((screenWidth - 13.3f.dpToPx() * 3) / 2).toInt(),
- onClickItem = { contentId ->
- startActivity(
- Intent(requireActivity(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
- }
- )
- },
- onClickCreator = { creatorId ->
- startActivity(
- Intent(requireActivity(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, creatorId)
- }
- )
- }
- )
-
- val recyclerView = binding.rvRankingSalesCount
- recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
- recyclerView.addItemDecoration(
- GridSpacingItemDecoration(
- 2,
- 13.3f.dpToPx().toInt(),
- false
- )
- )
-
- recyclerView.adapter = popularContentByCreatorAdapter
-
- viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.llNoItems.visibility = View.GONE
- recyclerView.visibility = View.VISIBLE
- popularContentByCreatorAdapter.addItems(it)
- } else {
- binding.llNoItems.visibility = View.VISIBLE
- recyclerView.visibility = View.GONE
- }
- }
- }
-
- private fun setupContentTag() {
- val spanCount = 4
- val spacing = 6f.dpToPx()
-
- contentTagAdapter = AudioContentMainTabContentTagAdapter {
- viewModel.getRecommendContentByTag(it)
- }
-
- val recyclerView = binding.rvRecommendContentTag
- recyclerView.layoutManager = GridLayoutManager(requireContext(), spanCount)
- recyclerView.addItemDecoration(GridSpacingItemDecoration(spanCount, spacing.toInt(), false))
- recyclerView.adapter = contentTagAdapter
-
- viewModel.tagListLiveData.observe(viewLifecycleOwner) {
- contentTagAdapter.addItems(it)
- if (
- contentTagAdapter.itemCount <= 0 ||
- !SharedPreferenceManager.isAdultContentVisible ||
- !SharedPreferenceManager.isAuth
- ) {
- binding.llRecommendContentByTag.visibility = View.GONE
- } else {
- binding.llRecommendContentByTag.visibility = View.VISIBLE
- }
- }
- }
-
- private fun setupContentByTag() {
- val spanCount = 3
- val horizontalSpacing = 13.3f.dpToPx().toInt()
- val verticalSpacing = 26.7f.dpToPx().toInt()
- val itemWidth = (screenWidth - horizontalSpacing * (spanCount + 1)) / spanCount
- contentByTagAdapter = AudioContentNewAllAdapter(
- itemWidth = itemWidth,
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- val recyclerView = binding.rvRecommendContent
- recyclerView.layoutManager = GridLayoutManager(requireContext(), spanCount)
- recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
- override fun getItemOffsets(
- outRect: Rect,
- view: View,
- parent: RecyclerView,
- state: RecyclerView.State
- ) {
- outRect.left = horizontalSpacing / 2
- outRect.right = horizontalSpacing / 2
- outRect.top = verticalSpacing / 2
- outRect.bottom = verticalSpacing / 2
- }
- })
- recyclerView.adapter = contentByTagAdapter
-
- viewModel.tagCurationContentListLiveData.observe(viewLifecycleOwner) {
- contentByTagAdapter.clear()
- contentByTagAdapter.addItems(it)
- }
- }
-
- private fun setupCuration() {
- curationAdapter = AudioContentMainContentCurationAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.VERTICAL,
- false
- )
-
- binding.rvCuration.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.top = 30f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
-
- curationAdapter.itemCount - 1 -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 30f.dpToPx().toInt()
- }
-
- else -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCuration.adapter = curationAdapter
-
- viewModel.curationListLiveData.observe(viewLifecycleOwner) {
- curationAdapter.addItems(it)
-
- binding.rvCuration.visibility = if (curationAdapter.itemCount <= 0 && it.isEmpty()) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
- }
-
- private fun bindData() {
- viewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.isLoading.observe(viewLifecycleOwner) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentRepository.kt
deleted file mode 100644
index eefd3e6e..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentRepository.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.content
-
-import kr.co.vividnext.sodalive.audio_content.AudioContentApi
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.ContentType
-
-class AudioContentMainTabContentRepository(private val api: AudioContentApi) {
- fun getContentMainContent(token: String) = api.getContentMainContent(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getNewContentOfTheme(theme: String, token: String) = api.getContentMainNewContentOfTheme(
- theme = theme,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getContentRanking(
- sortType: String = "매출",
- token: String
- ) = api.getDailyContentRanking(
- sortType = sortType,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getPopularContentByCreator(
- creatorId: Long,
- token: String
- ) = api.getContentMainContentPopularContentByCreator(
- creatorId,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getRecommendedContentByTag(
- tag: String,
- token: String
- ) = api.getRecommendedContentByTag(
- tag = tag,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentTagAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentTagAdapter.kt
deleted file mode 100644
index 80ee111c..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentTagAdapter.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.content
-
-import android.annotation.SuppressLint
-import android.content.Context
-import android.view.LayoutInflater
-import android.view.ViewGroup
-import androidx.core.content.ContextCompat
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.databinding.ItemContentMainTabContentTagBinding
-
-class AudioContentMainTabContentTagAdapter(
- private val onClick: (String) -> Unit
-) : RecyclerView.Adapter() {
-
- private val tagList = mutableListOf()
-
- private var selectedTag = ""
-
- inner class ViewHolder(
- private val context: Context,
- private val binding: ItemContentMainTabContentTagBinding
- ) : RecyclerView.ViewHolder(binding.root) {
- @SuppressLint("NotifyDataSetChanged")
- fun bind(tag: String) {
- if (tag == selectedTag) {
- binding.tvTag.setBackgroundResource(
- R.drawable.bg_round_corner_2_6_transparent_3bb9f1
- )
- binding.tvTag.setTextColor(
- ContextCompat.getColor(context, R.color.color_3bb9f1)
- )
- } else {
- binding.tvTag.setBackgroundResource(
- R.drawable.bg_round_corner_2_6_transparent_777777
- )
- binding.tvTag.setTextColor(
- ContextCompat.getColor(context, R.color.color_777777)
- )
- }
-
- binding.tvTag.text = tag
- binding.tvTag.setOnClickListener {
- selectedTag = tag
- onClick(tag)
- notifyDataSetChanged()
- }
- }
- }
-
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
- parent.context,
- ItemContentMainTabContentTagBinding.inflate(
- LayoutInflater.from(parent.context),
- parent,
- false
- )
- )
-
- override fun getItemCount() = tagList.size
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.bind(tagList[position])
- }
-
- @SuppressLint("NotifyDataSetChanged")
- fun addItems(tagList: List) {
- this.tagList.clear()
- this.tagList.addAll(tagList)
-
- if (tagList.isNotEmpty()) {
- selectedTag = tagList[0]
- }
-
- notifyDataSetChanged()
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentViewModel.kt
deleted file mode 100644
index b801d4a2..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/AudioContentMainTabContentViewModel.kt
+++ /dev/null
@@ -1,259 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.content
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.event.EventItem
-
-class AudioContentMainTabContentViewModel(
- private val repository: AudioContentMainTabContentRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _contentBannerLiveData = MutableLiveData>()
- val contentBannerLiveData: LiveData>
- get() = _contentBannerLiveData
-
- private var _newContentListLiveData = MutableLiveData>()
- val newContentListLiveData: LiveData>
- get() = _newContentListLiveData
-
- private var _themeListLiveData = MutableLiveData>()
- val themeListLiveData: LiveData>
- get() = _themeListLiveData
-
- private var _contentRankingSortListLiveData = MutableLiveData>()
- val contentRankingSortListLiveData: LiveData>
- get() = _contentRankingSortListLiveData
-
- private var _contentRankingLiveData = MutableLiveData>()
- val contentRankingLiveData: LiveData>
- get() = _contentRankingLiveData
-
- private val _eventLiveData = MutableLiveData>()
- val eventLiveData: LiveData>
- get() = _eventLiveData
-
- private var _curationListLiveData = MutableLiveData>()
- val curationListLiveData: LiveData>
- get() = _curationListLiveData
-
- private val _contentRankCreatorListLiveData = MutableLiveData>()
- val contentRankCreatorListLiveData: LiveData>
- get() = _contentRankCreatorListLiveData
-
- private val _salesCountRankContentListLiveData =
- MutableLiveData>()
- val salesCountRankContentListLiveData: LiveData>
- get() = _salesCountRankContentListLiveData
-
- private val _tagListLiveData = MutableLiveData>()
- val tagListLiveData: LiveData>
- get() = _tagListLiveData
-
- private val _tagCurationContentListLiveData = MutableLiveData>()
- val tagCurationContentListLiveData: LiveData>
- get() = _tagCurationContentListLiveData
-
- fun fetchData() {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getContentMainContent(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- val data = it.data
-
- _contentBannerLiveData.value = data.bannerList
-
- val themeList = listOf("전체").union(data.contentThemeList).toList()
- _themeListLiveData.value = themeList
- _newContentListLiveData.value = data.newContentList
-
- _contentRankingSortListLiveData.value = data.rankSortTypeList
- _contentRankingLiveData.value = data.rankContentList
-
- _eventLiveData.value = data.eventBannerList.eventList
- _contentRankCreatorListLiveData.value = data.contentRankCreatorList
- _salesCountRankContentListLiveData.value =
- data.salesCountRankContentList
- _curationListLiveData.value = data.curationList
-
- _tagListLiveData.value = data.tagList
- _tagCurationContentListLiveData.value = data.tagCurationContentList
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getNewContentOfTheme(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
- }
- )
- )
- }
-
- fun getContentRanking(sort: String = "매출") {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getContentRanking(
- sortType = sort,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _contentRankingLiveData.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
- }
- )
- )
- }
-
- fun getPopularContentByCreator(creatorId: Long) {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getPopularContentByCreator(
- creatorId = creatorId,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- _isLoading.value = false
- if (it.success && it.data != null) {
- _salesCountRankContentListLiveData.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("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getRecommendContentByTag(tag: String) {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getRecommendedContentByTag(
- tag = tag,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- _tagCurationContentListLiveData.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
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/GetContentMainTabContentResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/GetContentMainTabContentResponse.kt
deleted file mode 100644
index c6e54fce..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/content/GetContentMainTabContentResponse.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.content
-
-import androidx.annotation.Keep
-import com.google.gson.annotations.SerializedName
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.settings.event.GetEventResponse
-
-@Keep
-data class GetContentMainTabContentResponse(
- @SerializedName("bannerList") val bannerList: List,
- @SerializedName("contentThemeList") val contentThemeList: List,
- @SerializedName("newContentList") val newContentList: List,
- @SerializedName("rankSortTypeList") val rankSortTypeList: List,
- @SerializedName("rankContentList") val rankContentList: List,
- @SerializedName("contentRankCreatorList") val contentRankCreatorList: List,
- @SerializedName("salesCountRankContentList") val salesCountRankContentList: List,
- @SerializedName("eventBannerList") val eventBannerList: GetEventResponse,
- @SerializedName("tagList") val tagList: List,
- @SerializedName("tagCurationContentList") val tagCurationContentList: List,
- @SerializedName("curationList") val curationList: List
-)
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeFragment.kt
deleted file mode 100644
index a172b368..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeFragment.kt
+++ /dev/null
@@ -1,591 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.free
-
-import android.content.Intent
-import android.graphics.Rect
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.zhpan.bannerview.BaseBannerAdapter
-import com.zhpan.indicator.enums.IndicatorSlideMode
-import com.zhpan.indicator.enums.IndicatorStyle
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllActivity
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
-import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainContentCurationAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.free.introduce_creator.IntroduceCreatorActivity
-import kr.co.vividnext.sodalive.audio_content.main.v2.series.new_series.AudioContentMainNewSeriesAdapter
-import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
-import kr.co.vividnext.sodalive.base.BaseFragment
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabFreeBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@OptIn(UnstableApi::class)
-class AudioContentMainTabFreeFragment : BaseFragment(
- FragmentAudioContentMainTabFreeBinding::inflate
-) {
- private val viewModel: AudioContentMainTabFreeViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
- private lateinit var introduceCreatorAdapter: AudioContentMainContentAdapter
- private lateinit var recommendSeriesAdapter: AudioContentMainNewSeriesAdapter
- private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var newContentAdapter: AudioContentMainContentAdapter
- private lateinit var curationAdapter: AudioContentMainContentCurationAdapter
- private lateinit var contentRankCreatorAdapter: ContentRankCreatorAdapter
- private lateinit var popularContentByCreatorAdapter: PopularContentByCreatorAdapter
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- setupView()
- bindData()
-
- viewModel.fetchData()
- }
-
- private fun setupView() {
- loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
-
- setupContentBanner()
- setupIntroduceCreator()
- setupRecommendSeries()
- setupNewContentTheme()
- setupNewContent()
- setupPopularContentCreator()
- setupPopularContentByCreator()
- setupCuration()
- }
-
- private fun setupContentBanner() {
- val layoutParams = binding
- .rvBanner
- .layoutParams as LinearLayout.LayoutParams
-
- val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx()
- val pagerHeight = (pagerWidth * 0.53).roundToInt()
- layoutParams.width = pagerWidth.roundToInt()
- layoutParams.height = pagerHeight
-
- contentBannerAdapter = AudioContentMainBannerAdapter(
- requireContext(),
- pagerWidth.roundToInt(),
- pagerHeight
- ) {
- when (it.type) {
- AudioContentBannerType.EVENT -> {
- startActivity(
- Intent(requireContext(), EventDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
- }
- )
- }
-
- AudioContentBannerType.CREATOR -> {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
- }
- )
- }
-
- AudioContentBannerType.SERIES -> {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
- }
- )
- }
-
- AudioContentBannerType.LINK -> {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
- }
- }
- }
-
- binding
- .rvBanner
- .layoutParams = layoutParams
-
- binding.rvBanner.apply {
- adapter = contentBannerAdapter as BaseBannerAdapter
-
- setLifecycleRegistry(lifecycle)
- setScrollDuration(1000)
- setInterval(4 * 1000)
- }.create()
-
- binding
- .rvBanner
- .setIndicatorView(binding.indicatorBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.contentBannerLiveData.observe(viewLifecycleOwner) {
- if (contentBannerAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.rvBanner.visibility = View.GONE
- binding.indicatorBanner.visibility = View.GONE
- } else {
- binding.rvBanner.visibility = View.VISIBLE
- binding.indicatorBanner.visibility = View.VISIBLE
- binding.rvBanner.refreshData(it)
- }
- }
- }
-
- private fun setupIntroduceCreator() {
- binding.ivIntroduceCreatorAll.setOnClickListener {
- startActivity(
- Intent(requireContext(), IntroduceCreatorActivity::class.java)
- )
- }
-
- introduceCreatorAdapter = AudioContentMainContentAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- val recyclerView = binding.rvIntroduceCreator
- recyclerView.layoutManager = LinearLayoutManager(
- context,
- 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 = 6.7f.dpToPx().toInt()
- }
-
- introduceCreatorAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- recyclerView.adapter = introduceCreatorAdapter
-
- viewModel.introduceCreatorLiveData.observe(viewLifecycleOwner) {
- if (it.items.isNotEmpty()) {
- binding.llIntroduceCreator.visibility = View.VISIBLE
- binding.tvIntroduceCreator.text = it.title
- introduceCreatorAdapter.addItems(it.items)
- } else {
- binding.llIntroduceCreator.visibility = View.GONE
- }
- }
- }
-
- private fun setupRecommendSeries() {
- recommendSeriesAdapter = AudioContentMainNewSeriesAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- val recyclerView = binding.rvRecommendSeries
- 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 = 6.7f.dpToPx().toInt()
- }
-
- recommendSeriesAdapter.itemCount - 1 -> {
- outRect.right = 0
- outRect.left = 6.7f.dpToPx().toInt()
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- recyclerView.adapter = recommendSeriesAdapter
-
- viewModel.recommendSeriesListLiveData.observe(viewLifecycleOwner) {
- recommendSeriesAdapter.addItems(it)
- binding.llRecommendSeries.visibility = if (it.isNotEmpty()) {
- View.VISIBLE
- } else {
- View.GONE
- }
- }
- }
-
- private fun setupNewContentTheme() {
- newContentThemeAdapter = AudioContentMainNewContentThemeAdapter {
- viewModel.getNewFreeContentOfTheme(theme = it)
- }
-
- binding.rvNewContentTheme.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContentTheme.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 = 4f.dpToPx().toInt()
- }
-
- newContentThemeAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContentTheme.adapter = newContentThemeAdapter
-
- viewModel.themeListLiveData.observe(viewLifecycleOwner) {
- binding.llNewContent.visibility = View.VISIBLE
- newContentThemeAdapter.addItems(it)
- }
- }
-
- private fun setupNewContent() {
- binding.ivNewContentAll.setOnClickListener {
- startActivity(
- Intent(
- requireContext(),
- AudioContentNewAllActivity::class.java
- ).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_FREE, true)
- }
- )
- }
-
- newContentAdapter = AudioContentMainContentAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvNewContent.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContent.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 = 6.7f.dpToPx().toInt()
- }
-
- newContentAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContent.adapter = newContentAdapter
-
- viewModel.newContentListLiveData.observe(viewLifecycleOwner) {
- newContentAdapter.addItems(it)
- }
- }
-
- private fun setupPopularContentCreator() {
- contentRankCreatorAdapter = ContentRankCreatorAdapter {
- binding.llNoItems.visibility = View.VISIBLE
- binding.rvRankingPlayCount.visibility = View.GONE
- viewModel.getPopularContentByCreator(it)
- }
-
- binding.rvRankingCreator.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvRankingCreator.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 = 11f.dpToPx().toInt()
- }
-
- contentRankCreatorAdapter.itemCount - 1 -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 11f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvRankingCreator.adapter = contentRankCreatorAdapter
-
- viewModel.contentCreatorListLiveData.observe(viewLifecycleOwner) {
- contentRankCreatorAdapter.addItems(it)
- if (contentRankCreatorAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.llCreatorContentRanking.visibility = View.GONE
- } else {
- binding.llCreatorContentRanking.visibility = View.VISIBLE
- }
- }
- }
-
- private fun setupPopularContentByCreator() {
- popularContentByCreatorAdapter = PopularContentByCreatorAdapter(
- itemWidth = ((screenWidth - 13.3f.dpToPx() * 3) / 2).toInt(),
- onClickItem = { contentId ->
- startActivity(
- Intent(requireActivity(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
- }
- )
- },
- onClickCreator = { creatorId ->
- startActivity(
- Intent(requireActivity(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, creatorId)
- }
- )
- }
- )
-
- val recyclerView = binding.rvRankingPlayCount
- recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
- recyclerView.addItemDecoration(
- GridSpacingItemDecoration(
- 2,
- 13.3f.dpToPx().toInt(),
- false
- )
- )
-
- recyclerView.adapter = popularContentByCreatorAdapter
-
- viewModel.playCountRankContentListLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.llNoItems.visibility = View.GONE
- recyclerView.visibility = View.VISIBLE
- popularContentByCreatorAdapter.addItems(it)
- } else {
- binding.llNoItems.visibility = View.VISIBLE
- recyclerView.visibility = View.GONE
- }
- }
- }
-
- private fun setupCuration() {
- curationAdapter = AudioContentMainContentCurationAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.VERTICAL,
- false
- )
-
- binding.rvCuration.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.top = 30f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
-
- curationAdapter.itemCount - 1 -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 30f.dpToPx().toInt()
- }
-
- else -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCuration.adapter = curationAdapter
-
- viewModel.curationListLiveData.observe(viewLifecycleOwner) {
- curationAdapter.addItems(it)
-
- binding.rvCuration.visibility = if (curationAdapter.itemCount <= 0 && it.isEmpty()) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
- }
-
- private fun bindData() {
- viewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.isLoading.observe(viewLifecycleOwner) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeRepository.kt
deleted file mode 100644
index 41cd5015..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeRepository.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.free
-
-import kr.co.vividnext.sodalive.audio_content.AudioContentApi
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.ContentType
-
-class AudioContentMainTabFreeRepository(private val api: AudioContentApi) {
- fun getContentMainFree(token: String) = api.getContentMainFree(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getIntroduceCreatorList(page: Int, size: Int, token: String) = api.getIntroduceCreatorList(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- page = page - 1,
- size = size,
- authHeader = token
- )
-
- fun getNewContentOfTheme(
- theme: String,
- page: Int = 1,
- size: Int = 10,
- token: String
- ) = api.getNewFreeContentOfTheme(
- theme = theme,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- page = page - 1,
- size = size,
- authHeader = token
- )
-
- fun getPopularContentByCreator(
- creatorId: Long,
- token: String
- ) = api.getPopularFreeContentByCreator(
- creatorId,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeViewModel.kt
deleted file mode 100644
index 8a733dee..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/AudioContentMainTabFreeViewModel.kt
+++ /dev/null
@@ -1,181 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.free
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.series.GetRecommendSeriesListResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class AudioContentMainTabFreeViewModel(
- private val repository: AudioContentMainTabFreeRepository
-) : BaseViewModel() {
-
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _contentBannerLiveData = MutableLiveData>()
- val contentBannerLiveData: LiveData>
- get() = _contentBannerLiveData
-
- private var _introduceCreatorLiveData = MutableLiveData()
- val introduceCreatorLiveData: LiveData
- get() = _introduceCreatorLiveData
-
- private var _recommendSeriesListLiveData =
- MutableLiveData>()
- val recommendSeriesListLiveData: LiveData>
- get() = _recommendSeriesListLiveData
-
- private var _newContentListLiveData = MutableLiveData>()
- val newContentListLiveData: LiveData>
- get() = _newContentListLiveData
-
- private var _themeListLiveData = MutableLiveData>()
- val themeListLiveData: LiveData>
- get() = _themeListLiveData
-
- private val _contentCreatorListLiveData = MutableLiveData>()
- val contentCreatorListLiveData: LiveData>
- get() = _contentCreatorListLiveData
-
- private val _playCountRankContentListLiveData =
- MutableLiveData>()
- val playCountRankContentListLiveData: LiveData>
- get() = _playCountRankContentListLiveData
-
- private var _curationListLiveData = MutableLiveData>()
- val curationListLiveData: LiveData>
- get() = _curationListLiveData
-
- fun fetchData() {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getContentMainFree(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- val data = it.data
-
- _contentBannerLiveData.value = data.contentBannerList
-
- if (data.introduceCreator != null) {
- _introduceCreatorLiveData.value = data.introduceCreator!!
- }
-
- _recommendSeriesListLiveData.value = data.recommendSeriesList
- _newContentListLiveData.value = data.newFreeContentList
- val themeList = listOf("전체").union(data.themeList).toList()
- _themeListLiveData.value = themeList
-
- _contentCreatorListLiveData.value = data.creatorList
- _playCountRankContentListLiveData.value =
- data.playCountRankContentList
-
- _curationListLiveData.value = data.curationList
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- 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
- }
- )
- )
- }
-
- fun getPopularContentByCreator(creatorId: Long) {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getPopularContentByCreator(
- creatorId = creatorId,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- _isLoading.value = false
- if (it.success && it.data != null) {
- _playCountRankContentListLiveData.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("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/GetContentMainTabLiveFreeResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/GetContentMainTabLiveFreeResponse.kt
deleted file mode 100644
index 6f17140d..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/GetContentMainTabLiveFreeResponse.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.free
-
-import androidx.annotation.Keep
-import com.google.gson.annotations.SerializedName
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.audio_content.main.v2.series.GetRecommendSeriesListResponse
-
-@Keep
-data class GetContentMainTabLiveFreeResponse(
- @SerializedName("contentBannerList")
- val contentBannerList: List,
- @SerializedName("introduceCreator")
- val introduceCreator: GetContentCurationResponse?,
- @SerializedName("recommendSeriesList")
- val recommendSeriesList: List,
- @SerializedName("themeList")
- val themeList: List,
- @SerializedName("newFreeContentList")
- val newFreeContentList: List,
- @SerializedName("creatorList")
- val creatorList: List,
- @SerializedName("playCountRankContentList")
- val playCountRankContentList: List,
- @SerializedName("curationList")
- val curationList: List
-)
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/introduce_creator/IntroduceCreatorActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/introduce_creator/IntroduceCreatorActivity.kt
deleted file mode 100644
index 85692476..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/introduce_creator/IntroduceCreatorActivity.kt
+++ /dev/null
@@ -1,104 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.free.introduce_creator
-
-import android.content.Intent
-import android.os.Bundle
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllAdapter
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.base.BaseActivity
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.ActivityIntroduceCreatorBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@OptIn(UnstableApi::class)
-class IntroduceCreatorActivity : BaseActivity(
- ActivityIntroduceCreatorBinding::inflate
-) {
- private val viewModel: IntroduceCreatorViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var adapter: AudioContentNewAllAdapter
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
-
- bindData()
- viewModel.getIntroduceCreatorList()
- }
-
- override fun setupView() {
- loadingDialog = LoadingDialog(this, layoutInflater)
- binding.toolbar.tvBack.text = "크리에이터 소개"
- binding.toolbar.tvBack.setOnClickListener { finish() }
-
- val spanCount = 3
- val spacing = 13.3f.dpToPx().roundToInt()
- adapter = AudioContentNewAllAdapter(
- itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 3,
- onClickItem = {
- startActivity(
- Intent(this, AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(this, UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvContent.layoutManager = GridLayoutManager(this, spanCount)
- binding.rvContent.addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, true))
-
- binding.rvContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
- super.onScrolled(recyclerView, dx, dy)
-
- val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!
- .findLastCompletelyVisibleItemPosition()
- val itemTotalCount = recyclerView.adapter!!.itemCount - 1
-
- // 스크롤이 끝에 도달했는지 확인
- if (!recyclerView.canScrollVertically(1) &&
- lastVisibleItemPosition == itemTotalCount
- ) {
- viewModel.getIntroduceCreatorList()
- }
- }
- })
-
- binding.rvContent.adapter = adapter
- }
-
- private fun bindData() {
- viewModel.isLoading.observe(this) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
-
- viewModel.toastLiveData.observe(this) {
- it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.introduceCreatorListLiveData.observe(this) {
- adapter.addItems(it)
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/introduce_creator/IntroduceCreatorViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/introduce_creator/IntroduceCreatorViewModel.kt
deleted file mode 100644
index 224ff938..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/free/introduce_creator/IntroduceCreatorViewModel.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.free.introduce_creator
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.free.AudioContentMainTabFreeRepository
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-
-class IntroduceCreatorViewModel(
- private val repository: AudioContentMainTabFreeRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _introduceCreatorListLiveData = MutableLiveData>()
- val introduceCreatorListLiveData: LiveData>
- get() = _introduceCreatorListLiveData
-
- private var isLast = false
- private var page = 1
- private val size = 10
-
- fun getIntroduceCreatorList() {
- if (!_isLoading.value!! && !isLast) {
- _isLoading.value = true
-
- compositeDisposable.add(
- repository.getIntroduceCreatorList(
- page = page,
- size = size,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- if (it.data.isNotEmpty()) {
- page += 1
- _introduceCreatorListLiveData.postValue(it.data!!)
- } else {
- isLast = true
- }
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeFragment.kt
deleted file mode 100644
index 146396ef..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeFragment.kt
+++ /dev/null
@@ -1,761 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.home
-
-import android.content.Intent
-import android.content.SharedPreferences
-import android.graphics.Color
-import android.graphics.Rect
-import android.net.Uri
-import android.os.Bundle
-import android.text.SpannableString
-import android.text.Spanned
-import android.text.style.ForegroundColorSpan
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.Toast
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.zhpan.bannerview.BaseBannerAdapter
-import com.zhpan.indicator.enums.IndicatorSlideMode
-import com.zhpan.indicator.enums.IndicatorStyle
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.all.AudioContentRankingAllActivity
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
-import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
-import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainActivity
-import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainTab
-import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
-import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
-import kr.co.vividnext.sodalive.base.BaseFragment
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabHomeBinding
-import kr.co.vividnext.sodalive.explorer.ExplorerSectionAdapter
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.explorer.profile.series.UserProfileSeriesListAdapter
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.live.event_banner.EventBannerAdapter
-import kr.co.vividnext.sodalive.main.MainActivity
-import kr.co.vividnext.sodalive.mypage.can.charge.CanChargeActivity
-import kr.co.vividnext.sodalive.search.SearchActivity
-import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
-import kr.co.vividnext.sodalive.settings.notice.NoticeDetailActivity
-import kr.co.vividnext.sodalive.settings.notification.MemberRole
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@UnstableApi
-class AudioContentMainTabHomeFragment : BaseFragment(
- FragmentAudioContentMainTabHomeBinding::inflate
-) {
- private val viewModel: AudioContentMainTabHomeViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var rankCreatorAdapter: ExplorerSectionAdapter
- private lateinit var rankSeriesAdapter: UserProfileSeriesListAdapter
- private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
- private lateinit var rankContentAdapter: AudioContentMainRankingAdapter
- private lateinit var rankContentSortAdapter: AudioContentMainNewContentThemeAdapter
- private lateinit var contentRankCreatorAdapter: ContentRankCreatorAdapter
- private lateinit var popularContentByCreatorAdapter: PopularContentByCreatorAdapter
-
- private val preferenceChangeListener =
- SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key ->
- // 특정 키에 대한 값이 변경될 때 UI 업데이트
- if (key == Constants.PREF_USER_ROLE) {
- if (
- sharedPreferences.getString(
- key,
- MemberRole.USER.name
- ) == MemberRole.CREATOR.name
- ) {
- binding.llUploadContent.visibility = View.VISIBLE
- binding.llUploadContent.setOnClickListener {
- startActivity(
- Intent(
- requireActivity(),
- AudioContentUploadActivity::class.java
- )
- )
- }
- } else {
- binding.llUploadContent.visibility = View.GONE
- }
- }
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- SharedPreferenceManager.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
- setupView()
- bindData()
-
- viewModel.fetchData()
- }
-
- override fun onDestroyView() {
- SharedPreferenceManager.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
- super.onDestroyView()
- }
-
- private fun bindData() {
- viewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.isLoading.observe(viewLifecycleOwner) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
- }
-
- private fun setupView() {
- loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
-
- if (SharedPreferenceManager.role == MemberRole.CREATOR.name) {
- binding.llUploadContent.visibility = View.VISIBLE
- binding.llUploadContent.setOnClickListener {
- startActivity(
- Intent(
- requireActivity(),
- AudioContentUploadActivity::class.java
- )
- )
- }
- } else {
- binding.llUploadContent.visibility = View.GONE
- }
-
- if (SharedPreferenceManager.token.isNotBlank()) {
- binding.ivCharge.visibility = View.VISIBLE
- binding.ivCharge.setOnClickListener {
- startActivity(
- Intent(
- requireContext(),
- CanChargeActivity::class.java
- )
- )
- }
- } else {
- binding.ivCharge.visibility = View.GONE
- }
-
- if (SharedPreferenceManager.token.isNotBlank()) {
- binding.flSearch.visibility = View.VISIBLE
- binding.flSearch.setOnClickListener {
- startActivity(
- Intent(
- requireContext(),
- SearchActivity::class.java
- )
- )
- }
- } else {
- binding.flSearch.visibility = View.GONE
- }
-
- setupNotice()
- setupContentBanner()
- setupCategory()
- setupRankCreator()
- setupRankSeries()
- setupRankContentSortType()
- setupRankContent()
- setupEventBanner()
- setupPopularContentCreator()
- setupPopularContentByCreator()
- }
-
- private fun setupNotice() {
- viewModel.noticeLiveData.observe(viewLifecycleOwner) { notice ->
- binding.tvNoticeTitle.text = notice.title
- binding.tvDetail.setOnClickListener {
- startActivity(
- Intent(requireContext(), NoticeDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_NOTICE, notice)
- }
- )
- }
- }
- }
-
- private fun setupContentBanner() {
- val layoutParams = binding
- .rvBanner
- .layoutParams as LinearLayout.LayoutParams
-
- val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx()
- val pagerHeight = (pagerWidth * 0.53).roundToInt()
- layoutParams.width = pagerWidth.roundToInt()
- layoutParams.height = pagerHeight
-
- contentBannerAdapter = AudioContentMainBannerAdapter(
- requireContext(),
- pagerWidth.roundToInt(),
- pagerHeight
- ) {
- when (it.type) {
- AudioContentBannerType.EVENT -> {
- startActivity(
- Intent(requireContext(), EventDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
- }
- )
- }
-
- AudioContentBannerType.CREATOR -> {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
- }
- )
- }
-
- AudioContentBannerType.SERIES -> {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
- }
- )
- }
-
- AudioContentBannerType.LINK -> {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
- }
- }
- }
-
- binding
- .rvBanner
- .layoutParams = layoutParams
-
- binding.rvBanner.apply {
- adapter = contentBannerAdapter as BaseBannerAdapter
-
- setLifecycleRegistry(lifecycle)
- setScrollDuration(1000)
- setInterval(4 * 1000)
- }.create()
-
- binding
- .rvBanner
- .setIndicatorView(binding.indicatorBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.contentBannerLiveData.observe(viewLifecycleOwner) {
- if (
- SharedPreferenceManager.token.isBlank() ||
- (contentBannerAdapter.itemCount <= 0 && it.isEmpty())
- ) {
- binding.rvBanner.visibility = View.GONE
- binding.indicatorBanner.visibility = View.GONE
- } else {
- binding.rvBanner.visibility = View.VISIBLE
- binding.indicatorBanner.visibility = View.VISIBLE
- binding.rvBanner.refreshData(it)
- }
- }
- }
-
- private fun setupCategory() {
- if (SharedPreferenceManager.token.isNotBlank()) {
- binding.llCategoryContainer.visibility = View.VISIBLE
- } else {
- binding.llCategoryContainer.visibility = View.GONE
- }
-
- binding.rlCategoryAudioBook.setOnClickListener {
- showToast("준비중 입니다.")
- }
-
- binding.rlCategoryAudioToon.setOnClickListener {
- showToast("준비중 입니다.")
- }
-
- binding.rlCategorySeries.setOnClickListener {
- startAudioContentMainActivity(AudioContentMainTab.SERIES)
- }
-
- binding.rlCategoryContent.setOnClickListener {
- startAudioContentMainActivity(AudioContentMainTab.CONTENT)
- }
-
- binding.rlCategoryAlarm.setOnClickListener {
- startAudioContentMainActivity(AudioContentMainTab.ALARM)
- }
-
- binding.rlCategoryAsmr.setOnClickListener {
- startAudioContentMainActivity(AudioContentMainTab.ASMR)
- }
-
- binding.rlCategoryReplay.setOnClickListener {
- startAudioContentMainActivity(AudioContentMainTab.REPLAY)
- }
-
- binding.rlCategoryFree.setOnClickListener {
- startAudioContentMainActivity(AudioContentMainTab.FREE)
- }
- }
-
- private fun startAudioContentMainActivity(tab: AudioContentMainTab) {
- startActivity(
- Intent(requireContext(), AudioContentMainActivity::class.java).apply {
- putExtra(
- Constants.EXTRA_START_TAB_POSITION,
- tab.ordinal
- )
- }
- )
- }
-
- private fun setupRankCreator() {
- if (SharedPreferenceManager.token.isNotBlank()) {
- binding.llCreatorRankDate.visibility = View.VISIBLE
-
- val lp = binding.tvCreatorRankTitle.layoutParams as LinearLayout.LayoutParams
- lp.topMargin = 30f.dpToPx().toInt()
- binding.tvCreatorRankTitle.layoutParams = lp
- } else {
- binding.llCreatorRankDate.visibility = View.GONE
-
- val lp = binding.tvCreatorRankTitle.layoutParams as LinearLayout.LayoutParams
- lp.topMargin = 0
- binding.tvCreatorRankTitle.layoutParams = lp
- }
-
- rankCreatorAdapter = ExplorerSectionAdapter(
- onClickItem = {
- if (SharedPreferenceManager.token.isNotBlank()) {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- } else {
- (requireActivity() as MainActivity).showLoginActivity()
- }
- },
- isVisibleRanking = true
- )
-
- binding.rvCreatorRank.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvCreatorRank.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 = 6.7f.dpToPx().toInt()
- }
-
- rankCreatorAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCreatorRank.adapter = rankCreatorAdapter
-
- viewModel.rankCreatorLiveData.observe(viewLifecycleOwner) {
- binding.tvDesc.text = it.desc
- binding.tvCreatorRankTitle.text = if (
- !it.coloredTitle.isNullOrBlank() &&
- !it.color.isNullOrBlank()
- ) {
- val spStr = SpannableString(it.title)
-
- try {
- spStr.setSpan(
- ForegroundColorSpan(
- Color.parseColor("#${it.color}")
- ),
- it.title.indexOf(it.coloredTitle),
- it.title.indexOf(it.coloredTitle) + it.coloredTitle.length,
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
- )
-
- spStr
- } catch (e: IllegalArgumentException) {
- it.title
- }
- } else {
- it.title
- }
-
- rankCreatorAdapter.addItems(it.creators)
- if (rankCreatorAdapter.itemCount <= 0 && it.creators.isEmpty()) {
- binding.llCreatorRank.visibility = View.GONE
- binding.rvCreatorRank.visibility = View.GONE
- } else {
- binding.llCreatorRank.visibility = View.VISIBLE
- binding.rvCreatorRank.visibility = View.VISIBLE
- }
- }
- }
-
- private fun setupRankSeries() {
- rankSeriesAdapter = UserProfileSeriesListAdapter(
- onClickItem = {
- if (SharedPreferenceManager.token.isNotBlank()) {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it)
- }
- )
- } else {
- (requireActivity() as MainActivity).showLoginActivity()
- }
- },
- onClickCreator = {
- if (SharedPreferenceManager.token.isNotBlank()) {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- } else {
- (requireActivity() as MainActivity).showLoginActivity()
- }
- },
- isVisibleCreator = true
- )
-
- val recyclerView = binding.rvRankSeries
- 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 = 6.7f.dpToPx().toInt()
- }
-
- rankSeriesAdapter.itemCount - 1 -> {
- outRect.right = 0
- outRect.left = 6.7f.dpToPx().toInt()
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- recyclerView.adapter = rankSeriesAdapter
-
- viewModel.rankSeriesLiveData.observe(viewLifecycleOwner) {
- rankSeriesAdapter.addItems(it)
- binding.llRankSeries.visibility = if (
- SharedPreferenceManager.token.isBlank() ||
- rankSeriesAdapter.itemCount <= 0 && it.isEmpty()
- ) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
- }
-
- private fun setupRankContentSortType() {
- rankContentSortAdapter = AudioContentMainNewContentThemeAdapter {
- viewModel.getContentRanking(sort = it)
- }
-
- binding.rvRankContentSort.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvRankContentSort.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 = 4f.dpToPx().toInt()
- }
-
- rankContentSortAdapter.itemCount - 1 -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 4f.dpToPx().toInt()
- outRect.right = 4f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvRankContentSort.adapter = rankContentSortAdapter
-
- viewModel.rankContentSortListLiveData.observe(viewLifecycleOwner) {
- binding.llRankContent.visibility = View.VISIBLE
- rankContentSortAdapter.addItems(it)
- }
- }
-
- private fun setupRankContent() {
- binding.ivRankContentAll.setOnClickListener {
- if (SharedPreferenceManager.token.isNotBlank()) {
- startActivity(Intent(requireContext(), AudioContentRankingAllActivity::class.java))
- } else {
- (requireActivity() as MainActivity).showLoginActivity()
- }
- }
-
- rankContentAdapter = AudioContentMainRankingAdapter(
- width = (screenWidth * 0.66).toInt()
- ) {
- if (SharedPreferenceManager.token.isNotBlank()) {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- } else {
- (requireActivity() as MainActivity).showLoginActivity()
- }
- }
-
- binding.rvRankContent.layoutManager = GridLayoutManager(
- context,
- 3,
- GridLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvRankContent.addItemDecoration(object : RecyclerView.ItemDecoration() {
- override fun getItemOffsets(
- outRect: Rect,
- view: View,
- parent: RecyclerView,
- state: RecyclerView.State
- ) {
- super.getItemOffsets(outRect, view, parent, state)
- outRect.top = 13.3f.dpToPx().toInt()
- outRect.bottom = 13.3f.dpToPx().toInt()
- outRect.left = 13.3f.dpToPx().toInt()
- outRect.right = 13.3f.dpToPx().toInt()
- }
- })
-
- binding.rvRankContent.adapter = rankContentAdapter
-
- viewModel.rankContentLiveData.observe(viewLifecycleOwner) {
- binding.llRankContent.visibility = View.VISIBLE
- rankContentAdapter.addItems(it)
- }
- }
-
- private fun setupEventBanner() {
- val imageSliderLp = binding.eventBannerSlider.layoutParams
- imageSliderLp.width = screenWidth
- imageSliderLp.height = (screenWidth * 300) / 1000
- binding.eventBannerSlider.layoutParams = imageSliderLp
-
- binding.eventBannerSlider.apply {
- adapter = EventBannerAdapter(requireContext()) {
- if (it.detailImageUrl != null) {
- val intent = Intent(requireActivity(), EventDetailActivity::class.java)
- intent.putExtra(Constants.EXTRA_EVENT, it)
- startActivity(intent)
- } else if (!it.link.isNullOrBlank()) {
- startActivity(
- Intent(
- Intent.ACTION_VIEW,
- Uri.parse(it.link)
- )
- )
- }
- } as BaseBannerAdapter
- setLifecycleRegistry(lifecycle)
- setScrollDuration(800)
- }.create()
-
- binding.eventBannerSlider
- .setIndicatorView(binding.indicatorEventBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.eventLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty() && SharedPreferenceManager.token.isNotBlank()) {
- binding.eventBannerSlider.visibility = View.VISIBLE
- binding.eventBannerSlider.refreshData(it)
- } else {
- binding.eventBannerSlider.visibility = View.GONE
- }
- }
- }
-
- private fun setupPopularContentCreator() {
- contentRankCreatorAdapter = ContentRankCreatorAdapter {
- binding.llNoItems.visibility = View.VISIBLE
- binding.rvRankingSalesCount.visibility = View.GONE
- viewModel.getPopularContentByCreator(it)
- }
-
- binding.rvRankingCreator.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvRankingCreator.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 = 11f.dpToPx().toInt()
- }
-
- contentRankCreatorAdapter.itemCount - 1 -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 11f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvRankingCreator.adapter = contentRankCreatorAdapter
-
- viewModel.contentRankCreatorListLiveData.observe(viewLifecycleOwner) {
- contentRankCreatorAdapter.addItems(it)
- if (contentRankCreatorAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.llCreatorContentRanking.visibility = View.GONE
- } else {
- binding.llCreatorContentRanking.visibility = View.VISIBLE
- }
- }
- }
-
- private fun setupPopularContentByCreator() {
- popularContentByCreatorAdapter = PopularContentByCreatorAdapter(
- itemWidth = ((screenWidth - 13.3f.dpToPx() * 3) / 2).toInt(),
- onClickItem = { contentId ->
- if (SharedPreferenceManager.token.isNotBlank()) {
- startActivity(
- Intent(requireActivity(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
- }
- )
- } else {
- (requireActivity() as MainActivity).showLoginActivity()
- }
- },
- onClickCreator = { creatorId ->
- if (SharedPreferenceManager.token.isNotBlank()) {
- startActivity(
- Intent(requireActivity(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, creatorId)
- }
- )
- } else {
- (requireActivity() as MainActivity).showLoginActivity()
- }
- }
- )
-
- val recyclerView = binding.rvRankingSalesCount
- recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
- recyclerView.addItemDecoration(
- GridSpacingItemDecoration(
- 2,
- 13.3f.dpToPx().toInt(),
- false
- )
- )
-
- recyclerView.adapter = popularContentByCreatorAdapter
-
- viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.llNoItems.visibility = View.GONE
- recyclerView.visibility = View.VISIBLE
- popularContentByCreatorAdapter.addItems(it)
- } else {
- binding.llNoItems.visibility = View.VISIBLE
- recyclerView.visibility = View.GONE
- }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeRepository.kt
deleted file mode 100644
index f7f8aa66..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeRepository.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.home
-
-import kr.co.vividnext.sodalive.audio_content.AudioContentApi
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.ContentType
-
-class AudioContentMainTabHomeRepository(private val api: AudioContentApi) {
- fun getContentMainHome(token: String) = api.getContentMainHome(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getPopularContentByCreator(
- creatorId: Long,
- token: String
- ) = api.getPopularContentByCreator(
- creatorId,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getContentRanking(sort: String, token: String) = api.getContentMainHomeContentRanking(
- sortType = sort,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeViewModel.kt
deleted file mode 100644
index d042e66d..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/AudioContentMainTabHomeViewModel.kt
+++ /dev/null
@@ -1,175 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.home
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.explorer.GetExplorerSectionResponse
-import kr.co.vividnext.sodalive.settings.event.EventItem
-import kr.co.vividnext.sodalive.settings.notice.NoticeItem
-
-class AudioContentMainTabHomeViewModel(
- private val repository: AudioContentMainTabHomeRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData
- get() = _toastLiveData
-
- private var _isLoading = MutableLiveData(false)
- val isLoading: LiveData
- get() = _isLoading
-
- private var _noticeLiveData = MutableLiveData()
- val noticeLiveData: LiveData
- get() = _noticeLiveData
-
- private var _contentBannerLiveData = MutableLiveData>()
- val contentBannerLiveData: LiveData>
- get() = _contentBannerLiveData
-
- private val _rankCreatorLiveData = MutableLiveData()
- val rankCreatorLiveData: LiveData
- get() = _rankCreatorLiveData
-
- private var _rankSeriesLiveData = MutableLiveData>()
- val rankSeriesLiveData: LiveData>
- get() = _rankSeriesLiveData
-
- private var _rankContentSortListLiveData = MutableLiveData>()
- val rankContentSortListLiveData: LiveData>
- get() = _rankContentSortListLiveData
-
- private var _rankContentLiveData = MutableLiveData>()
- val rankContentLiveData: LiveData>
- get() = _rankContentLiveData
-
- private val _eventLiveData = MutableLiveData>()
- val eventLiveData: LiveData>
- get() = _eventLiveData
-
- private val _contentRankCreatorListLiveData = MutableLiveData>()
- val contentRankCreatorListLiveData: LiveData>
- get() = _contentRankCreatorListLiveData
-
- private val _salesCountRankContentListLiveData =
- MutableLiveData>()
- val salesCountRankContentListLiveData: LiveData>
- get() = _salesCountRankContentListLiveData
-
- fun fetchData() {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getContentMainHome(token = "Bearer ${SharedPreferenceManager.token}")
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- if (it.success && it.data != null) {
- val data = it.data
-
- if (data.latestNotice != null) {
- _noticeLiveData.value = data.latestNotice!!
- }
- _contentBannerLiveData.value = data.bannerList
- _rankCreatorLiveData.value = data.rankCreatorList
- _rankSeriesLiveData.value = data.rankSeriesList
- _rankContentLiveData.value = data.rankContentList
- _rankContentSortListLiveData.value = data.rankSortTypeList
- _eventLiveData.value = data.eventBannerList.eventList
- _contentRankCreatorListLiveData.value = data.contentRankCreatorList
- _salesCountRankContentListLiveData.value =
- data.salesCountRankContentList
- } else {
- if (it.message != null) {
- _toastLiveData.postValue(it.message)
- } else {
- _toastLiveData.postValue(
- "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
- )
- }
- }
-
- _isLoading.value = false
- },
- {
- _isLoading.value = false
- it.message?.let { message -> Logger.e(message) }
- _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getContentRanking(sort: String = "매출") {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getContentRanking(
- sort = sort,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- _isLoading.value = false
- if (it.success && it.data != null) {
- _rankContentLiveData.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("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-
- fun getPopularContentByCreator(creatorId: Long) {
- _isLoading.value = true
- compositeDisposable.add(
- repository.getPopularContentByCreator(
- creatorId = creatorId,
- token = "Bearer ${SharedPreferenceManager.token}"
- )
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- {
- _isLoading.value = false
- if (it.success && it.data != null) {
- _salesCountRankContentListLiveData.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("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
- }
- )
- )
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/GetContentMainTabHomeResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/GetContentMainTabHomeResponse.kt
deleted file mode 100644
index 1613ee0a..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/home/GetContentMainTabHomeResponse.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.home
-
-import androidx.annotation.Keep
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
-import kr.co.vividnext.sodalive.explorer.GetExplorerSectionResponse
-import kr.co.vividnext.sodalive.settings.event.GetEventResponse
-import kr.co.vividnext.sodalive.settings.notice.NoticeItem
-
-@Keep
-data class GetContentMainTabHomeResponse(
- val latestNotice: NoticeItem?,
- val bannerList: List,
- val rankCreatorList: GetExplorerSectionResponse,
- val rankSeriesList: List,
- val rankSortTypeList: List,
- val rankContentList: List,
- val eventBannerList: GetEventResponse,
- val contentRankCreatorList: List,
- val salesCountRankContentList: List
-)
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayFragment.kt
deleted file mode 100644
index 253194d4..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayFragment.kt
+++ /dev/null
@@ -1,448 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.replay
-
-import android.content.Intent
-import android.graphics.Rect
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import android.widget.LinearLayout
-import android.widget.Toast
-import androidx.annotation.OptIn
-import androidx.core.content.ContextCompat
-import androidx.media3.common.util.UnstableApi
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import com.zhpan.bannerview.BaseBannerAdapter
-import com.zhpan.indicator.enums.IndicatorSlideMode
-import com.zhpan.indicator.enums.IndicatorStyle
-import kr.co.vividnext.sodalive.R
-import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentBannerType
-import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainContentAdapter
-import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.AudioContentMainContentCurationAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.ContentRankCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.main.v2.PopularContentByCreatorAdapter
-import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
-import kr.co.vividnext.sodalive.base.BaseFragment
-import kr.co.vividnext.sodalive.common.Constants
-import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
-import kr.co.vividnext.sodalive.common.LoadingDialog
-import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainTabReplayBinding
-import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
-import kr.co.vividnext.sodalive.extensions.dpToPx
-import kr.co.vividnext.sodalive.live.event_banner.EventBannerAdapter
-import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
-import org.koin.android.ext.android.inject
-import kotlin.math.roundToInt
-
-@OptIn(UnstableApi::class)
-class AudioContentMainTabReplayFragment : BaseFragment(
- FragmentAudioContentMainTabReplayBinding::inflate
-) {
- private val viewModel: AudioContentMainTabReplayViewModel by inject()
-
- private lateinit var loadingDialog: LoadingDialog
- private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
- private lateinit var newContentAdapter: AudioContentMainContentAdapter
- private lateinit var curationAdapter: AudioContentMainContentCurationAdapter
- private lateinit var contentRankCreatorAdapter: ContentRankCreatorAdapter
- private lateinit var popularContentByCreatorAdapter: PopularContentByCreatorAdapter
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- setupView()
- bindData()
-
- viewModel.fetchData()
- }
-
- private fun setupView() {
- loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
-
- setupContentBanner()
- setupNewContent()
- setupPopularContentCreator()
- setupPopularContentByCreator()
- setupEventBanner()
- setupCuration()
- }
-
- private fun setupContentBanner() {
- val layoutParams = binding
- .rvBanner
- .layoutParams as LinearLayout.LayoutParams
-
- val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx()
- val pagerHeight = (pagerWidth * 0.53).roundToInt()
- layoutParams.width = pagerWidth.roundToInt()
- layoutParams.height = pagerHeight
-
- contentBannerAdapter = AudioContentMainBannerAdapter(
- requireContext(),
- pagerWidth.roundToInt(),
- pagerHeight
- ) {
- when (it.type) {
- AudioContentBannerType.EVENT -> {
- startActivity(
- Intent(requireContext(), EventDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_EVENT, it.eventItem!!)
- }
- )
- }
-
- AudioContentBannerType.CREATOR -> {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it.creatorId!!)
- }
- )
- }
-
- AudioContentBannerType.SERIES -> {
- startActivity(
- Intent(requireContext(), SeriesDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_SERIES_ID, it.seriesId!!)
- }
- )
- }
-
- AudioContentBannerType.LINK -> {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.link!!)))
- }
- }
- }
-
- binding
- .rvBanner
- .layoutParams = layoutParams
-
- binding.rvBanner.apply {
- adapter = contentBannerAdapter as BaseBannerAdapter
-
- setLifecycleRegistry(lifecycle)
- setScrollDuration(1000)
- setInterval(4 * 1000)
- }.create()
-
- binding
- .rvBanner
- .setIndicatorView(binding.indicatorBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.contentBannerLiveData.observe(viewLifecycleOwner) {
- if (contentBannerAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.rvBanner.visibility = View.GONE
- binding.indicatorBanner.visibility = View.GONE
- } else {
- binding.rvBanner.visibility = View.VISIBLE
- binding.indicatorBanner.visibility = View.VISIBLE
- binding.rvBanner.refreshData(it)
- }
- }
- }
-
- private fun setupNewContent() {
- binding.ivNewContentAll.setOnClickListener {
- startActivity(
- Intent(requireContext(), ReplayNewContentAllActivity::class.java)
- )
- }
-
- newContentAdapter = AudioContentMainContentAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvNewContent.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvNewContent.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 = 6.7f.dpToPx().toInt()
- }
-
- newContentAdapter.itemCount - 1 -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 6.7f.dpToPx().toInt()
- outRect.right = 6.7f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvNewContent.adapter = newContentAdapter
-
- viewModel.newContentListLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.llNewContent.visibility = View.VISIBLE
- newContentAdapter.addItems(it)
- } else {
- binding.llNewContent.visibility = View.GONE
- }
- }
- }
-
- private fun setupPopularContentCreator() {
- contentRankCreatorAdapter = ContentRankCreatorAdapter {
- binding.llNoItems.visibility = View.VISIBLE
- binding.rvRankingSalesCount.visibility = View.GONE
- viewModel.getPopularContentByCreator(it)
- }
-
- binding.rvRankingCreator.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.HORIZONTAL,
- false
- )
-
- binding.rvRankingCreator.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 = 11f.dpToPx().toInt()
- }
-
- contentRankCreatorAdapter.itemCount - 1 -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 0
- }
-
- else -> {
- outRect.left = 11f.dpToPx().toInt()
- outRect.right = 11f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvRankingCreator.adapter = contentRankCreatorAdapter
-
- viewModel.contentCreatorListLiveData.observe(viewLifecycleOwner) {
- contentRankCreatorAdapter.addItems(it)
- if (contentRankCreatorAdapter.itemCount <= 0 && it.isEmpty()) {
- binding.llCreatorContentRanking.visibility = View.GONE
- } else {
- binding.llCreatorContentRanking.visibility = View.VISIBLE
- }
- }
- }
-
- private fun setupPopularContentByCreator() {
- popularContentByCreatorAdapter = PopularContentByCreatorAdapter(
- itemWidth = ((screenWidth - 13.3f.dpToPx() * 3) / 2).toInt(),
- onClickItem = { contentId ->
- startActivity(
- Intent(requireActivity(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
- }
- )
- },
- onClickCreator = { creatorId ->
- startActivity(
- Intent(requireActivity(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, creatorId)
- }
- )
- }
- )
-
- val recyclerView = binding.rvRankingSalesCount
- recyclerView.layoutManager = GridLayoutManager(requireContext(), 2)
- recyclerView.addItemDecoration(
- GridSpacingItemDecoration(
- 2,
- 13.3f.dpToPx().toInt(),
- false
- )
- )
-
- recyclerView.adapter = popularContentByCreatorAdapter
-
- viewModel.salesCountRankContentListLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.llNoItems.visibility = View.GONE
- recyclerView.visibility = View.VISIBLE
- popularContentByCreatorAdapter.addItems(it)
- } else {
- binding.llNoItems.visibility = View.VISIBLE
- recyclerView.visibility = View.GONE
- }
- }
- }
-
- private fun setupEventBanner() {
- val imageSliderLp = binding.eventBannerSlider.layoutParams
- imageSliderLp.width = screenWidth
- imageSliderLp.height = (screenWidth * 300) / 1000
- binding.eventBannerSlider.layoutParams = imageSliderLp
-
- binding.eventBannerSlider.apply {
- adapter = EventBannerAdapter(requireContext()) {
- if (it.detailImageUrl != null) {
- val intent = Intent(requireActivity(), EventDetailActivity::class.java)
- intent.putExtra(Constants.EXTRA_EVENT, it)
- startActivity(intent)
- } else if (!it.link.isNullOrBlank()) {
- startActivity(
- Intent(
- Intent.ACTION_VIEW,
- Uri.parse(it.link)
- )
- )
- }
- } as BaseBannerAdapter
- setLifecycleRegistry(lifecycle)
- setScrollDuration(800)
- }.create()
-
- binding.eventBannerSlider
- .setIndicatorView(binding.indicatorEventBanner)
- .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(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
- .setIndicatorHeight(4f.dpToPx().toInt())
-
- viewModel.eventLiveData.observe(viewLifecycleOwner) {
- if (it.isNotEmpty()) {
- binding.eventBannerSlider.visibility = View.VISIBLE
- binding.indicatorEventBanner.visibility = View.VISIBLE
- binding.eventBannerSlider.refreshData(it)
- } else {
- binding.eventBannerSlider.visibility = View.GONE
- binding.indicatorEventBanner.visibility = View.GONE
- }
- }
- }
-
- private fun setupCuration() {
- curationAdapter = AudioContentMainContentCurationAdapter(
- onClickItem = {
- startActivity(
- Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
- putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
- }
- )
- },
- onClickCreator = {
- startActivity(
- Intent(requireContext(), UserProfileActivity::class.java).apply {
- putExtra(Constants.EXTRA_USER_ID, it)
- }
- )
- }
- )
-
- binding.rvCuration.layoutManager = LinearLayoutManager(
- context,
- LinearLayoutManager.VERTICAL,
- false
- )
-
- binding.rvCuration.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.top = 30f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
-
- curationAdapter.itemCount - 1 -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 30f.dpToPx().toInt()
- }
-
- else -> {
- outRect.top = 15f.dpToPx().toInt()
- outRect.bottom = 15f.dpToPx().toInt()
- }
- }
- }
- })
-
- binding.rvCuration.adapter = curationAdapter
-
- viewModel.curationListLiveData.observe(viewLifecycleOwner) {
- curationAdapter.addItems(it)
-
- binding.rvCuration.visibility = if (curationAdapter.itemCount <= 0 && it.isEmpty()) {
- View.GONE
- } else {
- View.VISIBLE
- }
- }
- }
-
- private fun bindData() {
- viewModel.toastLiveData.observe(viewLifecycleOwner) {
- it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
- }
-
- viewModel.isLoading.observe(viewLifecycleOwner) {
- if (it) {
- loadingDialog.show(screenWidth)
- } else {
- loadingDialog.dismiss()
- }
- }
- }
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayRepository.kt
deleted file mode 100644
index d4f579c1..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayRepository.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.replay
-
-import kr.co.vividnext.sodalive.audio_content.AudioContentApi
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.ContentType
-
-class AudioContentMainTabReplayRepository(private val api: AudioContentApi) {
- fun getContentMainReplay(token: String) = api.getContentMainReplay(
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-
- fun getPopularContentByCreator(
- creatorId: Long,
- token: String
- ) = api.getPopularReplayContentByCreator(
- creatorId,
- isAdultContentVisible = SharedPreferenceManager.isAdultContentVisible,
- contentType = ContentType.values()[SharedPreferenceManager.contentPreference],
- authHeader = token
- )
-}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayViewModel.kt
deleted file mode 100644
index 2ac591b5..00000000
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/replay/AudioContentMainTabReplayViewModel.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-package kr.co.vividnext.sodalive.audio_content.main.v2.replay
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.MutableLiveData
-import com.orhanobut.logger.Logger
-import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
-import io.reactivex.rxjava3.schedulers.Schedulers
-import kr.co.vividnext.sodalive.audio_content.main.ContentCreatorResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem
-import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
-import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse
-import kr.co.vividnext.sodalive.base.BaseViewModel
-import kr.co.vividnext.sodalive.common.SharedPreferenceManager
-import kr.co.vividnext.sodalive.settings.event.EventItem
-
-class AudioContentMainTabReplayViewModel(
- private val repository: AudioContentMainTabReplayRepository
-) : BaseViewModel() {
- private val _toastLiveData = MutableLiveData()
- val toastLiveData: LiveData