콘텐츠 메인

- 로그인 하지 않고도 페이지를 조회할 수 있도록 수정
This commit is contained in:
klaus 2025-03-22 04:07:54 +09:00
parent 22f90b2e40
commit 70fe5a4441
8 changed files with 204 additions and 100 deletions

View File

@ -265,6 +265,14 @@ interface AudioContentApi {
@Header("Authorization") authHeader: String
): Single<ApiResponse<List<GetAudioContentRankingItem>>>
@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<ApiResponse<List<GetAudioContentRankingItem>>>
@GET("/v2/audio-content/main/series")
fun getContentMainSeries(
@Query("isAdultContentVisible") isAdultContentVisible: Boolean,

View File

@ -1,6 +1,7 @@
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
@ -72,14 +73,45 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
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() }
@ -125,22 +157,29 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
binding.llUploadContent.visibility = View.GONE
}
binding.ivContentKeep.setOnClickListener {
startActivity(
Intent(
requireContext(),
AudioContentBoxActivity::class.java
if (SharedPreferenceManager.token.isNotBlank()) {
binding.ivContentKeep.setOnClickListener {
startActivity(
Intent(
requireContext(),
AudioContentBoxActivity::class.java
)
)
)
}
}
binding.ivAlarm.setOnClickListener {
startActivity(
Intent(
requireActivity(),
AlarmListActivity::class.java
binding.ivAlarm.setOnClickListener {
startActivity(
Intent(
requireActivity(),
AlarmListActivity::class.java
)
)
)
}
binding.ivAlarm.visibility = View.VISIBLE
binding.ivContentKeep.visibility = View.VISIBLE
} else {
binding.ivAlarm.visibility = View.GONE
binding.ivContentKeep.visibility = View.GONE
}
binding.flSearchChannel.setOnClickListener {
@ -244,7 +283,10 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
.setIndicatorHeight(4f.dpToPx().toInt())
viewModel.contentBannerLiveData.observe(viewLifecycleOwner) {
if (contentBannerAdapter.itemCount <= 0 && it.isEmpty()) {
if (
SharedPreferenceManager.token.isBlank() ||
(contentBannerAdapter.itemCount <= 0 && it.isEmpty())
) {
binding.rvBanner.visibility = View.GONE
binding.indicatorBanner.visibility = View.GONE
} else {
@ -256,6 +298,12 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
}
private fun setupCategory() {
if (SharedPreferenceManager.token.isNotBlank()) {
binding.llCategoryContainer.visibility = View.VISIBLE
} else {
binding.llCategoryContainer.visibility = View.GONE
}
binding.rlCategoryAudioBook.setOnClickListener {
showToast("준비중 입니다.")
}
@ -303,11 +351,15 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
private fun setupRankCreator() {
rankCreatorAdapter = ExplorerSectionAdapter(
onClickItem = {
startActivity(
Intent(requireContext(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, it)
}
)
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(
Intent(requireContext(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, it)
}
)
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
},
isVisibleRanking = true
)
@ -388,18 +440,26 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
private fun setupRankSeries() {
rankSeriesAdapter = UserProfileSeriesListAdapter(
onClickItem = {
startActivity(
Intent(requireContext(), SeriesDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_SERIES_ID, it)
}
)
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(
Intent(requireContext(), SeriesDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_SERIES_ID, it)
}
)
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
},
onClickCreator = {
startActivity(
Intent(requireContext(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, it)
}
)
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(
Intent(requireContext(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, it)
}
)
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
},
isVisibleCreator = true
)
@ -444,6 +504,7 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
viewModel.rankSeriesLiveData.observe(viewLifecycleOwner) {
rankSeriesAdapter.addItems(it)
binding.llRankSeries.visibility = if (
SharedPreferenceManager.token.isBlank() ||
rankSeriesAdapter.itemCount <= 0 && it.isEmpty()
) {
View.GONE
@ -502,17 +563,25 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
private fun setupRankContent() {
binding.ivRankContentAll.setOnClickListener {
startActivity(Intent(requireContext(), AudioContentRankingAllActivity::class.java))
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(Intent(requireContext(), AudioContentRankingAllActivity::class.java))
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
}
rankContentAdapter = AudioContentMainRankingAdapter(
width = (screenWidth * 0.66).toInt()
) {
startActivity(
Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
}
)
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(
@ -583,7 +652,7 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
.setIndicatorHeight(4f.dpToPx().toInt())
viewModel.eventLiveData.observe(viewLifecycleOwner) {
if (it.isNotEmpty()) {
if (it.isNotEmpty() && SharedPreferenceManager.token.isNotBlank()) {
binding.eventBannerSlider.visibility = View.VISIBLE
binding.eventBannerSlider.refreshData(it)
} else {
@ -649,18 +718,24 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
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)
}
)
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 ->
startActivity(
Intent(requireActivity(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, creatorId)
}
)
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(
Intent(requireActivity(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, creatorId)
}
)
}
}
)

View File

@ -20,4 +20,11 @@ class AudioContentMainTabHomeRepository(private val api: AudioContentApi) {
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
)
}

View File

@ -5,7 +5,6 @@ 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.ContentCreatorResponse
import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentBannerResponse
import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentRankingItem
@ -17,8 +16,7 @@ import kr.co.vividnext.sodalive.settings.event.EventItem
import kr.co.vividnext.sodalive.settings.notice.NoticeItem
class AudioContentMainTabHomeViewModel(
private val repository: AudioContentMainTabHomeRepository,
private val contentRepository: AudioContentRepository
private val repository: AudioContentMainTabHomeRepository
) : BaseViewModel() {
private val _toastLiveData = MutableLiveData<String?>()
val toastLiveData: LiveData<String?>
@ -112,10 +110,8 @@ class AudioContentMainTabHomeViewModel(
fun getContentRanking(sort: String = "매출") {
_isLoading.value = true
compositeDisposable.add(
contentRepository.getContentRanking(
page = 1,
size = 12,
sortType = sort,
repository.getContentRanking(
sort = sort,
token = "Bearer ${SharedPreferenceManager.token}"
)
.subscribeOn(Schedulers.io())
@ -124,7 +120,7 @@ class AudioContentMainTabHomeViewModel(
{
_isLoading.value = false
if (it.success && it.data != null) {
_rankContentLiveData.value = it.data.items
_rankContentLiveData.value = it.data!!
} else {
if (it.message != null) {
_toastLiveData.postValue(it.message)

View File

@ -309,7 +309,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
viewModel { AuditionDetailViewModel(get()) }
viewModel { AuditionRoleDetailViewModel(get()) }
viewModel { AudioContentMainCreatorRankingViewModel(get()) }
viewModel { AudioContentMainTabHomeViewModel(get(), get()) }
viewModel { AudioContentMainTabHomeViewModel(get()) }
viewModel { AudioContentMainTabSeriesViewModel(get()) }
viewModel { AudioContentMainTabContentViewModel(get()) }
viewModel { AudioContentMainTabAlarmViewModel(get()) }

View File

@ -59,6 +59,7 @@ import kr.co.vividnext.sodalive.message.SelectMessageRecipientAdapter
import kr.co.vividnext.sodalive.mypage.MyPageFragment
import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
import kr.co.vividnext.sodalive.settings.notification.NotificationSettingsDialog
import kr.co.vividnext.sodalive.user.login.LoginActivity
import org.koin.android.ext.android.inject
import java.util.concurrent.TimeUnit
@ -197,20 +198,27 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
) as InputMethodManager
checkPermissions()
pushTokenUpdate()
updatePidAndGaid()
getEventPopup()
if (
SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10
) {
pushTokenUpdate()
updatePidAndGaid()
getEventPopup()
SharedPreferenceManager.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
if (SharedPreferenceManager.isPlayerServiceRunning) {
initAndVisibleMiniPlayer()
} else {
deInitMiniPlayer()
SharedPreferenceManager.registerOnSharedPreferenceChangeListener(
preferenceChangeListener
)
if (SharedPreferenceManager.isPlayerServiceRunning) {
initAndVisibleMiniPlayer()
} else {
deInitMiniPlayer()
}
handler.postDelayed({ executeDeeplink(intent) }, 500)
}
handler.postDelayed({ executeDeeplink(intent) }, 500)
onBackPressedDispatcher.addCallback {
if (isShowSearchBar) {
hideSearchBar()
@ -276,7 +284,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
private fun executeDeeplink(intent: Intent) {
val bundle = intent.getBundleExtra(Constants.EXTRA_DATA)
if (bundle != null) {
if (
SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10 &&
bundle != null
) {
try {
val roomId = bundle.getLong(Constants.EXTRA_ROOM_ID)
val channelId = bundle.getLong(Constants.EXTRA_USER_ID)
@ -547,9 +559,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
}
private fun getMemberInfo() {
Logger.e("memberInfo")
viewModel.getMemberInfo(context = applicationContext) {
notificationSettingsDialog.show(screenWidth)
if (
SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10
) {
viewModel.getMemberInfo(context = applicationContext) {
notificationSettingsDialog.show(screenWidth)
}
}
}
@ -666,6 +682,19 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
}
}
fun showLoginActivity() {
if (SharedPreferenceManager.token.isBlank()) {
val extras = intent.extras
startActivity(
Intent(applicationContext, LoginActivity::class.java).apply {
putExtra(Constants.EXTRA_DATA, extras)
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
)
}
}
inner class AudioContentReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val contentId = intent?.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_ID, 0)

View File

@ -18,10 +18,8 @@ import kr.co.vividnext.sodalive.BuildConfig
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.base.SodaDialog
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.ActivitySplashBinding
import kr.co.vividnext.sodalive.main.MainActivity
import kr.co.vividnext.sodalive.user.login.LoginActivity
@SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding::inflate) {
@ -169,11 +167,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding
null
}
if (SharedPreferenceManager.token.isBlank()) {
showLoginActivity(extras)
} else {
showMainActivity(extras)
}
showMainActivity(extras)
}
@OptIn(UnstableApi::class)
@ -190,18 +184,5 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding
}, 500)
}
private fun showLoginActivity(extras: Bundle?) {
handler.postDelayed({
startActivity(
Intent(applicationContext, LoginActivity::class.java).apply {
putExtra(Constants.EXTRA_DATA, extras)
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
)
finish()
}, 500)
}
override fun setupView() {}
}

View File

@ -24,8 +24,8 @@
<ImageView
android:id="@+id/iv_logo"
android:layout_width="33.3dp"
android:layout_height="33.3dp"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginEnd="8dp"
@ -34,15 +34,15 @@
<TextView
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/iv_alarm"
android:layout_toEndOf="@+id/iv_logo"
android:fontFamily="@font/gmarket_sans_bold"
android:gravity="center_vertical"
android:text="보이스온"
android:textColor="@color/white"
android:textSize="24sp" />
android:textSize="18sp" />
<ImageView
android:id="@+id/iv_alarm"
@ -51,7 +51,8 @@
android:layout_marginEnd="16dp"
android:layout_toStartOf="@+id/iv_content_keep"
android:contentDescription="@null"
android:src="@drawable/ic_alarm_clock" />
android:src="@drawable/ic_alarm_clock"
android:visibility="gone" />
<ImageView
android:id="@+id/iv_content_keep"
@ -59,7 +60,8 @@
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:contentDescription="@null"
android:src="@drawable/ic_content_keep" />
android:src="@drawable/ic_content_keep"
android:visibility="gone" />
</RelativeLayout>
<RelativeLayout
@ -96,14 +98,16 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp" />
android:layout_marginTop="30dp"
android:visibility="gone" />
<com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
android:layout_marginTop="6.7dp"
android:visibility="gone" />
<RelativeLayout
android:id="@+id/fl_search_channel"
@ -112,6 +116,7 @@
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp"
android:background="@drawable/bg_round_corner_6_7_222222_bbbbbb"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
@ -138,13 +143,15 @@
</RelativeLayout>
<LinearLayout
android:id="@+id/ll_category_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginTop="30dp"
android:background="@drawable/bg_round_corner_5_3_222222"
android:orientation="vertical"
android:paddingVertical="13.3dp">
android:paddingVertical="13.3dp"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
@ -612,7 +619,8 @@
android:layout_marginBottom="16.7dp"
android:background="@drawable/bg_round_corner_44_3bb9f1"
android:orientation="horizontal"
android:padding="13.3dp">
android:padding="13.3dp"
android:visibility="gone">
<ImageView
android:layout_width="20dp"