콘텐츠 메인

- 로그인 하지 않고도 페이지를 조회할 수 있도록 수정
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 @Header("Authorization") authHeader: String
): Single<ApiResponse<List<GetAudioContentRankingItem>>> ): 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") @GET("/v2/audio-content/main/series")
fun getContentMainSeries( fun getContentMainSeries(
@Query("isAdultContentVisible") isAdultContentVisible: Boolean, @Query("isAdultContentVisible") isAdultContentVisible: Boolean,

View File

@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.audio_content.main.v2.home package kr.co.vividnext.sodalive.audio_content.main.v2.home
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences
import android.graphics.Color import android.graphics.Color
import android.graphics.Rect import android.graphics.Rect
import android.net.Uri import android.net.Uri
@ -72,14 +73,45 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
private lateinit var contentRankCreatorAdapter: ContentRankCreatorAdapter private lateinit var contentRankCreatorAdapter: ContentRankCreatorAdapter
private lateinit var popularContentByCreatorAdapter: PopularContentByCreatorAdapter 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
SharedPreferenceManager.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
setupView() setupView()
bindData() bindData()
viewModel.fetchData() viewModel.fetchData()
} }
override fun onDestroyView() {
SharedPreferenceManager.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
super.onDestroyView()
}
private fun bindData() { private fun bindData() {
viewModel.toastLiveData.observe(viewLifecycleOwner) { viewModel.toastLiveData.observe(viewLifecycleOwner) {
it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
@ -125,6 +157,7 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
binding.llUploadContent.visibility = View.GONE binding.llUploadContent.visibility = View.GONE
} }
if (SharedPreferenceManager.token.isNotBlank()) {
binding.ivContentKeep.setOnClickListener { binding.ivContentKeep.setOnClickListener {
startActivity( startActivity(
Intent( Intent(
@ -142,6 +175,12 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
) )
) )
} }
binding.ivAlarm.visibility = View.VISIBLE
binding.ivContentKeep.visibility = View.VISIBLE
} else {
binding.ivAlarm.visibility = View.GONE
binding.ivContentKeep.visibility = View.GONE
}
binding.flSearchChannel.setOnClickListener { binding.flSearchChannel.setOnClickListener {
(requireActivity() as MainActivity).showSearchBar() (requireActivity() as MainActivity).showSearchBar()
@ -244,7 +283,10 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
.setIndicatorHeight(4f.dpToPx().toInt()) .setIndicatorHeight(4f.dpToPx().toInt())
viewModel.contentBannerLiveData.observe(viewLifecycleOwner) { 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.rvBanner.visibility = View.GONE
binding.indicatorBanner.visibility = View.GONE binding.indicatorBanner.visibility = View.GONE
} else { } else {
@ -256,6 +298,12 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
} }
private fun setupCategory() { private fun setupCategory() {
if (SharedPreferenceManager.token.isNotBlank()) {
binding.llCategoryContainer.visibility = View.VISIBLE
} else {
binding.llCategoryContainer.visibility = View.GONE
}
binding.rlCategoryAudioBook.setOnClickListener { binding.rlCategoryAudioBook.setOnClickListener {
showToast("준비중 입니다.") showToast("준비중 입니다.")
} }
@ -303,11 +351,15 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
private fun setupRankCreator() { private fun setupRankCreator() {
rankCreatorAdapter = ExplorerSectionAdapter( rankCreatorAdapter = ExplorerSectionAdapter(
onClickItem = { onClickItem = {
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity( startActivity(
Intent(requireContext(), UserProfileActivity::class.java).apply { Intent(requireContext(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, it) putExtra(Constants.EXTRA_USER_ID, it)
} }
) )
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
}, },
isVisibleRanking = true isVisibleRanking = true
) )
@ -388,18 +440,26 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
private fun setupRankSeries() { private fun setupRankSeries() {
rankSeriesAdapter = UserProfileSeriesListAdapter( rankSeriesAdapter = UserProfileSeriesListAdapter(
onClickItem = { onClickItem = {
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity( startActivity(
Intent(requireContext(), SeriesDetailActivity::class.java).apply { Intent(requireContext(), SeriesDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_SERIES_ID, it) putExtra(Constants.EXTRA_SERIES_ID, it)
} }
) )
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
}, },
onClickCreator = { onClickCreator = {
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity( startActivity(
Intent(requireContext(), UserProfileActivity::class.java).apply { Intent(requireContext(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, it) putExtra(Constants.EXTRA_USER_ID, it)
} }
) )
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
}, },
isVisibleCreator = true isVisibleCreator = true
) )
@ -444,6 +504,7 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
viewModel.rankSeriesLiveData.observe(viewLifecycleOwner) { viewModel.rankSeriesLiveData.observe(viewLifecycleOwner) {
rankSeriesAdapter.addItems(it) rankSeriesAdapter.addItems(it)
binding.llRankSeries.visibility = if ( binding.llRankSeries.visibility = if (
SharedPreferenceManager.token.isBlank() ||
rankSeriesAdapter.itemCount <= 0 && it.isEmpty() rankSeriesAdapter.itemCount <= 0 && it.isEmpty()
) { ) {
View.GONE View.GONE
@ -502,17 +563,25 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
private fun setupRankContent() { private fun setupRankContent() {
binding.ivRankContentAll.setOnClickListener { binding.ivRankContentAll.setOnClickListener {
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(Intent(requireContext(), AudioContentRankingAllActivity::class.java)) startActivity(Intent(requireContext(), AudioContentRankingAllActivity::class.java))
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
} }
rankContentAdapter = AudioContentMainRankingAdapter( rankContentAdapter = AudioContentMainRankingAdapter(
width = (screenWidth * 0.66).toInt() width = (screenWidth * 0.66).toInt()
) { ) {
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity( startActivity(
Intent(requireContext(), AudioContentDetailActivity::class.java).apply { Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it) putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
} }
) )
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
} }
binding.rvRankContent.layoutManager = GridLayoutManager( binding.rvRankContent.layoutManager = GridLayoutManager(
@ -583,7 +652,7 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
.setIndicatorHeight(4f.dpToPx().toInt()) .setIndicatorHeight(4f.dpToPx().toInt())
viewModel.eventLiveData.observe(viewLifecycleOwner) { viewModel.eventLiveData.observe(viewLifecycleOwner) {
if (it.isNotEmpty()) { if (it.isNotEmpty() && SharedPreferenceManager.token.isNotBlank()) {
binding.eventBannerSlider.visibility = View.VISIBLE binding.eventBannerSlider.visibility = View.VISIBLE
binding.eventBannerSlider.refreshData(it) binding.eventBannerSlider.refreshData(it)
} else { } else {
@ -649,19 +718,25 @@ class AudioContentMainTabHomeFragment : BaseFragment<FragmentAudioContentMainTab
popularContentByCreatorAdapter = PopularContentByCreatorAdapter( popularContentByCreatorAdapter = PopularContentByCreatorAdapter(
itemWidth = ((screenWidth - 13.3f.dpToPx() * 3) / 2).toInt(), itemWidth = ((screenWidth - 13.3f.dpToPx() * 3) / 2).toInt(),
onClickItem = { contentId -> onClickItem = { contentId ->
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity( startActivity(
Intent(requireActivity(), AudioContentDetailActivity::class.java).apply { Intent(requireActivity(), AudioContentDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId) putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
} }
) )
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
}, },
onClickCreator = { creatorId -> onClickCreator = { creatorId ->
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity( startActivity(
Intent(requireActivity(), UserProfileActivity::class.java).apply { Intent(requireActivity(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, creatorId) putExtra(Constants.EXTRA_USER_ID, creatorId)
} }
) )
} }
}
) )
val recyclerView = binding.rvRankingSalesCount val recyclerView = binding.rvRankingSalesCount

View File

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

View File

@ -309,7 +309,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
viewModel { AuditionDetailViewModel(get()) } viewModel { AuditionDetailViewModel(get()) }
viewModel { AuditionRoleDetailViewModel(get()) } viewModel { AuditionRoleDetailViewModel(get()) }
viewModel { AudioContentMainCreatorRankingViewModel(get()) } viewModel { AudioContentMainCreatorRankingViewModel(get()) }
viewModel { AudioContentMainTabHomeViewModel(get(), get()) } viewModel { AudioContentMainTabHomeViewModel(get()) }
viewModel { AudioContentMainTabSeriesViewModel(get()) } viewModel { AudioContentMainTabSeriesViewModel(get()) }
viewModel { AudioContentMainTabContentViewModel(get()) } viewModel { AudioContentMainTabContentViewModel(get()) }
viewModel { AudioContentMainTabAlarmViewModel(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.mypage.MyPageFragment
import kr.co.vividnext.sodalive.settings.event.EventDetailActivity import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
import kr.co.vividnext.sodalive.settings.notification.NotificationSettingsDialog import kr.co.vividnext.sodalive.settings.notification.NotificationSettingsDialog
import kr.co.vividnext.sodalive.user.login.LoginActivity
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -197,12 +198,18 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
) as InputMethodManager ) as InputMethodManager
checkPermissions() checkPermissions()
if (
SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10
) {
pushTokenUpdate() pushTokenUpdate()
updatePidAndGaid() updatePidAndGaid()
getEventPopup() getEventPopup()
SharedPreferenceManager.registerOnSharedPreferenceChangeListener(preferenceChangeListener) SharedPreferenceManager.registerOnSharedPreferenceChangeListener(
preferenceChangeListener
)
if (SharedPreferenceManager.isPlayerServiceRunning) { if (SharedPreferenceManager.isPlayerServiceRunning) {
initAndVisibleMiniPlayer() initAndVisibleMiniPlayer()
} else { } else {
@ -210,6 +217,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
} }
handler.postDelayed({ executeDeeplink(intent) }, 500) handler.postDelayed({ executeDeeplink(intent) }, 500)
}
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
if (isShowSearchBar) { if (isShowSearchBar) {
@ -276,7 +284,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
private fun executeDeeplink(intent: Intent) { private fun executeDeeplink(intent: Intent) {
val bundle = intent.getBundleExtra(Constants.EXTRA_DATA) val bundle = intent.getBundleExtra(Constants.EXTRA_DATA)
if (bundle != null) { if (
SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10 &&
bundle != null
) {
try { try {
val roomId = bundle.getLong(Constants.EXTRA_ROOM_ID) val roomId = bundle.getLong(Constants.EXTRA_ROOM_ID)
val channelId = bundle.getLong(Constants.EXTRA_USER_ID) val channelId = bundle.getLong(Constants.EXTRA_USER_ID)
@ -547,11 +559,15 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
} }
private fun getMemberInfo() { private fun getMemberInfo() {
Logger.e("memberInfo") if (
SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10
) {
viewModel.getMemberInfo(context = applicationContext) { viewModel.getMemberInfo(context = applicationContext) {
notificationSettingsDialog.show(screenWidth) notificationSettingsDialog.show(screenWidth)
} }
} }
}
private fun getEventPopup() { private fun getEventPopup() {
viewModel.getEventPopup { viewModel.getEventPopup {
@ -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() { inner class AudioContentReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) { override fun onReceive(context: Context?, intent: Intent?) {
val contentId = intent?.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_ID, 0) 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.BaseActivity
import kr.co.vividnext.sodalive.base.SodaDialog import kr.co.vividnext.sodalive.base.SodaDialog
import kr.co.vividnext.sodalive.common.Constants 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.databinding.ActivitySplashBinding
import kr.co.vividnext.sodalive.main.MainActivity import kr.co.vividnext.sodalive.main.MainActivity
import kr.co.vividnext.sodalive.user.login.LoginActivity
@SuppressLint("CustomSplashScreen") @SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding::inflate) { class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding::inflate) {
@ -169,12 +167,8 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding
null null
} }
if (SharedPreferenceManager.token.isBlank()) {
showLoginActivity(extras)
} else {
showMainActivity(extras) showMainActivity(extras)
} }
}
@OptIn(UnstableApi::class) @OptIn(UnstableApi::class)
private fun showMainActivity(extras: Bundle?) { private fun showMainActivity(extras: Bundle?) {
@ -190,18 +184,5 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>(ActivitySplashBinding
}, 500) }, 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() {} override fun setupView() {}
} }

View File

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