From bad5e6612a204b3da8ebb82544fc7adf70cb84a9 Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 27 Jul 2023 06:46:26 +0900 Subject: [PATCH] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20-=20UI,=20Api=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +- .../co/vividnext/sodalive/common/Constants.kt | 3 +- .../common/SharedPreferenceManager.kt | 6 + .../java/kr/co/vividnext/sodalive/di/AppDI.kt | 14 + .../sodalive/live/GetRoomListResponse.kt | 21 + .../kr/co/vividnext/sodalive/live/LiveApi.kt | 20 + .../vividnext/sodalive/live/LiveFragment.kt | 396 +++++ .../vividnext/sodalive/live/LiveRepository.kt | 25 + .../co/vividnext/sodalive/live/LiveSummary.kt | 13 + .../vividnext/sodalive/live/LiveViewModel.kt | 241 +++ .../live/event_banner/EventBannerAdapter.kt | 38 + .../sodalive/live/now/LiveNowAdapter.kt | 76 + .../recommend/GetRecommendLiveResponse.kt | 10 + .../live/recommend/LiveRecommendApi.kt | 25 + .../live/recommend/LiveRecommendRepository.kt | 7 + .../live/recommend/RecommendLiveAdapter.kt | 41 + .../GetRecommendChannelResponse.kt | 14 + .../LiveRecommendChannelAdapter.kt | 142 ++ .../reservation/LiveReservationAdapter.kt | 146 ++ .../sodalive/live/room/LiveRoomStatus.kt | 8 + .../sodalive/settings/event/EventApi.kt | 20 + .../settings/event/EventRepository.kt | 11 + .../settings/event/GetEventResponse.kt | 19 + .../res/drawable-xxhdpi/btn_item_more.png | Bin 0 -> 2207 bytes .../res/drawable-xxhdpi/btn_make_live.png | Bin 0 -> 5223 bytes app/src/main/res/drawable-xxhdpi/ic_19.png | Bin 0 -> 3096 bytes .../main/res/drawable-xxhdpi/ic_avatar.png | Bin 0 -> 362 bytes app/src/main/res/drawable-xxhdpi/ic_lock.png | Bin 0 -> 824 bytes .../res/drawable-xxhdpi/ic_mic_colored.png | Bin 0 -> 1111 bytes .../main/res/drawable-xxhdpi/ic_no_item.png | Bin 0 -> 3897 bytes .../res/drawable-xxhdpi/ic_plus_no_bg.png | Bin 0 -> 551 bytes .../res/drawable-xxxhdpi/img_how_to_use.png | Bin 0 -> 103162 bytes app/src/main/res/drawable/bg_placeholder.xml | 1353 +++++++++++++++++ .../drawable/bg_round_corner_10_533d89.xml | 8 + .../drawable/bg_round_corner_10_643bc8.xml | 8 + .../drawable/bg_round_corner_10_881609.xml | 8 + ...g_round_corner_33_3_transparent_9970ff.xml | 8 + .../drawable/bg_round_corner_4_7_2b2635.xml | 8 + .../drawable/bg_round_corner_4_7_9970ff.xml | 8 + .../res/drawable/gradient_live_room_item.xml | 10 + .../res/drawable/ic_launcher_background.xml | 170 +++ app/src/main/res/layout/fragment_live.xml | 82 +- app/src/main/res/layout/item_event_slider.xml | 13 + app/src/main/res/layout/item_live_now.xml | 97 ++ .../main/res/layout/item_live_reservation.xml | 127 ++ .../res/layout/item_my_live_reservation.xml | 113 ++ .../res/layout/item_recommend_channel.xml | 53 + .../main/res/layout/item_recommend_live.xml | 13 + app/src/main/res/layout/layout_live_now.xml | 100 ++ .../layout/layout_live_recommend_channel.xml | 88 ++ .../res/layout/layout_live_reservation.xml | 101 ++ .../main/res/layout/layout_recommend_live.xml | 41 + app/src/main/res/values/colors.xml | 9 + 53 files changed, 3709 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/GetRoomListResponse.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/event_banner/EventBannerAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/now/LiveNowAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/recommend/GetRecommendLiveResponse.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendApi.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/recommend/RecommendLiveAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/GetRecommendChannelResponse.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/LiveRecommendChannelAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/reservation/LiveReservationAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomStatus.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventApi.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventRepository.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/settings/event/GetEventResponse.kt create mode 100644 app/src/main/res/drawable-xxhdpi/btn_item_more.png create mode 100644 app/src/main/res/drawable-xxhdpi/btn_make_live.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_19.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_avatar.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_lock.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_mic_colored.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_no_item.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_plus_no_bg.png create mode 100644 app/src/main/res/drawable-xxxhdpi/img_how_to_use.png create mode 100644 app/src/main/res/drawable/bg_placeholder.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_10_533d89.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_10_643bc8.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_10_881609.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_33_3_transparent_9970ff.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_4_7_2b2635.xml create mode 100644 app/src/main/res/drawable/bg_round_corner_4_7_9970ff.xml create mode 100644 app/src/main/res/drawable/gradient_live_room_item.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/item_event_slider.xml create mode 100644 app/src/main/res/layout/item_live_now.xml create mode 100644 app/src/main/res/layout/item_live_reservation.xml create mode 100644 app/src/main/res/layout/item_my_live_reservation.xml create mode 100644 app/src/main/res/layout/item_recommend_channel.xml create mode 100644 app/src/main/res/layout/item_recommend_live.xml create mode 100644 app/src/main/res/layout/layout_live_now.xml create mode 100644 app/src/main/res/layout/layout_live_recommend_channel.xml create mode 100644 app/src/main/res/layout/layout_live_reservation.xml create mode 100644 app/src/main/res/layout/layout_recommend_live.xml diff --git a/app/build.gradle b/app/build.gradle index cb006b1..dda3c75 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,7 +98,7 @@ dependencies { } // Gson - implementation "com.google.code.gson:gson:2.9.0" + implementation "com.google.code.gson:gson:2.9.1" // Network implementation "com.squareup.retrofit2:retrofit:2.9.0" @@ -115,6 +115,7 @@ dependencies { implementation "io.github.ParkSangGwon:tedpermission-normal:3.3.0" implementation 'com.github.dhaval2404:imagepicker:2.1' + implementation 'com.github.zhpanvip:bannerviewpager:3.5.7' implementation 'com.google.android.gms:play-services-oss-licenses:17.0.1' 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 b700cbf..5eff772 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 @@ -10,11 +10,12 @@ object Constants { const val PREF_USER_ROLE = "pref_user_role" const val PREF_PUSH_TOKEN = "pref_push_token" const val PREF_PROFILE_IMAGE = "pref_profile_image" + const val PREF_IS_FOLLOWED_CREATOR_LIVE = "pref_is_followed_creator_live" const val EXTRA_DATA = "extra_data" const val EXTRA_TERMS = "extra_terms" - const val EXTRA_USER_ID = "extra_user_id" const val EXTRA_ROOM_ID = "extra_room_id" + const val EXTRA_USER_ID = "extra_user_id" const val EXTRA_MESSAGE_ID = "extra_message_id" const val EXTRA_CONTENT_ID = "extra_content_id" diff --git a/app/src/main/java/kr/co/vividnext/sodalive/common/SharedPreferenceManager.kt b/app/src/main/java/kr/co/vividnext/sodalive/common/SharedPreferenceManager.kt index 60bbe3f..1e77cd3 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/common/SharedPreferenceManager.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/common/SharedPreferenceManager.kt @@ -98,4 +98,10 @@ object SharedPreferenceManager { set(value) { sharedPreferences[Constants.PREF_PUSH_TOKEN] = value } + + var isFollowedCreatorLive: Boolean + get() = sharedPreferences[Constants.PREF_IS_FOLLOWED_CREATOR_LIVE, false] + set(value) { + sharedPreferences[Constants.PREF_IS_FOLLOWED_CREATOR_LIVE] = value + } } 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 8e37ae9..7b70ef8 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 @@ -4,8 +4,15 @@ import android.content.Context import com.google.gson.GsonBuilder import kr.co.vividnext.sodalive.BuildConfig import kr.co.vividnext.sodalive.common.ApiBuilder +import kr.co.vividnext.sodalive.live.LiveApi +import kr.co.vividnext.sodalive.live.LiveRepository +import kr.co.vividnext.sodalive.live.LiveViewModel +import kr.co.vividnext.sodalive.live.recommend.LiveRecommendApi +import kr.co.vividnext.sodalive.live.recommend.LiveRecommendRepository import kr.co.vividnext.sodalive.main.MainViewModel import kr.co.vividnext.sodalive.network.TokenAuthenticator +import kr.co.vividnext.sodalive.settings.event.EventApi +import kr.co.vividnext.sodalive.settings.event.EventRepository import kr.co.vividnext.sodalive.settings.terms.TermsApi import kr.co.vividnext.sodalive.settings.terms.TermsRepository import kr.co.vividnext.sodalive.settings.terms.TermsViewModel @@ -58,6 +65,9 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { single { ApiBuilder().build(get(), UserApi::class.java) } single { ApiBuilder().build(get(), TermsApi::class.java) } + single { ApiBuilder().build(get(), LiveApi::class.java) } + single { ApiBuilder().build(get(), EventApi::class.java) } + single { ApiBuilder().build(get(), LiveRecommendApi::class.java) } } private val viewModelModule = module { @@ -66,11 +76,15 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { viewModel { TermsViewModel(get()) } viewModel { FindPasswordViewModel(get()) } viewModel { MainViewModel(get()) } + viewModel { LiveViewModel(get(), get(), get()) } } private val repositoryModule = module { factory { UserRepository(get()) } factory { TermsRepository(get()) } + factory { LiveRepository(get()) } + factory { EventRepository(get()) } + factory { LiveRecommendRepository(get()) } } private val moduleList = listOf( diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/GetRoomListResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/GetRoomListResponse.kt new file mode 100644 index 0000000..a0b0860 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/GetRoomListResponse.kt @@ -0,0 +1,21 @@ +package kr.co.vividnext.sodalive.live + +import com.google.gson.annotations.SerializedName + +data class GetRoomListResponse( + @SerializedName("roomId") val roomId: Long, + @SerializedName("title") val title: String, + @SerializedName("content") val content: String, + @SerializedName("beginDateTime") val beginDateTime: String, + @SerializedName("numberOfParticipate") val numberOfParticipate: Int, + @SerializedName("numberOfPeople") val numberOfPeople: Int, + @SerializedName("coverImageUrl") val coverImageUrl: String, + @SerializedName("isAdult") val isAdult: Boolean, + @SerializedName("price") val price: Int, + @SerializedName("tags") val tags: List, + @SerializedName("channelName") val channelName: String?, + @SerializedName("managerNickname") val managerNickname: String, + @SerializedName("managerId") val managerId: Long, + @SerializedName("isReservation") val isReservation: Boolean, + @SerializedName("isPrivateRoom") val isPrivateRoom: Boolean +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt new file mode 100644 index 0000000..fc0d70d --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt @@ -0,0 +1,20 @@ +package kr.co.vividnext.sodalive.live + +import io.reactivex.rxjava3.core.Flowable +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.live.room.LiveRoomStatus +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface LiveApi { + @GET("/live/room") + fun roomList( + @Query("timezone") timezone: String, + @Query("dateString") dateString: String?, + @Query("status") status: LiveRoomStatus, + @Query("page") page: Int, + @Query("size") size: Int, + @Header("Authorization") authHeader: String + ): Flowable>> +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt index c46c85e..7cf3dfe 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveFragment.kt @@ -1,7 +1,403 @@ package kr.co.vividnext.sodalive.live +import android.annotation.SuppressLint +import android.content.Intent +import android.graphics.Rect +import android.net.Uri +import android.os.Bundle +import android.view.View +import android.webkit.URLUtil +import android.widget.LinearLayout +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.zhpan.bannerview.BaseBannerAdapter +import com.zhpan.indicator.enums.IndicatorSlideMode +import com.zhpan.indicator.enums.IndicatorStyle +import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment +import kr.co.vividnext.sodalive.common.LoadingDialog +import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.FragmentLiveBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.live.event_banner.EventBannerAdapter +import kr.co.vividnext.sodalive.live.now.LiveNowAdapter +import kr.co.vividnext.sodalive.live.recommend.RecommendLiveAdapter +import kr.co.vividnext.sodalive.live.recommend_channel.LiveRecommendChannelAdapter +import kr.co.vividnext.sodalive.live.reservation.LiveReservationAdapter +import kr.co.vividnext.sodalive.settings.notification.MemberRole +import org.koin.android.ext.android.inject +import kotlin.math.roundToInt class LiveFragment : BaseFragment(FragmentLiveBinding::inflate) { + private val viewModel: LiveViewModel by inject() + + private lateinit var liveNowAdapter: LiveNowAdapter + private lateinit var liveReservationAdapter: LiveReservationAdapter + private lateinit var liveRecommendChannelAdapter: LiveRecommendChannelAdapter + + private lateinit var loadingDialog: LoadingDialog + + private var message = "" + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupView() + setupRecommendLive() + setupRecommendChannel() + setupLiveNow() + setupLiveReservation() + setupEvent() + + message = "라이브를 불러오고 있습니다." + viewModel.getSummary() + } + + private fun setupView() { + loadingDialog = LoadingDialog(requireActivity(), layoutInflater) + + viewModel.toastLiveData.observe(viewLifecycleOwner) { + it?.let { Toast.makeText(requireActivity(), it, Toast.LENGTH_LONG).show() } + } + + viewModel.isLoading.observe(viewLifecycleOwner) { + if (it) { + loadingDialog.show(screenWidth, message) + } else { + loadingDialog.dismiss() + } + } + + binding.ivMakeRoom.visibility = + if (SharedPreferenceManager.role == MemberRole.CREATOR.name) { + View.VISIBLE + } else { + View.GONE + } + binding.ivMakeRoom.setOnClickListener {} + + binding.swipeRefreshLayout.setOnRefreshListener { refreshSummary() } + + val ivHowToUseLp = binding.ivHowToUse.layoutParams as LinearLayout.LayoutParams + ivHowToUseLp.width = screenWidth + ivHowToUseLp.height = (200 * screenWidth) / 1080 + binding.ivHowToUse.layoutParams = ivHowToUseLp + binding.ivHowToUse.setOnClickListener { + val url = "https://blog.naver.com/yozmlive" + if (URLUtil.isValidUrl(url)) { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) + } + } + } + + private fun refreshSummary() { + liveNowAdapter.clear() + liveRecommendChannelAdapter.clear() + liveReservationAdapter.clear() + + message = "라이브를 불러오고 있습니다." + viewModel.getSummary() + + binding.swipeRefreshLayout.isRefreshing = false + } + + @SuppressLint("NotifyDataSetChanged") + private fun setupRecommendLive() { + val layoutParams = binding + .layoutRecommendLive + .pager + .layoutParams as LinearLayout.LayoutParams + + val pagerWidth = screenWidth.toDouble() - 26.7f.dpToPx() + val pagerHeight = (pagerWidth * 0.53).roundToInt() + layoutParams.width = pagerWidth.roundToInt() + layoutParams.height = pagerHeight + + binding + .layoutRecommendLive + .pager + .layoutParams = layoutParams + + binding.layoutRecommendLive.pager.apply { + adapter = RecommendLiveAdapter(pagerWidth.roundToInt(), pagerHeight) { + } as BaseBannerAdapter + + setLifecycleRegistry(lifecycle) + setScrollDuration(1000) + setInterval(4 * 1000) + }.create() + + binding + .layoutRecommendLive + .pager + .setIndicatorView(binding.layoutRecommendLive.indicator2) + .setIndicatorStyle(IndicatorStyle.ROUND_RECT) + .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH) + .setIndicatorVisibility(View.GONE) + .setIndicatorSliderColor( + ContextCompat.getColor(requireContext(), R.color.color_909090), + ContextCompat.getColor(requireContext(), R.color.color_9970ff) + ) + .setIndicatorSliderWidth(4f.dpToPx().toInt(), 10f.dpToPx().toInt()) + .setIndicatorHeight(4f.dpToPx().toInt()) + + viewModel.recommendLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.layoutRecommendLive.root.visibility = View.VISIBLE + binding.layoutRecommendLive.pager.refreshData(it) + } else { + binding.layoutRecommendLive.root.visibility = View.GONE + } + } + } + + private fun setupRecommendChannel() { + liveRecommendChannelAdapter = LiveRecommendChannelAdapter( + onClick = {}, + onClickMore = {} + ) + + binding.layoutRecommendChannel.rvRecommendChannel.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.HORIZONTAL, + false + ) + + binding + .layoutRecommendChannel + .rvRecommendChannel + .addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.left = 0.dpToPx().toInt() + outRect.right = 8.3f.dpToPx().toInt() + } + + liveRecommendChannelAdapter.itemCount - 1 -> { + outRect.left = 8.3f.dpToPx().toInt() + outRect.right = 0.dpToPx().toInt() + } + + else -> { + outRect.left = 8.3f.dpToPx().toInt() + outRect.right = 8.3f.dpToPx().toInt() + } + } + } + }) + + binding.layoutRecommendChannel.rvRecommendChannel.adapter = liveRecommendChannelAdapter + binding.layoutRecommendChannel.ivSwitch.setOnClickListener { + viewModel.toggleIsFollowedCreatorLive() + } + + viewModel.recommendChannelLiveData.observe(viewLifecycleOwner) { + binding.layoutRecommendChannel.root.visibility = View.VISIBLE + liveRecommendChannelAdapter.addItems(it) + binding.layoutRecommendChannel.rvRecommendChannel.requestLayout() + binding.layoutRecommendChannel.root.requestLayout() + } + + viewModel.isFollowedCreatorLive.observe(viewLifecycleOwner) { + liveRecommendChannelAdapter.isFollowedCreatorLive = it + liveRecommendChannelAdapter.clear() + + if (it) { + binding.layoutRecommendChannel.ivSwitch.setImageResource(R.drawable.btn_toggle_on_big) + binding.layoutRecommendChannel.llTitle2.visibility = View.VISIBLE + binding.layoutRecommendChannel.llTitle1.visibility = View.GONE + } else { + binding.layoutRecommendChannel.ivSwitch.setImageResource(R.drawable.btn_toggle_off_big) + binding.layoutRecommendChannel.llTitle1.visibility = View.VISIBLE + binding.layoutRecommendChannel.llTitle2.visibility = View.GONE + } + } + } + + @SuppressLint("NotifyDataSetChanged") + private fun setupLiveNow() { + binding + .layoutLiveNow + .tvAllView + .setOnClickListener {} + + val recyclerView = binding + .layoutLiveNow + .rvSudaNow + + liveNowAdapter = LiveNowAdapter {} + + recyclerView.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.HORIZONTAL, + false + ) + + recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.left = 13.3f.dpToPx().toInt() + outRect.right = 5.dpToPx().toInt() + } + + liveNowAdapter.itemCount - 1 -> { + outRect.left = 5.dpToPx().toInt() + outRect.right = 13.3f.dpToPx().toInt() + } + + else -> { + outRect.left = 5.dpToPx().toInt() + outRect.right = 5.dpToPx().toInt() + } + } + } + }) + + recyclerView.adapter = liveNowAdapter + + viewModel.liveNowLiveData.observe(viewLifecycleOwner) { + if (liveNowAdapter.items.isEmpty() && it.isEmpty()) { + recyclerView.visibility = View.GONE + binding.layoutLiveNow.tvAllView.visibility = View.GONE + binding.layoutLiveNow.llNoItems.visibility = View.VISIBLE + binding.layoutLiveNow.tvMakeRoom.setOnClickListener {} + + recyclerView.requestLayout() + binding.layoutLiveNow.llNoItems.requestLayout() + } else { + binding.layoutLiveNow.tvAllView.visibility = View.VISIBLE + binding.layoutLiveNow.llNoItems.visibility = View.GONE + liveNowAdapter.items.addAll(it) + liveNowAdapter.notifyDataSetChanged() + recyclerView.visibility = View.VISIBLE + recyclerView.requestLayout() + } + + binding.layoutLiveNow.root.requestLayout() + } + } + + @SuppressLint("NotifyDataSetChanged") + private fun setupLiveReservation() { + val recyclerView = binding + .layoutLiveReservation + .rvSudaReservation + + liveReservationAdapter = LiveReservationAdapter(isMain = true) {} + + recyclerView.layoutManager = LinearLayoutManager( + requireContext(), + LinearLayoutManager.VERTICAL, + false + ) + + recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + outRect.left = 13.3f.dpToPx().toInt() + outRect.right = 13.3f.dpToPx().toInt() + + when (parent.getChildAdapterPosition(view)) { + 0 -> { + outRect.top = 0f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + + liveReservationAdapter.itemCount - 1 -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 13.3f.dpToPx().toInt() + } + + else -> { + outRect.top = 6.7f.dpToPx().toInt() + outRect.bottom = 6.7f.dpToPx().toInt() + } + } + } + }) + + recyclerView.adapter = liveReservationAdapter + + viewModel.liveReservationLiveData.observe(viewLifecycleOwner) { + if (liveReservationAdapter.items.isEmpty() && it.isEmpty()) { + recyclerView.visibility = View.GONE + binding.layoutLiveReservation.tvAllView.visibility = View.GONE + binding.layoutLiveReservation.llNoItems.visibility = View.VISIBLE + binding.layoutLiveReservation.tvMakeRoom.setOnClickListener {} + + recyclerView.requestLayout() + binding.layoutLiveReservation.llNoItems.requestLayout() + } else { + binding.layoutLiveReservation.tvAllView.visibility = View.VISIBLE + binding.layoutLiveReservation.llNoItems.visibility = View.GONE + liveReservationAdapter.items.addAll(it) + liveReservationAdapter.notifyDataSetChanged() + + recyclerView.visibility = View.VISIBLE + recyclerView.requestLayout() + } + + binding.layoutLiveReservation.root.requestLayout() + } + + binding.layoutLiveReservation.tvAllView.setOnClickListener {} + } + + @SuppressLint("NotifyDataSetChanged") + private fun setupEvent() { + val imageSliderLp = binding.eventBannerSlider.layoutParams + imageSliderLp.width = screenWidth + imageSliderLp.height = (screenWidth * 300) / 1000 + binding.eventBannerSlider.layoutParams = imageSliderLp + + binding.eventBannerSlider.apply { + adapter = EventBannerAdapter(requireContext()) {} as BaseBannerAdapter + setLifecycleRegistry(lifecycle) + setScrollDuration(800) + }.create() + + binding.eventBannerSlider + .setIndicatorView(binding.indicator) + .setIndicatorStyle(IndicatorStyle.ROUND_RECT) + .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH) + .setIndicatorVisibility(View.GONE) + .setIndicatorSliderColor( + ContextCompat.getColor(requireContext(), R.color.color_909090), + ContextCompat.getColor(requireContext(), R.color.color_9970ff) + ) + .setIndicatorSliderWidth(4f.dpToPx().toInt(), 10f.dpToPx().toInt()) + .setIndicatorHeight(4f.dpToPx().toInt()) + + viewModel.eventLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.eventBannerSlider.visibility = View.VISIBLE + binding.eventBannerSlider.refreshData(it) + } else { + binding.eventBannerSlider.visibility = View.GONE + } + } + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt new file mode 100644 index 0000000..e0ca9e0 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt @@ -0,0 +1,25 @@ +package kr.co.vividnext.sodalive.live + +import io.reactivex.rxjava3.core.Flowable +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.live.room.LiveRoomStatus +import java.util.TimeZone + +class LiveRepository(private val api: LiveApi) { + fun roomList( + dateString: String? = null, + status: LiveRoomStatus, + page: Int, + size: Int, + token: String + ): Flowable>> { + return api.roomList( + timezone = TimeZone.getDefault().id, + dateString = dateString, + status = status, + page = page - 1, + size = size, + authHeader = token + ) + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt new file mode 100644 index 0000000..206ba1a --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveSummary.kt @@ -0,0 +1,13 @@ +package kr.co.vividnext.sodalive.live + +import com.google.gson.annotations.SerializedName +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.live.recommend.GetRecommendLiveResponse +import kr.co.vividnext.sodalive.settings.event.GetEventResponse + +data class LiveSummary( + @SerializedName("liveNow") val liveNow: ApiResponse>, + @SerializedName("liveReservation") val liveReservation: ApiResponse>, + @SerializedName("event") val event: ApiResponse, + @SerializedName("recommendLive") val recommendLive: ApiResponse>, +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt new file mode 100644 index 0000000..bba57cb --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/LiveViewModel.kt @@ -0,0 +1,241 @@ +package kr.co.vividnext.sodalive.live + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.orhanobut.logger.Logger +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.schedulers.Schedulers +import kr.co.vividnext.sodalive.base.BaseViewModel +import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.live.recommend.GetRecommendLiveResponse +import kr.co.vividnext.sodalive.live.recommend.LiveRecommendRepository +import kr.co.vividnext.sodalive.live.recommend_channel.GetRecommendChannelResponse +import kr.co.vividnext.sodalive.live.room.LiveRoomStatus +import kr.co.vividnext.sodalive.settings.event.EventItem +import kr.co.vividnext.sodalive.settings.event.EventRepository + +class LiveViewModel( + private val repository: LiveRepository, + private val eventRepository: EventRepository, + private val liveRecommendRepository: LiveRecommendRepository +) : BaseViewModel() { + private var _isLoading = MutableLiveData(false) + val isLoading: LiveData + get() = _isLoading + + private val _toastLiveData = MutableLiveData() + val toastLiveData: LiveData + get() = _toastLiveData + + private val _recommendLiveData = MutableLiveData>() + val recommendLiveData: LiveData> + get() = _recommendLiveData + + private val _isFollowedCreatorLive = MutableLiveData( + SharedPreferenceManager.isFollowedCreatorLive + ) + val isFollowedCreatorLive: LiveData + get() = _isFollowedCreatorLive + + private val _recommendChannelLiveData = MutableLiveData>() + val recommendChannelLiveData: LiveData> + get() = _recommendChannelLiveData + + private val _liveNowLiveData = MutableLiveData>() + val liveNowLiveData: LiveData> + get() = _liveNowLiveData + + private val _liveReservationLiveData = MutableLiveData>() + val liveReservationLiveData: LiveData> + get() = _liveReservationLiveData + + private val _eventLiveData = MutableLiveData>() + val eventLiveData: LiveData> + get() = _eventLiveData + + var page = 1 + var isLast = false + private val pageSize = 10 + + fun toggleIsFollowedCreatorLive() { + val isOn = !_isFollowedCreatorLive.value!! + SharedPreferenceManager.isFollowedCreatorLive = isOn + _isFollowedCreatorLive.value = isOn + if (_isFollowedCreatorLive.value!!) { + getFollowedChannelList() + } else { + getRecommendChannelList() + } + } + + private fun getFollowedChannelList() { + compositeDisposable.add( + liveRecommendRepository.getFollowingChannelList( + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + if (it.success && it.data != null) { + _recommendChannelLiveData.postValue(it.data!!) + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } + + private fun getRecommendChannelList() { + compositeDisposable.add( + liveRecommendRepository.getRecommendChannelList( + token = "Bearer ${SharedPreferenceManager.token}" + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + if (it.success && it.data != null) { + _recommendChannelLiveData.postValue(it.data!!) + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } + + fun getSummary() { + if (!_isLoading.value!!) { + if (_isFollowedCreatorLive.value!!) { + getFollowedChannelList() + } else { + getRecommendChannelList() + } + + val liveNow = repository.roomList( + status = LiveRoomStatus.NOW, + page = 1, + size = pageSize, + token = "Bearer ${SharedPreferenceManager.token}" + ) + + val liveReservation = repository.roomList( + status = LiveRoomStatus.RESERVATION, + page = 1, + size = pageSize, + token = "Bearer ${SharedPreferenceManager.token}" + ) + + val event = eventRepository.getEvents( + 0, + 5, + token = "Bearer ${SharedPreferenceManager.token}" + ) + + val recommendLive = liveRecommendRepository.getRecommendLive( + token = "Bearer ${SharedPreferenceManager.token}" + ) + + _isLoading.postValue(true) + + compositeDisposable.add( + Flowable.combineLatest( + liveNow, + liveReservation, + event, + recommendLive, + ) { t1, t2, t3, t4 -> LiveSummary(t1, t2, t3, t4) } + .subscribe( + { + val now = it.liveNow + if (now.success && now.data != null) { + _liveNowLiveData.postValue(now.data!!) + if (now.data.isNotEmpty()) { + page += 1 + } else { + isLast = true + } + } else { + if (now.message != null) { + _toastLiveData.postValue(now.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + + val reservation = it.liveReservation + if (reservation.success && reservation.data != null) { + _liveReservationLiveData.postValue(reservation.data!!) + if (reservation.data.isNotEmpty()) { + page += 1 + } else { + isLast = true + } + } else { + if (reservation.message != null) { + _toastLiveData.postValue(reservation.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + } + + val eventResponse = it.event + if (eventResponse.success && eventResponse.data != null) { + val data = eventResponse.data + _eventLiveData.postValue(data.eventList) + } else { + _eventLiveData.postValue(emptyList()) + } + + val recommendLiveResponse = it.recommendLive + if ( + recommendLiveResponse.success && + recommendLiveResponse.data != null + ) { + val data = recommendLiveResponse.data + _recommendLiveData.postValue(data!!) + } else { + _recommendLiveData.postValue(emptyList()) + } + + _isLoading.postValue(false) + }, + { + _isLoading.postValue(false) + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/event_banner/EventBannerAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/event_banner/EventBannerAdapter.kt new file mode 100644 index 0000000..cdaed10 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/event_banner/EventBannerAdapter.kt @@ -0,0 +1,38 @@ +package kr.co.vividnext.sodalive.live.event_banner + +import android.content.Context +import android.widget.ImageView +import coil.load +import com.zhpan.bannerview.BaseBannerAdapter +import com.zhpan.bannerview.BaseViewHolder +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.settings.event.EventItem + +class EventBannerAdapter( + private val context: Context, + private val itemClick: (EventItem) -> Unit +) : BaseBannerAdapter() { + + override fun bindData( + holder: BaseViewHolder, + data: EventItem, + position: Int, + pageSize: Int + ) { + val ivThumbnail = holder.findViewById(R.id.iv_thumbnail) + ivThumbnail.load(data.thumbnailImageUrl) { + crossfade(true) + + val layoutParams = ivThumbnail.layoutParams + val screenWidth = context.resources.displayMetrics.widthPixels + layoutParams.width = screenWidth + layoutParams.height = (screenWidth * 300) / 1000 + ivThumbnail.layoutParams = layoutParams + } + ivThumbnail.setOnClickListener { itemClick(data) } + } + + override fun getLayoutId(viewType: Int): Int { + return R.layout.item_event_slider + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/now/LiveNowAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/now/LiveNowAdapter.kt new file mode 100644 index 0000000..52a73a2 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/now/LiveNowAdapter.kt @@ -0,0 +1,76 @@ +package kr.co.vividnext.sodalive.live.now + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import coil.load +import coil.transform.RoundedCornersTransformation +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.databinding.ItemLiveNowBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.live.GetRoomListResponse + +class LiveNowAdapter( + private val onClick: (GetRoomListResponse) -> Unit +) : RecyclerView.Adapter() { + + var items = mutableListOf() + + inner class ViewHolder( + private val binding: ItemLiveNowBinding + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: GetRoomListResponse) { + binding.ivCover.load(item.coverImageUrl) { + crossfade(true) + placeholder(R.drawable.bg_placeholder) + transformations(RoundedCornersTransformation(4.7f.dpToPx())) + } + binding.tvManager.text = item.managerNickname + binding.tvNumberOfMembers.text = "${item.numberOfParticipate}" + binding.ivLock.visibility = if (item.isPrivateRoom) { + View.VISIBLE + } else { + View.GONE + } + + if (item.price > 0) { + binding.tvPrice.text = "유료" + binding.tvPrice.setBackgroundResource(R.drawable.bg_round_corner_10_881609) + } else { + binding.tvPrice.text = "무료" + binding.tvPrice.setBackgroundResource(R.drawable.bg_round_corner_10_643bc8) + } + + binding.iv19.visibility = if (item.isAdult) { + View.VISIBLE + } else { + View.GONE + } + + binding.root.setOnClickListener { onClick(item) } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + ItemLiveNowBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount() = items.count() + + @SuppressLint("NotifyDataSetChanged") + fun clear() { + items.clear() + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/GetRecommendLiveResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/GetRecommendLiveResponse.kt new file mode 100644 index 0000000..891e9e4 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/GetRecommendLiveResponse.kt @@ -0,0 +1,10 @@ +package kr.co.vividnext.sodalive.live.recommend + +import com.google.gson.annotations.SerializedName + +data class GetRecommendLiveResponse( + @SerializedName("imageUrl") + val imageUrl: String, + @SerializedName("creatorId") + val creatorId: Long +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendApi.kt new file mode 100644 index 0000000..9f7f9dc --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendApi.kt @@ -0,0 +1,25 @@ +package kr.co.vividnext.sodalive.live.recommend + +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.Single +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.live.recommend_channel.GetRecommendChannelResponse +import retrofit2.http.GET +import retrofit2.http.Header + +interface LiveRecommendApi { + @GET("/live/recommend") + fun getRecommendLive( + @Header("Authorization") authHeader: String + ): Flowable>> + + @GET("/live/recommend/channel") + fun getRecommendChannelList( + @Header("Authorization") authHeader: String + ): Flowable>> + + @GET("/live/following/channel") + fun getFollowingChannelList( + @Header("Authorization") authHeader: String + ): Single>> +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt new file mode 100644 index 0000000..989d6c4 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.live.recommend + +class LiveRecommendRepository(private val api: LiveRecommendApi) { + fun getRecommendLive(token: String) = api.getRecommendLive(authHeader = token) + fun getRecommendChannelList(token: String) = api.getRecommendChannelList(authHeader = token) + fun getFollowingChannelList(token: String) = api.getFollowingChannelList(authHeader = token) +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/RecommendLiveAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/RecommendLiveAdapter.kt new file mode 100644 index 0000000..4906110 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend/RecommendLiveAdapter.kt @@ -0,0 +1,41 @@ +package kr.co.vividnext.sodalive.live.recommend + +import android.widget.FrameLayout +import android.widget.ImageView +import coil.load +import coil.transform.RoundedCornersTransformation +import com.zhpan.bannerview.BaseBannerAdapter +import com.zhpan.bannerview.BaseViewHolder +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.extensions.dpToPx + +class RecommendLiveAdapter( + private val itemWidth: Int, + private val itemHeight: Int, + private val onClick: (Long) -> Unit +) : BaseBannerAdapter() { + override fun bindData( + holder: BaseViewHolder, + data: GetRecommendLiveResponse, + position: Int, + pageSize: Int + ) { + val ivRecommendLive = holder.findViewById(R.id.iv_recommend_live) + val layoutParams = ivRecommendLive.layoutParams as FrameLayout.LayoutParams + + layoutParams.width = itemWidth + layoutParams.height = itemHeight + + ivRecommendLive.load(data.imageUrl) { + crossfade(true) + placeholder(R.drawable.bg_placeholder) + transformations(RoundedCornersTransformation(5.3f.dpToPx())) + } + ivRecommendLive.layoutParams = layoutParams + ivRecommendLive.setOnClickListener { onClick(data.creatorId) } + } + + override fun getLayoutId(viewType: Int): Int { + return R.layout.item_recommend_live + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/GetRecommendChannelResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/GetRecommendChannelResponse.kt new file mode 100644 index 0000000..d42057b --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/GetRecommendChannelResponse.kt @@ -0,0 +1,14 @@ +package kr.co.vividnext.sodalive.live.recommend_channel + +import com.google.gson.annotations.SerializedName + +data class GetRecommendChannelResponse( + @SerializedName("creatorId") + val creatorId: Long, + @SerializedName("nickname") + val nickname: String, + @SerializedName("profileImageUrl") + val profileImageUrl: String, + @SerializedName("isOnAir") + val isOnAir: Boolean +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/LiveRecommendChannelAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/LiveRecommendChannelAdapter.kt new file mode 100644 index 0000000..75727ee --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/recommend_channel/LiveRecommendChannelAdapter.kt @@ -0,0 +1,142 @@ +package kr.co.vividnext.sodalive.live.recommend_channel + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.recyclerview.widget.RecyclerView +import coil.load +import coil.transform.RoundedCornersTransformation +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.databinding.ItemRecommendChannelBinding +import kr.co.vividnext.sodalive.extensions.dpToPx + +class LiveRecommendChannelAdapter( + private val onClick: (Long) -> Unit, + private val onClickMore: () -> Unit, +) : RecyclerView.Adapter() { + + var isFollowedCreatorLive = false + + private val items = mutableListOf() + + class FooterViewHolder( + private val binding: ItemRecommendChannelBinding, + private val onClickItem: () -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + fun bind() { + binding.ivRecommendChannel.setImageResource(R.drawable.btn_item_more) + binding.tvRecommendChannelNickname.text = "더보기" + + val layoutParams = binding.ivRecommendChannel.layoutParams as FrameLayout.LayoutParams + layoutParams.width = 60f.dpToPx().toInt() + layoutParams.height = 60f.dpToPx().toInt() + + binding.ivRecommendChannel.layoutParams = layoutParams + binding.ivRecommendChannelBg.layoutParams = layoutParams + + binding.tvRecommendChannel.visibility = View.GONE + binding.ivRecommendChannelBg.visibility = View.GONE + binding.root.setOnClickListener { onClickItem() } + } + + companion object { + const val VIEW_TYPE = 1 + } + } + + class ViewHolder( + private val binding: ItemRecommendChannelBinding, + private val onClickItem: (Long) -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: GetRecommendChannelResponse) { + binding.ivRecommendChannel.load(item.profileImageUrl) { + crossfade(true) + placeholder(R.drawable.bg_placeholder) + transformations(RoundedCornersTransformation(30f.dpToPx())) + } + binding.tvRecommendChannelNickname.text = item.nickname + + val layoutParams = binding.ivRecommendChannel.layoutParams as FrameLayout.LayoutParams + layoutParams.width = 60f.dpToPx().toInt() + layoutParams.height = 60f.dpToPx().toInt() + + binding.ivRecommendChannel.layoutParams = layoutParams + binding.ivRecommendChannelBg.layoutParams = layoutParams + + if (item.isOnAir) { + binding.tvRecommendChannel.visibility = View.VISIBLE + binding.ivRecommendChannelBg.visibility = View.VISIBLE + } else { + binding.tvRecommendChannel.visibility = View.GONE + binding.ivRecommendChannelBg.visibility = View.GONE + } + + binding.root.setOnClickListener { onClickItem(item.creatorId) } + } + + companion object { + const val VIEW_TYPE = 0 + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == FooterViewHolder.VIEW_TYPE) { + FooterViewHolder( + ItemRecommendChannelBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + onClickItem = onClickMore + ) + } else { + ViewHolder( + ItemRecommendChannelBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ), + onClickItem = onClick + ) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is FooterViewHolder) { + holder.bind() + } else { + (holder as ViewHolder).bind(items[position]) + } + } + + override fun getItemCount(): Int { + return if (isFollowedCreatorLive) { + items.size + 1 + } else { + items.size + } + } + + override fun getItemViewType(position: Int): Int { + return if (position == items.size) { + FooterViewHolder.VIEW_TYPE + } else { + ViewHolder.VIEW_TYPE + } + } + + @SuppressLint("NotifyDataSetChanged") + fun clear() { + items.clear() + notifyDataSetChanged() + } + + @SuppressLint("NotifyDataSetChanged") + fun addItems(items: List) { + this.items.addAll(items) + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/reservation/LiveReservationAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/reservation/LiveReservationAdapter.kt new file mode 100644 index 0000000..a9e8c58 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/reservation/LiveReservationAdapter.kt @@ -0,0 +1,146 @@ +package kr.co.vividnext.sodalive.live.reservation + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import coil.load +import coil.transform.RoundedCornersTransformation +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.databinding.ItemLiveReservationBinding +import kr.co.vividnext.sodalive.databinding.ItemMyLiveReservationBinding +import kr.co.vividnext.sodalive.extensions.dpToPx +import kr.co.vividnext.sodalive.extensions.moneyFormat +import kr.co.vividnext.sodalive.live.GetRoomListResponse + +class LiveReservationAdapter( + private val isMain: Boolean = false, + private val onClick: (GetRoomListResponse) -> Unit +) : RecyclerView.Adapter() { + var items = mutableListOf() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == 1) { + MyLiveViewHolder( + ItemMyLiveReservationBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } else { + ViewHolder( + ItemLiveReservationBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val item = items[position] + if (isMyLive(item)) { + (holder as MyLiveViewHolder).bind(item, position) + } else { + (holder as ViewHolder).bind(item) + } + } + + override fun getItemCount() = items.count() + + override fun getItemViewType(position: Int): Int { + return if (isMyLive(items[position])) { + 1 + } else { + 0 + } + } + + private fun isMyLive(item: GetRoomListResponse) = + item.managerId == SharedPreferenceManager.userId && isMain + + @SuppressLint("NotifyDataSetChanged") + fun clear() { + items.clear() + notifyDataSetChanged() + } + + inner class ViewHolder( + private val binding: ItemLiveReservationBinding + ) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: GetRoomListResponse) { + binding.ivCover.load(item.coverImageUrl) { + crossfade(true) + placeholder(R.drawable.bg_placeholder) + transformations(RoundedCornersTransformation(4.7f.dpToPx())) + } + binding.tvDate.text = item.beginDateTime + binding.tvNickname.text = item.managerNickname + binding.tvTitle.text = item.title + binding.root.setOnClickListener { onClick(item) } + binding.ivLock.visibility = if (item.isPrivateRoom) { + View.VISIBLE + } else { + View.GONE + } + + if (item.isReservation) { + binding.tvPrice.visibility = View.GONE + binding.tvCompleteReservation.visibility = View.VISIBLE + } else { + binding.tvPrice.visibility = View.VISIBLE + binding.tvCompleteReservation.visibility = View.GONE + + binding.tvPrice.text = if (item.price <= 0) { + "무료" + } else { + "${item.price.moneyFormat()}코인" + } + } + + binding.iv19.visibility = if (item.isAdult) { + View.VISIBLE + } else { + View.GONE + } + } + } + + inner class MyLiveViewHolder( + private val binding: ItemMyLiveReservationBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: GetRoomListResponse, position: Int) { + binding.tvMyLive.visibility = if (position == 0) { + View.VISIBLE + } else { + View.GONE + } + binding.ivCover.load(item.coverImageUrl) { + crossfade(true) + placeholder(R.drawable.bg_placeholder) + transformations(RoundedCornersTransformation(4f.dpToPx())) + } + binding.tvDate.text = item.beginDateTime + binding.tvNickname.text = item.managerNickname + binding.tvTitle.text = item.title + binding.root.setOnClickListener { onClick(item) } + + binding.ivLock.visibility = if (item.isPrivateRoom) { + View.VISIBLE + } else { + View.GONE + } + + binding.iv19.visibility = if (item.isAdult) { + View.VISIBLE + } else { + View.GONE + } + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomStatus.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomStatus.kt new file mode 100644 index 0000000..0acf81d --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomStatus.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.live.room + +import com.google.gson.annotations.SerializedName + +enum class LiveRoomStatus { + @SerializedName("NOW") NOW, + @SerializedName("RESERVATION") RESERVATION +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventApi.kt new file mode 100644 index 0000000..9e8a22b --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventApi.kt @@ -0,0 +1,20 @@ +package kr.co.vividnext.sodalive.settings.event + +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.Single +import kr.co.vividnext.sodalive.common.ApiResponse +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface EventApi { + @GET("/event") + fun getEvents( + @Query("page") page: Int, + @Query("size") size: Int, + @Header("Authorization") authHeader: String + ): Flowable> + + @GET("/event/popup") + fun getEventPopup(@Header("Authorization") authHeader: String): Single> +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventRepository.kt new file mode 100644 index 0000000..c426fd1 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/settings/event/EventRepository.kt @@ -0,0 +1,11 @@ +package kr.co.vividnext.sodalive.settings.event + +class EventRepository(private val api: EventApi) { + fun getEvents( + page: Int, + size: Int, + token: String + ) = api.getEvents(page, size, authHeader = token) + + fun getEventPopup(token: String) = api.getEventPopup(authHeader = token) +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/settings/event/GetEventResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/settings/event/GetEventResponse.kt new file mode 100644 index 0000000..bddec51 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/settings/event/GetEventResponse.kt @@ -0,0 +1,19 @@ +package kr.co.vividnext.sodalive.settings.event + +import android.os.Parcelable +import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize + +data class GetEventResponse( + @SerializedName("totalCount") val totalCount: Int, + @SerializedName("eventList") val eventList: List +) + +@Parcelize +data class EventItem( + @SerializedName("id") val id: Long, + @SerializedName("thumbnailImageUrl") val thumbnailImageUrl: String, + @SerializedName("detailImageUrl") val detailImageUrl: String? = null, + @SerializedName("popupImageUrl") val popupImageUrl: String? = null, + @SerializedName("link") val link: String? = null +) : Parcelable diff --git a/app/src/main/res/drawable-xxhdpi/btn_item_more.png b/app/src/main/res/drawable-xxhdpi/btn_item_more.png new file mode 100644 index 0000000000000000000000000000000000000000..f219986248fb9324b0e90435421acf17f3b70ac4 GIT binary patch literal 2207 zcmV;Q2w?Y#P)wIfF!U;+Oz;U{9bBWb*_u4}jKt zgA-W+QXnMRU(NQIu|0NX?D^9*Q=ep<3FImP;zbF5^X5&BMdIeK;C%t_6-oh5I^JJG_&Z6$tryHvStz1uEiIwv!Koc@ z9sE2`mY0`1WHD9>=G2Ru_y=BhY>_$+Pj;zP+N{^>J+cg|1aq|FZ3C|w$)tl6zTIp# zUy>zQAs7+6j!0M|xnc(}QQcZvT6#hmlc``6v5)Bgo^bB4L3Ad9bC8Oo(!sd=b{1`P zs)D%)@$=_T7JG+^$reO!rztu$!DbA*GixD2I%%iv#06{Aj)kL{hgOG_Ac+cw+$w6o z?V?BRI5?Uyey%5(vK>l@{r&wl$URWG~_HSiV`9b!EfKb-M|mOYkL*S5-NPJ z&_~&z1c*IF<9{P}q}EB9hAq^#?^2A!CfIbQ+LY6xMT&IM`Krg&`HDrb%8i}aB+o2Z zO zyrh-1m|-KKQuV|Xtt&FDhg0?Zq*CU@2u3kuP32lm<;Ra76Qg)+1Z&4i3=^YxYy_jo z-6BN-6*Qw`Yt?}ftkEkEMDgXIC=QHZjb3?-Yl}xB*hKFEzSI?wvIuO8M=lSjd>nMl?uw^$B*g5hYuu}1v6jYXFza~7py;c@PM8_ ze@^%A-4iW&cp24zV1)Q}Dj+NuHFx*xuV254mTVq{(WfuC$m#jYl`8|^3zuB+r|G`n zBCn9Vb?X-0ym@ornq z59#XFt0V=lbm>Mgiq$%yZ^%m|qhRHxX;(1jeQTuj$%$k)XkEcYZ-0Z3F4=SHb+R-? z2OwN>m4BHtPj)>ZWh_!VUg$W_qetyjNtuY$NG_F1HAj2U;gBd9o#%>!^sIBgA(18- z+4&j^zD7!DBuPfe@^WHNy2~?CBqM@<=LoKn5*Z1Sx%qYUaf8z%LNewK&nRPfoGBUH zL;CpfrL)US3|NJYs`n?PMhgr|VX$MOmVP6NDo;Yr$o*fZ>jcGh-RxX#_V;5Y( z=xx0u#U(Gh3%`H={wsoco1rbCsaW0-@i|dM#KGDvRnpp3myOW150*H zX#YtCge70Rc#)dTrdYYmaFC8XZ5Cxq-Ycv-4h6#L8JTF_e=TUqP9f8D9zc3-ja(bP zfC|Vi6|}P@oWtYe1|R(!Tl$%xZx*oRVAW$ixg2HdN+fv2MXpWF6xj; zB8cAIpy*}Bu8YP51V0{L+hPHXi(Y1|U~P+KfH{QCanZ|6+}U8-VvS-;;c+hn?@s#6 zM8PJCH%YM)9`{a)UMAE5(Wq|m>VO(4HqphT!s2-!3VT5GZPHY26>zc|=5wJ0n>3)Q z+7iy|SosN+qCGTKTR{h@xgPezk@g33s@C0z*}?bTG?$@?6v2!+vZYN*7S#Q#HNp^i zhrjs;?vj!!-0nt|%S4V~kNy4qEu@S>uKq|HmfLJLTQmhz3ugBA_FkaSUDyM)(txJ{ zmzI`74T*x7=^-qbkl+Six4k3;GGzD5moJezRm02_!A!f|uApbfoi1I+6(cP7+qZA^ z)z#IR3QRK#W>j*##3h%BMKGh1;~`GDOl*QZw0Au{yo#pLXslC=#Qvl^^!Rush}Nwm z!b73Bt$EP8|V*&pY@>)-A|?k*)jVuG1huU=J4rBYkZg$Rag%O@u%^{_KT z(~#)HNcjiHSa}hGb#2!Wkh_h})MAoynM5Pl52{}4c-ts?G;`GA9^9U$t~?E?Jx-Y0 z7*0n;j%F`v(~`@i7QueFZ7!F~J5-#-10B3J(-iBGiC~Wcr0ou6B-SHS!5%pj-Qn#d zs0n1g{l^Ny9;kw?m?~I}WYVFGBX$_81bdkAa|>Ty7ZBC%79Z5%cat9SOoNqz{qPzv zMD;q^CEMM7$&>LmMQae&3-*Jydckp=>$thRiiBsa(kg>;ly+GtKjhPPseVKW9>x=n zLjAls=z3=9<{YV>d0H#4R_S64FLu?6Xu;!P@qBhJzxW*cpo72A#(&1|xd)Q4RJ5VJ hqobq4xaMJP;XgJHhWq>HqVzXEkxE<z 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_19.png b/app/src/main/res/drawable-xxhdpi/ic_19.png new file mode 100644 index 0000000000000000000000000000000000000000..df995e91cf260a9a925a2b03c23f61987153599f GIT binary patch literal 3096 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 NgQu&X%Q~loCIEYUr#=7x literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_lock.png b/app/src/main/res/drawable-xxhdpi/ic_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..39e287d984fb39bc47cfb487d3a07da41ea5d9a0 GIT binary patch literal 824 zcmV-81IPS{P)$pI3HL6N}|N~sZTCS5Z3PXT|PRUNmHtK$U zk?rHLLY2?8(6;>Hd(jiUxHMIGPMd;kWPP;M_Fo^5QM&iUE`sb6x%oH54vGD2wHUi{ zq5E*v^~M{1Sod9XS%?{`;LNJ@c~ke)!gtA5mgskg5#34~OYEp+8EiZHUc*}T*ry+i z<&vwmVnsPdv~20$hzZ@gk{lh-qTg7qJw+^7t$PdyP&t`Z?pMTu<$hB*prV!6hykj| zMD|@cM7Q!rxb*}bd4}%fV*di}IT8C&2$q#t!aZhE!BJt3j<^uqCmdorokhhi*f~k? z(0Ou#ThE7ej6B8m>HJzBGYhgaxaF?$c|=(Bni?Xpb5)r;Y zlZ#aOE6&8J1Mscm*MYm*yp0AI>%$>n7v_iQ*of5>Zsnh$35 z>p}!WYz<;R(tOR>#^rUQ)n+6{rVEN{(jD?ImRbHr)V5uayTi)eA%(;0auE)1P*|3} zBcGd2<}Mg7yh~vb$n1B>{QlgjQDD$dZ<)^JF8C)=6NeFnrDi&jyWmHW7(jHL!i&~Y zNLtE4^up!g(4sF)Cvp*t+}qKWE76?-tB?m9s(ll=FdloIng5H@< z1|4Z7CkS}i$-_uAlh-|q=ftB%cq=vkK;0aBb1!t_cqP)?1UrT?ZzU!;{?t-RdL6 zp6qE-4+GJcWayVBr+qPZAMV9sS1KB}Y+}_%GDcq+JN$|QktJv?SM(8dU=lm|NMv92 zkhtm#1!Ar~j6TbQi*7||Q^aS>133-Vkv}=2Ufpv;iPfboiktA^ZX}*i4y5hFD-ip}c7fX4 z?eMjT#{5C+7O_13ZRRDGadw#dt>lepeZ}X2`|D=tCY;2{VUTF=vgaAgqFWar)uG1qZ3jOD~~QjtjHWl4)>}3YBuUifF<~jDnBsg9}%# zQqE3}QFs=%pw)0$xv;<~r?tC4Vi}{u8MieHNjWaq9R5VPx#W>8F2MMrQ zk8kXqe)OS%_L_R~k8kUYZ0dnvtiD~GPa_yvr_?^;duOSAX?afA#;Xbi0q@c(>biV~zib<2c%;|1jQtyt`h;x=z)JI*qUH zblSzy{-1-MM)8RED)3&r5i&r{izDAA{|w@7tO+(SbI1aA!)q6%{{-R-FGX}GP)pFN zn&~ZY?|+x?B-&kO%$jIGbEh#ks!mP(dvvFgWP$lIOGDEPh}M`7&0(xxqFY10VxBur z^@)q4Gim0K#ZQ#{BFlUYUg$Ll1g%gvoa(85mhA*WzA9_xi*Salc!o?1ZHV95B$A)Q z9AU^;Xm(c#xjRv7u#tcT=<&7N{*cM-E=U?+4R&x1cGMbdAYxu|^25r2Ja>xd6IOI% z7zbc_syzF4vQtd6T7p{5vobm*juXJ#D7=#BA0Rur79RmSF}^3#PMr_dOEXUu?`5jrdB~2J+_y zNCUE*aoF{@NW_w}W||Bfjpfiv9DwOuFwN`v5{cc?2t_0$XQYh`K(6yT{(j7tD{)SN zL{q+j%r4hN*VE6Fg&jMst_$a9mFy-t9}vxm=sIV+^qY1;v=Mf|I3Q#qj2dQ_b44rI z6X?2Tb^2{QUu>&$y(hj z1s?~cZ+P>ww2i}v@BRH#tif3v;%_tJ@x_ww%Shy|(m3+7BznU4{*gg#bmDKbI7ZO< zCVA>2yn;;yDFf)4%+Er}5_GP-Zq)Lp2F)bXkL`_1@-ttAf&4t%odTU{-%y~L#68vP zGX?F-&#r(3wiLkh-DDd4TEJ zI0{wK-9)1k#NdLoUZxa&J&_#JX-lem)rIlmiF&g^Vr}f0HaD z)a9zRm{8&X(!jTEWPY~$byIy!02`P%Sk3>IL9dfMPnF)MXiFNWCHdKG7RbszzrLCr zxie$q-!kNN8uSXP6FWb5AaHaG`p*ZGWrbTDQNTV}Lx)z71<@<0-qZP+unlK^25QdW z!CRcWbA~o=H{`N>U9ArL8rE2Zp8QPp7$s`MoogF)DJ6YeOm#|~2kB$?30@D{w?K0r zNw+uV?nXX)Mr{+VR^f!Xk5=s9SDc@(U8w);@MoxI*pvaDVeBb0;t}$3s$^XzCHhFN z{0y(#5N1F$WSZ5pXIR@{Ig8^cVDA^J!^qF}FvOz#jN}X;i&HEE)`9$4Lgtvu<7V+P zyqcHvDAsxNb4K)^Wdj-ju3d6gYL@Ca9@B;DFj|b)HTn5K^`9riKpep7?7$&0PsM*n zOLvy5bv@z9&*bKvgH*eC#yGN#{PRskp zr$pQk(ol%yM|J<1VP!CCM^Vz4UVXm_8y=CLk#RH}2j7J+s3&u+A%QRNx6*((5Er(pL|9=t;Oh-inlr!PMnAFXkVkqo295*Wvf`P>KcM<_ox z9|*|@m7iy?Gd}918RX|9@{Jku*)QrOn4jNqWuE-}PJjk_w)3;*xks4Keo?3X{A`1! z^7DL7F+K_tQsK(anrMJI;MDtIem0Qg2WNgZn0|NfDVEa-ubW|?&wbE5y!rWHX&Meu z<>-$73xAZ6dy0{t%X#zGJWrJb%%k(?XUje4`Hd-z8XpC5RO?w;9SEa65QnU7$npI7 z+3;z1ejXhT`!pl{+0M^^=b32#N{qw#+1L>s`I*NgxBxO=ewOiB?kd`!1>)*lc~{~t zl%L0}aaDn$v+^^X-WW@*fR6+7<>!g%iRymN8%P@?YVV%73*=|ser{xRJ1of0{G(r= z2(g`?(LUH?aa8=}1Ks(rtz>>~M7vy%F=qIV9%X*U!zj6T+xgkpRL%-@vH-NRRe&xh zu+?Q$SB8m`%6vWO*ioo8s34C&Rh0%opBBz<95UMNV5flL#KBlFKSQD`j(DtX2sAdk zaQ_+lMm@hY)6_QT&(DbHio@Rf7vjme2pf2`GI#H~z1`m4Znu`fmJ9=d!<(OtEUF<3 z%puT5en$OgbCOsKV|Y_FnBrKJpP@gWg>h7h=c9aEh7xumU5lRRPeZizA3e?HjvgNHdiPvW?l zpl@vM*h%1?{Cu?YGqAfEwiooe{^mKpv`^`DQ<{0#Iwp&oJj&WPUrb7sx+PwyKA z`c}ilQLN0*(Cj$ob^&O*|Lkbk(V!Xg^kgK><a%@z4CbR^`EW#Zc%S!)sD<> zrBO0JR|s~1>6e}L=u$&=zCf;{K{I=PgF<{H@-v{iZN=NqbnF@XvgSAPFz7)4nat17 z>V!A~pd%bcX*uKPCVZd^=FQK?-j$!VG}^GHQ>5nx_n+~cc@}26a2yEL-tEZGXN)++ zbmEHa@i4ux|E%+~hTLlBn9ARR+}hVxuK5l5+=LsnCqMT@e#YB(3z-gpPDrLRy2n_% z4VW;U3uGu=6u*b^>-?PJex70L_OsorDariY+xfXVTRTdHmBC>znR6rZ zGjI;G|I93b^kjav`_I)GuR+Q$YY6=Sm*D&yKjkxfbFW7EV#`-T4_`O*ndt!Tz)R zI0$IwkQbT<_iAT;&f&zUbq!mh-5pzIhb?-5L=S5o6ONtp&k}J>HtY&tes=k@ZFB-N|GnlZ z;e^c3tah7SNfPAkNR{%IZH8DM{7(N8au9TrZg4u$o_Fhmo&BL(dk^!yS*kZwW!$^Bd)|`3-zQ zD5X)s{5)7Z5BGeTLuAdIte$_S^Rv-OB6K0@uJ3Y)w4Ce3^BX;tpJA`Say#uD829Go zR`BVEUnNEZo+FG>XES zl3AUfp=S`NANx+GWJ9EWOte2gpUM0zl(E@Rh;NUngQI@+&Oh6SE2{Tp=jTD(U2Qki zDjXjFKFbJA_AJZK723MV{Jar+9tr#LuXKA!H;kCyaP*(i#HjWSt8f0QWShPk;&@mc zl5F4nhTVUz;EiU5ue&ABC=X%ScjgX?Y-fHZ=AX&_GflHvIgjTK7ugH@&+tyOwNF+X zipeCJ#W6hbYwnXswPfgE=bzuudBc^Ill`--150oH{Dw(%>-{45ZS?y5FN#lJHO-~7 z{|x6vja}uJ{-uD3JX+ba@n?G*-2C3ZC6Vkm?)i-hjX$?=8NO~`eziurjr@G}%y0ZM z$^W%?hdKblFc5}w%`RyrlJ|d6m|++|U@HDkRbG~giY~o9cMNT>`_ETL&%}Lh(Pa61 ze?zW5M`%`X?@#lyN3;vPdL?VvmNdWPNoQS=ee(hU002K7mGLh88~fdu00000NkvXX Hu0mjfIxO_q literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_plus_no_bg.png b/app/src/main/res/drawable-xxhdpi/ic_plus_no_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..acb5e05df369f6a407dff36c48b05fa7b24623a0 GIT binary patch literal 551 zcmV+?0@(eDP)Px#7*I@9MMrQ<00000000000RR90{QUgY)z$z1|IBTY zIsgCw2Xswc zd*}m9>I-a@^7?at&_FVREp@6i{$rF+wgdjb*=(w+o*rBS~Qz0ML{` z7zVD#3s3?H)x4bg+ovWl7-rY^{TT?!VKrN14p38O0WUl|cGveXTrvrGpCj^M2@VseH$dZ+cn!07N)t{|;vOcoOEWv>b2 zr57MuMNsFNZt`qa)!@*2f{e@^YG&>oCpKZ?^wKrCp8A|_mt?KnL6BE^ObB-nN`nR6dV^{yKu%>Jx_G!UbXk?6gJbSG-f}{Oe6*i!r81P%re6QIUm%7IZFi}q|AWc2q|-;T6XA_yB|g& p&9to9nKPra{spl9IaED|egF#qZXppxAw2*9002ovPDHLkV1lr@?RfwI literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/img_how_to_use.png b/app/src/main/res/drawable-xxxhdpi/img_how_to_use.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8cfa8be772d950fd97ac7bbed46fdc97d5d783 GIT binary patch literal 103162 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 z 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_placeholder.xml b/app/src/main/res/drawable/bg_placeholder.xml new file mode 100644 index 0000000..1cd81f8 --- /dev/null +++ b/app/src/main/res/drawable/bg_placeholder.xml @@ -0,0 +1,1353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_10_533d89.xml b/app/src/main/res/drawable/bg_round_corner_10_533d89.xml new file mode 100644 index 0000000..021bea2 --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_10_533d89.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_10_643bc8.xml b/app/src/main/res/drawable/bg_round_corner_10_643bc8.xml new file mode 100644 index 0000000..955baae --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_10_643bc8.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_10_881609.xml b/app/src/main/res/drawable/bg_round_corner_10_881609.xml new file mode 100644 index 0000000..cae42d1 --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_10_881609.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_33_3_transparent_9970ff.xml b/app/src/main/res/drawable/bg_round_corner_33_3_transparent_9970ff.xml new file mode 100644 index 0000000..3ae5d7f --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_33_3_transparent_9970ff.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_4_7_2b2635.xml b/app/src/main/res/drawable/bg_round_corner_4_7_2b2635.xml new file mode 100644 index 0000000..f7705de --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_4_7_2b2635.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_round_corner_4_7_9970ff.xml b/app/src/main/res/drawable/bg_round_corner_4_7_9970ff.xml new file mode 100644 index 0000000..24973ed --- /dev/null +++ b/app/src/main/res/drawable/bg_round_corner_4_7_9970ff.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/gradient_live_room_item.xml b/app/src/main/res/drawable/gradient_live_room_item.xml new file mode 100644 index 0000000..882480a --- /dev/null +++ b/app/src/main/res/drawable/gradient_live_room_item.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_live.xml b/app/src/main/res/layout/fragment_live.xml index d7a8f06..8a2b316 100644 --- a/app/src/main/res/layout/fragment_live.xml +++ b/app/src/main/res/layout/fragment_live.xml @@ -4,13 +4,83 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + + + + + + + + + + + + + + + + + + + + + + + - + app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/item_event_slider.xml b/app/src/main/res/layout/item_event_slider.xml new file mode 100644 index 0000000..5287bf8 --- /dev/null +++ b/app/src/main/res/layout/item_event_slider.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/item_live_now.xml b/app/src/main/res/layout/item_live_now.xml new file mode 100644 index 0000000..9c9382f --- /dev/null +++ b/app/src/main/res/layout/item_live_now.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_live_reservation.xml b/app/src/main/res/layout/item_live_reservation.xml new file mode 100644 index 0000000..5510b7e --- /dev/null +++ b/app/src/main/res/layout/item_live_reservation.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_my_live_reservation.xml b/app/src/main/res/layout/item_my_live_reservation.xml new file mode 100644 index 0000000..2af237f --- /dev/null +++ b/app/src/main/res/layout/item_my_live_reservation.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_recommend_channel.xml b/app/src/main/res/layout/item_recommend_channel.xml new file mode 100644 index 0000000..87b92cc --- /dev/null +++ b/app/src/main/res/layout/item_recommend_channel.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_recommend_live.xml b/app/src/main/res/layout/item_recommend_live.xml new file mode 100644 index 0000000..afd32a8 --- /dev/null +++ b/app/src/main/res/layout/item_recommend_live.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/layout_live_now.xml b/app/src/main/res/layout/layout_live_now.xml new file mode 100644 index 0000000..4d3f260 --- /dev/null +++ b/app/src/main/res/layout/layout_live_now.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_live_recommend_channel.xml b/app/src/main/res/layout/layout_live_recommend_channel.xml new file mode 100644 index 0000000..574bd52 --- /dev/null +++ b/app/src/main/res/layout/layout_live_recommend_channel.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_live_reservation.xml b/app/src/main/res/layout/layout_live_reservation.xml new file mode 100644 index 0000000..88ab43d --- /dev/null +++ b/app/src/main/res/layout/layout_live_reservation.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_recommend_live.xml b/app/src/main/res/layout/layout_recommend_live.xml new file mode 100644 index 0000000..750559c --- /dev/null +++ b/app/src/main/res/layout/layout_recommend_live.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f729221..3ae1c1e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,8 +13,17 @@ #A0E2FF #ECFAFF #111111 + #FF5C49 + #2b2635 + #FFD300 + #E2E2E2 + #D2D2D2 + #533D89 + #643BC8 + #881609 #B3909090 #88909090 #339970FF + #7FE2E2E2