From b9a8f3217fe12359a47e0f4d5cd83555f402a85a Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Tue, 10 Sep 2019 15:50:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=86=E9=A2=91=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E7=9A=84=E7=82=B9=E8=B5=9E=E3=80=81=E6=94=B6?= =?UTF-8?q?=E8=97=8F=E5=92=8C=E5=88=86=E4=BA=AB=E5=8A=9F=E8=83=BD=20https:?= =?UTF-8?q?//gitlab.ghzs.com/pm/halo-app-issues/issues/617?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/ShareUtils.java | 8 +- .../com/gh/gamecenter/entity/VideoEntity.kt | 5 +- .../retrofit/service/ApiService.java | 24 +++++ .../video/detail/DetailPlayerView.kt | 58 +++++++++++- .../video/detail/VideoDetailActivity.kt | 2 - .../detail/VideoDetailContainerFragment.kt | 85 ++++++++++++++++- .../detail/VideoDetailContainerViewModel.kt | 21 ++++- .../video/detail/VideoDetailFragment.kt | 21 ++++- .../video/detail/VideoDetailViewModel.kt | 89 ++++++++++++++++++ .../drawable-xxhdpi/ic_video_detail_liked.png | Bin 0 -> 3574 bytes .../ic_video_detail_menu_more.png | Bin 0 -> 349 bytes .../ic_video_detail_question.png | Bin 0 -> 1826 bytes .../res/layout/layout_video_detail_more.xml | 56 +++++++++++ .../layout/layout_video_detail_surface.xml | 40 +++++++- app/src/main/res/menu/menu_video_detail.xml | 17 ++++ 15 files changed, 413 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_liked.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_menu_more.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_question.png create mode 100644 app/src/main/res/layout/layout_video_detail_more.xml create mode 100644 app/src/main/res/menu/menu_video_detail.xml diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index a407d32ff8..3405f64243 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -87,7 +87,8 @@ public class ShareUtils { askInvite, askNormal, // 问答问题/答案 shareGh, - communityArticle + communityArticle, + video } private String[] arrLabel = {"微信好友", "朋友圈", "QQ好友", "QQ空间", "新浪微博", "短信", "复制链接", "取消"}; @@ -221,6 +222,7 @@ public class ShareUtils { mSummary += "(光环加速版)"; break; case askNormal: + case video: case communityArticle: mTitle += " - 光环助手"; break; @@ -261,6 +263,7 @@ public class ShareUtils { mSummary += "(光环加速版)"; break; case askNormal: + case video: case communityArticle: mTitle += " - 光环助手"; break; @@ -362,6 +365,7 @@ public class ShareUtils { mSummary += "(光环加速版)"; break; case askNormal: + case video: case communityArticle: mTitle += " - 光环助手"; break; @@ -411,6 +415,7 @@ public class ShareUtils { msg.title = mSummary; break; case askNormal: + case video: case communityArticle: msg.title = mTitle + " - 光环助手"; break; @@ -472,6 +477,7 @@ public class ShareUtils { break; case askInvite: case askNormal: + case video: case communityArticle: smsBody = mTitle + " - 光环助手" + shareUrl; break; diff --git a/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt index c411695c6b..657ac83d4a 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt @@ -19,7 +19,7 @@ open class VideoEntity( val gameIcon: String = "", @SerializedName("category_id") val categoryId: String = "", - val vote: Int = 0, + var vote: Int = 0, @SerializedName("vote_recently") val voteRecently: Int = 0, @SerializedName("comment_count") @@ -28,6 +28,9 @@ open class VideoEntity( val me: MeEntity = MeEntity(), val size: Long = 0, val length: Long = 0, + // 有三种状态 pass通过,fail未通过,pending审核中 + var status: String = "", + var thumb: String = "$url?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0", val format: String = "Mp4", @SerializedName("tag_id") val tagsId: List = ArrayList()) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index c2ddf3f6c3..3510feaf16 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -1842,6 +1842,30 @@ public interface ApiService { @GET("videos/{video_id}") Single> getVideoDetailList(@Path("video_id") String videoId, @Query("filter") String filter); + /** + * 点赞视频 + */ + @POST("videos/{video_id}:vote") + Single voteVideo(@Path("video_id") String videoId); + + /** + * 取消点赞视频 + */ + @POST("videos/{video_id}:unvote") + Single undoVoteVideo(@Path("video_id") String videoId); + + /** + * 收藏视频 + */ + @POST("users/{user_id}/favorites/videos/{video_id}") + Single collectVideo(@Path("user_id") String userId, @Path("video_id") String videoId); + + /** + * 取消收藏视频 + */ + @DELETE("users/{user_id}/favorites/videos/{video_id}") + Single undoCollectVideo(@Path("user_id") String userId, @Path("video_id") String videoId); + /** * 获取阿里云上传配置 */ diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt index d4136af58a..63372a3ce1 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt @@ -1,14 +1,19 @@ package com.gh.gamecenter.video.detail +import android.app.Activity import android.content.Context import android.util.AttributeSet import android.view.Surface import android.view.View import android.widget.ImageView +import androidx.core.content.ContextCompat +import com.gh.common.util.CheckLoginUtils import com.gh.common.util.DirectUtils import com.gh.common.util.ImageUtils +import com.gh.common.util.ShareUtils import com.gh.gamecenter.R import com.gh.gamecenter.entity.VideoEntity +import com.gh.gamecenter.manager.UserManager import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import com.squareup.picasso.Picasso @@ -17,8 +22,9 @@ import kotlinx.android.synthetic.main.layout_video_detail_surface.view.* class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : StandardGSYVideoPlayer(context, attrs) { - private var mVideoEntity: VideoEntity? = null private val mEntrance = "(视频详情)" + private var mVideoEntity: VideoEntity? = null + private var mViewModel: VideoDetailViewModel? = null override fun init(context: Context) { super.init(context) @@ -28,6 +34,10 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib } } + fun setViewModel(viewModel: VideoDetailViewModel) { + mViewModel = viewModel + } + fun updateViewDetail(videoEntity: VideoEntity) { mVideoEntity = videoEntity @@ -37,6 +47,34 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib usernameTv.text = "@" + videoEntity.user.name videoTitleTv.text = videoEntity.title + if (videoEntity.me.isVoted && UserManager.getInstance().isLoggedIn) { + likeIv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_video_detail_liked)) + likeIv.setOnClickListener { + mViewModel?.undoVoteVideo() + } + } else { + likeIv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_video_detail_like)) + likeIv.setOnClickListener { + CheckLoginUtils.checkLogin(context, "(游戏详情)") { + mViewModel?.voteVideo() + } + } + } + + shareIv.setOnClickListener { + val shareIcon = videoEntity.thumb + + val shareSummary = "@" + videoEntity.user.name + "在光环助手发布了游戏小视频,快点开看看吧" + + ShareUtils.getInstance(context).showShareWindows(context as Activity, + (context as Activity).window.decorView, + "https://resource.ghzs.com/page/video_play/video/video.html?video=${videoEntity.id}", + shareIcon, + videoEntity.title, + shareSummary, + ShareUtils.ShareType.video) + } + likeCountTv.text = videoEntity.vote.toString() commentCountTv.text = videoEntity.commentCount.toString() @@ -53,6 +91,23 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib DirectUtils.directToGameDetail(context, videoEntity.gameId, mEntrance) } + censoringContainer.setOnClickListener { DirectUtils.directToWebView(context, "https://resource.ghzs.com/page/video_rule/video_rule.html", mEntrance) } + + when (videoEntity.status) { + "pass" -> { + gameContainer.visibility = View.VISIBLE + censoringContainer.visibility = View.GONE + } + "fail" -> { + gameContainer.visibility = View.GONE + censoringContainer.visibility = View.GONE + } + "pending" -> { + gameContainer.visibility = View.INVISIBLE + censoringContainer.visibility = View.VISIBLE + } + } + } fun updateThumb(url: String) { @@ -94,6 +149,7 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib override fun changeUiToPreparingShow() { super.changeUiToPreparingShow() + setViewShowState(mBottomProgressBar, View.VISIBLE) } override fun changeUiToPlayingShow() { diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt index 850986804d..e47d595d31 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt @@ -28,12 +28,10 @@ class VideoDetailActivity : BaseActivity() { } override fun onStop() { - GSYVideoManager.onPause() super.onStop() } override fun onResume() { - GSYVideoManager.onResume(true) super.onResume() } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt index eacd80d276..4f8277caef 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt @@ -1,12 +1,17 @@ package com.gh.gamecenter.video.detail +import android.app.Dialog +import android.graphics.drawable.ColorDrawable import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater import android.view.View +import android.widget.TextView import androidx.viewpager2.widget.ViewPager2 -import com.gh.common.util.EntranceUtils -import com.gh.common.util.observeNonNull -import com.gh.common.util.viewModelProviderFromParent +import com.gh.common.util.* import com.gh.gamecenter.R +import com.gh.gamecenter.entity.VideoEntity +import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.normal.NormalFragment import kotlinx.android.synthetic.main.fragment_video_detail_container.* @@ -32,9 +37,20 @@ class VideoDetailContainerFragment : NormalFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + titleTv.text = "推荐" toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material) toolbar.setNavigationOnClickListener { requireActivity().finish() } + toolbar.inflateMenu(R.menu.menu_video_detail) + toolbar.setOnMenuItemClickListener { + consume { + if (it.itemId == R.id.menu_more) { + mViewModel.currentDisplayingVideo?.let { + showMoreMenuDialog(it) + } + } + } + } mViewModel.videoList.observeNonNull(this) { if (!::mFragmentAdapter.isInitialized) { @@ -51,4 +67,67 @@ class VideoDetailContainerFragment : NormalFragment() { } } + private fun showMoreMenuDialog(video: VideoEntity) { + if (!isVisible) return + + val inflater = LayoutInflater.from(requireContext()) + val layout = inflater.inflate(R.layout.layout_video_detail_more, null) + + val dialog = Dialog(requireActivity()) + dialog.setContentView(layout) + + val window = dialog.window + if (window != null) { + window.setGravity(Gravity.RIGHT or Gravity.TOP) + window.setBackgroundDrawable(ColorDrawable(0)) + window.setDimAmount(0.2f) + val lp = window.attributes + lp.x = DisplayUtils.dip2px(requireContext(), 12f) + lp.y = DisplayUtils.dip2px(requireContext(), 64f) + window.attributes = lp + } + dialog.show() + + val collectTv = layout.findViewById(R.id.collect_tv) + val collectContainer = layout.findViewById(R.id.collect_container) + + if (video.me.isVideoFavorite && UserManager.getInstance().isLoggedIn) { + collectTv.text = "取消收藏" + collectContainer.setOnClickListener { + mViewModel.undoCollect() + dialog.dismiss() + } + } else { + collectTv.text = "收藏" + + collectContainer.setOnClickListener { + ifLogin("(视频详情)") { + mViewModel.collect() + dialog.dismiss() + } + } + } + + layout.findViewById(R.id.share_container).setOnClickListener { + share() + dialog.dismiss() + } + + } + + private fun share() { + mViewModel.currentDisplayingVideo?.let { + val shareIcon = it.thumb + + val shareSummary = "@" + it.user.name + "在光环助手发布了游戏小视频,快点开看看吧" + + ShareUtils.getInstance(context).showShareWindows(activity, + view, + "https://resource.ghzs.com/page/video_play/video/video.html?video=${it.id}", + shareIcon, + it.title, + shareSummary, + ShareUtils.ShareType.video) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt index 7fee5936b2..f6db5b7abc 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt @@ -12,11 +12,23 @@ import io.reactivex.schedulers.Schedulers class VideoDetailContainerViewModel(application: Application) : AndroidViewModel(application) { - var videoList = MutableLiveData>() var startPosition = 0 + var currentDisplayingVideo: VideoEntity? = null + var videoList = MutableLiveData>() + + var action = MutableLiveData() // TODO 上下预加载 @SuppressLint("CheckResult") + + fun collect() { + action.postValue(Action(currentDisplayingVideo?.id ?: "", ActionType.COLLECT)) + } + + fun undoCollect() { + action.postValue(Action(currentDisplayingVideo?.id ?: "", ActionType.UNDO_COLLECT)) + } + fun getVideoDetailList(videoId: String, location: String) { RetrofitManager.getInstance(getApplication()) .api.getVideoDetailList(videoId, getFilter(location)) @@ -70,6 +82,13 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel USER_UPLOADED_VIDEO("user_uploaded_video"); } + enum class ActionType { + COLLECT, + UNDO_COLLECT + } + + class Action(var videoId: String, var actionType: ActionType) + companion object { private const val DEFAULT_LOADING_SIZE = 5 } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt index 146f03ae4c..8feab50b3a 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailFragment.kt @@ -2,11 +2,13 @@ package com.gh.gamecenter.video.detail import android.os.Bundle import butterknife.BindView +import com.gh.common.util.observeNonNull import com.gh.common.util.viewModelProvider import com.gh.common.util.viewModelProviderFromParent import com.gh.gamecenter.R import com.gh.gamecenter.entity.VideoEntity import com.gh.gamecenter.normal.NormalFragment +import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel.ActionType import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder class VideoDetailFragment : NormalFragment() { @@ -31,6 +33,20 @@ class VideoDetailFragment : NormalFragment() { mViewModel.videoDetail = arguments?.getParcelable(KEY_VIDEO) } + mContainerViewModel.action.observeNonNull(this) { + if (it.videoId == mViewModel.videoDetail?.id) { + when (it.actionType) { + ActionType.COLLECT -> mViewModel.collectVideo() + + ActionType.UNDO_COLLECT -> mViewModel.undoCollectVideo() + } + } + } + + mViewModel.needToUpdateVideoInfo.observeNonNull(this) { + videoView.updateViewDetail(mViewModel.videoDetail!!) + } + mViewModel.videoDetail?.let { GSYVideoOptionBuilder() .setIsTouchWiget(false) @@ -44,8 +60,9 @@ class VideoDetailFragment : NormalFragment() { .setLooping(true) .build(videoView) + videoView.setViewModel(mViewModel) videoView.updateViewDetail(it) - videoView.updateThumb("${it.url}?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0") + videoView.updateThumb(it.thumb) } } @@ -54,6 +71,8 @@ class VideoDetailFragment : NormalFragment() { if (!videoView.isInPlayingState) { videoView.startButton.performClick() } + + mContainerViewModel.currentDisplayingVideo = mViewModel.videoDetail } companion object { diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailViewModel.kt index 4ee2fc6c58..57a75781d4 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailViewModel.kt @@ -1,11 +1,100 @@ package com.gh.gamecenter.video.detail +import android.annotation.SuppressLint import android.app.Application import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData import com.gh.gamecenter.entity.VideoEntity +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import com.lightgame.utils.Utils +import io.reactivex.schedulers.Schedulers +import okhttp3.ResponseBody +@SuppressLint("CheckResult") class VideoDetailViewModel(application: Application) : AndroidViewModel(application) { var videoDetail: VideoEntity? = null + var needToUpdateVideoInfo = MutableLiveData() + + fun voteVideo() { + RetrofitManager.getInstance(getApplication()) + .api.voteVideo(videoDetail!!.id) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + videoDetail?.let { + it.vote++ + it.me.isVoted = true + } + needToUpdateVideoInfo.postValue(true) + } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + Utils.toast(getApplication(), exception.localizedMessage) + } + }) + } + + fun undoVoteVideo() { + RetrofitManager.getInstance(getApplication()) + .api.undoVoteVideo(videoDetail!!.id) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + videoDetail?.let { + it.vote-- + it.me.isVoted = false + } + needToUpdateVideoInfo.postValue(true) + } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + Utils.toast(getApplication(), exception.localizedMessage) + } + }) + } + + + fun collectVideo() { + RetrofitManager.getInstance(getApplication()) + .api.collectVideo(UserManager.getInstance().userId, videoDetail!!.id) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + videoDetail!!.me.isVideoFavorite = true + needToUpdateVideoInfo.postValue(true) + Utils.toast(getApplication(), "收藏成功") + } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + Utils.toast(getApplication(), exception.localizedMessage) + } + }) + } + + fun undoCollectVideo() { + RetrofitManager.getInstance(getApplication()) + .api.undoCollectVideo(UserManager.getInstance().userId, videoDetail!!.id) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + videoDetail!!.me.isVideoFavorite = false + needToUpdateVideoInfo.postValue(true) + Utils.toast(getApplication(), "取消收藏") + } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + Utils.toast(getApplication(), exception.localizedMessage) + } + }) + } + + } \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_liked.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_liked.png new file mode 100644 index 0000000000000000000000000000000000000000..71b8b1760a9d303152e3d0b63c64cbc042bf4f3a GIT binary patch literal 3574 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_menu_more.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_menu_more.png new file mode 100644 index 0000000000000000000000000000000000000000..d16d90c9322697ef33c7a22ab09c132f7ee89f9e GIT binary patch literal 349 zcmV-j0iyniP)Px$7fD1xR9Fe^SFsI)Fc6GWWC;ey5NS}xfPzNDf{BAN`50azl9a|e%wKt#qa zX#S*w$NV4W{mv6}TEKgM#ZU#7U;z?6*nv-D%m?QHGg%0{z_wrmhH=<)cw9KpLg>pI zgQEmLaDC%o1m5teDRLHPi*sx+L+ER17FKqV0f9tD#Va$&9h3T*Fp?%>8Ofj!unT%Mc00000NkvXXu0mjfEFp@g literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_question.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_question.png new file mode 100644 index 0000000000000000000000000000000000000000..07466c38980413db3bf4516f88d1230ab7223ffb GIT binary patch literal 1826 zcmV+-2i^FIP)Px*+(|@1RCoc^n@?yRMI6VI+R_-?s#q~pQv{JzA`%si6}4im#9AcMsvwA$;3Y>d z9_mREZ=#~79+Y}1SShHXltx4fZR)`g4EP7JZBSD!qNXOPTA!cqcJ{IRc6Q(HzL|Y_ zKlr}c`OVDl-_Fjz-Phe!G1Y3db*NkqdJJU2vcW=kclUWQs-kY6ig0!V@&^pAC+!2h zAd40$oCiOGZv=w!C#e^59suL?-B^1M=yzoG9CA*8ldgl|EC4vZ83T8MA>d3dvZ7QY zGYuvP#F=P8+3S`K#c_4*-C(e+5hdHr((WLE(4$hCN(TVPHHhs3+rg^R7PQvzKblX1 zj|qeZ(!x|K064!1P2*r=VU2zooI~u}1mUNm;tK}==Wj#F7+70WndkZ!kiU;0%oNd6 zC;&J=g78sLs9h0*TCA%<@(@8doL5dRM{s-%0-puLc?Gw*-W2-x6NrDB*^zhf>Llmo zvu>1ZZc0r9V7h&$-1(@(!^ZX~FL9k200d~j(=*?xG-`ZEwLdigG}Kh5(LUEWk*cA+ z1+sn2_+quh8UPw-k)wIu*Hov``gbr7eg+FbJRc+<#*I%2`KuG0OAM{>TrYC|K<06v zd3uf!`ft)YVc=zCZUnc0d%-op70DO*^g*M*MEAxJt?l;$Ywu_jkRz|DXaXF;>3?(7 z?=r#IO5Hu+@;q&F)X}o}6>Ny@9c)f&V`Jmz(2=OJ1m|^>YWJ4Qc}bw|MR1JESHW5F z9FTmHZ!wBFO60Yrb+xP0GyM*Zd>_+TAVb?U!Yl5)j{K9y-q9uaJ8RzMMrVq z+g61k<5y%HXjM+6eay#t0Eo<$R2qs@Y~@nj{YaVsbgkB%0Jp33EA4b@tU|oaICCWa9_X%w;M$5=kR8tThkMc`i z%g4LGQMIr40IppwcfXeKM#2f{coH-^uc{jD9|KP)W1;UXys|8vR|XUW0K;^8+i!R- z5)EE9+Gb-m@b1GNTTlG0pR|Mji^a7`dsDZ^@@kmsw+kMNCsx z;B)v0xDLRGaX7GoYpwF0Zfeq{^NJ_u}}Mq)R}% z%4`){3_)3_zmGmX#W5r$J3?`aGol!FxDwUGNY{$$B7KrbrWMF(*Hvn=Hpxr6dNvqzSg zw6gUY1hw~X2OZ1d{DT;_$D?sQ>H+Ntz%qJ2OmmF8u1E4Ipe?aa3IgC$L7MF2-2K07 zg*ZP5|2a@!uiNUm;;9GdZd6Uyw>LO{Cx$#%ix5FQBin?yo>;s6tcS3k2bFQl0+jG|JU+ z9HMfOe6DYXf=sSv?ke4kD4|^x_#8X}3{(kcx2A+*GjRxusN ze2fKv$eh8bS&LyVSyyBT^SuL{H9po&hy}oK50d&^mTs+UPhQ-SWI5vm$8U|&5&V}hz6&>ccG3qB4J@9Tv$3qVFG>V!uzQy>qH!%7@p@&*8fsL`+ZZk88)9bD^Krc+R zI`l>75d1O$NNoMB0gx30K^vAAfoZXTu-JzuKhUG&lWd=a45OA1eDpkVDEtoR4XIj`a0H*bR(oPD3 zY?aMTDRmIEwPau%fj?VHddI*@n;kUT`~Aa27zi^(j+6Jf zP6*ZINj1+`^Ou>>8iJt3(k`$aj{KDG}sM%uH>RB!)tBY z+V{7)(26i65SzK)3AE1lHArfZn+7ZAkCPY^BLbl + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_video_detail_surface.xml b/app/src/main/res/layout/layout_video_detail_surface.xml index 448928a237..c4647b186b 100644 --- a/app/src/main/res/layout/layout_video_detail_surface.xml +++ b/app/src/main/res/layout/layout_video_detail_surface.xml @@ -20,6 +20,38 @@ android:max="100" android:progressDrawable="@drawable/progressbar_video_detail" /> + + + + + + + + + + android:layout_marginBottom="16dp" + android:visibility="invisible"> + + + + + + \ No newline at end of file