Commit 118a34f7 authored by wanglei's avatar wanglei

...提交代码

parent 24bd4887
......@@ -112,6 +112,7 @@ dependencies {
implementation("io.github.youth5201314:banner:2.2.3")
implementation("com.github.angcyo.DslTablayout:TabLayout:3.6.4")
implementation("com.github.angcyo.DslTablayout:ViewPager2Delegate:3.6.4")
implementation("io.github.litao0621:nifty-slider:2.0.2")
//firebase
implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
......
......@@ -12,6 +12,8 @@ import com.chad.library.adapter4.BaseQuickAdapter
class EPAdapter : BaseQuickAdapter<ShortPlayEPBean, CommonViewHolder>() {
var selectEp: ((ep: Int, lock: Boolean) -> Unit)? = null
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: ShortPlayEPBean?) {
item ?: return
val context = holder.itemView.context
......@@ -24,6 +26,10 @@ class EPAdapter : BaseQuickAdapter<ShortPlayEPBean, CommonViewHolder>() {
binding.ivPlay.visibility = View.GONE
binding.ivLock.isVisible = item.lock
binding.tvEP.visibility = View.VISIBLE
binding.tvEP.text = item.ep.toString()
}
binding.root.setOnClickListener {
selectEp?.invoke(item.ep, item.lock)
}
}
......
......@@ -21,33 +21,36 @@ import com.chad.library.adapter4.BaseQuickAdapter
import com.youth.banner.adapter.BannerAdapter
class BannerAdapter(
val shortPlayList: List<ShortPlay>
) : BaseQuickAdapter<Any, CommonViewHolder>() {
class BannerAdapter : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
private val TAG = "BannerAdapter"
var paletteAction: ((colorInt: Int) -> Unit)? = null
var playAction: ((shortPlay: ShortPlay) -> Unit)? = null
var binding: ItemBannerBinding? = null
override fun getItemCount(items: List<Any>): Int {
return 1
override fun getItemCount(items: List<List<ShortPlay>>): Int {
return items.size
}
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: Any?) {
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: List<ShortPlay>?) {
item ?: return
binding = ItemBannerBinding.bind(holder.itemView)
val context = holder.itemView.context
LogEx.logDebug(TAG, "onBindViewHolder")
if (binding?.banner?.adapter == null) {
val innerAdapter = binding?.banner?.adapter as GalleryAdapter?
if (innerAdapter == null && item.isNotEmpty()) {
LogEx.logDebug(TAG, "onBindViewHolder banner")
binding?.banner?.setAdapter(GalleryAdapter(shortPlayList))
binding?.banner?.setAdapter(GalleryAdapter(item))
//添加画廊效果
binding?.banner?.setBannerGalleryEffect(
context.resources.getDimensionPixelSize(R.dimen.dp_30),
context.resources.getDimensionPixelSize(R.dimen.dp_10)
)
binding?.banner?.setIndicator(binding?.indicator, false)
} else {
innerAdapter?.setDatas(item)
}
}
......
......@@ -16,24 +16,24 @@ import com.chad.library.adapter4.BaseQuickAdapter
*/
class ShortPlayColumnsAdapter(
val category: String = "",
val shortList: List<ShortPlay>
) : BaseQuickAdapter<Any, CommonViewHolder>() {
) : BaseQuickAdapter<List<ShortPlay>, CommonViewHolder>() {
var itemClick: ((shortPlay: ShortPlay) -> Unit)? = null
override fun getItemCount(items: List<Any>): Int {
return 1
override fun getItemCount(items: List<List<ShortPlay>>): Int {
return items.size
}
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: Any?) {
override fun onBindViewHolder(holder: CommonViewHolder, position: Int, item: List<ShortPlay>?) {
item ?: return
val binding = ItemShortplayColumnsBinding.bind(holder.itemView)
binding.tvCategory.text = category
if (binding.rv.adapter == null) {
val adapter = InnerShortPlayAdapter()
binding.rv.adapter = adapter
adapter.submitList(shortList)
var innerAdapter = binding.rv.adapter as InnerShortPlayAdapter?
if (innerAdapter == null) {
innerAdapter = InnerShortPlayAdapter()
binding.rv.adapter = innerAdapter
}
innerAdapter.submitList(item)
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): CommonViewHolder {
......
......@@ -14,12 +14,12 @@ import com.base.appzxhy.ui.concatAdapter.BannerAdapter
import com.base.appzxhy.ui.concatAdapter.ShortPlayCategoryAdapter
import com.base.appzxhy.ui.concatAdapter.ShortPlayColumnsAdapter
import com.base.appzxhy.ui.play.PlayFullActivity
import com.base.appzxhy.ui.vm.ShortPlayViewModel
import com.base.appzxhy.utils.BarUtils
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.ToastUtils.toast
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
......@@ -30,44 +30,38 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
private var bannerAdapter: BannerAdapter? = null
private var columnsAdapter: ShortPlayColumnsAdapter? = null
private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[ShortPlayViewModel::class.java]
}
override fun initView() {
super.initView()
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
contactAdapter = ConcatAdapter()
binding.rv.adapter = contactAdapter
initBannerAdapter()
lifecycleScope.launch {
viewModel.homeCategoryFlow.collectLatest { id ->
when (id) {
0L -> initNewShortAdapter()
else -> initCategoryShortAdapter(listOf(id))
}
}
}
initBannerAdapter()
initNewShortAdapter()
initCategoryAdapter()
binding.rv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset() >= recyclerView.computeVerticalScrollRange()) {
LogEx.logDebug(TAG, "loadMore")
viewModel.sendHomeCategoryFlow()
val activity = requireActivity() as MainActivity?
activity?.viewModel?.getCategoryListFlow()
}
}
})
}
private fun initCategoryShortAdapter(categoryIds: List<Long>) {
viewModel.getFeedListByCategoryIds(categoryIds, null) { list ->
if (list.size > 4) {
val activity = requireActivity() as MainActivity?
activity?.runOnUiThread {
val ids = categoryIds[0]
val categoryTitle = viewModel.categoryTitle(requireContext(), ids)
private fun initCategoryAdapter() {
val activity = requireActivity() as MainActivity?
lifecycleScope.launch {
activity?.viewModel?.categoryList?.collectLatest { list ->
if (list.size > 4) {
var ids = 1L
kotlin.runCatching {
ids = list[0].categories[0].id
}
val categoryTitle = activity.viewModel.categoryTitle(requireContext(), ids)
val categoryAdapter = ShortPlayCategoryAdapter(categoryTitle, list)
categoryAdapter.itemClick = ::shortPlayClick
categoryAdapter.categoryClick = {
......@@ -80,24 +74,25 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}
private fun initBannerAdapter() {
viewModel.getPopularDrama { list ->
val activity = requireActivity() as MainActivity?
activity?.runOnUiThread {
// LogEx.logDebug(TAG, "list=${list.size}")
bannerAdapter = BannerAdapter(list)
bannerAdapter?.let {
it.paletteAction = {
binding.root.setBackgroundColor(it)
}
it.playAction = { shortPlay ->
startActivity(Intent(activity, PlayFullActivity::class.java).apply {
putExtra("data", Gson().toJson(shortPlay))
})
}
contactAdapter?.addAdapter(0, it)
}
val activity = requireActivity() as MainActivity?
bannerAdapter = BannerAdapter()
bannerAdapter?.let {
it.paletteAction = {
binding.root.setBackgroundColor(it)
}
it.playAction = { shortPlay ->
startActivity(Intent(activity, PlayFullActivity::class.java).apply {
putExtra("data", Gson().toJson(shortPlay))
})
}
contactAdapter?.addAdapter(0, it)
}
lifecycleScope.launch(Dispatchers.Main) {
activity?.viewModel?.bannerList?.collectLatest { bannerList ->
LogEx.logDebug(TAG, "bannerList=${bannerList.size}")
bannerAdapter?.submitList(listOf(bannerList))
}
}
}
......@@ -105,9 +100,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
override fun onResumeOneShoot() {
super.onResumeOneShoot()
binding.root.postDelayed({
bannerAdapter?.setBannerAutoLoop(true)
}, 1500)
val activity = requireActivity() as MainActivity?
activity?.viewModel?.getCategoryListFlow(true)
}
override fun onResume() {
......@@ -120,15 +115,16 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}
private fun initNewShortAdapter() {
viewModel.getNewDrama { list ->
if (list.size > 4) {
val activity = requireActivity() as MainActivity?
activity?.runOnUiThread {
columnsAdapter = ShortPlayColumnsAdapter("New Short", list)
columnsAdapter?.let { contactAdapter?.addAdapter(it) }
val activity = requireActivity() as MainActivity?
columnsAdapter = ShortPlayColumnsAdapter("New Short")
columnsAdapter?.let { contactAdapter?.addAdapter(it) }
lifecycleScope.launch(Dispatchers.Main) {
activity?.viewModel?.newList?.collectLatest { list ->
if (list.size > 4) {
columnsAdapter?.submitList(listOf(list))
}
}
viewModel.sendHomeCategoryFlow()
}
}
......
......@@ -3,6 +3,8 @@ package com.base.appzxhy.ui.main
import android.graphics.Color
import android.view.LayoutInflater
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.base.appzxhy.R
......@@ -10,6 +12,7 @@ import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.bean.HomeTabUIBean
import com.base.appzxhy.databinding.ActivityMainBinding
import com.base.appzxhy.databinding.ItemHomeTabBinding
import com.base.appzxhy.ui.vm.ShortPlayViewModel
import com.base.appzxhy.utils.LogEx
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
......@@ -27,11 +30,28 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
HomeTabUIBean(R.drawable.bg_selector_profile, "Profile"),
)
}
val viewModel by lazy(LazyThreadSafetyMode.NONE) {
ViewModelProvider(this)[ShortPlayViewModel::class.java]
}
override fun initView() {
super.initView()
navController = (supportFragmentManager.findFragmentById(R.id.fragment_container) as NavHostFragment).navController
navController.addOnDestinationChangedListener { controller, destination, arguments ->
LogEx.logDebug(TAG, "addOnDestinationChangedListener")
if (destination.id == R.id.homeFragment) {
LogEx.logDebug(TAG, "addOnDestinationChangedListener homeFragment")
}
}
initTab()
viewModel.getPopularDrama()
viewModel.getNewDrama()
}
private fun initTab() {
......@@ -68,17 +88,40 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
private fun naviFragment(id: Int) {
when (id) {
0 -> {
if (navController.currentDestination?.id != R.id.homeFragment) {
navController.navigate(R.id.homeFragment)
}
}
1 -> {
navController.navigate(R.id.playSlideFragment)
}
2 -> {
navController.navigate(R.id.myListFragment)
}
3 -> {
navController.navigate(R.id.rewardsFragment)
}
4 -> {
navController.navigate(R.id.profileFragment)
}
}
}
private fun showFragment(targetFragment: Fragment) {
val transaction = supportFragmentManager.beginTransaction()
// 隐藏所有Fragment
for (fragment in supportFragmentManager.fragments) {
transaction.hide(fragment)
}
// 显示当前需要显示的Fragment
transaction.show(targetFragment)
transaction.commit()
}
fun TabLayout.Tab.setUnselected() {
val textView = customView?.findViewById<TextView>(R.id.tv_tab)
LogEx.logDebug(TAG, "setUnselected ${textView?.text}")
......
package com.base.appzxhy.ui.main
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentMyListBinding
class MyListFragment : BaseFragment<FragmentMyListBinding>(FragmentMyListBinding::inflate) {
}
\ No newline at end of file
package com.base.appzxhy.ui.main
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentPlaySlideBinding
class PlaySlideFragment : BaseFragment<FragmentPlaySlideBinding>(FragmentPlaySlideBinding::inflate) {
override fun initView() {
super.initView()
}
override fun initListener() {
super.initListener()
}
}
\ No newline at end of file
package com.base.appzxhy.ui.main
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentProfileBinding
class ProfileFragment : BaseFragment<FragmentProfileBinding>(FragmentProfileBinding::inflate) {
}
\ No newline at end of file
package com.base.appzxhy.ui.main
import com.base.appzxhy.base.BaseFragment
import com.base.appzxhy.databinding.FragmentRewardsBinding
class RewardsFragment : BaseFragment<FragmentRewardsBinding>(FragmentRewardsBinding::inflate) {
}
\ No newline at end of file
package com.base.appzxhy.ui.play
import android.content.Context
import android.util.AttributeSet
import android.widget.FrameLayout
import com.base.appzxhy.R
import com.base.appzxhy.databinding.LayoutOverlayForyouBinding
import com.bytedance.sdk.shortplay.api.PSSDK
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.bytedance.sdk.shortplay.api.ShortPlayFragment
/**
* 自定义播放页面悬浮成
*/
class CustomOverlayView : FrameLayout, PSSDK.IControlView {
private var layout: Int = 0
constructor(context: Context, layout: Int) : super(context) {
this.layout = layout
inflate(context, layout, this)
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun getControlViewType(): PSSDK.ControlViewType {
return PSSDK.ControlViewType.CUSTOM
}
override fun bindItemData(shortPlayFragment: ShortPlayFragment?, shortPlay: ShortPlay, index: Int) {
when (layout) {
R.layout.layout_overlay_foryou -> {
val binding = LayoutOverlayForyouBinding.bind(this)
binding.tvTitle.text = shortPlay.title
binding.tvDesc.text = shortPlay.desc
}
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.play
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.Gravity
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.content.ContextCompat
import com.base.appzxhy.R
import com.bytedance.sdk.shortplay.api.PSSDK
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.bytedance.sdk.shortplay.api.ShortPlayFragment
class CustomShareView : AppCompatTextView, PSSDK.IControlView {
private val TAG = "CustomShareView"
private var shareDrawable: Drawable?
constructor(context: Context) : super(context) {
gravity = Gravity.CENTER_HORIZONTAL
setTextColor(Color.parseColor("#ffffff"))
textSize = 12f
shareDrawable = ContextCompat.getDrawable(context, R.mipmap.fy_share)
val size = resources.getDimensionPixelSize(R.dimen.dp_32)
shareDrawable?.setBounds(0, 0, size, size)
setCompoundDrawables(null, shareDrawable, null, null)
}
override fun getControlViewType(): PSSDK.ControlViewType {
return PSSDK.ControlViewType.Share
}
override fun bindItemData(fragment: ShortPlayFragment?, shortPlay: ShortPlay, index: Int) {
}
}
\ No newline at end of file
......@@ -8,19 +8,15 @@ import android.view.Gravity
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.content.ContextCompat
import com.base.appzxhy.R
import com.base.appzxhy.utils.LogEx
import com.bytedance.sdk.shortplay.api.PSSDK
import com.bytedance.sdk.shortplay.api.PSSDK.ControlStatus
import com.bytedance.sdk.shortplay.api.PSSDK.IControlStatusView
import com.bytedance.sdk.shortplay.api.ShortPlay
import com.bytedance.sdk.shortplay.api.ShortPlayFragment
class CustomView : AppCompatTextView, IControlStatusView {
class CustomView : AppCompatTextView, PSSDK.IControlView {
private val TAG = "CustomEPView"
private var drawable: Drawable?
private var status = ControlStatus.Normal
constructor(context: Context, drawableRes: Int) : super(context) {
gravity = Gravity.CENTER_HORIZONTAL
......@@ -42,18 +38,5 @@ class CustomView : AppCompatTextView, IControlStatusView {
override fun bindItemData(fragment: ShortPlayFragment?, shortPlay: ShortPlay, index: Int) {
}
@SuppressLint("SetTextI18n")
override fun setCurrentStatus(shortPlay: ShortPlay, index: Int, status: ControlStatus, extraInfo: PSSDK.StatusExtraInfo) {
this.status = status
LogEx.logDebug(TAG, "setCurrentStatus status=$status")
}
override fun getCurrentStatus(shortPlay: ShortPlay, index: Int): ControlStatus {
return status
}
override fun onClicked(shortPlay: ShortPlay, index: Int, status: ControlStatus): ControlStatus {
return ControlStatus.Normal
}
}
\ No newline at end of file
package com.base.appzxhy.ui.play
import android.annotation.SuppressLint
import android.content.Intent
import android.view.Gravity
import android.view.View
import android.widget.FrameLayout
......@@ -8,6 +9,8 @@ import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.databinding.ActivityPlayFullBinding
import com.base.appzxhy.shortplay.PlayHistoryHelper
import com.base.appzxhy.ui.views.DialogSelectEP
import com.base.appzxhy.ui.views.ShortPlayEPDialog.showShortPlayEPDialog
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.ToastUtils.toast
import com.bytedance.sdk.shortplay.api.PSSDK
......@@ -25,7 +28,7 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
private var detailFragment: ShortPlayFragment? = null
private val startFromIndex = 1//剧集下标
private var startFromIndex = 1//剧集下标
private val startFromSeconds = 0//开始秒数
private val playHistory: PlayHistoryHelper.PlayHistory = PlayHistoryHelper.PlayHistory()
......@@ -91,7 +94,9 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
})
builder.progressBarMarginToBottom(10)
builder.enableImmersiveMode(1500)
builder.enableImmersiveMode(5000)
builder.enableAutoPlayNext(true)
builder.displayProgressBar(false)
detailFragment = PSSDK.createDetailFragment(shortPlay, builder.build(), object : PSSDK.ShortPlayDetailPageListener {
......@@ -177,21 +182,34 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
customCollectView.setLayoutParams(collectParams)
views.add(customCollectView)
//选集
//选集,测试过无法触发点击事件
val customPEView = CustomView(applicationContext, R.mipmap.fy_list)
customPEView.text = resources.getString(R.string.list)
val peParams =
FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT).apply {
gravity = Gravity.BOTTOM or Gravity.RIGHT
bottomMargin = aLLBottomMargin + itemMargin
bottomMargin = aLLBottomMargin + itemMargin * 1
rightMargin = this@PlayFullActivity.resources.getDimensionPixelSize(R.dimen.dp_18)
}
customPEView.setLayoutParams(peParams)
views.add(customPEView)
customPEView.setOnClickListener {
detailFragment?.pausePlay()
showShortPlayEPDialog(shortPlay.total, startFromIndex, 5, object : DialogSelectEP {
override fun dismissAction() {
detailFragment?.startPlay()
}
override fun selectEPAction(ep: Int) {
super.selectEPAction(ep)
startFromIndex = ep
detailFragment?.startPlayIndex(startFromIndex)
}
})
}
//分享
val customShareView = CustomView(applicationContext, R.mipmap.fy_share)
val customShareView = CustomShareView(applicationContext)
customShareView.text = resources.getString(R.string.share)
val shareParams =
FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT).apply {
......@@ -201,6 +219,19 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
}
customShareView.setLayoutParams(shareParams)
views.add(customShareView)
customShareView.setOnClickListener {
val intent = Intent(Intent.ACTION_SEND)
intent.setType("text/plain")
intent.putExtra(Intent.EXTRA_SUBJECT, shortPlay.title)
intent.putExtra(Intent.EXTRA_TEXT, shortPlay.desc)
startActivity(Intent.createChooser(intent, "分享短剧"))
}
//控制按钮
val playControlView = CustomOverlayView(this@PlayFullActivity, R.layout.layout_overlay_player)
playControlView.layoutParams =
FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
views.add(playControlView)
return views
}
......
package com.base.appzxhy.ui.views
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.core.content.ContextCompat
import com.base.appzxhy.R
import com.base.appzxhy.bean.ShortPlayEPBean
import com.base.appzxhy.databinding.DialogEpListBinding
import com.base.appzxhy.ui.adapter.EPAdapter
import com.base.appzxhy.utils.XmlEx.inflate
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
interface DialogSelectEP {
open fun dismissAction() {}
open fun selectEPAction(ep: Int) {}
}
object ShortPlayEPDialog {
fun Context.showShortPlayEPDialog(totalEp: Int, lockEp: Int, playEp: Int) {
@SuppressLint("SetTextI18n")
fun Context.showShortPlayEPDialog(
totalEp: Int,
playEp: Int,
lockEp: Int = 9,
callBack: DialogSelectEP
) {
val dialog = BottomSheetDialog(this, R.style.BottomSheetDialog)
val binding = DialogEpListBinding.inflate(LayoutInflater.from(this))
dialog.setContentView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.setCanceledOnTouchOutside(true)
dialog.show()
......@@ -24,30 +41,44 @@ object ShortPlayEPDialog {
//展开
behavior.state = BottomSheetBehavior.STATE_EXPANDED
val textLength = resources.getDimensionPixelOffset(R.dimen.dp_5)
val list = ArrayList<ShortPlayEPBean>()
repeat(totalEp) { i ->
val ep = i + 1
val lock = ep >= lockEp
val isPlay = ep == playEp
val bean = ShortPlayEPBean(ep, lock, isPlay)
list.add(bean)
}
val splitLists = list.chunked(50)
splitLists.forEach {
val view = R.layout.item_ep_tab.inflate(this)
view.findViewById<TextView>(R.id.tv).text = "${it.first().ep} - ${it.last().ep}"
binding.dslTabLayout.addView(view)
}
binding.dslTabLayout.tabIndicator.indicatorDrawable =
ContextCompat.getDrawable(this, R.drawable.indicator_bottom_line_ff3d71)
binding.dslTabLayout.tabIndicator.indicatorEnableFlow = true
binding.dslTabLayout.tabIndicator.ignoreChildPadding = true
binding.dslTabLayout.tabIndicator.indicatorWidth = resources.getDimensionPixelSize(R.dimen.dp_28)
binding.dslTabLayout.tabIndicator.indicatorHeight = resources.getDimensionPixelSize(R.dimen.dp_2)
val adapter = EPAdapter()
binding.rv.adapter = adapter
adapter.selectEp = { ep, lock ->
dialog.dismiss()
callBack.selectEPAction(ep)
}
// binding.dslTabLayout.tabIndicator.indicatorDrawable =
// ContextCompat.getDrawable(this, R.drawable.indicator_bottom_line_ff3d71)
// binding.dslTabLayout.tabIndicator.indicatorEnableFlow = true
// binding.dslTabLayout.tabIndicator.ignoreChildPadding = true
//
// binding.dslTabLayout.configTabLayoutConfig {
// onSelectIndexChange = { fromIndex, selectIndexList, reselect, fromUser ->
// val toIndex = selectIndexList.first()
// binding.dslTabLayout.tabIndicator.indicatorWidth = tab.length * textLength
// }
// }
binding.dslTabLayout.configTabLayoutConfig {
onSelectIndexChange = { fromIndex, selectIndexList, reselect, fromUser ->
val toIndex = selectIndexList.first()
val epList = splitLists[toIndex]
adapter.submitList(epList)
}
}
dialog.setOnDismissListener {
callBack.dismissAction()
}
}
}
\ No newline at end of file
package com.base.appzxhy.ui.views
import android.app.AlertDialog
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import com.base.appzxhy.databinding.DialogPlayQualityBinding
object ShortPlayQualityDialog {
fun Context.showShortPlayQualityDialog() {
val dialog = AlertDialog.Builder(this).create()
val binding = DialogPlayQualityBinding.inflate(LayoutInflater.from(this))
dialog.setView(binding.root)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val params = dialog.window?.attributes
// params?.width = resources.getDimensionPixelOffset(R.dimen.dp_320)
// params?.height = resources.getDimensionPixelOffset(R.dimen.dp_400)
params?.gravity = Gravity.CENTER
// params?.y = 50
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.base.appzxhy.ui.vm
import android.content.Context
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelStore
import androidx.lifecycle.viewModelScope
import com.base.appzxhy.R
import com.base.appzxhy.utils.LogEx
......@@ -9,6 +10,7 @@ import com.bytedance.sdk.shortplay.api.PSSDK
import com.bytedance.sdk.shortplay.api.PSSDK.FeedListLoadResult
import com.bytedance.sdk.shortplay.api.PSSDK.FeedListResultListener
import com.bytedance.sdk.shortplay.api.ShortPlay
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import java.util.concurrent.atomic.AtomicBoolean
......@@ -17,6 +19,10 @@ class ShortPlayViewModel : ViewModel() {
private val TAG = "ShortPlayViewModel"
val bannerList = MutableStateFlow<List<ShortPlay>>(listOf())
var newList = MutableStateFlow<List<ShortPlay>>(listOf())
var categoryList = MutableStateFlow<List<ShortPlay>>(listOf())
companion object {
const val CATEGORY_MALE_ID = 1L//男频
......@@ -33,13 +39,8 @@ class ShortPlayViewModel : ViewModel() {
const val CATEGORY_ACTION_ID = 12L//动作
const val CATEGORY_ACG_ID = 13L//二次元
const val CATEGORY_OTHERS_ID = 14L//其他
}
private val categoryLoading = AtomicBoolean(false)
var homeCategoryFlow = MutableStateFlow(-1L)
private val homeCategoryList =
arrayListOf(
0,
private val tempCategoryList = listOf(
CATEGORY_CITY_ID,
CATEGORY_MODERN_ID,
CATEGORY_COMEDY_ID,
......@@ -53,37 +54,58 @@ class ShortPlayViewModel : ViewModel() {
CATEGORY_ACG_ID,
CATEGORY_OTHERS_ID
)
}
fun sendHomeCategoryFlow() {
if (homeCategoryList.isEmpty()) return
if (categoryLoading.get()) return
val nextCategory = homeCategoryList[0]
homeCategoryList.removeAt(0)
LogEx.logDebug(TAG, "nextCategory=$nextCategory")
viewModelScope.launch {
homeCategoryFlow.emit(nextCategory)
}
private val categoryLoading = AtomicBoolean(false)
private val homeCategoryList = ArrayList<Long>().apply {
addAll(tempCategoryList)
}
fun getCategoryListFlow(
reload: Boolean = false,
count: Int = 12,
) {
if (reload) {
homeCategoryList.addAll(tempCategoryList)
}
if (homeCategoryList.isNotEmpty()) {
val nextCategory = homeCategoryList[0]
homeCategoryList.removeAt(0)
PSSDK.requestFeedListByCategoryIds(listOf(nextCategory), null, 1, count, object : FeedListResultListener {
override fun onFail(errorInfo: PSSDK.ErrorInfo?) {
LogEx.logDebug(TAG, "requestFeedListByCategoryIds ${errorInfo?.msg} ${errorInfo?.code}")
getCategoryListFlow(false)
}
override fun onSuccess(result: FeedListLoadResult<ShortPlay>?) {
viewModelScope.launch(Dispatchers.IO) {
result?.dataList?.let { categoryList.emit(it) }
}
}
})
}
}
/**
* 获取热门短剧列表
*/
fun getPopularDrama(
count: Int = 10,
uiAction: (list: List<ShortPlay>) -> Unit
) {
PSSDK.requestPopularDrama(1, count, object : FeedListResultListener {
override fun onFail(errorInfo: PSSDK.ErrorInfo?) {
LogEx.logDebug(TAG, "requestPopularDrama ${errorInfo?.msg} ${errorInfo?.code}")
}
override fun onSuccess(result: FeedListLoadResult<ShortPlay>?) {
// LogEx.logDebug(TAG, "hasMore=${result?.hasMore}")
// LogEx.logDebug(TAG, "fromCache=${result?.fromCache}")
// LogEx.logDebug(TAG, "dataList=${result?.dataList?.size}")
result?.dataList?.let { uiAction.invoke(it) }
result?.dataList?.let {
viewModelScope.launch { bannerList.emit(it) }
}
}
})
}
......@@ -93,7 +115,6 @@ class ShortPlayViewModel : ViewModel() {
*/
fun getNewDrama(
count: Int = 12,
uiAction: (list: List<ShortPlay>) -> Unit
) {
PSSDK.requestNewDrama(1, count, object : FeedListResultListener {
override fun onFail(errorInfo: PSSDK.ErrorInfo?) {
......@@ -102,7 +123,9 @@ class ShortPlayViewModel : ViewModel() {
override fun onSuccess(result: FeedListLoadResult<ShortPlay>?) {
LogEx.logDebug(TAG, "dataList=${result?.dataList?.size}")
result?.dataList?.let { uiAction.invoke(it) }
result?.dataList?.let {
viewModelScope.launch { newList.emit(it) }
}
}
})
}
......@@ -151,6 +174,7 @@ class ShortPlayViewModel : ViewModel() {
}
}
/**
* 获取分类标签接口
*/
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF3D71"/>
<corners android:radius="10dp"/>
</shape>
\ No newline at end of file
......@@ -3,11 +3,11 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="336dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="336dp"
android:background="@mipmap/fy_bg"
android:minHeight="336dp"
app:layout_constraintEnd_toEndOf="parent"
......@@ -31,8 +31,10 @@
android:id="@+id/dslTabLayout"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="20dp"
app:layout_constraintTop_toBottomOf="@id/tv"
app:tab_default_index="0"
app:tab_indicator_height="2dp">
</com.angcyo.tablayout.DslTabLayout>
......@@ -41,12 +43,16 @@
android:id="@+id/v"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="5dp"
android:background="@color/white"
app:layout_constraintTop_toBottomOf="@id/dslTabLayout" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="0dp"
android:layout_marginBottom="20dp"
android:layout_marginTop="16dp"
android:layout_marginHorizontal="12dp"
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".ui.main.MyListFragment">
<com.angcyo.tablayout.DslTabLayout
android:id="@+id/dslTabLayout"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.angcyo.tablayout.DslTabLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:src="@mipmap/my_bianji_n"
app:layout_constraintBottom_toBottomOf="@id/dslTabLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/dslTabLayout">
<ImageView
android:id="@+id/ivIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/my_bianji_n"
tools:ignore="ContentDescription" />
</FrameLayout>
<LinearLayout
android:id="@+id/llEmpty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@mipmap/mylistwushuju"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/nothing_here_yet_add_something"
android:textColor="#B3FFFFFF"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/btnDiscover"
android:layout_width="250dp"
android:layout_height="50dp"
android:layout_marginTop="52dp"
android:background="@drawable/bg_ff3d71_10"
android:gravity="center"
android:text="@string/discover_more"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.PlaySlideFragment">
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.ProfileFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.RewardsFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="0dp"
android:layout_width="match_parent"
android:layout_height="46dp"
android:layout_columnWeight="1"
android:layout_margin="4dp"
......@@ -11,6 +11,7 @@
android:id="@+id/tvEP"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@color/white"
android:textSize="16sp" />
......@@ -25,10 +26,10 @@
<ImageView
android:id="@+id/ivLock"
android:layout_gravity="end|top"
android:src="@mipmap/fy_suo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|top"
android:src="@mipmap/fy_suo"
tools:ignore="ContentDescription" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="8dp"
android:paddingVertical="2dp"
android:text="1 - 50"
android:textColor="@color/white"
android:textSize="14sp"
android:textStyle="bold"
tools:ignore="HardcodedText">
</TextView>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="#99000000">
<LinearLayout
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom|start"
android:layout_marginStart="16dp"
android:layout_marginBottom="65dp"
android:orientation="vertical"
tools:ignore="UselessParent">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="17sp"
android:textStyle="bold"
tools:text="Genius Baby Gets Daddy Back" />
<TextView
android:id="@+id/tvDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@color/white"
android:textSize="13sp"
tools:text="Afler a medical mishap, the virgin Violet Gray becomes pregnant wit... More" />
<LinearLayout
android:id="@+id/llBtn"
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="16dp"
android:background="@drawable/bg_ff3d71_10"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/fy_poly"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="Watch Now"
android:textColor="@color/white"
android:textSize="15sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="#99000000">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="60dp">
<!-- <TextView-->
<!-- android:id="@+id/tvPlaySecond"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content" />-->
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
\ No newline at end of file
......@@ -10,4 +10,24 @@
android:name="com.base.appzxhy.ui.main.HomeFragment"
android:label="fragment_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/myListFragment"
android:name="com.base.appzxhy.ui.main.MyListFragment"
android:label="fragment_my_list"
tools:layout="@layout/fragment_my_list" />
<fragment
android:id="@+id/playSlideFragment"
android:name="com.base.appzxhy.ui.main.PlaySlideFragment"
android:label="fragment_play_slide"
tools:layout="@layout/fragment_play_slide" />
<fragment
android:id="@+id/rewardsFragment"
android:name="com.base.appzxhy.ui.main.RewardsFragment"
android:label="fragment_rewards"
tools:layout="@layout/fragment_rewards" />
<fragment
android:id="@+id/profileFragment"
android:name="com.base.appzxhy.ui.main.ProfileFragment"
android:label="fragment_profile"
tools:layout="@layout/fragment_profile" />
</navigation>
\ No newline at end of file
......@@ -28,4 +28,5 @@
<dimen name="dp_310">310dp</dimen>
<dimen name="dp_330">330dp</dimen>
<dimen name="dp_70">70dp</dimen>
<dimen name="dp_28">28dp</dimen>
</resources>
\ No newline at end of file
......@@ -28,5 +28,7 @@
<string name="others">Others</string>
<string name="share">Share</string>
<string name="list">List</string>
<string name="discover_more">Discover More</string>
<string name="nothing_here_yet_add_something">Nothing here yet - Add something!</string>
</resources>
\ No newline at end of file
......@@ -15,6 +15,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment