Commit f58eb093 authored by jyx's avatar jyx

代码优化

parent 542ea2b7
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_15" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
......
......@@ -69,11 +69,7 @@
android:configChanges="orientation|screenSize|keyboardHidden"
android:exported="true"
android:theme="@style/AppTheme.TranslucentSplish">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activitys.SplashAdActivity"
......@@ -89,11 +85,15 @@
<activity
android:name=".ui.activitys.MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoneTranslucent">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.activitys.WebActivity"
......
......@@ -52,4 +52,5 @@ public class TrackManager {
trackPresenter.commitVedio(vo);
}
}
}
package com.mints.wisdomclean.mvp.model;
import java.io.Serializable;
import java.util.List;
public class IndexList implements Serializable {
private VedioBean vedioMsg;
private List<VedioEpisodeBean> list;
public VedioBean getVedioMsg() {
return vedioMsg;
}
public void setVedioMsg(VedioBean list) {
this.vedioMsg = list;
}
public List<VedioEpisodeBean> getList() {
return list;
}
public void setList(List<VedioEpisodeBean> list) {
this.list = list;
}
public class VedioEpisodeBean implements Serializable {
private String vedioUrl;
private int vedioIndex;
private boolean lock;
private String title;
private int vedioId;
public String getVedioUrl() {
return vedioUrl;
}
public void setVedioUrl(String vedioUrl) {
this.vedioUrl = vedioUrl;
}
public int getVedioIndex() {
return vedioIndex;
}
public void setVedioIndex(int vedioIndex) {
this.vedioIndex = vedioIndex;
}
public boolean isLock() {
return lock;
}
public void setLock(boolean lock) {
this.lock = lock;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getVedioId() {
return vedioId;
}
public void setVedioId(int vedioId) {
this.vedioId = vedioId;
}
}
}
package com.mints.wisdomclean.mvp.model
import com.chad.library.adapter.base.entity.MultiItemEntity
data class VideoMultiItemEntity(
override val itemType: Int,
var video: IndexList.VedioEpisodeBean
) : MultiItemEntity,
java.io.Serializable {
companion object {
const val MULTI_ITEM_1 = 1
const val MULTI_ITEM_2 = 2
}
}
\ No newline at end of file
package com.mints.wisdomclean.mvp.presenters
import com.google.gson.JsonObject
import com.mints.library.net.neterror.BaseSubscriber
import com.mints.library.net.neterror.Throwable
import com.mints.wisdomclean.manager.AppHttpManager
import com.mints.wisdomclean.mvp.model.BannerList
import com.mints.wisdomclean.mvp.model.BaseResponse
import com.mints.wisdomclean.mvp.model.IndexList
import com.mints.wisdomclean.mvp.views.VideoView
import java.util.HashMap
......@@ -12,16 +13,16 @@ class VideoPresenter : BasePresenter<VideoView>() {
fun getIndexList(videoId: String) {
val vo = HashMap<String, Any>()
vo["videoId"] = videoId
vo["vedioId"] = videoId
AppHttpManager.getInstance(loanApplication)
.call(loanService.getIndexList(vo),
object : BaseSubscriber<BaseResponse<BannerList>>() {
object : BaseSubscriber<BaseResponse<IndexList>>() {
override fun onCompleted() {
if (isLinkView) return
view.hideLoading()
}
override fun onNext(baseResponse: BaseResponse<BannerList>) {
override fun onNext(baseResponse: BaseResponse<IndexList>) {
if (isLinkView) return
view.hideLoading()
......@@ -29,7 +30,7 @@ class VideoPresenter : BasePresenter<VideoView>() {
val message = baseResponse.message
when (code) {
200 -> view.getIndexListSuc()
200 -> view.getIndexListSuc(baseResponse.data)
else -> {
view.getIndexListFail()
view.showToast(message)
......@@ -46,6 +47,122 @@ class VideoPresenter : BasePresenter<VideoView>() {
}
})
}
fun collect(videoId: String) {
val vo = HashMap<String, Any>()
vo["vedioId"] = videoId
AppHttpManager.getInstance(loanApplication)
.call(loanService.collect(vo), object : BaseSubscriber<BaseResponse<JsonObject>>() {
override fun onCompleted() {
if (isLinkView) return
view.hideLoading()
}
override fun onNext(baseResponse: BaseResponse<JsonObject>) {
if (isLinkView) return
view.hideLoading()
val code = baseResponse.status
val message = baseResponse.message
when (code) {
200 -> view.collectSuc()
else -> {
view.collectFail()
view.showToast(message)
}
}
}
override fun onError(e: Throwable?) {
if (isLinkView) return
view.hideLoading()
view.showToast(e?.message)
view.collectFail()
}
})
}
fun cancelCollect(videoId: String) {
val vo = HashMap<String, Any>()
vo["vedioId"] = videoId
AppHttpManager.getInstance(loanApplication)
.call(
loanService.cancelCollect(vo),
object : BaseSubscriber<BaseResponse<JsonObject>>() {
override fun onCompleted() {
if (isLinkView) return
view.hideLoading()
}
override fun onNext(baseResponse: BaseResponse<JsonObject>) {
if (isLinkView) return
view.hideLoading()
val code = baseResponse.status
val message = baseResponse.message
when (code) {
200 -> view.cancelCollectSuc()
else -> {
view.cancelCollectFail()
view.showToast(message)
}
}
}
override fun onError(e: Throwable?) {
if (isLinkView) return
view.hideLoading()
view.showToast(e?.message)
view.cancelCollectFail()
}
})
}
fun unlock(vo: HashMap<String, Any>) {
AppHttpManager.getInstance(loanApplication)
.call(
loanService.unlock(vo),
object : BaseSubscriber<BaseResponse<IndexList>>() {
override fun onCompleted() {
if (isLinkView) return
view.hideLoading()
}
override fun onNext(baseResponse: BaseResponse<IndexList>) {
if (isLinkView) return
view.hideLoading()
val code = baseResponse.status
val message = baseResponse.message
when (code) {
200 -> view.unlockSuc(baseResponse.data)
else -> {
view.unlockFail()
view.showToast(message)
}
}
}
override fun onError(e: Throwable?) {
if (isLinkView) return
view.hideLoading()
view.showToast(e?.message)
view.unlockFail()
}
})
}
......
package com.mints.wisdomclean.mvp.views
import com.mints.wisdomclean.mvp.model.IndexList
interface VideoView : BaseView {
fun getIndexListSuc()
fun getIndexListSuc(indexList: IndexList)
fun getIndexListFail()
fun collectSuc()
fun collectFail()
fun cancelCollectSuc()
fun cancelCollectFail()
fun unlockSuc(indexList: IndexList)
fun unlockFail()
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import com.mints.wisdomclean.mvp.model.BannerList;
import com.mints.wisdomclean.mvp.model.BaseResponse;
import com.mints.wisdomclean.mvp.model.BannerList;
import com.mints.wisdomclean.mvp.model.HotStyleTypesList;
import com.mints.wisdomclean.mvp.model.IndexList;
import com.mints.wisdomclean.mvp.model.OrderRecordBean;
import com.mints.wisdomclean.mvp.model.UserBean;
import com.mints.wisdomclean.mvp.model.Version;
......@@ -150,7 +151,7 @@ public interface LoanService {
* @return
*/
@POST("api/vedio/unlock")
Observable<BaseResponse<JsonObject>> unlock(@Body Map<String, Object> vo);
Observable<BaseResponse<IndexList>> unlock(@Body Map<String, Object> vo);
/**
* 首页分类
......@@ -199,7 +200,7 @@ public interface LoanService {
* @return
*/
@POST("api/vedio/getIndexList")
Observable<BaseResponse<Object>> getIndexList(@Body Map<String, Object> vo);
Observable<BaseResponse<IndexList>> getIndexList(@Body Map<String, Object> vo);
/**
* 播放链接
......
......@@ -82,5 +82,4 @@ class WatchRecordAdapter :
view.setImageDrawable(lottieDrawable)
}
}
\ No newline at end of file
......@@ -71,6 +71,10 @@ class FollowVideoFragment : BaseFragment(), FollowView {
followPresenter.detachView()
}
fun isListEmpty(): Boolean {
return datas.isEmpty()
}
override fun getCollectListSuc(bannerList: BannerList) {
if (bannerList.list.isNotEmpty()) {
......
......@@ -57,7 +57,11 @@ class RecommendFragment : BaseFragment(), View.OnClickListener {
updateTab(tab, true, mSelectTabIndex)
if (mSelectTabIndex == 0) {
changeBottomTabColor(false)
if ((fragments[0] as FollowVideoFragment).isListEmpty()) {
iv_edit.visibility = View.GONE
} else {
iv_edit.visibility = View.VISIBLE
}
} else {
changeBottomTabColor(true)
iv_edit.visibility = View.GONE
......
......@@ -11,6 +11,7 @@ import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.mints.wisdomclean.R
import com.mints.wisdomclean.mvp.model.EpisodeBean
import com.mints.wisdomclean.mvp.model.IndexList
import com.mints.wisdomclean.ui.adapter.VideoEpisodeAdapter
import com.mints.wisdomclean.utils.CommonUtils
......@@ -19,7 +20,11 @@ import com.mints.wisdomclean.utils.CommonUtils
* @date 2023/7/5
* @desc
*/
class VideoEpisodeDialog(context: Context, private val listener: DialogListener) :
class VideoEpisodeDialog(
context: Context,
val indexList: IndexList?,
private val listener: DialogListener
) :
Dialog(context, R.style.dialog) {
private val lp: WindowManager.LayoutParams
......@@ -35,8 +40,9 @@ class VideoEpisodeDialog(context: Context, private val listener: DialogListener)
setContentView(R.layout.dialog_video_episode)
// 设置window属性
lp = window!!.attributes
lp.gravity = Gravity.CENTER
lp.gravity = Gravity.BOTTOM
lp.width = WindowManager.LayoutParams.MATCH_PARENT
lp.height = WindowManager.LayoutParams.WRAP_CONTENT
lp.windowAnimations = R.style.DialogAnimBottom
// lp.dimAmount = 0; // 去背景遮盖
// lp.alpha = 1.0f;//透明效果
......@@ -55,12 +61,25 @@ class VideoEpisodeDialog(context: Context, private val listener: DialogListener)
ivClose = findViewById(R.id.close_iv)
ivClose.setOnClickListener(listener)
findViewById<TextView>(R.id.title_tv).text = indexList?.vedioMsg?.title
findViewById<TextView>(R.id.label_tv).text =
if (indexList?.vedioMsg?.completeStatus == 0) "已完结" else "未完结"
initVp()
}
private fun initVp() {
for (i in 1..100) {
mData.add(EpisodeBean(lock = false, playing = false, "" + i))
for (i in 0 until indexList!!.vedioMsg.vedioTotal) {
if (i < indexList.list.size) {
val index = indexList.list[i]
var playing = false
if (indexList.vedioMsg.seeIndex == i) {
playing = true
}
mData.add(EpisodeBean(index.isLock, playing, "" + (i + 1)))
} else {
mData.add(EpisodeBean(lock = true, playing = false, title = "" + (i + 1)))
}
}
val subList = CommonUtils.getSubList(30, mData)
adapter = VideoEpisodeAdapter()
......@@ -115,8 +134,7 @@ class VideoEpisodeDialog(context: Context, private val listener: DialogListener)
for (mDatum in mData) {
mDatum.playing = false
}
mData[position - 1].playing = true
// adapter?.notifyItemChanged(position)
mData[position].playing = true
adapter?.notifyDataSetChanged()
}
......
......@@ -398,7 +398,7 @@ class DramaApiDetailActivity : BaseActivity(), VideoEpisodeAdapter.OnEpisodeClic
dialog!!.setCurrentIndex(lastIndex)
dialog!!.show()
} else {
dialog = VideoEpisodeDialog(this, object : DialogListener() {
dialog = VideoEpisodeDialog(this,null, object : DialogListener() {
override fun onClick(dialog: Dialog?, v: View?) {
super.onClick(dialog, v)
dialog?.dismiss()
......
......@@ -2,32 +2,47 @@ package com.mints.wisdomclean.video
import android.app.Dialog
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.OrientationHelper
import androidx.recyclerview.widget.RecyclerView
import cn.jzvd.Jzvd
import com.google.gson.Gson
import com.mints.wisdomclean.R
import com.mints.wisdomclean.ad.AdManager
import com.mints.wisdomclean.ad.AdStatusListener
import com.mints.wisdomclean.common.Constant
import com.mints.wisdomclean.manager.LocalVedioManager
import com.mints.wisdomclean.mvp.model.IndexList
import com.mints.wisdomclean.mvp.model.IndexList.VedioEpisodeBean
import com.mints.wisdomclean.mvp.model.VedioBean
import com.mints.wisdomclean.mvp.model.VideoMultiItemEntity
import com.mints.wisdomclean.mvp.presenters.VideoPresenter
import com.mints.wisdomclean.mvp.views.VideoView
import com.mints.wisdomclean.ui.activitys.VipActivity
import com.mints.wisdomclean.ui.activitys.base.BaseActivity
import com.mints.wisdomclean.ui.adapter.VideoEpisodeAdapter
import com.mints.wisdomclean.ui.widgets.DialogListener
import com.mints.wisdomclean.ui.widgets.VideoEpisodeDialog
import kotlinx.android.synthetic.main.activity_video.*
import java.util.HashMap
class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
VideoEpisodeAdapter.OnEpisodeClickListener, VideoAdapter.OnCustomChildClickListener {
lateinit var adapter: VideoAdapter
private var mCurrentPosition = -1
var videos = ArrayList<VideoBean>()
private var mCurrentPosition = 0
var videos = ArrayList<VedioEpisodeBean>()
private var dialog: VideoEpisodeDialog? = null
private val videoPresenter by lazy { VideoPresenter() }
private var mVedioBean: VedioBean? = null
private var indexBean: IndexList? = null
override fun getContentViewLayoutID() = R.layout.activity_video
......@@ -36,7 +51,6 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
mVedioBean?.let { videoPresenter.getIndexList("" + it.vedioId) }
initData()
initView()
}
......@@ -67,28 +81,33 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
}
fun initView() {
mVedioBean?.let {
episode_tv.text =
"共" + it.vedioTotal + "集" + if (it.completeStatus == 0) "已完结" else "更新中" + " >"
}
fm_bottom.setOnClickListener(this)
val recyViewLayoutManager = RecyViewLayoutManager(this, OrientationHelper.VERTICAL)
recy.layoutManager = recyViewLayoutManager
adapter = VideoAdapter(this)
adapter = VideoAdapter(mVedioBean!!)
recy.adapter = adapter
//预加载下一个
adapter.setNewData(videos)
adapter.setNewInstance(getAdapterData())
val emptyView = LayoutInflater.from(this).inflate(R.layout.item_empty_video, null)
adapter.setEmptyView(emptyView)
//指定位置其他页面跳转过来。直接定位指定posion 这里不需要。
// recy.scrollToPosition(postion);
adapter.setOnCustomChildClickListener(this)
adapter.setOnVideoCompletion(object : JzvdStdTikTok.OnVideoCompletion {
override fun onVideoCompletion() {
recy.smoothScrollToPosition(mCurrentPosition + 1)
}
})
recyViewLayoutManager.setOnViewPagerListener(object : OnRecyViewListener {
override fun onInitComplete() {
mCurrentPosition = 0
// LocalVedioManager.commitVedio()
dialog?.setCurrentIndex(mCurrentPosition)
//初始化 自动播放
autoPlayVideo()
}
......@@ -105,12 +124,15 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
if (mCurrentPosition == position) {
return
}
if (isBottom) {
//是最底部,执行加载更多数据
loadData()
// loadData()
}
autoPlayVideo()
mCurrentPosition = position
dialog?.setCurrentIndex(mCurrentPosition)
}
})
......@@ -119,6 +141,7 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
recy.addOnChildAttachStateChangeListener(object :
RecyclerView.OnChildAttachStateChangeListener {
override fun onChildViewDetachedFromWindow(view: View) {
if (view !is ConstraintLayout) return
val jzvd: Jzvd = view.findViewById(R.id.jz_video)
if (jzvd != null && Jzvd.CURRENT_JZVD != null &&
jzvd.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.currentUrl)
......@@ -140,15 +163,18 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
* 滑动后自动播放。
*/
private fun autoPlayVideo() {
if (recy == null || recy.getChildAt(0) == null) {
if (recy == null || recy.getChildAt(0) == null || videos.isEmpty()) {
return
}
val player: JzvdStdTikTok = recy.getChildAt(0).findViewById(R.id.jz_video)
if (player != null) {
if (recy.getChildAt(0) !is ConstraintLayout) return
val player = recy.getChildAt(0).findViewById<JzvdStdTikTok>(R.id.jz_video)
player.startVideoAfterPreloading()
// VIdeoindex -> seeIndex
mVedioBean!!.seeIndex = mCurrentPosition
LocalVedioManager.commitVedio(mVedioBean!!)
//播放开始,进行倒计时
}
}
override fun onBackPressed() {
......@@ -159,116 +185,6 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
super.onBackPressed()
}
fun initData() {
videos.add(
VideoBean(
1,
"中韩夫妇与两宝",
"https://p29-dy.byteimg.com/aweme/100x100/2f9480001ea8cc615d6a9.jpeg?from=401053103",
"家有一老如有一宝,不分国界",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe90000bs854d21rirdcdon9fk0&ratio=720p&line=0",
"https://p6-dy-ipv6.byteimg.com/img/tos-cn-p-0015/2263f31dfb304120a5fb5d6655b230c5_1594905185~tplv-dmt-logom:tos-cn-i-0813/65302cd29d2d4043a98de10a7723d33d.image?from=2563711402_large"
)
)
videos.add(
VideoBean(
2,
"央视新闻",
"https://p6-dy-ipv6.byteimg.com/aweme/100x100/30e520009a01cad2d810e.jpeg?from=4010531038",
"高三考生注意了!今年高考时间推迟一个月,为7月7日至7月8日",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe90000bs854d21rirdcdon9fk0&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/tos-cn-p-0015/f79a5fe204e24bbbbfc55a76a81f5c2c_1585626014?from=2563711402_large"
)
)
videos.add(
VideoBean(
3,
"查查和张张",
"https://p6-dy-ipv6.byteimg.com/aweme/100x100/30e520009a01cad2d810e.jpeg?from=4010531038",
"#情侣 #春节 就没有我解决不了的婆媳关系 嘿嘿@Singing哥 @抖音小助手",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f670000bomln43d82dvbadk5a00&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/tos-cn-p-0015/f61dcb8127204a8cb7a322bf816c0b3e_1580030882?from=2563711402_large"
)
)
videos.add(
VideoBean(
4,
"大鹏(宇宙简史)",
"https://p3-dy-ipv6.byteimg.com/aweme/100x100/1e1170002093b2ff1d0f7.jpeg?from=4010531038",
"2018下半年所以天文奇观!还有流星雨哦!千万不要错过了",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f4e0000bddrstnff778g23hs6mg&ratio=720p&line=0",
"https://p6-dy-ipv6.byteimg.com/obj/9dfb0003c8c228b763eb?from=2563711402_large"
)
)
videos.add(
VideoBean(
5,
"胖爹带娃",
"https://p3-dy-ipv6.byteimg.com/aweme/100x100/26ec600005035c9b87288.jpeg?from=4010531038",
"带孩子出门玩耍一定要记得这一点!接力下去,别以为危险离我们很远@抖音小助手 #暑假安全",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f4e0000bddrstnff778g23hs6mg&ratio=720p&line=0",
"https://p9-dy.byteimg.com/obj/2c5c600050a7b42352869?from=2563711402_large"
)
)
}
//加载
fun loadData() {
videos.add(
VideoBean(
6,
"遵义观察 ",
"https://p9-dy.byteimg.com/aweme/100x100/2e1ce00021ee51a2aacdc.jpeg?from=4010531038",
"老伴咱走!",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe10000bloib0nrri6bf7b1k4fg&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/tos-cn-p-0015/601c6d730167431184c5412e81cd32d1?from=2563711402_large"
)
)
videos.add(
VideoBean(
7,
"BTV养生堂 ",
"https://p6-dy-ipv6.byteimg.com/aweme/100x100/3151700027839b153b924.jpeg?from=4010531038",
"湿气过重,快收藏这个中医调理方!!",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f730000bpebr0dqg5balrfhqlog&ratio=720p&line=0",
"https://p3-dy-ipv6.byteimg.com/obj/tos-cn-p-0015/0e99f0aca9764e7da53be1096a3bd641_1583136211?from=2563711402_large"
)
)
videos.add(
VideoBean(
8,
"河南都市频道 ",
"https://p9-dy.byteimg.com/aweme/100x100/312a8000720705660b806.jpeg?from=4010531038",
"痛心!手扶梯绞断女童两根手指!带娃搭扶梯的一定要注意了!(上)!",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f250000bgsu5vamac2seo2gp53g&ratio=720p&line=0",
"https://p1-dy-ipv6.byteimg.com/obj/160b4000aa3f373bd14cd?from=2563711402_large"
)
)
videos.add(
VideoBean(
9,
"科学小妙招 ",
"https://p26-dy.byteimg.com/aweme/100x100/312090000434b4dd10244.jpeg?from=4010531038",
"不喜欢的衣服扔了可惜,这样改造一下非常酷#生活小妙招 #生活小技巧 #废物利用 @抖音小助手",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200fe10000bq2bf7s9hq5lufbuoflg&ratio=720p&line=0",
"https://p9-dy.byteimg.com/obj/tos-cn-p-0015/9a6784fcbf9b43849081d7a3388db08d_1585756125?from=2563711402_large"
)
)
videos.add(
VideoBean(
10,
"一起装修网 ",
"https://p29-dy.byteimg.com/aweme/100x100/f77d000eae902034a2bf.jpeg?from=4010531038",
"#装修 #黑幕重重 怎样选购浴室柜?揭露浴室柜增项(增项:镜子,水龙头,软管等)@胡 一刀",
"https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0300f9a0000belnavkqn5hfpb70b5kg&ratio=720p&line=0",
"https://p29-dy.byteimg.com/obj/c8f200068c30b23f1024?from=2563711402_large"
)
)
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.close_iv -> {
......@@ -283,23 +199,128 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView {
private fun showEpisodeDialog() {
if (dialog != null && !dialog!!.isShowing) {
dialog?.setCurrentIndex(mCurrentPosition)
dialog!!.show()
} else {
dialog = VideoEpisodeDialog(this, object : DialogListener() {
dialog = VideoEpisodeDialog(this,
indexBean!!, object : DialogListener() {
override fun onClick(dialog: Dialog?, v: View?) {
super.onClick(dialog, v)
dialog?.dismiss()
}
})
dialog?.setCurrentIndex(mCurrentPosition)
dialog?.setOnEpisodeClickListener(this)
dialog?.show()
}
}
override fun getIndexListSuc() {
override fun getIndexListSuc(indexList: IndexList) {
indexBean = indexList
mVedioBean = indexList.vedioMsg
videos.clear()
videos.addAll(indexList.list)
adapter.setNewInstance(getAdapterData())
adapter.notifyDataSetChanged()
}
override fun getIndexListFail() {
}
override fun collectSuc() {
mVedioBean!!.collect = 1
}
override fun collectFail() {
}
override fun cancelCollectSuc() {
mVedioBean!!.collect = 0
}
override fun cancelCollectFail() {
}
override fun unlockSuc(indexList: IndexList) {
videos.addAll(indexList.list)
adapter.setNewInstance(getAdapterData())
adapter.notifyDataSetChanged()
}
override fun unlockFail() {
}
override fun onEpisodeClick(position: Int) {
dialog?.dismiss()
if (position >= mVedioBean!!.unlockIndex) {
return
}
mCurrentPosition = position
recy.scrollToPosition(position)
Handler(Looper.getMainLooper()).postDelayed({
autoPlayVideo()
}, 300)
}
private fun getAdapterData(): MutableList<VideoMultiItemEntity> {
val data = mutableListOf<VideoMultiItemEntity>()
if (videos.size > 0) {
for (video in videos) {
val item = VideoMultiItemEntity(VideoMultiItemEntity.MULTI_ITEM_1, video)
data.add(item)
}
if (mVedioBean!!.unlockIndex < mVedioBean!!.vedioTotal) {
val item = VideoMultiItemEntity(VideoMultiItemEntity.MULTI_ITEM_2, videos[0])
data.add(item)
}
}
return data
}
override fun onCustomChildClick(view: View, position: Int) {
when (view.id) {
R.id.ll_collect -> {
// 收藏
mVedioBean?.let {
if (it.collect == 0) {
videoPresenter.collect("" + it.vedioId)
} else {
videoPresenter.cancelCollect("" + it.vedioId)
}
}
}
R.id.leave -> {
// 返回
finish()
}
R.id.unlock -> {
// 看广告解锁
AdManager.instance.showAd(this, "",
object : AdStatusListener {
override fun adSuccess() {}
override fun adFail() {
showToast("广告太火爆了,请稍候再试")
}
override fun adClose(vo: HashMap<String, Any>?) {
vo?.let {
vo["vedioId"] = mVedioBean!!.vedioId
videoPresenter.unlock(vo)
}
}
})
}
R.id.vip -> {
// 开通VIP
readyGo(VipActivity::class.java)
}
else -> {}
}
}
}
\ No newline at end of file
package com.mints.wisdomclean.video
import android.app.Activity
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import cn.jzvd.Jzvd
import cn.jzvd.JzvdStd
import com.airbnb.lottie.LottieAnimationView
import com.airbnb.lottie.LottieComposition
import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.LottieDrawable
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseMultiItemQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.mints.wisdomclean.MintsApplication
import com.mints.wisdomclean.R
import com.mints.wisdomclean.mvp.model.VedioBean
import com.mints.wisdomclean.mvp.model.VideoMultiItemEntity
/**
* author : ChenWenJie
......@@ -17,35 +24,86 @@ import com.mints.wisdomclean.R
* date : 2020/9/22
* desc : 适配器
*/
class VideoAdapter(var activity: Activity) :
BaseQuickAdapter<VideoBean, BaseViewHolder>(R.layout.item_video) {
override fun convert(holder: BaseViewHolder, item: VideoBean) {
//用户名
holder.setText(R.id.username_tv, item.user_name)
class VideoAdapter(private var vedioBean: VedioBean) :
BaseMultiItemQuickAdapter<VideoMultiItemEntity, BaseViewHolder>() {
init {
addItemType(VideoMultiItemEntity.MULTI_ITEM_1, R.layout.item_video)
addItemType(VideoMultiItemEntity.MULTI_ITEM_2, R.layout.item_block_view)
}
override fun convert(holder: BaseViewHolder, item: VideoMultiItemEntity) {
if (holder.itemViewType == VideoMultiItemEntity.MULTI_ITEM_1) {
initVideoHolder(holder, item)
} else {
initLockHolder(holder, item)
}
}
private fun initLockHolder(holder: BaseViewHolder, item: VideoMultiItemEntity) {
Glide.with(context).load(vedioBean.coverImage)
.into(holder.getView(R.id.iv_bg))
holder.getView<View>(R.id.vip).setOnClickListener {
mOnCustomChildClickListener?.onCustomChildClick(it, holder.adapterPosition)
}
holder.getView<View>(R.id.leave).visibility = View.GONE
holder.getView<View>(R.id.leave).setOnClickListener {
mOnCustomChildClickListener?.onCustomChildClick(it, holder.adapterPosition)
}
holder.getView<View>(R.id.unlock).setOnClickListener {
mOnCustomChildClickListener?.onCustomChildClick(it, holder.adapterPosition)
}
}
private fun initVideoHolder(holder: BaseViewHolder, item: VideoMultiItemEntity) {
//标题
holder.setText(R.id.usertitle_tv, item.video_title)
holder.setText(R.id.title_tv, item.video.title)
//介绍
holder.setText(R.id.info_tv, "第" + item.video.vedioIndex + "集")
//收藏数量
holder.setText(R.id.zan_num_tv, "" + vedioBean.hot)
//缩略图
Glide.with(activity).load(item.video_image)
Glide.with(context).load(vedioBean.coverImage)
.into(holder.getView<JzvdStdTikTok>(R.id.jz_video).posterImageView)
holder.getView<LinearLayout>(R.id.ll_collect).setOnClickListener {
mOnCustomChildClickListener?.onCustomChildClick(it, holder.adapterPosition)
if (vedioBean.collect == 0) {
vedioBean.collect = 1
playCollectAnim(holder.getView(R.id.zan_iv))
} else {
vedioBean.collect = 0
playCancelCollectAnim(holder.getView(R.id.zan_iv))
}
}
if (vedioBean.collect == 0) {
// 未收藏
holder.getView<LottieAnimationView>(R.id.zan_iv)
.setImageResource(R.mipmap.home_collect_img_0)
} else {
// 已收藏
holder.getView<LottieAnimationView>(R.id.zan_iv)
.setImageResource(R.mipmap.home_collect_img_1)
}
//声明 代理服务缓存
val proxy = MintsApplication.StaticParams.getProxy()
//这个缓存下一个
if (holder.layoutPosition + 1 < itemCount) {
var item1 = getItem(holder.layoutPosition + 1)
val item1 = getItem(holder.layoutPosition + 1)
//缓存下一个 10秒
proxy!!.preLoad(item1.video_path, 10)
proxy!!.preLoad(item1.video.vedioUrl, 10)
}
//缓存当前,播放当前
var proxyUrl = proxy?.getProxyUrl(item.video_path).toString() //设置视
val proxyUrl = proxy?.getProxyUrl(item.video.vedioUrl).toString() //设置视
setPlay(holder.getView(R.id.jz_video), proxyUrl)
}
fun setPlay(jzvdStdTikTok: JzvdStdTikTok, path: String) {
Log.e("VideoAdapter", "${path}")
Log.e("VideoAdapter", "$path")
//不保存播放进度
Jzvd.SAVE_PROGRESS = false
//取消播放时在非WIFIDialog提示
......@@ -63,6 +121,41 @@ class VideoAdapter(var activity: Activity) :
this.onVideoCompletion = onVideoCompletion
}
private fun playCollectAnim(view: LottieAnimationView) {
val lottieDrawable = LottieDrawable()
LottieCompositionFactory.fromAsset(context, "home_collect.json")
.addListener { result: LottieComposition? ->
lottieDrawable.setImagesAssetsFolder("images/")
lottieDrawable.composition = result
lottieDrawable.loop(false)
lottieDrawable.playAnimation()
}
view.setImageDrawable(lottieDrawable)
}
private fun playCancelCollectAnim(view: LottieAnimationView) {
val lottieDrawable = LottieDrawable()
LottieCompositionFactory.fromAsset(context, "home_cancel_collect.json")
.addListener { result: LottieComposition? ->
lottieDrawable.setImagesAssetsFolder("images/")
lottieDrawable.composition = result
lottieDrawable.loop(false)
lottieDrawable.playAnimation()
}
view.setImageDrawable(lottieDrawable)
}
private var mOnCustomChildClickListener: OnCustomChildClickListener? = null
fun setOnCustomChildClickListener(onCustomChildClickListener: OnCustomChildClickListener) {
this.mOnCustomChildClickListener = onCustomChildClickListener
}
interface OnCustomChildClickListener {
fun onCustomChildClick(view: View, position: Int)
}
}
\ No newline at end of file
......@@ -5,15 +5,7 @@
android:layout_height="match_parent"
android:background="@color/black"
android:orientation="vertical"
tools:context=".video.VideoActivity">
<ImageView
android:id="@+id/close_iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:src="@mipmap/ic_arrow_back" />
tools:context=".video.VideoActivity">r
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy"
......@@ -21,6 +13,14 @@
android:layout_height="match_parent"
android:layout_marginBottom="50dp" />
<ImageView
android:id="@+id/close_iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:padding="10dp"
android:src="@mipmap/ic_arrow_white" />
<FrameLayout
android:id="@+id/fm_bottom"
android:layout_width="match_parent"
......
......@@ -2,12 +2,11 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/shape_tab_friends"
android:orientation="vertical">
......@@ -24,7 +23,7 @@
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="霸道总裁爱上我"
android:text="-"
android:textColor="@color/black" />
<TextView
......@@ -32,10 +31,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_10"
android:background="@drawable/shape_green"
android:padding="2dp"
android:background="@drawable/shape_red"
android:paddingStart="6dp"
android:paddingTop="2dp"
android:paddingEnd="6dp"
android:paddingBottom="2dp"
android:text="已完结"
android:textColor="@color/gray"
android:textColor="@color/white"
android:textSize="12sp" />
<View
......
......@@ -67,53 +67,6 @@
</LinearLayout>
<FrameLayout
android:id="@+id/block_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99000000">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="试看已结束"
android:textColor="@color/white"
android:textSize="16sp" />
<Button
android:id="@+id/unlock"
android:layout_width="280dp"
android:layout_height="40dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_red"
android:text="看广告解锁1集"
android:textColor="@color/white" />
<Button
android:id="@+id/vip"
android:layout_width="280dp"
android:layout_height="40dp"
android:background="@drawable/shape_green"
android:text="开通会员" />
</LinearLayout>
<ImageView
android:id="@+id/leave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:padding="10dp"
android:src="@mipmap/ic_arrow_white" />
</FrameLayout>
<include layout="@layout/item_block_view" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/block_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99000000">
<ImageView
android:id="@+id/iv_bg"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="试看已结束"
android:textColor="@color/white"
android:textSize="16sp" />
<Button
android:id="@+id/unlock"
android:layout_width="280dp"
android:layout_height="40dp"
android:layout_marginBottom="10dp"
android:background="@drawable/shape_red"
android:text="看广告解锁1集"
android:textColor="@color/white" />
<Button
android:id="@+id/vip"
android:layout_width="280dp"
android:layout_height="40dp"
android:background="@drawable/shape_green"
android:text="开通会员"
android:textColor="@color/white" />
</LinearLayout>
<ImageView
android:id="@+id/leave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:padding="10dp"
android:src="@mipmap/ic_arrow_white" />
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99000000">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="暂无视频"
android:textColor="@color/white"
android:textSize="18sp" />
</RelativeLayout>
\ No newline at end of file
......@@ -21,24 +21,24 @@
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:orientation="horizontal"
app:layout_constraintBottom_toTopOf="@id/usertitle_tv"
app:layout_constraintBottom_toTopOf="@id/info_tv"
app:layout_constraintLeft_toLeftOf="parent">
<TextView
android:id="@+id/username_tv"
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:ellipsize="end"
android:gravity="center"
android:maxEms="9"
android:maxLines="1"
android:text="飞翔的企鹅"
android:text="-"
android:textColor="#fff"
android:textSize="16sp" />
</LinearLayout>
<TextView
android:id="@+id/usertitle_tv"
android:id="@+id/info_tv"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_marginStart="15dp"
......@@ -46,7 +46,7 @@
android:gravity="center|left"
android:maxEms="14"
android:maxLines="3"
android:text="飞翔的企鹅飞翔的企鹅飞翔的企鹅飞翔的企鹅飞翔/n的企鹅飞翔的企鹅"
android:text="-"
android:textColor="#fff"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
......@@ -54,6 +54,7 @@
tools:ignore="RtlHardcoded" />
<LinearLayout
android:id="@+id/ll_collect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="15dp"
......@@ -74,7 +75,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="199.9w"
android:text="-"
android:textColor="#fff"
android:textSize="14sp" />
......
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