From a2cbeb87d53651f1fdb8157be1d46716f58be507 Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 14 Feb 2024 02:10:30 +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=20-=20=EC=88=8F=ED=94=8C,=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=20=EB=8B=A4=EC=8B=9C=20=EB=93=A3=EA=B8=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 + .../sodalive/audio_content/AudioContentApi.kt | 10 + .../audio_content/AudioContentRepository.kt | 14 ++ .../AudioContentAllByThemeActivity.kt | 191 ++++++++++++++++++ .../AudioContentAllByThemeViewModel.kt | 86 ++++++++ .../all/by_theme/GetContentByThemeResponse.kt | 10 + .../main/AudioContentMainFragment.kt | 17 ++ .../co/vividnext/sodalive/common/Constants.kt | 1 + .../java/kr/co/vividnext/sodalive/di/AppDI.kt | 2 + .../sodalive/live/room/LiveRoomViewModel.kt | 1 - .../res/drawable-xxhdpi/ic_short_play.png | Bin 0 -> 1375 bytes .../drawable-xxhdpi/ic_thumb_play_blue.png | Bin 0 -> 3001 bytes .../drawable/bg_round_corner_2_6_ecf9ff.xml | 8 + .../drawable/bg_round_corner_2_6_ffecf7.xml | 8 + .../activity_audio_content_all_by_theme.xml | 98 +++++++++ .../layout/fragment_audio_content_main.xml | 75 ++++++- app/src/main/res/values/colors.xml | 4 + 17 files changed, 524 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeViewModel.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/GetContentByThemeResponse.kt create mode 100644 app/src/main/res/drawable-xxhdpi/ic_short_play.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_thumb_play_blue.png create mode 100644 app/src/main/res/drawable/bg_round_corner_2_6_ecf9ff.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_2_6_ffecf7.xml create mode 100644 app/src/main/res/layout/activity_audio_content_all_by_theme.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b95e2f3..7354621 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -128,6 +128,7 @@ + >> + @GET("/audio-content/theme/{id}/content") + fun getAudioContentByTheme( + @Path("id") id: Long, + @Query("page") page: Int, + @Query("size") size: Int, + @Query("sort-type") sort: AudioContentViewModel.Sort, + @Header("Authorization") authHeader: String + ): Single> + @POST("/audio-content") @Multipart fun uploadAudioContent( 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 278e5da..e8c7e22 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 @@ -206,4 +206,18 @@ class AudioContentRepository( creatorId: Long, token: String ) = categoryApi.getCategoryList(creatorId, authHeader = token) + + fun getAudioContentByTheme( + themeId: Long, + page: Int, + size: Int, + sort: AudioContentViewModel.Sort = AudioContentViewModel.Sort.NEWEST, + token: String + ) = api.getAudioContentByTheme( + id = themeId, + page = page - 1, + size = size, + sort = sort, + authHeader = token + ) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt new file mode 100644 index 0000000..4b284a0 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeActivity.kt @@ -0,0 +1,191 @@ +package kr.co.vividnext.sodalive.audio_content.all.by_theme + +import android.content.Intent +import android.graphics.Rect +import android.os.Bundle +import android.view.View +import android.widget.TextView +import android.widget.Toast +import androidx.core.content.ContextCompat +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.LoadingDialog +import kr.co.vividnext.sodalive.databinding.ActivityAudioContentAllByThemeBinding +import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity +import kr.co.vividnext.sodalive.extensions.dpToPx +import org.koin.android.ext.android.inject + +class AudioContentAllByThemeActivity : BaseActivity( + ActivityAudioContentAllByThemeBinding::inflate +) { + private val viewModel: AudioContentAllByThemeViewModel by inject() + + private lateinit var loadingDialog: LoadingDialog + private lateinit var adapter: AudioContentNewAllAdapter + + private var themeId: Long = 0 + + override fun onCreate(savedInstanceState: Bundle?) { + themeId = intent.getLongExtra(Constants.EXTRA_THEME_ID, 0) + + if (themeId <= 0) { + Toast.makeText( + applicationContext, + "잘못된 요청입니다.\n다시 시도해 주세요.", + Toast.LENGTH_LONG + ).show() + + finish() + } + + super.onCreate(savedInstanceState) + + bindData() + viewModel.getContentList(themeId = themeId) + } + + override fun setupView() { + loadingDialog = LoadingDialog(this, layoutInflater) + binding.toolbar.tvBack.setOnClickListener { finish() } + + adapter = AudioContentNewAllAdapter( + itemWidth = (screenWidth - 54f.dpToPx().toInt()) / 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.rvContentAll.layoutManager = GridLayoutManager(this, 3) + + binding.rvContentAll.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + outRect.left = 6.7f.dpToPx().toInt() + outRect.right = 6.7f.dpToPx().toInt() + } + }) + + binding.rvContentAll.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(themeId = themeId) + } + } + }) + + binding.rvContentAll.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) + } + } + + 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.rvContentAll.scrollToPosition(0) + } + + binding.tvTotalCount.text = "${it.totalCount}" + binding.toolbar.tvBack.text = it.theme + 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(themeId = themeId) + } + } + + 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/all/by_theme/AudioContentAllByThemeViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeViewModel.kt new file mode 100644 index 0000000..4879607 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/AudioContentAllByThemeViewModel.kt @@ -0,0 +1,86 @@ +package kr.co.vividnext.sodalive.audio_content.all.by_theme + +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 AudioContentAllByThemeViewModel( + 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 = 15 + + fun getContentList(themeId: Long) { + if (!_isLoading.value!! && !isLast) { + _isLoading.value = true + + compositeDisposable.add( + repository.getAudioContentByTheme( + themeId = themeId, + 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/all/by_theme/GetContentByThemeResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/GetContentByThemeResponse.kt new file mode 100644 index 0000000..bec1a38 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/all/by_theme/GetContentByThemeResponse.kt @@ -0,0 +1,10 @@ +package kr.co.vividnext.sodalive.audio_content.all.by_theme + +import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem + +data class GetContentByThemeResponse( + @SerializedName("theme") val theme: String, + @SerializedName("totalCount") val totalCount: Int, + @SerializedName("items") val items: List +) 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 4b7c9f0..6d4d7a2 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 @@ -20,6 +20,7 @@ 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.curation.AudioContentCurationActivity import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerAdapter @@ -116,6 +117,22 @@ class AudioContentMainFragment : BaseFragment( contentRankingViewModel.getContentRankingSortType() newContentCreatorViewModel.getNewContentUploadCreatorList() } + + binding.llShortPlay.setOnClickListener { + startActivity( + Intent(requireContext(), AudioContentAllByThemeActivity::class.java).apply { + putExtra(Constants.EXTRA_THEME_ID, 11L) + } + ) + } + + binding.llReviewLive.setOnClickListener { + startActivity( + Intent(requireContext(), AudioContentAllByThemeActivity::class.java).apply { + putExtra(Constants.EXTRA_THEME_ID, 7L) + } + ) + } } private fun setupNewContentCreator() { diff --git a/app/src/main/java/kr/co/vividnext/sodalive/common/Constants.kt b/app/src/main/java/kr/co/vividnext/sodalive/common/Constants.kt index 1eab262..752831f 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/common/Constants.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/common/Constants.kt @@ -23,6 +23,7 @@ object Constants { const val EXTRA_NOTICE = "extra_notice" const val EXTRA_ROOM_ID = "extra_room_id" const val EXTRA_USER_ID = "extra_user_id" + const val EXTRA_THEME_ID = "extra_theme_id" const val EXTRA_NICKNAME = "extra_nickname" const val EXTRA_MESSAGE_ID = "extra_message_id" const val EXTRA_ROOM_DETAIL = "extra_room_detail" 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 e72f6f1..c34761d 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 @@ -9,6 +9,7 @@ import kr.co.vividnext.sodalive.audio_content.AudioContentViewModel import kr.co.vividnext.sodalive.audio_content.PlaybackTrackingRepository import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllViewModel import kr.co.vividnext.sodalive.audio_content.all.AudioContentRankingAllViewModel +import kr.co.vividnext.sodalive.audio_content.all.by_theme.AudioContentAllByThemeViewModel import kr.co.vividnext.sodalive.audio_content.category.CategoryApi import kr.co.vividnext.sodalive.audio_content.comment.AudioContentCommentListViewModel import kr.co.vividnext.sodalive.audio_content.comment.AudioContentCommentReplyViewModel @@ -220,6 +221,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { viewModel { UserProfileDonationAllViewModel(get(), get()) } viewModel { AudioContentCurationViewModel(get()) } viewModel { AudioContentNewAllViewModel(get()) } + viewModel { AudioContentAllByThemeViewModel(get()) } viewModel { AudioContentRankingAllViewModel(get()) } viewModel { RouletteSettingsViewModel(get()) } viewModel { CreatorCommunityAllViewModel(get(), get()) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt index 59e33c3..09f0aa9 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomViewModel.kt @@ -192,7 +192,6 @@ class LiveRoomViewModel( { if (it.success && it.data != null) { roomInfoResponse = it.data - Logger.e("data: ${it.data}") _roomInfoLiveData.postValue(roomInfoResponse) if (_coverImageUrlLiveData.value!! != roomInfoResponse.coverImageUrl) { diff --git a/app/src/main/res/drawable-xxhdpi/ic_short_play.png b/app/src/main/res/drawable-xxhdpi/ic_short_play.png new file mode 100644 index 0000000000000000000000000000000000000000..51b75d6217ed2276381a8312dc4ae2831be45eb9 GIT binary patch literal 1375 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 + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_2_6_ffecf7.xml b/app/src/main/res/drawable/bg_round_corner_2_6_ffecf7.xml new file mode 100644 index 0000000..c239b8b --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_2_6_ffecf7.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_audio_content_all_by_theme.xml b/app/src/main/res/layout/activity_audio_content_all_by_theme.xml new file mode 100644 index 0000000..21033d7 --- /dev/null +++ b/app/src/main/res/layout/activity_audio_content_all_by_theme.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 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 e302de2..178f404 100644 --- a/app/src/main/res/layout/fragment_audio_content_main.xml +++ b/app/src/main/res/layout/fragment_audio_content_main.xml @@ -1,5 +1,7 @@ @@ -51,7 +53,78 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="6.7dp" - android:layout_marginBottom="40dp" /> + android:layout_marginBottom="26.7dp" /> + + + + + + + + + + + + + + + + + #553bb9f1 #EA3A25 #CC004462 + #DD158D + #0057FF + #FFECF7 + #ECF9FF