From 8ddf85c1bebbab6d9b0b38380eb692a1f1f7bcc1 Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 13 Dec 2023 15:58:31 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20API=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=86=8D?= =?UTF-8?q?=EB=8F=84=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/audio_content/AudioContentApi.kt | 31 ++- .../audio_content/AudioContentRepository.kt | 15 +- .../all/AudioContentNewAllActivity.kt | 2 +- .../all/AudioContentRankingAllActivity.kt | 2 +- .../main/AudioContentMainFragment.kt | 234 +++++++++++------- .../main/AudioContentMainViewModel.kt | 166 ------------- .../main/GetAudioContentMainResponse.kt | 12 - .../AudioContentMainBannerAdapter.kt | 3 +- .../banner/AudioContentMainBannerViewModel.kt | 54 ++++ .../AudioContentMainCurationAdapter.kt | 10 +- .../AudioContentMainCurationViewModel.kt | 85 +++++++ .../AudioContentMainNewContentThemeAdapter.kt | 2 +- .../AudioContentMainNewContentViewModel.kt | 96 +++++++ ...udioContentMainNewContentCreatorAdapter.kt | 3 +- ...ioContentMainNewContentCreatorViewModel.kt | 57 +++++ .../AudioContentMainOrderListViewModel.kt | 54 ++++ .../AudioContentMainRankingAdapter.kt | 3 +- .../AudioContentMainRankingViewModel.kt | 86 +++++++ .../java/kr/co/vividnext/sodalive/di/AppDI.kt | 14 +- .../layout/fragment_audio_content_main.xml | 18 +- 20 files changed, 664 insertions(+), 283 deletions(-) delete mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainViewModel.kt rename app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/{ => banner}/AudioContentMainBannerAdapter.kt (92%) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerViewModel.kt rename app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/{ => curation}/AudioContentMainCurationAdapter.kt (91%) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationViewModel.kt rename app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/{ => new_content}/AudioContentMainNewContentThemeAdapter.kt (97%) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentViewModel.kt rename app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/{ => new_content_upload_creator}/AudioContentMainNewContentCreatorAdapter.kt (91%) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content_upload_creator/AudioContentMainNewContentCreatorViewModel.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/order/AudioContentMainOrderListViewModel.kt rename app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/{ => ranking}/AudioContentMainRankingAdapter.kt (94%) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingViewModel.kt 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 c44078a..757857f 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 @@ -10,9 +10,11 @@ import kr.co.vividnext.sodalive.audio_content.detail.GetAudioContentDetailRespon import kr.co.vividnext.sodalive.audio_content.detail.PutAudioContentLikeRequest import kr.co.vividnext.sodalive.audio_content.detail.PutAudioContentLikeResponse import kr.co.vividnext.sodalive.audio_content.donation.AudioContentDonationRequest +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.GetAudioContentMainResponse import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRanking +import kr.co.vividnext.sodalive.audio_content.main.GetNewContentUploadCreator 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.upload.theme.GetAudioContentThemeResponse @@ -125,11 +127,6 @@ interface AudioContentApi { @Header("Authorization") authHeader: String ): Single> - @GET("/audio-content/main") - fun getMain( - @Header("Authorization") authHeader: String - ): Single> - @GET("/audio-content/main/new") fun getNewContentOfTheme( @Query("theme") theme: String, @@ -182,4 +179,26 @@ interface AudioContentApi { @Query("sort-type") sortType: String, @Header("Authorization") authHeader: String ): Single> + + @GET("/audio-content/main/curation-list") + fun getCurationList( + @Query("page") page: Int, + @Query("size") size: Int, + @Header("Authorization") authHeader: String + ): Single>> + + @GET("/audio-content/main/new-content-upload-creator") + fun getNewContentUploadCreatorList( + @Header("Authorization") authHeader: String + ): Single>> + + @GET("/audio-content/main/banner-list") + fun getMainBannerList( + @Header("Authorization") authHeader: String + ): Single>> + + @GET("/audio-content/main/order-list") + fun getMainOrderList( + @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 4db1c5d..6554426 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 @@ -129,8 +129,6 @@ class AudioContentRepository( token: String ) = api.likeContent(request, authHeader = token) - fun getMain(token: String) = api.getMain(authHeader = token) - fun getNewContentOfTheme(theme: String, token: String) = api.getNewContentOfTheme( theme = theme, authHeader = token @@ -177,4 +175,17 @@ class AudioContentRepository( sortType = sortType, authHeader = token ) + + fun getCurationList(page: Int, size: Int, token: String) = api.getCurationList( + page = page - 1, + size = size, + authHeader = token + ) + + fun getNewContentUploadCreatorList( + token: String + ) = api.getNewContentUploadCreatorList(authHeader = token) + + fun getMainBannerList(token: String) = api.getMainBannerList(authHeader = token) + fun getMainOrderList(token: String) = api.getMainOrderList(authHeader = token) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt index 4daa4b6..2b64be6 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentNewAllActivity.kt @@ -9,7 +9,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity -import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainNewContentThemeAdapter +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.LoadingDialog diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentRankingAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentRankingAllActivity.kt index 5d41f61..31ed498 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentRankingAllActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/AudioContentRankingAllActivity.kt @@ -9,7 +9,7 @@ import android.widget.Toast import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity -import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainNewContentThemeAdapter +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.LoadingDialog 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 index f6afef0..4b7c9f0 100644 --- 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 @@ -22,11 +22,21 @@ 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.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.new_content_upload_creator.AudioContentMainNewContentCreatorAdapter +import kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator.AudioContentMainNewContentCreatorViewModel +import kr.co.vividnext.sodalive.audio_content.main.order.AudioContentMainOrderListViewModel +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.order.AudioContentOrderListActivity 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.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainBinding import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity @@ -39,32 +49,37 @@ import kotlin.math.roundToInt class AudioContentMainFragment : BaseFragment( FragmentAudioContentMainBinding::inflate ) { - private val viewModel: AudioContentMainViewModel by inject() - - private lateinit var loadingDialog: LoadingDialog - private lateinit var imm: InputMethodManager - + private val newContentCreatorViewModel: AudioContentMainNewContentCreatorViewModel by inject() private lateinit var newContentCreatorAdapter: AudioContentMainNewContentCreatorAdapter + + private val bannerViewModel: AudioContentMainBannerViewModel by inject() private lateinit var bannerAdapter: AudioContentMainBannerAdapter + + private val orderListViewModel: AudioContentMainOrderListViewModel by inject() private lateinit var orderListAdapter: AudioContentMainContentAdapter + + 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) - - loadingDialog = LoadingDialog(requireActivity(), layoutInflater) - imm = requireContext().getSystemService( - Service.INPUT_METHOD_SERVICE - ) as InputMethodManager - setupView() - bindData() - viewModel.getMain() + curationViewModel.getCurationList() + bannerViewModel.getMainBannerList() + newContentViewModel.getThemeList() + newContentViewModel.getNewContentOfTheme("전체") + contentRankingViewModel.getContentRanking() + contentRankingViewModel.getContentRankingSortType() + newContentCreatorViewModel.getNewContentUploadCreatorList() } private fun setupView() { @@ -93,7 +108,13 @@ class AudioContentMainFragment : BaseFragment( binding.swipeRefreshLayout.setOnRefreshListener { binding.swipeRefreshLayout.isRefreshing = false - viewModel.getMain() + curationViewModel.refresh() + bannerViewModel.getMainBannerList() + newContentViewModel.getThemeList() + newContentViewModel.getNewContentOfTheme("전체") + contentRankingViewModel.getContentRanking() + contentRankingViewModel.getContentRankingSortType() + newContentCreatorViewModel.getNewContentUploadCreatorList() } } @@ -139,6 +160,21 @@ class AudioContentMainFragment : BaseFragment( }) binding.rvNewContentCreator.adapter = newContentCreatorAdapter + + newContentCreatorViewModel.newContentUploadCreatorListLiveData.observe(viewLifecycleOwner) { + newContentCreatorAdapter.addItems(it) + binding.rvNewContentCreator.visibility = if ( + newContentCreatorAdapter.itemCount <= 0 && it.isEmpty() + ) { + View.GONE + } else { + View.VISIBLE + } + } + + newContentCreatorViewModel.toastLiveData.observe(viewLifecycleOwner) { + it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } + } } private fun setupBanner() { @@ -203,6 +239,21 @@ class AudioContentMainFragment : BaseFragment( ) .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 setupOrderList() { @@ -261,11 +312,26 @@ class AudioContentMainFragment : BaseFragment( binding.tvMyStashViewAll.setOnClickListener { startActivity(Intent(requireContext(), AudioContentOrderListActivity::class.java)) } + + orderListViewModel.orderListLiveData.observe(viewLifecycleOwner) { + orderListAdapter.addItems(it) + binding.llMyStash.visibility = if ( + orderListAdapter.itemCount <= 0 && it.isEmpty() + ) { + View.GONE + } else { + View.VISIBLE + } + } + + orderListViewModel.toastLiveData.observe(viewLifecycleOwner) { + it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } + } } private fun setupNewContentTheme() { newContentThemeAdapter = AudioContentMainNewContentThemeAdapter { - viewModel.getNewContentOfTheme(theme = it) + newContentViewModel.getNewContentOfTheme(theme = it) } binding.rvNewContentTheme.layoutManager = LinearLayoutManager( @@ -303,6 +369,11 @@ class AudioContentMainFragment : BaseFragment( }) binding.rvNewContentTheme.adapter = newContentThemeAdapter + + newContentViewModel.themeListLiveData.observe(viewLifecycleOwner) { + binding.llNewContent.visibility = View.VISIBLE + newContentThemeAdapter.addItems(it) + } } private fun setupNewContent() { @@ -362,11 +433,27 @@ class AudioContentMainFragment : BaseFragment( }) 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 { - viewModel.getContentRanking(sort = it) + contentRankingViewModel.getContentRanking(sort = it) } binding.rvContentRankingSort.layoutManager = LinearLayoutManager( @@ -404,8 +491,14 @@ class AudioContentMainFragment : BaseFragment( }) 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)) @@ -444,6 +537,16 @@ class AudioContentMainFragment : BaseFragment( }) 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() { @@ -506,85 +609,50 @@ class AudioContentMainFragment : BaseFragment( } } }) + + 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 - } - @SuppressLint("SetTextI18n") - private fun bindData() { - viewModel.isLoading.observe(viewLifecycleOwner) { - if (it) { - loadingDialog.show(screenWidth) - } else { - loadingDialog.dismiss() + curationViewModel.curationListLiveData.observe(viewLifecycleOwner) { + if (curationViewModel.page == 2) { + curationAdapter.clear() } - } - viewModel.toastLiveData.observe(viewLifecycleOwner) { - it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } - } - - viewModel.newContentUploadCreatorListLiveData.observe(viewLifecycleOwner) { - newContentCreatorAdapter.addItems(it) - binding.rvNewContentCreator.visibility = if ( - newContentCreatorAdapter.itemCount <= 0 && it.isEmpty() - ) { - View.GONE - } else { - View.VISIBLE - } - } - - viewModel.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) - } - } - - viewModel.orderListLiveData.observe(viewLifecycleOwner) { - orderListAdapter.addItems(it) - binding.llMyStash.visibility = if ( - orderListAdapter.itemCount <= 0 && it.isEmpty() - ) { - View.GONE - } else { - View.VISIBLE - } - } - - viewModel.newContentListLiveData.observe(viewLifecycleOwner) { - newContentAdapter.addItems(it) - } - - viewModel.themeListLiveData.observe(viewLifecycleOwner) { - binding.llNewContent.visibility = View.VISIBLE - newContentThemeAdapter.addItems(it) - } - - viewModel.curationListLiveData.observe(viewLifecycleOwner) { curationAdapter.addItems(it) - binding.rvCuration.visibility = if ( - curationAdapter.itemCount <= 0 && it.isEmpty() - ) { + + binding.rvCuration.visibility = if (curationAdapter.itemCount <= 0 && it.isEmpty()) { View.GONE } else { View.VISIBLE } } - viewModel.contentRankingSortListLiveData.observe(viewLifecycleOwner) { - binding.llContentRanking.visibility = View.VISIBLE - contentRankingSortAdapter.addItems(it) + curationViewModel.isLoading.observe(viewLifecycleOwner) { + binding.pbCuration.visibility = if (it) { + View.VISIBLE + } else { + View.GONE + } } - viewModel.contentRankingLiveData.observe(viewLifecycleOwner) { - binding.llContentRanking.visibility = View.VISIBLE - binding.tvDate.text = "${it.startDate}~${it.endDate}" - contentRankingAdapter.addItems(it.items) + 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/AudioContentMainViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainViewModel.kt deleted file mode 100644 index 7c4dddf..0000000 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainViewModel.kt +++ /dev/null @@ -1,166 +0,0 @@ -package kr.co.vividnext.sodalive.audio_content.main - -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 - -class AudioContentMainViewModel( - 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 _newContentUploadCreatorListLiveData = - MutableLiveData>() - val newContentUploadCreatorListLiveData: LiveData> - get() = _newContentUploadCreatorListLiveData - - private var _newContentListLiveData = MutableLiveData>() - val newContentListLiveData: LiveData> - get() = _newContentListLiveData - - private var _bannerLiveData = MutableLiveData>() - val bannerLiveData: LiveData> - get() = _bannerLiveData - - private var _orderListLiveData = MutableLiveData>() - val orderListLiveData: LiveData> - get() = _orderListLiveData - - private var _themeListLiveData = MutableLiveData>() - val themeListLiveData: LiveData> - get() = _themeListLiveData - - private var _curationListLiveData = MutableLiveData>() - val curationListLiveData: LiveData> - get() = _curationListLiveData - - private var _contentRankingSortListLiveData = MutableLiveData>() - val contentRankingSortListLiveData: LiveData> - get() = _contentRankingSortListLiveData - - private var _contentRankingLiveData = MutableLiveData() - val contentRankingLiveData: LiveData - get() = _contentRankingLiveData - - fun getMain() { - _isLoading.value = true - compositeDisposable.add( - repository.getMain(token = "Bearer ${SharedPreferenceManager.token}") - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe( - { - if (it.success && it.data != null) { - val data = it.data - _newContentUploadCreatorListLiveData.value = - data.newContentUploadCreatorList - _newContentListLiveData.value = data.newContentList - _orderListLiveData.value = data.orderList - _bannerLiveData.value = data.bannerList - _curationListLiveData.value = data.curationList - _contentRankingLiveData.value = data.contentRanking - _contentRankingSortListLiveData.value = data.contentRankingSortTypeList - - val themeList = listOf("전체").union(data.themeList).toList() - _themeListLiveData.value = 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) { - 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( - "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." - ) - } - } - }, - { - it.message?.let { message -> Logger.e(message) } - _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") - } - ) - ) - } - - fun getContentRanking(sort: String) { - _isLoading.value = true - 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) { - _isLoading.value = false - _contentRankingLiveData.value = it.data!! - } else { - _isLoading.value = false - 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/GetAudioContentMainResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt index 3087a50..ec746d3 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 @@ -3,18 +3,6 @@ package kr.co.vividnext.sodalive.audio_content.main import com.google.gson.annotations.SerializedName import kr.co.vividnext.sodalive.settings.event.EventItem -data class GetAudioContentMainResponse( - @SerializedName("newContentUploadCreatorList") - val newContentUploadCreatorList: List, - @SerializedName("bannerList") val bannerList: List, - @SerializedName("orderList") val orderList: List, - @SerializedName("themeList") val themeList: List, - @SerializedName("newContentList") val newContentList: List, - @SerializedName("curationList") val curationList: List, - @SerializedName("contentRankingSortTypeList") val contentRankingSortTypeList: List, - @SerializedName("contentRanking") val contentRanking: GetAudioContentRanking -) - data class GetNewContentUploadCreator( @SerializedName("creatorId") val creatorId: Long, @SerializedName("creatorNickname") val creatorNickname: String, diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainBannerAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerAdapter.kt similarity index 92% rename from app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainBannerAdapter.kt rename to app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerAdapter.kt index 4cda6fc..1ec8352 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainBannerAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerAdapter.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.audio_content.main +package kr.co.vividnext.sodalive.audio_content.main.banner import android.content.Context import android.graphics.Bitmap @@ -11,6 +11,7 @@ import com.bumptech.glide.request.transition.Transition import com.zhpan.bannerview.BaseBannerAdapter import com.zhpan.bannerview.BaseViewHolder import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse class AudioContentMainBannerAdapter( private val context: Context, 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 new file mode 100644 index 0000000..ae3f52a --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/banner/AudioContentMainBannerViewModel.kt @@ -0,0 +1,54 @@ +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/AudioContentMainCurationAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationAdapter.kt similarity index 91% rename from app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainCurationAdapter.kt rename to app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationAdapter.kt index 54012ae..7a8aa8e 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainCurationAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationAdapter.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.audio_content.main +package kr.co.vividnext.sodalive.audio_content.main.curation import android.annotation.SuppressLint import android.content.Context @@ -8,6 +8,9 @@ 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 @@ -89,8 +92,11 @@ class AudioContentMainCurationAdapter( @SuppressLint("NotifyDataSetChanged") fun addItems(items: List) { - this.items.clear() 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 new file mode 100644 index 0000000..50aa4c1 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/curation/AudioContentMainCurationViewModel.kt @@ -0,0 +1,85 @@ +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/AudioContentMainNewContentThemeAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentThemeAdapter.kt similarity index 97% rename from app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainNewContentThemeAdapter.kt rename to app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentThemeAdapter.kt index 57d749a..d6669d9 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainNewContentThemeAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentThemeAdapter.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.audio_content.main +package kr.co.vividnext.sodalive.audio_content.main.new_content import android.annotation.SuppressLint import android.content.Context 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 new file mode 100644 index 0000000..f3daa8b --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content/AudioContentMainNewContentViewModel.kt @@ -0,0 +1,96 @@ +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) { + 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( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainNewContentCreatorAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content_upload_creator/AudioContentMainNewContentCreatorAdapter.kt similarity index 91% rename from app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainNewContentCreatorAdapter.kt rename to app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content_upload_creator/AudioContentMainNewContentCreatorAdapter.kt index d884e11..d620717 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainNewContentCreatorAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content_upload_creator/AudioContentMainNewContentCreatorAdapter.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.audio_content.main +package kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator import android.annotation.SuppressLint import android.view.LayoutInflater @@ -7,6 +7,7 @@ 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.GetNewContentUploadCreator import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainNewContentCreatorBinding class AudioContentMainNewContentCreatorAdapter( diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content_upload_creator/AudioContentMainNewContentCreatorViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content_upload_creator/AudioContentMainNewContentCreatorViewModel.kt new file mode 100644 index 0000000..c152c61 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/new_content_upload_creator/AudioContentMainNewContentCreatorViewModel.kt @@ -0,0 +1,57 @@ +package kr.co.vividnext.sodalive.audio_content.main.new_content_upload_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.AudioContentRepository +import kr.co.vividnext.sodalive.audio_content.main.GetNewContentUploadCreator +import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.common.SharedPreferenceManager + +class AudioContentMainNewContentCreatorViewModel( + private val repository: AudioContentRepository +) : BaseViewModel() { + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData + get() = _toastLiveData + + private var _newContentUploadCreatorListLiveData = + MutableLiveData>() + val newContentUploadCreatorListLiveData: LiveData> + get() = _newContentUploadCreatorListLiveData + + fun getNewContentUploadCreatorList() { + compositeDisposable.add( + repository.getNewContentUploadCreatorList( + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + if (it.success && it.data != null) { + _newContentUploadCreatorListLiveData.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/order/AudioContentMainOrderListViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/order/AudioContentMainOrderListViewModel.kt new file mode 100644 index 0000000..f43db2e --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/order/AudioContentMainOrderListViewModel.kt @@ -0,0 +1,54 @@ +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/AudioContentMainRankingAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingAdapter.kt similarity index 94% rename from app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainRankingAdapter.kt rename to app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingAdapter.kt index 4afe573..c0fad45 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainRankingAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingAdapter.kt @@ -1,4 +1,4 @@ -package kr.co.vividnext.sodalive.audio_content.main +package kr.co.vividnext.sodalive.audio_content.main.ranking import android.annotation.SuppressLint import android.view.LayoutInflater @@ -7,6 +7,7 @@ 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 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 new file mode 100644 index 0000000..6e24ffd --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/ranking/AudioContentMainRankingViewModel.kt @@ -0,0 +1,86 @@ +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/di/AppDI.kt b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt index 2c037bf..f869678 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt @@ -14,7 +14,12 @@ import kr.co.vividnext.sodalive.audio_content.comment.AudioContentCommentReplyVi import kr.co.vividnext.sodalive.audio_content.comment.AudioContentCommentRepository import kr.co.vividnext.sodalive.audio_content.curation.AudioContentCurationViewModel import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailViewModel -import kr.co.vividnext.sodalive.audio_content.main.AudioContentMainViewModel +import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerViewModel +import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCurationViewModel +import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentViewModel +import kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator.AudioContentMainNewContentCreatorViewModel +import kr.co.vividnext.sodalive.audio_content.main.order.AudioContentMainOrderListViewModel +import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingViewModel import kr.co.vividnext.sodalive.audio_content.modify.AudioContentModifyViewModel import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListViewModel import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadViewModel @@ -183,7 +188,12 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { viewModel { SettingsViewModel(get()) } viewModel { TextMessageDetailViewModel(get()) } viewModel { LiveReservationStatusViewModel(get()) } - viewModel { AudioContentMainViewModel(get()) } + viewModel { AudioContentMainBannerViewModel(get()) } + viewModel { AudioContentMainRankingViewModel(get()) } + viewModel { AudioContentMainCurationViewModel(get()) } + viewModel { AudioContentMainOrderListViewModel(get()) } + viewModel { AudioContentMainNewContentViewModel(get()) } + viewModel { AudioContentMainNewContentCreatorViewModel(get()) } viewModel { AudioContentViewModel(get()) } viewModel { AudioContentOrderListViewModel(get()) } viewModel { AudioContentUploadViewModel(get()) } diff --git a/app/src/main/res/layout/fragment_audio_content_main.xml b/app/src/main/res/layout/fragment_audio_content_main.xml index e0ee5b1..a89542f 100644 --- a/app/src/main/res/layout/fragment_audio_content_main.xml +++ b/app/src/main/res/layout/fragment_audio_content_main.xml @@ -43,8 +43,7 @@ android:id="@+id/rv_banner" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="13.3dp" - android:visibility="gone" /> + android:layout_marginHorizontal="13.3dp" /> + + + android:clipToPadding="false" /> + +