From 848537d35bcb3c3a3816de56b0a3aa89609dea3d Mon Sep 17 00:00:00 2001 From: raoqian <506411586@qq.com> Date: Mon, 22 Sep 2025 18:28:57 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AE=8C=E6=88=90=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E9=80=9F=E5=BA=A6=E5=BC=B9=E7=AA=97=202.?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E8=AF=A6=E6=83=85=E9=A1=B5=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E5=89=A7=E4=BB=A5=E5=8F=8A=E9=80=89=E9=9B=86?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jia/er/nebuluxe/app/basics/Constants.kt | 2 + .../jia/er/nebuluxe/app/home/HomeFragment.kt | 128 +++++----- .../nebuluxe/app/home/InputResultAdapter.kt | 4 - .../er/nebuluxe/app/home/SearchActivity.kt | 2 +- .../jia/er/nebuluxe/app/main/MainActivity.kt | 33 +-- .../jia/er/nebuluxe/app/net/MainRequest.kt | 5 + .../jia/er/nebuluxe/app/net/MainViewModel.kt | 10 +- .../com/jia/er/nebuluxe/app/ui/LoadingLine.kt | 2 +- .../er/nebuluxe/app/utils/ImageLoadUtil.kt | 18 ++ .../com/jia/er/nebuluxe/app/utils/LOG.java | 5 + .../app/video/NewRecommendBannerAdapter.kt | 12 + .../app/video/PlayerDetailActivity.kt | 218 +++++++++--------- .../nebuluxe/app/video/PlayerDetailAdapter.kt | 5 +- .../nebuluxe/app/video/SeriesDataAdapter.kt | 36 +-- .../app/video/SeriesDialogFragment.kt | 43 ++-- .../nebuluxe/app/video/SpeedDialogFragment.kt | 88 +++++++ .../nebuluxe/app/video/VideoSettingEvent.java | 27 +++ app/src/main/res/drawable-xxhdpi/ic_lock.png | Bin 0 -> 566 bytes app/src/main/res/drawable-xxhdpi/ic_play.png | Bin 0 -> 374 bytes app/src/main/res/drawable-xxhdpi/ic_speed.png | Bin 0 -> 651 bytes .../res/drawable/bg_conner_20px_trans.xml | 5 + .../drawable/bg_conner_50px_black_history.xml | 5 + .../main/res/drawable/bg_example_num_h.xml | 15 +- .../main/res/drawable/bg_example_num_n.xml | 12 +- .../drawable/bg_example_seekbar_player.xml | 15 -- .../bg_example_shape_seekbar_player.xml | 4 - .../main/res/drawable/ic_arrow_up_white.png | Bin 0 -> 268 bytes .../res/drawable/ic_bg_of_video_index.xml | 8 + app/src/main/res/drawable/ic_close_his.png | Bin 0 -> 806 bytes app/src/main/res/drawable/ic_ep_tip.png | Bin 0 -> 492 bytes app/src/main/res/drawable/ic_more.png | Bin 0 -> 322 bytes app/src/main/res/drawable/ic_play_his.png | Bin 0 -> 322 bytes app/src/main/res/drawable/ic_qua_108.png | Bin 0 -> 743 bytes app/src/main/res/drawable/ic_qua_72.png | Bin 0 -> 671 bytes app/src/main/res/drawable/ic_quality.png | Bin 0 -> 519 bytes app/src/main/res/drawable/progress_bar.xml | 20 ++ app/src/main/res/drawable/progress_thumb.xml | 8 + .../main/res/drawable/sel_bg_example_num.xml | 5 + .../res/drawable/sel_color_example_num.xml | 5 + .../main/res/drawable/sel_color_gray_pink.xml | 5 + .../main/res/drawable/sel_vis_example_num.xml | 5 + app/src/main/res/layout/activity_main.xml | 2 +- .../res/layout/close_episode_recommend.xml | 1 + .../layout/detail_player_view_controller.xml | 181 ++++++++++----- app/src/main/res/layout/dialog_series.xml | 87 +++---- app/src/main/res/layout/dialog_speed.xml | 214 +++++++++++++++++ app/src/main/res/layout/fragment_home.xml | 85 ++++++- app/src/main/res/layout/item_num_data.xml | 29 ++- app/src/main/res/layout/line_layout.xml | 4 +- .../recommend_player_view_controller.xml | 4 +- app/src/main/res/values/strings.xml | 15 +- app/src/main/res/values/styles.xml | 6 + 52 files changed, 980 insertions(+), 398 deletions(-) create mode 100644 app/src/main/java/com/jia/er/nebuluxe/app/utils/ImageLoadUtil.kt create mode 100644 app/src/main/java/com/jia/er/nebuluxe/app/video/SpeedDialogFragment.kt create mode 100644 app/src/main/java/com/jia/er/nebuluxe/app/video/VideoSettingEvent.java create mode 100644 app/src/main/res/drawable-xxhdpi/ic_lock.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_play.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_speed.png create mode 100644 app/src/main/res/drawable/bg_conner_20px_trans.xml create mode 100644 app/src/main/res/drawable/bg_conner_50px_black_history.xml delete mode 100644 app/src/main/res/drawable/bg_example_seekbar_player.xml delete mode 100644 app/src/main/res/drawable/bg_example_shape_seekbar_player.xml create mode 100644 app/src/main/res/drawable/ic_arrow_up_white.png create mode 100644 app/src/main/res/drawable/ic_bg_of_video_index.xml create mode 100644 app/src/main/res/drawable/ic_close_his.png create mode 100644 app/src/main/res/drawable/ic_ep_tip.png create mode 100644 app/src/main/res/drawable/ic_more.png create mode 100644 app/src/main/res/drawable/ic_play_his.png create mode 100644 app/src/main/res/drawable/ic_qua_108.png create mode 100644 app/src/main/res/drawable/ic_qua_72.png create mode 100644 app/src/main/res/drawable/ic_quality.png create mode 100644 app/src/main/res/drawable/progress_bar.xml create mode 100644 app/src/main/res/drawable/progress_thumb.xml create mode 100644 app/src/main/res/drawable/sel_bg_example_num.xml create mode 100644 app/src/main/res/drawable/sel_color_example_num.xml create mode 100644 app/src/main/res/drawable/sel_color_gray_pink.xml create mode 100644 app/src/main/res/drawable/sel_vis_example_num.xml create mode 100644 app/src/main/res/layout/dialog_speed.xml diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/basics/Constants.kt b/app/src/main/java/com/jia/er/nebuluxe/app/basics/Constants.kt index 28448cb..ad2fd40 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/basics/Constants.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/basics/Constants.kt @@ -30,6 +30,8 @@ object Constants { const val Constants_Episodes_Series_DataExample = "Constants_Episodes_Series_DataExample" const val CONSTANTS_activity_id = "activity_id" const val CONSTANTS_refresh_me = "CONSTANTS_refresh_me" + const val CONSTANTS_video_speed = "CONSTANTS_video_speed" + const val CONSTANTS_video_quality = "CONSTANTS_video_quality" const val Constants_DDL_Url = "Constants_DDL_Url" const val CONSTANTS_leaveApp = "CONSTANTS_leaveApp" const val CONSTANTS_enterTheApp = "CONSTANTS_enterTheApp" diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/home/HomeFragment.kt b/app/src/main/java/com/jia/er/nebuluxe/app/home/HomeFragment.kt index 4c8ecd3..5dc07e0 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/home/HomeFragment.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/home/HomeFragment.kt @@ -11,6 +11,7 @@ import com.jia.er.nebuluxe.app.R import com.jia.er.nebuluxe.app.basics.BaseActivity import com.jia.er.nebuluxe.app.basics.BaseFragment import com.jia.er.nebuluxe.app.basics.Constants +import com.jia.er.nebuluxe.app.data.HistoryDataRes import com.jia.er.nebuluxe.app.data.HomeBannerAndNineSquarepRes import com.jia.er.nebuluxe.app.data.HomeBannerBean import com.jia.er.nebuluxe.app.data.HomeModuleBean @@ -18,6 +19,7 @@ import com.jia.er.nebuluxe.app.data.HomeTopWeekRes import com.jia.er.nebuluxe.app.databinding.FragmentHomeBinding import com.jia.er.nebuluxe.app.net.MainViewModel import com.jia.er.nebuluxe.app.ui.RotateDownPageTransformer +import com.jia.er.nebuluxe.app.utils.ImageLoadUtil import com.jia.er.nebuluxe.app.utils.LOG import com.jia.er.nebuluxe.app.utils.singleClick import com.jia.er.nebuluxe.app.utils.toast @@ -40,6 +42,27 @@ class HomeFragment : BaseFragment() { page = 1 mViewModel.allModules() } + + mViewModel.historysData_home.observe(this) { + if (it.data?.list?.get(0) != null) { + binding.llHistory.visibility = View.VISIBLE + binding.tvHisTitle.text = it.data.list[0].name + binding.tvHisEp.text = + String.format(getString(R.string.ep_), it.data.list[0].current_episode) + ImageLoadUtil.loadImage( + it.data.list[0].image_url, binding.ivHistory + ) + binding.ivHisPlay.tag = it.data.list[0] + } + } + binding.ivHisClose.setOnClickListener { + binding.llHistory.visibility = View.GONE + } + binding.ivHisPlay.setOnClickListener { + binding.llHistory.visibility = View.GONE + openVideo((it.tag as HistoryDataRes.Data).short_play_id) + } + mViewModel.myHomeHistory() binding.tvHot.setOnClickListener { skip2Activity(HotActivity::class.java) } @@ -97,9 +120,7 @@ class HomeFragment : BaseFragment() { private fun setMarqueeData(item: HomeModuleBean.RecommandDataBean) { binding.root.postDelayed({ dataList.clear() - val marqueeList = - gson.fromJson(item.data, Array::class.java) - .toList() + val marqueeList = gson.fromJson(item.data, Array::class.java).toList() marqueeList?.forEach { it1 -> dataList.add(it1.name) } @@ -110,28 +131,16 @@ class HomeFragment : BaseFragment() { } private fun setNewRecommend(item: HomeModuleBean.RecommandDataBean) { - val cagetoryBean = - gson.fromJson(item.data, HomeTopWeekRes::class.java) + val cagetoryBean = gson.fromJson(item.data, HomeTopWeekRes::class.java) if (cagetoryBean.list.isNotEmpty()) { binding?.clBannerB?.visibility = View.VISIBLE - val exampleHomeBannerAdapter = - HomeBannerBottomAdapter(cagetoryBean.list) + val exampleHomeBannerAdapter = HomeBannerBottomAdapter(cagetoryBean.list) binding?.bannerHomeB?.setBannerGalleryEffect(24, 10, 1f) binding?.bannerHomeB?.setAdapter( exampleHomeBannerAdapter - )?.addBannerLifecycleObserver(this) - ?.setIndicator(binding.indicatorHome, false) + )?.addBannerLifecycleObserver(this)?.setIndicator(binding.indicatorHome, false) exampleHomeBannerAdapter.setOnBannerListener { data, position -> - startActivity( - Intent( - context, - PlayerDetailActivity::class.java - ).apply { - putExtra( - Constants.CONSTANTS_short_play_id, - data?.short_play_id - ) - }) + openVideo(data?.short_play_id) } } else { binding?.clBannerB?.visibility = View.GONE @@ -139,31 +148,19 @@ class HomeFragment : BaseFragment() { } private fun setRecommendData(item: HomeModuleBean.RecommandDataBean) { - val homeBannerAndNineSquarepRes = - gson.fromJson( - item.data, - HomeBannerAndNineSquarepRes::class.java - ) + val homeBannerAndNineSquarepRes = gson.fromJson( + item.data, HomeBannerAndNineSquarepRes::class.java + ) if (homeBannerAndNineSquarepRes?.list?.isNotEmpty() == true) { binding?.clBanner?.visibility = View.VISIBLE - val exampleHomeBannerAdapter = - HomeBannerAdapter(homeBannerAndNineSquarepRes?.list) + val exampleHomeBannerAdapter = HomeBannerAdapter(homeBannerAndNineSquarepRes?.list) binding?.bannerHome?.apply { setAdapter(exampleHomeBannerAdapter) setBannerGalleryEffect(65, 10, 1f) setPageTransformer(RotateDownPageTransformer(10.5f)) } exampleHomeBannerAdapter.setOnBannerListener { data, position -> - startActivity( - Intent( - context, - PlayerDetailActivity::class.java - ).apply { - putExtra( - Constants.CONSTANTS_short_play_id, - data?.short_play_id - ) - }) + openVideo(data?.short_play_id) } } else { binding?.clBanner?.visibility = View.GONE @@ -171,26 +168,20 @@ class HomeFragment : BaseFragment() { } private fun setBannerData(item: HomeModuleBean.RecommandDataBean) { - val bannerList = - gson.fromJson(item.data, Array::class.java) - .toList() + val bannerList = gson.fromJson(item.data, Array::class.java).toList() if (bannerList?.isNotEmpty() == true) { binding?.clFs?.visibility = View.VISIBLE val exampleDominantCeoAdapter = HomeMostAdapter() - val layoutManager = - LinearLayoutManager( - context, - LinearLayoutManager.HORIZONTAL, - false - ) + val layoutManager = LinearLayoutManager( + context, LinearLayoutManager.HORIZONTAL, false + ) binding?.rvFs?.layoutManager = layoutManager binding?.rvFs?.adapter = exampleDominantCeoAdapter binding?.rvFs?.isNestedScrollingEnabled = false exampleDominantCeoAdapter.submitList(bannerList) val video = bannerList[0] Glide.with(requireContext()).load(video?.horizontally_img) - .placeholder(R.drawable.iv_placeholder_h) - .into(binding.ivFs) + .placeholder(R.drawable.iv_placeholder_h).into(binding.ivFs) binding.tvName.text = video.name if (video.category.isNotEmpty()) { binding.tvTag.visibility = View.VISIBLE @@ -199,24 +190,13 @@ class HomeFragment : BaseFragment() { binding.tvTag.visibility = View.INVISIBLE } binding.ivFs.setOnClickListener { - startActivity( - Intent( - context, - PlayerDetailActivity::class.java - ).apply { - putExtra( - Constants.CONSTANTS_short_play_id, - video.short_play_id - ) - }) + openVideo(video.short_play_id) } exampleDominantCeoAdapter.setOnItemClickListener { adapter, view, position -> exampleDominantCeoAdapter.currentPosition = position - val video = - adapter.getItem(position) as HomeBannerBean + val video = adapter.getItem(position) as HomeBannerBean Glide.with(requireContext()).load(video?.horizontally_img) - .placeholder(R.drawable.iv_placeholder_h) - .into(binding.ivFs) + .placeholder(R.drawable.iv_placeholder_h).into(binding.ivFs) binding.tvName.text = video.name if (video.category.isNotEmpty()) { binding.tvTag.visibility = View.VISIBLE @@ -225,16 +205,7 @@ class HomeFragment : BaseFragment() { binding.tvTag.visibility = View.INVISIBLE } binding.ivFs.setOnClickListener { - startActivity( - Intent( - context, - PlayerDetailActivity::class.java - ).apply { - putExtra( - Constants.CONSTANTS_short_play_id, - video.short_play_id - ) - }) + openVideo(video.short_play_id) } exampleDominantCeoAdapter.notifyDataSetChanged() } @@ -244,6 +215,21 @@ class HomeFragment : BaseFragment() { } } + fun openVideo(videoId: Int?) { + if (videoId == null) { + LOG.d("HomeFragment", "openVideo.videoId.is.empty:" + LOG.useInfo()) + return + } + startActivity( + Intent( + context, PlayerDetailActivity::class.java + ).apply { + putExtra( + Constants.CONSTANTS_short_play_id, videoId + ) + }) + } + override fun getViewBinding(): FragmentHomeBinding { return FragmentHomeBinding.inflate(layoutInflater) } diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/home/InputResultAdapter.kt b/app/src/main/java/com/jia/er/nebuluxe/app/home/InputResultAdapter.kt index ce7ed17..e89ea01 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/home/InputResultAdapter.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/home/InputResultAdapter.kt @@ -33,8 +33,4 @@ class InputResultAdapter : BaseQuickAdapter() { ): QuickViewHolder { return QuickViewHolder(R.layout.item_search_result, viewGroup) } - - fun setKeyword(input: String?) { - keyword = input - } } diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/home/SearchActivity.kt b/app/src/main/java/com/jia/er/nebuluxe/app/home/SearchActivity.kt index 2bcf991..fa7f7e3 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/home/SearchActivity.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/home/SearchActivity.kt @@ -129,7 +129,7 @@ class SearchActivity : BaseActivity() { private fun onSearch(input: String) { Memory.saveSearchString(input) mViewModel.searchDataByInput(input) - searchResultAdapter!!.setKeyword(input) + searchResultAdapter!!.keyword = input KeyboardUtils.hideSoftInput(this) } diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/main/MainActivity.kt b/app/src/main/java/com/jia/er/nebuluxe/app/main/MainActivity.kt index 98b92be..0923b7a 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/main/MainActivity.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/main/MainActivity.kt @@ -1,6 +1,7 @@ package com.jia.er.nebuluxe.app.main import android.view.KeyEvent +import android.view.View import androidx.fragment.app.FragmentTransaction import androidx.lifecycle.ViewModelProvider import com.jia.er.nebuluxe.app.home.HomeFragment @@ -15,6 +16,8 @@ import com.jia.er.nebuluxe.app.data.TabEntity import com.jia.er.nebuluxe.app.databinding.ActivityMainBinding import com.jia.er.nebuluxe.app.me.MeFragment import com.jia.er.nebuluxe.app.net.MainViewModel +import com.jia.er.nebuluxe.app.utils.ImageLoadUtil +import com.jia.er.nebuluxe.app.utils.LOG import com.jia.er.nebuluxe.app.utils.Memory import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -25,25 +28,16 @@ class MainActivity : BaseActivity() { private val mViewModel by lazy { ViewModelProvider(this)[MainViewModel::class.java] } private var titles = arrayOf( - "", - "", - "", - "" + "", "", "", "" ) private val iconUnSelectIds by lazy { intArrayOf( - R.drawable.iv_home_n, - R.drawable.iv_reels_n, - R.drawable.iv_saved_n, - R.drawable.iv_me_n + R.drawable.iv_home_n, R.drawable.iv_reels_n, R.drawable.iv_saved_n, R.drawable.iv_me_n ) } private val iconSelectIds by lazy { intArrayOf( - R.drawable.iv_home_h, - R.drawable.iv_reels_h, - R.drawable.iv_saved_h, - R.drawable.iv_me_h + R.drawable.iv_home_h, R.drawable.iv_reels_h, R.drawable.iv_saved_h, R.drawable.iv_me_h ) } private val tabEntities = ArrayList() @@ -87,6 +81,8 @@ class MainActivity : BaseActivity() { ) } binding.tabLayout.setTabData(tabEntities) + + binding?.tabLayout?.setOnTabSelectListener(object : OnTabSelectListener { override fun onTabSelect(position: Int) { switchFragment(position) @@ -178,8 +174,7 @@ class MainActivity : BaseActivity() { } mViewModel.userRegisterData.observe(this) { if (it != null) { - Memory.getMMKV() - .putString(Constants.CONSTANTS_AuthorizationExample, it.data?.token) + Memory.getMMKV().putString(Constants.CONSTANTS_AuthorizationExample, it.data?.token) EventBus.getDefault().post(Constants.CONSTANTS_refresh_me) } } @@ -220,6 +215,16 @@ class MainActivity : BaseActivity() { // } // } + override fun onResume() { + super.onResume() + when (index) { + 0 -> homeFragment?.onResume() + 1 -> reelsFragment?.onResume() + 2 -> myListFragment?.onResume() + 3 -> meFragment?.onResume() + } + } + // private fun showHistoryDialog(data: MainDataHis) { // binding?.dialogHistory?.ivCloseHistory?.setOnClickListener { // Memory.getMMKV() diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/net/MainRequest.kt b/app/src/main/java/com/jia/er/nebuluxe/app/net/MainRequest.kt index c93e6fa..e981c9f 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/net/MainRequest.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/net/MainRequest.kt @@ -126,6 +126,11 @@ object MainRequest { appService.myHistorys(current_page).response() } + fun myHomeHistorys( + current_page: Int + ): LiveData>> = handleData { + appService.myHistorys(current_page, 1).response() + } fun getVideoList(search: String): LiveData>> = handleData { diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/net/MainViewModel.kt b/app/src/main/java/com/jia/er/nebuluxe/app/net/MainViewModel.kt index 98cb6e8..9575342 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/net/MainViewModel.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/net/MainViewModel.kt @@ -184,6 +184,14 @@ class MainViewModel : ViewModel() { } } + private val historysLiveData_home = MutableLiveData>() + val historysData_home: MutableLiveData> get() = historysLiveData_home + fun myHomeHistory() { + MainRequest.myHomeHistorys(1).observeForever { result -> + historysLiveData_home.value = result.getOrNull() + } + } + private val getDetailsRecommandLiveData = MutableLiveData>() val getDetailsRecommandData: MutableLiveData> get() = getDetailsRecommandLiveData @@ -400,7 +408,7 @@ class MainViewModel : ViewModel() { private val userCenterRecommendLiveData = MutableLiveData?>() val userCenterRecommendData: MutableLiveData?> get() = userCenterRecommendLiveData - fun userCenterRecommend(){ + fun userCenterRecommend() { MainRequest.userCenterRecommend() .observeForever { userCenterRecommendLiveData.value = it.getOrNull() diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/ui/LoadingLine.kt b/app/src/main/java/com/jia/er/nebuluxe/app/ui/LoadingLine.kt index 3506255..11e7175 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/ui/LoadingLine.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/ui/LoadingLine.kt @@ -53,7 +53,7 @@ class LoadingLine : FrameLayout { loadView!!.startAnimation(set) } - fun endAnimation(){ + fun endAnimation() { loadView!!.clearAnimation() } } \ No newline at end of file diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/utils/ImageLoadUtil.kt b/app/src/main/java/com/jia/er/nebuluxe/app/utils/ImageLoadUtil.kt new file mode 100644 index 0000000..7ccc992 --- /dev/null +++ b/app/src/main/java/com/jia/er/nebuluxe/app/utils/ImageLoadUtil.kt @@ -0,0 +1,18 @@ +package com.jia.er.nebuluxe.app.utils + +import android.widget.ImageView +import com.bumptech.glide.Glide +import com.jia.er.nebuluxe.app.R + +object ImageLoadUtil { + fun loadImage(url: String?, iv: ImageView?) { + if (url == null || iv == null) { + LOG.d("ImageLoadUtil.9", "图片填充错误:" + LOG.useInfo()) + return + } + val isHor = iv.width > iv.height + Glide.with(iv.context).load(url) + .placeholder(if (isHor) R.drawable.ic_default_iv_hor else R.drawable.ic_default_iv_ver) + .into(iv) + } +} diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/utils/LOG.java b/app/src/main/java/com/jia/er/nebuluxe/app/utils/LOG.java index 22672b7..91e5a1e 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/utils/LOG.java +++ b/app/src/main/java/com/jia/er/nebuluxe/app/utils/LOG.java @@ -99,6 +99,11 @@ public class LOG { return newString; } + + public static String useInfo() {//该方法 所在方法的 调用所在行数 + return getWhere(2); + } + public static int useLine() {//该方法 所在方法的 调用所在行数 StackTraceElement[] stacks = new Exception().getStackTrace(); return stacks[2].getLineNumber(); diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/video/NewRecommendBannerAdapter.kt b/app/src/main/java/com/jia/er/nebuluxe/app/video/NewRecommendBannerAdapter.kt index deb9172..3b14e1a 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/video/NewRecommendBannerAdapter.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/video/NewRecommendBannerAdapter.kt @@ -20,7 +20,9 @@ import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.jia.er.nebuluxe.app.R import com.jia.er.nebuluxe.app.data.DetailsRecommendRes +import com.jia.er.nebuluxe.app.utils.LOG import com.youth.banner.adapter.BannerAdapter +import com.youth.banner.listener.OnBannerListener @SuppressLint("UnsafeOptInUsageError") @@ -79,6 +81,9 @@ class NewRecommendBannerAdapter(items: List?, context playerMap[position] = exoPlayer } playerView?.player = exoPlayer + playerView?.setOnClickListener { + mListener?.OnBannerClick(data, position) + } exoPlayer.let { player -> player.addListener(object : Player.Listener { @@ -113,6 +118,13 @@ class NewRecommendBannerAdapter(items: List?, context } } + var mListener: OnBannerListener? = null + + override fun setOnBannerListener(listener: OnBannerListener?) { + super.setOnBannerListener(listener) + mListener = listener + } + private fun getLoadControl(): LoadControl { return androidx.media3.exoplayer.DefaultLoadControl.Builder() .setBufferDurationsMs( diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailActivity.kt b/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailActivity.kt index 9840d0c..63c51b3 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailActivity.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailActivity.kt @@ -19,6 +19,7 @@ import androidx.lifecycle.lifecycleScope import androidx.media3.common.MediaItem import androidx.media3.common.PlaybackException import androidx.media3.common.Player +import androidx.media3.common.Timeline import androidx.media3.datasource.DataSource import androidx.media3.datasource.DefaultDataSourceFactory import androidx.media3.exoplayer.DefaultRenderersFactory @@ -46,6 +47,7 @@ import com.jia.er.nebuluxe.app.ui.LoadingLine import com.jia.er.nebuluxe.app.ui.OnSnapHelperCurrentListener import com.jia.er.nebuluxe.app.ui.RecyclerViewScrollerDetection import com.jia.er.nebuluxe.app.utils.DialogUtils +import com.jia.er.nebuluxe.app.utils.LOG import com.jia.er.nebuluxe.app.utils.Memory import com.jia.er.nebuluxe.app.utils.appendWithStyle import com.jia.er.nebuluxe.app.utils.formatTimestamp @@ -63,8 +65,8 @@ import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @SuppressLint("UnsafeOptInUsageError") -class PlayerDetailActivity : BaseActivity(), - OnSnapHelperCurrentListener, SeriesDialogFragment.SeriesCallBack { +class PlayerDetailActivity : BaseActivity(), OnSnapHelperCurrentListener, + SeriesDialogFragment.SeriesCallBack { private var builder: ExoPlayer.Builder? = null private var player: ExoPlayer? = null private val pagerSnapHelper = PagerSnapHelper() @@ -74,18 +76,23 @@ class PlayerDetailActivity : BaseActivity(), private var currentView: View? = null private var loadingLine: LoadingLine? = null private var tvName: AppCompatTextView? = null - private var tvTime: AppCompatTextView? = null + private var tvTimeStart: AppCompatTextView? = null + private var tvTimeEnd: AppCompatTextView? = null private var tvEpTotal: AppCompatTextView? = null + private var tvEpCurrent: AppCompatTextView? = null private var tvCollectionNum: AppCompatTextView? = null private var play: AppCompatImageView? = null private var collection: AppCompatImageView? = null private var ivIconPlayer: AppCompatImageView? = null private var ivCover: AppCompatImageView? = null private var ivBackController: AppCompatImageView? = null + private var icBtnMore: View? = null private var exampleSeekbarPlayerController: AppCompatSeekBar? = null private var exampleProgressJob: Job? = null private var isDragging = false private var isPlaying = false + private var videoSpeed = 1.toFloat() + private var videoQuality = 540.toFloat() private var shortVideoId: Int = 0 private var dataRes: PlayerDetailDataRes.Episode? = null private var currentPosition = 0 @@ -100,7 +107,8 @@ class PlayerDetailActivity : BaseActivity(), private var needRefresh: Boolean = false private var payPosition = 0 private var isCanPlay = false -// private var isLock = false + + // private var isLock = false private var exampleSeriesDialogFragment: SeriesDialogFragment? = null @SuppressLint("UnsafeOptInUsageError") @@ -111,24 +119,38 @@ class PlayerDetailActivity : BaseActivity(), startTime = System.currentTimeMillis() shortVideoId = intent.getIntExtra(Constants.CONSTANTS_short_play_id, 0) activityId = intent.getIntExtra(Constants.CONSTANTS_activity_id, 0) - builder = ExoPlayer.Builder(this, FfmpegRenderersFactory(this)) - .setRenderersFactory( - DefaultRenderersFactory(this).setEnableDecoderFallback( - true - ) + builder = ExoPlayer.Builder(this, FfmpegRenderersFactory(this)).setRenderersFactory( + DefaultRenderersFactory(this).setEnableDecoderFallback( + true ) + ) player = builder?.build() playerView = ViewUtils.layoutId2View(R.layout.include_detail_player_view) as PlayerView playerView?.player = player loadingLine = playerView?.findViewById(R.id.load_line) tvName = playerView?.findViewById(R.id.example_tv_title_player_controller) - tvTime = playerView?.findViewById(R.id.tv_player_seek_time) + tvTimeStart = playerView?.findViewById(R.id.tv_player_seek_time_current) + tvTimeEnd = playerView?.findViewById(R.id.tv_player_seek_time_all) + tvEpCurrent = playerView?.findViewById(R.id.tv_ep_current) tvEpTotal = playerView?.findViewById(R.id.tv_ep_total) tvCollectionNum = playerView?.findViewById(R.id.example_tv_collection_num_controller) collection = playerView?.findViewById(R.id.example_iv_collection_controller) play = playerView?.findViewById(R.id.example_iv_play_player_controller) ivIconPlayer = playerView?.findViewById(R.id.iv_icon_player) ivBackController = playerView?.findViewById(R.id.iv_back_controller) + icBtnMore = playerView?.findViewById(R.id.iv_btn_more) + icBtnMore?.setOnClickListener { + singleClick { + val exampleSeriesDialogFragment = SpeedDialogFragment() + val bundle = Bundle() + bundle.putFloat(Constants.CONSTANTS_video_speed, videoSpeed) + bundle.putFloat(Constants.CONSTANTS_video_quality, videoQuality) + exampleSeriesDialogFragment.arguments = bundle + exampleSeriesDialogFragment.show( + supportFragmentManager, "SpeedDialogFragment" + ) + } + } exampleSeekbarPlayerController = playerView?.findViewById(R.id.example_seekBar_player_controller) play?.setOnClickListener { @@ -146,6 +168,22 @@ class PlayerDetailActivity : BaseActivity(), } } player?.addListener(object : Player.Listener { + + override fun onSeekBackIncrementChanged(seekBackIncrementMs: Long) { + super.onSeekBackIncrementChanged(seekBackIncrementMs) + LOG.d( + "PlayerDetailActivity", "onSeekBackIncrementChanged.155:" + seekBackIncrementMs + ) + } + + override fun onSeekForwardIncrementChanged(seekForwardIncrementMs: Long) { + super.onSeekForwardIncrementChanged(seekForwardIncrementMs) + LOG.d( + "PlayerDetailActivity", + "onSeekForwardIncrementChanged.160:" + seekForwardIncrementMs + ) + } + override fun onPlaybackStateChanged(playbackState: Int) { super.onPlaybackStateChanged(playbackState) when (playbackState) { @@ -157,13 +195,13 @@ class PlayerDetailActivity : BaseActivity(), Player.STATE_READY -> { // if (!isLock) { - if (isCanPlay) { - if (seek && progress > 0) { - player?.seekTo(progress) - seek = false - } - canPlay() + if (isCanPlay) { + if (seek && progress > 0) { + player?.seekTo(progress) + seek = false } + canPlay() + } // } else { // loadingLine?.endAnimation() // loadingLine?.visibility = View.INVISIBLE @@ -198,38 +236,30 @@ class PlayerDetailActivity : BaseActivity(), doCollect() } } - tvEpTotal?.setOnClickListener { + playerView?.findViewById(R.id.cl)?.setOnClickListener { singleClick { exampleSeriesDialogFragment = SeriesDialogFragment() val bundle = Bundle() dataRes?.episode?.let { it1 -> bundle.putInt( - Constants.Constants_Episodes_Series_Data_currentPositionExample, - it1 + Constants.Constants_Episodes_Series_Data_currentPositionExample, it1 ) } bundle.putParcelable( - Constants.Constants_Episodes_Series_DataExample, - dataRes?.shortPlayInfo + Constants.Constants_Episodes_Series_DataExample, dataRes?.shortPlayInfo ) bundle.putParcelableArrayList( Constants.Constants_Episodes_Series_Data_ListExample, - playerDetailAdapter?.items?.let { it1 -> ArrayList(it1) } - ) + playerDetailAdapter?.items?.let { it1 -> ArrayList(it1) }) exampleSeriesDialogFragment?.seriesCallBack = this exampleSeriesDialogFragment?.arguments = bundle exampleSeriesDialogFragment?.show( - supportFragmentManager, - "SeriesDialogFragment" + supportFragmentManager, "SeriesDialogFragment" ) } } mViewModel.getVideoDetails( - shortVideoId, - 0, - activityId, - revolution, - null + shortVideoId, 0, activityId, revolution, null ) onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { @@ -279,10 +309,7 @@ class PlayerDetailActivity : BaseActivity(), dataRes?.short_play_id?.let { it1 -> dataRes?.short_play_video_id?.let { it2 -> DialogUtils.unFavoriteDialog( - this, - it1, - it2, - mViewModel + this, it1, it2, mViewModel ) } } @@ -364,35 +391,32 @@ class PlayerDetailActivity : BaseActivity(), if (it.data?.list?.isNotEmpty() == true) { binding.viewVideoRecommend.root.visibility = View.VISIBLE binding.viewVideoRecommend.bottom.setOnClickListener { } - recommendBannerAdapter = - NewRecommendBannerAdapter(it.data.list, this) + recommendBannerAdapter = NewRecommendBannerAdapter(it.data.list, this) binding?.viewVideoRecommend?.exampleBannerRecommend?.setBannerGalleryEffect( - 52, - 12 + 52, 12 ) - binding?.viewVideoRecommend?.exampleBannerRecommend?.setAdapter( + binding?.viewVideoRecommend?.exampleBannerRecommend?.adapter = recommendBannerAdapter - ) val i = it.data.list.size / 2 binding?.viewVideoRecommend?.exampleBannerRecommend?.setCurrentItem( - i, - false + i, false ) + recommendBannerAdapter?.setOnBannerListener { data, position -> + watchNow(data) + } recommendBannerAdapter?.currentPlayingPosition = i recommendBannerPosition = i recommendBannerAdapter?.resumeCurrentPlayer() binding?.viewVideoRecommend?.exampleBannerRecommend?.addOnPageChangeListener( - object : - OnPageChangeListener { + object : OnPageChangeListener { override fun onPageScrolled( - position: Int, - positionOffset: Float, - positionOffsetPixels: Int + position: Int, positionOffset: Float, positionOffsetPixels: Int ) { } @SuppressLint("UnsafeOptInUsageError") override fun onPageSelected(position: Int) { + LOG.d("PlayerDetailActivity", "onPageSelected.399:" + position) recommendBannerPosition = position recommendBannerAdapter?.pauseAllPlayers() recommendBannerAdapter?.currentPlayingPosition = position @@ -412,12 +436,10 @@ class PlayerDetailActivity : BaseActivity(), } } mViewModel.infoData.observe(this) { - if (it != null) { - it.data?.let { it1 -> - Memory.saveUserInfo(it1) - if (needRefresh) { - detailRefresh() - } + it?.data?.let { it1 -> + Memory.saveUserInfo(it1) + if (needRefresh) { + detailRefresh() } } } @@ -459,8 +481,7 @@ class PlayerDetailActivity : BaseActivity(), mViewModel.videoDetailsData.observe(this) { it -> if (it != null) { playerDetailAdapter = PlayerDetailAdapter() - val layoutManager = - LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) + val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false) binding?.rvDetail?.layoutManager = layoutManager binding?.rvDetail?.adapter = playerDetailAdapter binding?.rvDetail?.isNestedScrollingEnabled = false @@ -476,8 +497,7 @@ class PlayerDetailActivity : BaseActivity(), it1.shortPlayInfo = it.data.shortPlayInfo } ivIconPlayer?.let { it1 -> - Glide.with(this).load(it.data?.shortPlayInfo?.image_url) - .into(it1) + Glide.with(this).load(it.data?.shortPlayInfo?.image_url).into(it1) } playerDetailAdapter?.submitList(it.data?.episodeList) if (needRefresh) { @@ -487,11 +507,10 @@ class PlayerDetailActivity : BaseActivity(), } else { if (it.data?.video_info != null) { if (it.data.video_info.episode > 1) { - it.data.video_info.episode.minus(1) - .let { it1 -> - recyclerViewScrollerDetection.isFirstAttached = false - binding.rvDetail.scrollToPosition(it1) - } + it.data.video_info.episode.minus(1).let { it1 -> + recyclerViewScrollerDetection.isFirstAttached = false + binding.rvDetail.scrollToPosition(it1) + } } } } @@ -533,8 +552,7 @@ class PlayerDetailActivity : BaseActivity(), @SuppressLint("UnsafeOptInUsageError") private fun buildMediaSource(videoPath: String): MediaSource { - val dataSourceFactory: DataSource.Factory = - DefaultDataSourceFactory(this, "reelcrush") + val dataSourceFactory: DataSource.Factory = DefaultDataSourceFactory(this, "reelcrush") return if (videoPath.endsWith(".m3u8")) { HlsMediaSource.Factory(dataSourceFactory) @@ -555,8 +573,8 @@ class PlayerDetailActivity : BaseActivity(), override fun onResume() { super.onResume() // if (!isLock && player?.isPlaying == false) { - isCanPlay = true - binding.root.postDelayed({ canPlay() }, 300) + isCanPlay = true + binding.root.postDelayed({ canPlay() }, 300) // } recommendBannerAdapter?.resumeCurrentPlayer() } @@ -584,16 +602,15 @@ class PlayerDetailActivity : BaseActivity(), if (fromUser) { seekTo(progress) } + seekTime() } override fun onStartTrackingTouch(seekBar: SeekBar?) { - tvTime?.visibility = FrameLayout.VISIBLE isDragging = true } override fun onStopTrackingTouch(seekBar: SeekBar?) { isDragging = false - tvTime?.visibility = FrameLayout.INVISIBLE } }) } @@ -614,15 +631,13 @@ class PlayerDetailActivity : BaseActivity(), private fun seekTo(progress: Int) { player?.seekTo(progress.toLong()) - seekTime() } private fun seekTime() { val currentPosition = player!!.currentPosition - val currentTime = formatTimestamp(currentPosition / 1000) + tvTimeStart?.text = formatTimestamp(currentPosition / 1000) val totalDuration = player!!.duration - val totalTime = formatTimestamp(totalDuration / 1000) - tvTime?.text = "$currentTime/$totalTime" + tvTimeEnd?.text = formatTimestamp(totalDuration / 1000) } override fun getViewBinding(): ActivityPlayDetailBinding { @@ -645,10 +660,7 @@ class PlayerDetailActivity : BaseActivity(), @SuppressLint("UnsafeOptInUsageError") override fun setActive( - currentView: View?, - position: Int, - previousView: View?, - previousPosition: Int + currentView: View?, position: Int, previousView: View?, previousPosition: Int ) { seek = true isCanPlay = true @@ -690,21 +702,19 @@ class PlayerDetailActivity : BaseActivity(), tvCollectionNum?.text = dataRes?.shortPlayInfo?.collect_total.toString() val builder = SpannableStringBuilder() builder.appendWithStyle( - "Ep.".plus(dataRes?.episode), - Color.parseColor("#FFDAA4"), - isBold = true + "Ep.".plus(dataRes?.episode), Color.parseColor("#FFDAA4"), isBold = true + ).appendWithStyle( + "/Ep.".plus(dataRes?.shortPlayInfo?.episode_total), + Color.parseColor("#FFFFFF"), + isBold = false ) - .appendWithStyle( - "/Ep.".plus(dataRes?.shortPlayInfo?.episode_total), - Color.parseColor("#FFFFFF"), - isBold = false - ) - tvEpTotal?.text = builder + tvEpTotal?.text = + String.format(getString(R.string.ep_all_), dataRes?.shortPlayInfo?.episode_total) + tvEpCurrent?.text = String.format(getString(R.string.ep_), dataRes?.episode) if (dataRes?.is_lock == false || Memory.isVip()) { dataRes?.short_play_video_id?.let { mViewModel.doCreateHistory( - shortVideoId, - it + shortVideoId, it ) } } @@ -726,8 +736,7 @@ class PlayerDetailActivity : BaseActivity(), private fun uploadSeconds() { if (dataRes?.is_lock == false) { playerDetailAdapter?.getItem(currentPosition)?.play_seconds = - if (needRestart) "0" else lastProgress() - .toString() + if (needRestart) "0" else lastProgress().toString() mViewModel.uploadHistorySeconds( UploadHistoryReq( if (needRestart) 0 else lastProgress(), @@ -743,8 +752,7 @@ class PlayerDetailActivity : BaseActivity(), // isLock = episode.is_lock uploadSeconds() val index = playerDetailAdapter?.items?.withIndex()?.firstOrNull { - (episode.episode == it.value.episode) && (episode.shortPlayInfo?.name == it.value.shortPlayInfo?.name - ) + (episode.episode == it.value.episode) && (episode.shortPlayInfo?.name == it.value.shortPlayInfo?.name) }?.index recyclerViewScrollerDetection.isFirstAttached = false index?.let { binding.rvDetail.scrollToPosition(it) } @@ -759,9 +767,7 @@ class PlayerDetailActivity : BaseActivity(), if (dataRes?.is_lock == false || Memory.isVip()) { dataRes?.short_play_id?.let { UploadHistoryReq( - lastProgress(), - it, - dataRes?.short_play_video_id + lastProgress(), it, dataRes?.short_play_video_id ) }?.let { mViewModel.uploadHistorySeconds( @@ -778,12 +784,9 @@ class PlayerDetailActivity : BaseActivity(), dataRes?.episode.toString(), dataRes?.shortPlayInfo?.image_url.toString() ) - } - ) - Memory.getMMKV() - .putString(Constants.Constants_Main_Video_info, toJson) - Memory.getMMKV() - .putBoolean(Constants.Constants_Main_Video_status, true) + }) + Memory.getMMKV().putString(Constants.Constants_Main_Video_info, toJson) + Memory.getMMKV().putBoolean(Constants.Constants_Main_Video_status, true) } } @@ -796,11 +799,7 @@ class PlayerDetailActivity : BaseActivity(), player?.pause() player?.stop() mViewModel.getVideoDetails( - shortVideoId, - 0, - activityId, - revolution, - null + shortVideoId, 0, activityId, revolution, null ) } @@ -813,6 +812,15 @@ class PlayerDetailActivity : BaseActivity(), } } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: VideoSettingEvent) { + player?.setPlaybackSpeed(event.playSpeed) + videoSpeed = event.playSpeed +// payPosition = dataRes?.episode?.minus(1)!! +// needRefresh = true +// mViewModel.getInfo() + } + override fun onReturn() { super.onReturn() finish() diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailAdapter.kt b/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailAdapter.kt index dffdf2d..016cdcf 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailAdapter.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/video/PlayerDetailAdapter.kt @@ -7,6 +7,8 @@ import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.jia.er.nebuluxe.app.R import com.jia.er.nebuluxe.app.data.PlayerDetailDataRes +import com.jia.er.nebuluxe.app.utils.ImageLoadUtil +import com.jia.er.nebuluxe.app.utils.ImageLoadUtil.loadImage class PlayerDetailAdapter : BaseQuickAdapter() { @@ -15,8 +17,7 @@ class PlayerDetailAdapter : position: Int, item: PlayerDetailDataRes.Episode? ) { - Glide.with(context).load(item?.shortPlayInfo?.image_url).placeholder(R.drawable.iv_placeholder_v) - .into(holder.getView(R.id.iv_icon)) + loadImage(item?.shortPlayInfo?.image_url, holder.getView(R.id.iv_icon)) } override fun onCreateViewHolder( diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDataAdapter.kt b/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDataAdapter.kt index cd452c6..7afbdb7 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDataAdapter.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDataAdapter.kt @@ -7,6 +7,7 @@ import com.chad.library.adapter4.BaseQuickAdapter import com.chad.library.adapter4.viewholder.QuickViewHolder import com.jia.er.nebuluxe.app.R import com.jia.er.nebuluxe.app.data.PlayerDetailDataRes +import com.jia.er.nebuluxe.app.utils.Memory class SeriesDataAdapter : BaseQuickAdapter() { @@ -18,24 +19,27 @@ class SeriesDataAdapter : ) { val view = holder.getView(R.id.example_tv_num_data) view.text = item?.episode.toString() - if (currentPosition == view.text.toString().toInt()) { - holder.setBackgroundResource(R.id.example_tv_num_data, R.drawable.bg_example_num_h) - holder.setTextColor( - R.id.example_tv_num_data, - context.getColor(R.color.black) - ) - } else { - holder.setBackgroundResource(R.id.example_tv_num_data, R.drawable.bg_example_num_n) - holder.setTextColor( - R.id.example_tv_num_data, - context.getColor(R.color.white) - ) - } -// if (item?.is_lock == true && !Memory.isVip()) { -// holder.setVisible(R.id.iv_example_lock, true) + val select: Boolean = currentPosition == view.text.toString().toInt() + holder.setSelected(R.id.item_pan, select) + holder.setVisible(R.id.iv_example_playing, select) +// if (currentPosition == view.text.toString().toInt()) { +// holder.setBackgroundResource(R.id.example_tv_num_data, R.drawable.bg_example_num_h) +// holder.setTextColor( +// R.id.example_tv_num_data, +// context.getColor(R.color.black) +// ) // } else { -// holder.setVisible(R.id.iv_example_lock, false) +// holder.setBackgroundResource(R.id.example_tv_num_data, R.drawable.bg_example_num_n) +// holder.setTextColor( +// R.id.example_tv_num_data, +// context.getColor(R.color.white) +// ) // } + if (item?.is_lock == true && !Memory.isVip()) { + holder.setVisible(R.id.iv_example_lock, true) + } else { + holder.setVisible(R.id.iv_example_lock, false) + } } override fun onCreateViewHolder( diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDialogFragment.kt b/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDialogFragment.kt index a30a109..609999c 100644 --- a/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDialogFragment.kt +++ b/app/src/main/java/com/jia/er/nebuluxe/app/video/SeriesDialogFragment.kt @@ -9,12 +9,12 @@ import android.view.WindowManager import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.GridLayoutManager import com.jia.er.nebuluxe.app.R -import com.jia.er.nebuluxe.app.basics.Constants import com.jia.er.nebuluxe.app.basics.Constants.Constants_Episodes_Series_DataExample import com.jia.er.nebuluxe.app.basics.Constants.Constants_Episodes_Series_Data_ListExample import com.jia.er.nebuluxe.app.basics.Constants.Constants_Episodes_Series_Data_currentPositionExample import com.jia.er.nebuluxe.app.data.PlayerDetailDataRes import com.jia.er.nebuluxe.app.databinding.DialogSeriesBinding +import com.jia.er.nebuluxe.app.utils.ImageLoadUtil.loadImage import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -22,7 +22,7 @@ import org.greenrobot.eventbus.ThreadMode class SeriesDialogFragment : DialogFragment() { var seriesCallBack: SeriesCallBack? = null var is_collect = false - var exampleDialogSeriesBinding: DialogSeriesBinding? = null + var binding: DialogSeriesBinding? = null interface SeriesCallBack { fun chooseSeries(episode: PlayerDetailDataRes.Episode) @@ -34,7 +34,7 @@ class SeriesDialogFragment : DialogFragment() { val builder = AlertDialog.Builder(requireActivity()) val inflater = requireActivity().layoutInflater val view = inflater.inflate(R.layout.dialog_series, null) - exampleDialogSeriesBinding = DialogSeriesBinding.bind(view) + binding = DialogSeriesBinding.bind(view) val episodeList: List? = arguments?.getParcelableArrayList(Constants_Episodes_Series_Data_ListExample) val data: PlayerDetailDataRes.ShortPlayInfo? = @@ -42,26 +42,26 @@ class SeriesDialogFragment : DialogFragment() { val currentPosition = arguments?.getInt(Constants_Episodes_Series_Data_currentPositionExample, 0) val exampleSeriesDataAdapter = SeriesDataAdapter() - val spanCount = 6 + val spanCount = 5 val layoutManager = GridLayoutManager(context, spanCount) - exampleDialogSeriesBinding?.rvDataDialogSeries?.layoutManager = layoutManager - exampleDialogSeriesBinding?.rvDataDialogSeries?.adapter = exampleSeriesDataAdapter + binding?.rvDataDialogSeries?.layoutManager = layoutManager + binding?.rvDataDialogSeries?.adapter = exampleSeriesDataAdapter exampleSeriesDataAdapter.submitList(episodeList) if (currentPosition != null) { exampleSeriesDataAdapter.currentPosition = currentPosition } - exampleDialogSeriesBinding?.tvDesDialogSeries?.text = data?.description + binding?.tvDesDialogSeries?.text = data?.description if (data?.category?.isNotEmpty() == true) { - exampleDialogSeriesBinding?.tvTag?.visibility = View.VISIBLE - exampleDialogSeriesBinding?.tvTag?.text = data?.category?.get(0) + binding?.tvTag?.visibility = View.VISIBLE + binding?.tvTag?.text = data?.category?.get(0) } else { - exampleDialogSeriesBinding?.tvTag?.visibility = View.GONE + binding?.tvTag?.visibility = View.GONE } is_collect = data?.is_collect == true - exampleDialogSeriesBinding?.ivCollect?.setImageResource(if (data?.is_collect == true) R.drawable.iv_example_collection_h else R.drawable.iv_example_collection_n) - exampleDialogSeriesBinding?.ivCollect?.setOnClickListener { - seriesCallBack?.collection() - } +// exampleDialogSeriesBinding?.ivCollect?.setImageResource(if (data?.is_collect == true) R.drawable.iv_example_collection_h else R.drawable.iv_example_collection_n) +// exampleDialogSeriesBinding?.ivCollect?.setOnClickListener { +// seriesCallBack?.collection() +// } exampleSeriesDataAdapter.setOnItemClickListener { adapter, view, position -> val item = adapter.getItem(position) as PlayerDetailDataRes.Episode // if (position > 0) { @@ -76,8 +76,11 @@ class SeriesDialogFragment : DialogFragment() { dismiss() } isCancelable = true - exampleDialogSeriesBinding?.tvContentDialogSeries?.text = data?.name - builder.setView(exampleDialogSeriesBinding?.root) + binding?.tvContentDialogSeries?.text = data?.name + loadImage(data?.image_url, binding?.iv) + binding?.tvEp?.text = + String.format(getString(R.string.tip_episodes_in_index_dialog), data?.episode_total) + builder.setView(binding?.root) val dialog = builder.create() dialog.window?.setBackgroundDrawableResource(android.R.color.transparent) val window = dialog.window @@ -97,9 +100,9 @@ class SeriesDialogFragment : DialogFragment() { @Subscribe(threadMode = ThreadMode.MAIN) fun onEvent(event: String) { - if (Constants.CONSTANTS_collect_refresh == event) { - is_collect = !is_collect - exampleDialogSeriesBinding?.ivCollect?.setImageResource(if (is_collect == true) R.drawable.iv_example_collection_h else R.drawable.iv_example_collection_n) - } +// if (Constants.CONSTANTS_collect_refresh == event) { +// is_collect = !is_collect +// exampleDialogSeriesBinding?.ivCollect?.setImageResource(if (is_collect == true) R.drawable.iv_example_collection_h else R.drawable.iv_example_collection_n) +// } } } diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/video/SpeedDialogFragment.kt b/app/src/main/java/com/jia/er/nebuluxe/app/video/SpeedDialogFragment.kt new file mode 100644 index 0000000..a910d13 --- /dev/null +++ b/app/src/main/java/com/jia/er/nebuluxe/app/video/SpeedDialogFragment.kt @@ -0,0 +1,88 @@ +package com.jia.er.nebuluxe.app.video + +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import android.view.Gravity +import android.view.View +import android.view.WindowManager +import androidx.fragment.app.DialogFragment +import com.jia.er.nebuluxe.app.basics.Constants.CONSTANTS_video_quality +import com.jia.er.nebuluxe.app.basics.Constants.CONSTANTS_video_speed +import com.jia.er.nebuluxe.app.databinding.DialogSpeedBinding +import com.jia.er.nebuluxe.app.utils.LOG +import org.greenrobot.eventbus.EventBus + +class SpeedDialogFragment : DialogFragment(), View.OnClickListener { + + var binding: DialogSpeedBinding? = null + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + binding = DialogSpeedBinding.inflate(layoutInflater) + binding?.btn075?.setOnClickListener(this) + binding?.btn1?.setOnClickListener(this) + binding?.btn15?.setOnClickListener(this) + binding?.btn2?.setOnClickListener(this) + + binding?.btn54?.setOnClickListener(this) + binding?.btn72?.setOnClickListener(this) + binding?.btn108?.setOnClickListener(this) + var speed = arguments?.getFloat(CONSTANTS_video_speed) + var quality = arguments?.getFloat(CONSTANTS_video_quality) + binding?.btn075?.isSelected = speed == 0.75F + binding?.btn1?.isSelected = speed == 1F + binding?.btn15?.isSelected = speed == 1.5F + binding?.btn2?.isSelected = speed == 2F + binding?.btn54?.isSelected = quality == 540F + binding?.btn72?.isSelected = quality == 720F + binding?.btn108?.isSelected = quality == 1080F + val builder = AlertDialog.Builder(requireActivity()) + builder.setView(binding?.root) + val dialog = builder.create() + dialog.window?.setBackgroundDrawableResource(android.R.color.transparent) + val window = dialog.window + window?.decorView?.setPadding(0, 0, 0, 0) + window?.setGravity(Gravity.BOTTOM) + val layoutParams = window?.attributes + layoutParams?.width = WindowManager.LayoutParams.MATCH_PARENT + layoutParams?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = layoutParams + return dialog + } + + override fun onClick(p0: View?) { + LOG.d("SpeedDialogFragment", "onClick.34:") + var speed = 1F; + var quality = 540F; + when (p0) { + binding?.btn075 -> { + speed = .75F + } + + binding?.btn1 -> { + speed = 1.0F + } + + binding?.btn15 -> { + speed = 1.5F + } + + binding?.btn2 -> { + speed = 2.0F + } + + binding?.btn54 -> { + quality = 540F + } + + binding?.btn72 -> { + quality = 720F + } + + binding?.btn108 -> { + quality = 1080F + } + } + dismiss() + EventBus.getDefault().post(VideoSettingEvent(speed, quality)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/jia/er/nebuluxe/app/video/VideoSettingEvent.java b/app/src/main/java/com/jia/er/nebuluxe/app/video/VideoSettingEvent.java new file mode 100644 index 0000000..21e5c03 --- /dev/null +++ b/app/src/main/java/com/jia/er/nebuluxe/app/video/VideoSettingEvent.java @@ -0,0 +1,27 @@ +package com.jia.er.nebuluxe.app.video; + +public class VideoSettingEvent { + private Float playSpeed; + private Float qualityValue; + + public VideoSettingEvent(Float playSpeed, Float qualityValue) { + this.playSpeed = playSpeed; + this.qualityValue = qualityValue; + } + + public Float getPlaySpeed() { + return playSpeed; + } + + public void setPlaySpeed(Float playSpeed) { + this.playSpeed = playSpeed; + } + + public Float getQualityValue() { + return qualityValue; + } + + public void setQualityValue(Float qualityValue) { + this.qualityValue = qualityValue; + } +} 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..a7a63c54ca02da4f0773ac96a3300a279104389d GIT binary patch literal 566 zcmV-60?GY}P)qL z+CUI}d-#8(25hMV@;ej26(k)5cVJgQQh`YYkP1vH0Ex-uXVifty8wv-benhB#IZfV zVVO50&FyL5?bq!JI5Nanv0B~@VC~?ZC0W=zo%!(g8mNBdU1`h>mk|^h53d0oP%c#L zMffpZ?Bbi9hyTta9zLfZnKm{I`e*Nh-sw5lv8qi(&AeLX1H2Y>TIO|nd$ZMnq#Qe) zYMuu;G=g=`nHFuDt8F^0$ycX?PUrK%2B5afoEPDFTx?U}x0+SVpc-w{kr!S++!PV% zJE8(Vumd9a!gryn$$I0&&cY9I_QF7w=0ky*IIqzL0_W6K*gG3P*{_%7pH+H0K}%Fg zK6QoP$d5Hp1Qtlp7J|k9qQQ}I;;VRHqs}L{W{!VyR7`z%UJ&k>j7eO%ufL^Sg_4#XCG2R=m48pw=k88Iy|V%{;L zOMy&%n0_g0nhVA{7IAg3YlC*zj5^f7dgcJbhvy(1y${SYp^ug@FdUMoH}by}DeQNC zzUB`m!fT-#unD_7>)U4Q>9}UMLQRA=Fm|!;KmDfo3pjzs4{jgJMgRZ+07*qoM6N<$ Ef-jf!*Z=?k literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_play.png b/app/src/main/res/drawable-xxhdpi/ic_play.png new file mode 100644 index 0000000000000000000000000000000000000000..fb71fa1e07ff4bf0f78d2b25fae768a8248add80 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9R!3HG1hpsgQQk(@Ik;M!QVyYm_=ozH)0Vv2= z9OUlAugQ3{sK$3i@5H zKFX_En|j19GX}Xjv$Xmgw!AO8nx#X~<>YgZxM{OA(z}ju7dN~%l0Q9Zrr~YT*E{&x zmt~l(-*8ou$F(9M^Xt*duFlClI<7mc`O1}7x3lD#iQEjHd~3Gx3qJLrC7H%N*_UJ@ z@2_MwTVr~V^XZwb?h8)TS@`O`+P~L5$hvRl?S0M#_B4_9|a>?~!1@h&h|zylN>0C8uK+HSy7CK%g_2Wa61@(6Tg>d2T3Ft_3b+;c)) zSuRfE#IzmGC;f|+6aW9Q4ORdchG7_nVa|sT;u7Vd)~G9sx)SO>s=I@q04Kf>UwNYO z6t$jK=i4;E2{>V2&c562bTj>g+K}ybo2dcL1Jvtvv0N^7Gp{By@`2H46w0;%&I44d z)lki5Q#V80ov8f`Ky|haNXs9vWWV1-tJQ+pYzBwJK@Lxo_BcIDHB?LQi1>%{MUF#m z9YC^Lt)SECfaiH~=mO;>?eVM)Fp)WcG&3HLLn&SDqt;2aSsS2}D}aPdkQp+im`NnA z0cj7plK_NakEg=WfTuKv+*tsL+~c;y9P-!@&I9B{J>(H3l<{!?x&TC@(SUBZs}8-J zp8X4FGLVI0u?WNA5PH3yI{Z>76rN2rP6HSWq@vw!huenU5kXzQjWbU;3vj|fD$3W@ahP7ekH{Tlw}`~D4_6E(mo1E`yr z+K|O!AvT+h9{K@Qf^(w=ur&|`)bUZ5@Lh=Gmxb3X255D()tY`w*9~T_qSdf6AdX)( l`afozVHk#C7>4=Xd;p^S()eR0?|uLP002ovPDHLkV1jHp9B}{u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_conner_20px_trans.xml b/app/src/main/res/drawable/bg_conner_20px_trans.xml new file mode 100644 index 0000000..ed2427b --- /dev/null +++ b/app/src/main/res/drawable/bg_conner_20px_trans.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_conner_50px_black_history.xml b/app/src/main/res/drawable/bg_conner_50px_black_history.xml new file mode 100644 index 0000000..01a4de3 --- /dev/null +++ b/app/src/main/res/drawable/bg_conner_50px_black_history.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_example_num_h.xml b/app/src/main/res/drawable/bg_example_num_h.xml index 5f4b6e9..3e58dde 100644 --- a/app/src/main/res/drawable/bg_example_num_h.xml +++ b/app/src/main/res/drawable/bg_example_num_h.xml @@ -1,9 +1,8 @@ - - - - - - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_example_num_n.xml b/app/src/main/res/drawable/bg_example_num_n.xml index 0bf824e..eaf3f5b 100644 --- a/app/src/main/res/drawable/bg_example_num_n.xml +++ b/app/src/main/res/drawable/bg_example_num_n.xml @@ -1,9 +1,5 @@ - - - - - - - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_example_seekbar_player.xml b/app/src/main/res/drawable/bg_example_seekbar_player.xml deleted file mode 100644 index 93f7976..0000000 --- a/app/src/main/res/drawable/bg_example_seekbar_player.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_example_shape_seekbar_player.xml b/app/src/main/res/drawable/bg_example_shape_seekbar_player.xml deleted file mode 100644 index c944060..0000000 --- a/app/src/main/res/drawable/bg_example_shape_seekbar_player.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_arrow_up_white.png b/app/src/main/res/drawable/ic_arrow_up_white.png new file mode 100644 index 0000000000000000000000000000000000000000..a02b38f38ad020976b1ce7c2da112b030ad8634d GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F$05`DhM-r2B~}i3NjW4 zxjQkeJ16rJ$YDu$^mSxl*x1kgCy^D%U+C%L7*fIbcG5*&CPkjM-_q;_0vy^FP0}kS zS8VU}TOhrI+2DXL)3(m(1^NN^-c9;FX&GRe|I^MZcIT z{=e4BI9YV={85Gi<70bPlphY779?fqIbqIKvsSlfbEKC%+dbvaid?R>Im=XC`+byM z*RN64l~28JiY0sPm!79<3g&R%dv~rd>1O+sjw$wkjy!d-e*KjFVoc?9MYhV + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_close_his.png b/app/src/main/res/drawable/ic_close_his.png new file mode 100644 index 0000000000000000000000000000000000000000..cb129066f9dcfb63a6c2a9d2357b91456c31a551 GIT binary patch literal 806 zcmV+>1KIqEP)K~#7F&6usS z@-PsFx2Vd>%1R^>S&2j*$)$Xkf;6@lPBROaO9zSfX9c@R zfOvrvq|nD!H6z4XwbB8qfPQuY8R1Vpuw=p@W>~7O9T3d4kw~F;OM;yV)&v7FPJYC= ze$qe$R7NPk!CU*G_)11P?!?UIsGZL8Mp66l_+|`h(QBMKFo$=;Kxp&8F@8AaFpzZX zd<@NsnNYBO6cZAq3;{9l;Lgh@JTm~*CJDx5Mm__HA#GDrz9%O!8N3x2h~B|conm*^ zSA>}hFJ)wScnC{X`{G7BEme2SMDeu6APCx}rzwB{W`JlM!BvT0?9Mw0M0R2$#f1Yvyb$Djsa_8~FJvEiwF!Ok}c zlrgBeFpi*YVS%E~sUfHrVIXiy3ZOI=XawpN7%S;Q{+Ix0R#`C+Gn3gDAni(7pggAM zPyowB_C)~I0IFzYHVk6MwpS2gOoubvO>?H-fDbHk;A{9jL-zs#4SHc{4$*6<~M&r|{U&>aM<%TssT zuYpgGZTRdd(miACL^f-XKn6D=7F%CAgSeW95+YICPIX|HI0%WT3yH7ih03m)2;Ue~ zv=#y)E=(!pfW5lF2(q6`8FY355mjIi^}ajGC^_vrhkmCBJo2TeE#<&Jr`X6#sy7|j zuRSeAM8s*Fz~)p#KIJq{V;?<_dw!k32_o^3I-sz^Vbjgnx48gQ$_GU!9Fc0L=l~OB zXiEymPTL8Y1C`AP5GnhfQ?h2NhLgG_d5zY~5E)aQ!1rjq86uW1oiKfPiUZgDm>5}} iar-VmCLi>`f5bO-cZ%lv@o5|Y00003$>R>moS&N^iANsqyEADjasA2KZ8dy1{|Dv)73X90rkVct&2z5juqCt+x5

e-3I0o28M=de;Mm$)_*lo{qO`N>gnp|vd$@?2>`KQ Be>wmF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_play_his.png b/app/src/main/res/drawable/ic_play_his.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ef1e9f0df77d4b1cb544392a6cb17ac36f9fbb GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^5FVdQ&MBb@0LPGauK)l5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_qua_108.png b/app/src/main/res/drawable/ic_qua_108.png new file mode 100644 index 0000000000000000000000000000000000000000..a783cd13d71dedb4622d026cd544933f0787bff9 GIT binary patch literal 743 zcmV?P)m1F8rSqqfpa9hvBld`RN$pYTH!LNHXK!12Ls1%jGO>^Nx^skrn69-JBnu7T z`L}xG>6MWiQFjhVfcyOqNH9mP9!HLi6vThIh7EWnBQazihr8S zDM4FEY#Uc5qj~&LxWTrmn{V1&bXfjOFwD$S9BZmC6}{NZ!_<%Od&cL?NwDSw;JDcm?gJ!*0guIpZzf3h^X{OS@j!iE1 z?=ph!S&2r7u-AD$Dv|Nh*k@{G`>MDH4uVYtNpo Z@E2O0_aIQqwE6%5002ovPDHLkV1g&DQ#$|v literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_qua_72.png b/app/src/main/res/drawable/ic_qua_72.png new file mode 100644 index 0000000000000000000000000000000000000000..bc01ed1ef50354d9ef61cb84e58171bd65246f58 GIT binary patch literal 671 zcmV;Q0$}}#P)V)J zdmX3UG_m71)233Tej8hp|IPgIc;+7i58N{doV1yR^~M z>J3~VIe;U9xYei)MU$VK)=>yYL{R-c9aXh@wIN1Qg(pUMQ?1nsm#wHmL|^On4&4EI zLqah;NjFQaR&B_fC*SO43=e{TNl&X)8>&5jJqF7W+-c8hZ`;sJ{GXe4FN)O#ggDJL zIN%-~HdL8|V|!b)a>mxo8`qH4Z;a9}M^l?)iONh$nfW}L#f<~1CuEIOnYrb&Q(qA$ zVm`iq`m%7f6+WS>qegTCGbv#}eB3=7>=y~C(2PhEw+YGTttXYHv!OIh+5Ri6fMrLL z+$m#9zG6ifmR9t;UsfCHPSUxi5UV5P$7Ww`$WCM(D~IaYL(kFqGu)v7xzlC8EMh3J zp_)!h?w*zPF0CyL7~li)X}?>qe1Zd=$)HU{yIH@Pgm>(vcdcz+M1l}`2!6m30`+pc zBfOn&GZ~`X<0g^Rqv@{@O47IyTa()#C|qotqkB3O+#y@*udaE>T4i2`Fi#f7S~TQ$ z2=hWjzRb5}Mn~uGph;%7GW@?ZmNT}2eYE|o(!c}voeTC^%pdK?HL6a)X??>$ zs(=H>an + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/progress_thumb.xml b/app/src/main/res/drawable/progress_thumb.xml new file mode 100644 index 0000000..9fcd603 --- /dev/null +++ b/app/src/main/res/drawable/progress_thumb.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/sel_bg_example_num.xml b/app/src/main/res/drawable/sel_bg_example_num.xml new file mode 100644 index 0000000..d90a0b4 --- /dev/null +++ b/app/src/main/res/drawable/sel_bg_example_num.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/sel_color_example_num.xml b/app/src/main/res/drawable/sel_color_example_num.xml new file mode 100644 index 0000000..b070cba --- /dev/null +++ b/app/src/main/res/drawable/sel_color_example_num.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/sel_color_gray_pink.xml b/app/src/main/res/drawable/sel_color_gray_pink.xml new file mode 100644 index 0000000..59f791a --- /dev/null +++ b/app/src/main/res/drawable/sel_color_gray_pink.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/sel_vis_example_num.xml b/app/src/main/res/drawable/sel_vis_example_num.xml new file mode 100644 index 0000000..fd56707 --- /dev/null +++ b/app/src/main/res/drawable/sel_vis_example_num.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5a51d58..a945655 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -9,7 +9,7 @@ android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="@dimen/padding_84px" /> + android:layout_marginBottom="@dimen/padding_54px" /> diff --git a/app/src/main/res/layout/detail_player_view_controller.xml b/app/src/main/res/layout/detail_player_view_controller.xml index d17c6a6..05cb603 100644 --- a/app/src/main/res/layout/detail_player_view_controller.xml +++ b/app/src/main/res/layout/detail_player_view_controller.xml @@ -17,8 +17,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/padding_15px" - android:padding="@dimen/padding_10px" android:layout_marginTop="@dimen/padding_45px" + android:padding="@dimen/padding_10px" android:src="@drawable/iv_example_back" /> - + - + android:layout_marginLeft="@dimen/padding_16px" + android:layout_marginTop="@dimen/padding_10px" + android:layout_marginRight="@dimen/padding_16px" + android:layout_marginBottom="@dimen/padding_34px" + android:background="@drawable/bg_conner_20px_trans" + android:gravity="center_vertical" + android:paddingLeft="@dimen/padding_10px" + android:paddingRight="@dimen/padding_10px"> - - + + + + + + + + + + + + android:layout_marginBottom="@dimen/padding_25px" /> + + + + + + + + + - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_series.xml b/app/src/main/res/layout/dialog_series.xml index b22dedf..85a713f 100644 --- a/app/src/main/res/layout/dialog_series.xml +++ b/app/src/main/res/layout/dialog_series.xml @@ -10,85 +10,86 @@ android:id="@+id/rl" android:layout_width="match_parent" android:layout_height="@dimen/padding_509px" + android:background="@drawable/ic_bg_of_video_index" android:paddingTop="@dimen/padding_19px" android:paddingBottom="@dimen/padding_15px" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"> + - - - + + + + + + + + android:textColor="@color/text_color_pink" + android:textSize="@dimen/text_size_10px" + tools:text="111" /> - + + android:text="@string/tip_episodes_in_index_dialog" + android:textColor="@color/text_color_white" + android:textSize="@dimen/text_size_15px" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_speed.xml b/app/src/main/res/layout/dialog_speed.xml new file mode 100644 index 0000000..aceeb98 --- /dev/null +++ b/app/src/main/res/layout/dialog_speed.xml @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index bfb00a2..f964aef 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -43,6 +43,7 @@ @@ -79,13 +80,12 @@ android:textSize="@dimen/text_size_14px" /> - @@ -182,9 +182,9 @@ + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/padding_6px" /> + app:layout_constraintTop_toBottomOf="@id/banner_home_b" + app:normal_drawable="@drawable/iv_indicator_n" + app:selected_drawable="@drawable/iv_indicator_h" /> @@ -319,6 +319,77 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_num_data.xml b/app/src/main/res/layout/item_num_data.xml index 9566135..01e6386 100644 --- a/app/src/main/res/layout/item_num_data.xml +++ b/app/src/main/res/layout/item_num_data.xml @@ -1,27 +1,40 @@ + android:layout_marginTop="@dimen/padding_11px" + android:background="@drawable/sel_bg_example_num"> - - - - - - - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line_layout.xml b/app/src/main/res/layout/line_layout.xml index 8206552..6352cc7 100644 --- a/app/src/main/res/layout/line_layout.xml +++ b/app/src/main/res/layout/line_layout.xml @@ -1,8 +1,8 @@ + android:layout_height="wrap_content" + android:background="@android:color/transparent"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fa941f0..8f04715 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,5 +36,18 @@ This drama will be removed from your favorites. Remove Cancel - 未搜索到结果 + No results found + Episodes (%d) + EP.%d + All %d Episodes + Speed + 0.75 + 1.0 + 1.25 + 1.5 + 2.0 + Quality + 540P + 720P + 1080P \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a453868..63efa8d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -21,4 +21,10 @@ 1px match_parent + + \ No newline at end of file