From ee146b20e5633070ecd239fb9d064efd03fa10cb Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Mon, 9 Sep 2019 18:19:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=BF=98=E5=8D=81=E5=88=86?= =?UTF-8?q?=E7=B2=97=E7=B3=99=E7=9A=84=E8=A7=86=E9=A2=91=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/DialogUtils.java | 26 ++- .../java/com/gh/common/util/DirectUtils.kt | 22 ++- .../com/gh/common/util/EntranceUtils.java | 1 + .../java/com/gh/gamecenter/SkipActivity.java | 4 +- .../java/com/gh/gamecenter/entity/MeEntity.kt | 3 + .../com/gh/gamecenter/entity/VideoEntity.kt | 11 +- .../gamedetail/desc/GameGalleryAdapter.kt | 7 +- .../retrofit/service/ApiService.java | 7 + .../video/detail/DetailPlayerView.kt | 39 +++- .../video/detail/VideoDetailActivity.kt | 37 ++-- .../detail/VideoDetailContainerFragment.kt | 42 ++-- .../detail/VideoDetailContainerViewModel.kt | 77 ++++++++ .../video/detail/VideoDetailFragment.kt | 66 ++++--- .../video/detail/VideoDetailViewModel.kt | 11 ++ .../video/detail/VideoFragmentPagerAdapter.kt | 15 +- .../ic_video_detail_comments.png | Bin 0 -> 2995 bytes .../drawable-xxhdpi/ic_video_detail_game.png | Bin 0 -> 2093 bytes .../drawable-xxhdpi/ic_video_detail_like.png | Bin 0 -> 2656 bytes .../drawable-xxhdpi/ic_video_detail_play.png | Bin 0 -> 6531 bytes .../drawable-xxhdpi/ic_video_detail_share.png | Bin 0 -> 2729 bytes .../res/drawable/progressbar_video_detail.xml | 19 ++ .../fragment_video_detail_container.xml | 1 + ...layer.xml => layout_video_detail_base.xml} | 19 +- .../layout/layout_video_detail_surface.xml | 182 ++++++++++++++++++ 24 files changed, 498 insertions(+), 91 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt create mode 100644 app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailViewModel.kt create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_comments.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_game.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_like.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_play.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_video_detail_share.png create mode 100644 app/src/main/res/drawable/progressbar_video_detail.xml rename app/src/main/res/layout/{layout_simple_player.xml => layout_video_detail_base.xml} (84%) create mode 100644 app/src/main/res/layout/layout_video_detail_surface.xml diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index bec3035471..6546161455 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -6,7 +6,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; -import android.graphics.drawable.Drawable; import android.text.Html; import android.text.SpannableStringBuilder; import android.text.Spanned; @@ -399,8 +398,6 @@ public class DialogUtils { dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(contentView); dialog.show(); - - } /** @@ -637,6 +634,29 @@ public class DialogUtils { dialog.show(); } + public static void showLowSystemVersionDialog(Context context) { + final Context activityContext = checkDialogContext(context); + + final Dialog dialog = new Dialog(activityContext, R.style.GhAlertDialog); + + View contentView = LayoutInflater.from(activityContext).inflate(R.layout.dialog_alert, null); + TextView contentTv = contentView.findViewById(R.id.dialog_content); + TextView titleTv = contentView.findViewById(R.id.dialog_title); + TextView positiveTv = contentView.findViewById(R.id.dialog_positive); + + titleTv.setText("提示"); + contentTv.setText("抱歉,您当前系统版本过低,暂不支持视频功能"); + positiveTv.setText("我知道了"); + + positiveTv.setOnClickListener(view -> { + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(contentView); + dialog.show(); + } + public static void showListDialog(Context context, List selectionList, DialogInterface.OnClickListener onClickListener) { diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index b6b0931076..0b889f7a07 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -3,6 +3,7 @@ package com.gh.common.util import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Build import android.os.Bundle import android.text.TextUtils import com.gh.base.BaseActivity @@ -152,6 +153,10 @@ object DirectUtils { jumpActivity(context, bundle) } + fun directToPersonalHome(context: Context, userId: String, entrance: String, path: String) { + PersonalHomeActivity.startTargetActivity(context, userId, entrance, path) + } + // 专栏 @JvmStatic fun directToSubject(context: Context, id: String, subjectName: String? = "", entrance: String? = null) { @@ -351,11 +356,16 @@ object DirectUtils { } @JvmStatic - fun directToVideoDetail(context: Context, id: String, entrance: String? = null) { - val bundle = Bundle() - bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) - bundle.putString(KEY_TO, VideoDetailActivity::class.java.name) - bundle.putString(KEY_VIDEO_ID, id) - jumpActivity(context, bundle) + fun directToVideoDetail(context: Context, videoId: String, fromLocation: String, entrance: String? = null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + val bundle = Bundle() + bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) + bundle.putString(KEY_TO, VideoDetailActivity::class.java.name) + bundle.putString(KEY_ID, videoId) + bundle.putString(KEY_LOCATION, fromLocation) + jumpActivity(context, bundle) + } else { + DialogUtils.showLowSystemVersionDialog(context) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index 21f2f72533..ca5b5307cc 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -62,6 +62,7 @@ public class EntranceUtils { public static final String KEY_VERSION = "version"; public static final String KEY_CONTENT = "content"; public static final String KEY_PLUGIN = "plugin"; + public static final String KEY_LOCATION = "location"; public static final String KEY_CURRENTITEM = "currentItem"; public static final String KEY_COMMENTID = "commentId"; public static final String KEY_PATH = "path"; diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index 94c91fbe5d..a5309f8375 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -11,7 +11,7 @@ import com.gh.common.util.PlatformUtils; import com.gh.common.util.RunningUtils; import com.gh.gamecenter.entity.CommunityEntity; import com.gh.gamecenter.manager.UserManager; -import com.gh.gamecenter.video.detail.VideoDetailActivity; +import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel; import com.lightgame.config.CommonDebug; import com.lightgame.utils.Utils; @@ -133,7 +133,7 @@ public class SkipActivity extends BaseActivity { } break; case HOST_VIDEO: - DirectUtils.directToVideoDetail(this, id, ENTRANCE_BROWSER); + DirectUtils.directToVideoDetail(this, id, VideoDetailContainerViewModel.Location.HOTTEST_GAME_VIDEO.getValue(), ENTRANCE_BROWSER); break; } } diff --git a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt index 4ee3217259..d2c105944d 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt @@ -89,6 +89,9 @@ class MeEntity(@SerializedName("is_community_voted") @SerializedName("libao") var userDataLibaoList: List? = null, + @SerializedName("is_video_favorite") + var isVideoFavorite: Boolean = false, + @SerializedName("is_moderator") val isModerator: Boolean = false, 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 b7f1937e0c..c411695c6b 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/VideoEntity.kt @@ -6,7 +6,7 @@ import kotlinx.android.parcel.Parcelize @Parcelize open class VideoEntity( - @SerializedName("id") + @SerializedName("_id") val id: String = "", val title: String = "", var poster: String = "", @@ -15,8 +15,17 @@ open class VideoEntity( val gameId: String = "", @SerializedName("game_name") val gameName: String = "", + @SerializedName("game_icon") + val gameIcon: String = "", @SerializedName("category_id") val categoryId: String = "", + val vote: Int = 0, + @SerializedName("vote_recently") + val voteRecently: Int = 0, + @SerializedName("comment_count") + val commentCount: Int = 0, + val user: UserEntity = UserEntity(), + val me: MeEntity = MeEntity(), val size: Long = 0, val length: Long = 0, val format: String = "Mp4", diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt index e134603f2f..934a2011d3 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameGalleryAdapter.kt @@ -18,7 +18,7 @@ import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.ViewImageActivity import com.gh.gamecenter.databinding.GalleryVideoItemBinding -import com.gh.gamecenter.video.detail.VideoDetailActivity +import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel import com.halo.assistant.HaloApp import kotlinx.android.synthetic.main.player_view.view.* import java.util.* @@ -66,11 +66,10 @@ class GameGalleryAdapter(var context: Context, context.startActivity(intent) } - testChannelOnly { + debugOnly { holder.itemView.setOnLongClickListener { consume { - val intent = VideoDetailActivity.getIntent(context) - context.startActivity(intent) + DirectUtils.directToVideoDetail(context, "5d6f1d908ff9c30034126902", VideoDetailContainerViewModel.Location.HOTTEST_GAME_VIDEO.value, mEntrance) } } } 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 cf6085da56..c2ddf3f6c3 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 @@ -42,6 +42,7 @@ import com.gh.gamecenter.entity.ToolBoxEntity; import com.gh.gamecenter.entity.UserInfoEntity; import com.gh.gamecenter.entity.VersionVoteEntity; import com.gh.gamecenter.entity.VideoDraftEntity; +import com.gh.gamecenter.entity.VideoEntity; import com.gh.gamecenter.entity.VideoTagEntity; import com.gh.gamecenter.entity.VideoVerifyEntity; import com.gh.gamecenter.entity.VoteEntity; @@ -1835,6 +1836,12 @@ public interface ApiService { @GET("privacy_policy") Single getPrivacyPolicy(); + /** + * 获取视频详情列表 + */ + @GET("videos/{video_id}") + Single> getVideoDetailList(@Path("video_id") String videoId, @Query("filter") String filter); + /** * 获取阿里云上传配置 */ 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 bf6a8972cd..d4136af58a 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 @@ -5,14 +5,21 @@ import android.util.AttributeSet import android.view.Surface import android.view.View import android.widget.ImageView +import com.gh.common.util.DirectUtils +import com.gh.common.util.ImageUtils import com.gh.gamecenter.R +import com.gh.gamecenter.entity.VideoEntity import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import com.squareup.picasso.Picasso +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 = "(视频详情)" + override fun init(context: Context) { super.init(context) @@ -21,13 +28,39 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib } } + fun updateViewDetail(videoEntity: VideoEntity) { + mVideoEntity = videoEntity + + gameNameTv.text = videoEntity.gameName + smallGameNameTv.text = videoEntity.gameName + + usernameTv.text = "@" + videoEntity.user.name + videoTitleTv.text = videoEntity.title + + likeCountTv.text = videoEntity.vote.toString() + commentCountTv.text = videoEntity.commentCount.toString() + + ImageUtils.display(gameIconIv, videoEntity.gameIcon) + ImageUtils.display(userIconIv, videoEntity.user.icon) + + usernameTv.setOnClickListener { userIconIv.performClick() } + userIconIv.setOnClickListener { + DirectUtils.directToPersonalHome(context, videoEntity.user.id ?: "", mEntrance, "") + } + + gameNameTv.setOnClickListener { gameContainer.performClick() } + gameContainer.setOnClickListener { + DirectUtils.directToGameDetail(context, videoEntity.gameId, mEntrance) + } + + } + fun updateThumb(url: String) { - Picasso.with(context).load(url) - .into(findViewById(R.id.thumbImage)) + Picasso.with(context).load(url).into(findViewById(R.id.thumbImage)) } override fun getLayoutId(): Int { - return R.layout.layout_simple_player + return R.layout.layout_video_detail_surface } /******************* 下方两个重载方法,在播放开始前不屏蔽封面,不需要可屏蔽 ********************/ 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 d72a9e945f..850986804d 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 @@ -1,13 +1,14 @@ package com.gh.gamecenter.video.detail -import android.content.Context -import android.content.Intent import android.os.Bundle import com.gh.base.BaseActivity import com.gh.common.util.DisplayUtils -import com.gh.common.util.EntranceUtils import com.gh.gamecenter.R +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.player.IjkPlayerManager +import tv.danmaku.ijk.media.player.IjkMediaPlayer +// 由于兼容性问题,本游戏详情页不应该被低于 Android 4.4 的设备打开 class VideoDetailActivity : BaseActivity() { override fun getLayoutId(): Int { @@ -19,22 +20,26 @@ class VideoDetailActivity : BaseActivity() { DisplayUtils.transparentStatusAndNavigation(this) - val containerFragment = VideoDetailContainerFragment() + IjkPlayerManager.setLogLevel(IjkMediaPlayer.IJK_LOG_SILENT) + + val containerFragment = VideoDetailContainerFragment().with(intent.extras) supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment).commitNowAllowingStateLoss() } - companion object { - fun getIntent(context: Context): Intent { - val intent = Intent(context, VideoDetailActivity::class.java) - return intent - } - - @JvmStatic - fun getIntent(context: Context, videoId: String): Intent { - val intent = Intent(context, VideoDetailActivity::class.java) - intent.putExtra(EntranceUtils.KEY_VIDEO_ID, videoId) - return intent - } + override fun onStop() { + GSYVideoManager.onPause() + super.onStop() } + + override fun onResume() { + GSYVideoManager.onResume(true) + super.onResume() + } + + override fun onDestroy() { + GSYVideoManager.releaseAllVideos() + super.onDestroy() + } + } \ No newline at end of file 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 1c61dc5705..eacd80d276 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 @@ -3,36 +3,52 @@ package com.gh.gamecenter.video.detail import android.os.Bundle import android.view.View 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.gamecenter.R import com.gh.gamecenter.normal.NormalFragment import kotlinx.android.synthetic.main.fragment_video_detail_container.* class VideoDetailContainerFragment : NormalFragment() { + private lateinit var mViewModel: VideoDetailContainerViewModel private lateinit var mFragmentAdapter: VideoFragmentPagerAdapter override fun getLayoutId(): Int { return R.layout.fragment_video_detail_container } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val videoId = arguments?.getString(EntranceUtils.KEY_ID) ?: "" + val location = arguments?.getString(EntranceUtils.KEY_LOCATION) ?: "" + + mViewModel = viewModelProviderFromParent() + mViewModel.getVideoDetailList(videoId, location) + } + 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.setNavigationOnClickListener { requireActivity().finish() } + + mViewModel.videoList.observeNonNull(this) { + if (!::mFragmentAdapter.isInitialized) { + mFragmentAdapter = VideoFragmentPagerAdapter(this) + + viewpager.adapter = mFragmentAdapter + viewpager.orientation = ViewPager2.ORIENTATION_VERTICAL + viewpager.offscreenPageLimit = 1 + } + + mFragmentAdapter.videoList = it + viewpager.setCurrentItem(Int.MAX_VALUE / 2 + mViewModel.startPosition, false) + mFragmentAdapter.notifyDataSetChanged() } - - mFragmentAdapter = VideoFragmentPagerAdapter(this) - - mFragmentAdapter.videoList = arrayListOf( - "https://resource.ghzs.com/video/game/5cef8c58bb946d11052dfe65.mp4", - "https://resource.ghzs.com/video/game/5d26e984c391ca0c9a16121c.mp4", - "https://resource.ghzs.com/video/game/5d53bc8e656a5c05bf59d2e7.mp4") - - viewpager.adapter = mFragmentAdapter - viewpager.orientation = ViewPager2.ORIENTATION_VERTICAL - viewpager.offscreenPageLimit = 1 } } \ 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 new file mode 100644 index 0000000000..7fee5936b2 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt @@ -0,0 +1,77 @@ +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.common.util.UrlFilterUtils +import com.gh.gamecenter.entity.VideoEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.schedulers.Schedulers + +class VideoDetailContainerViewModel(application: Application) : AndroidViewModel(application) { + + var videoList = MutableLiveData>() + var startPosition = 0 + + // TODO 上下预加载 + @SuppressLint("CheckResult") + fun getVideoDetailList(videoId: String, location: String) { + RetrofitManager.getInstance(getApplication()) + .api.getVideoDetailList(videoId, getFilter(location)) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: ArrayList) { + startPosition = data.indexOfFirst { video -> videoId == video.id } + + mergeVideoList(videoId, data) + } + }) + } + + fun mergeVideoList(videoId: String, receivedDataList: ArrayList) { + if (receivedDataList.isNullOrEmpty()) return + + val onDisplayingVideoList = videoList.value + + if (onDisplayingVideoList.isNullOrEmpty()) { + videoList.postValue(receivedDataList) + } else { + if (videoId == onDisplayingVideoList.last().id) { + onDisplayingVideoList.addAll(receivedDataList) + } else { + onDisplayingVideoList.addAll(0, receivedDataList) + } + videoList.postValue(onDisplayingVideoList) + } + } + + fun getFilter(location: String): String { + return UrlFilterUtils.getFilterQuery("location", location, "next", "10", "last", "10") + } + + /** + * hottest_game_video视频合集(最热), + * newest_game_video视频合集(最新), + * user_video用户上传视频(已通过审核的), + * user_favorite_video用户收藏视频, + * user_uploaded_video用户已投稿视频(包含所有状态) + */ + enum class Location(val value: String) { + HOTTEST_GAME_VIDEO("hottest_game_video"), + + NEWEST_GAME_VIDEO("newest_game_video"), + + USER_VIDEO("user_video"), + + USER_FAVORITE_VIDEO("user_favorite_video"), + + USER_UPLOADED_VIDEO("user_uploaded_video"); + } + + companion object { + private const val DEFAULT_LOADING_SIZE = 5 + } + +} \ No newline at end of file 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 eedbb72dc4..146f03ae4c 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 @@ -1,56 +1,68 @@ package com.gh.gamecenter.video.detail import android.os.Bundle -import android.util.Log -import android.view.View import butterknife.BindView +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.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder class VideoDetailFragment : NormalFragment() { - private var videoUrl = "" - @BindView(R.id.video) lateinit var videoView: DetailPlayerView + private lateinit var mViewModel: VideoDetailViewModel + private lateinit var mContainerViewModel: VideoDetailContainerViewModel + override fun getLayoutId(): Int { return R.layout.fragment_video_detail } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - GSYVideoOptionBuilder() - .setIsTouchWiget(false) - .setUrl(videoUrl) - .setRotateViewAuto(false) - .setCacheWithPlay(true) - .setRotateViewAuto(false) - .setRotateWithSystem(false) - .setReleaseWhenLossAudio(true) - .setLockLand(true) - .setLooping(true) - .build(videoView) + mViewModel = viewModelProvider() + mContainerViewModel = viewModelProviderFromParent() - videoView.updateThumb("$videoUrl?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0") + if (mViewModel.videoDetail == null) { + mViewModel.videoDetail = arguments?.getParcelable(KEY_VIDEO) + } + + mViewModel.videoDetail?.let { + GSYVideoOptionBuilder() + .setIsTouchWiget(false) + .setUrl(it.url) + .setRotateViewAuto(false) + .setCacheWithPlay(true) + .setRotateViewAuto(false) + .setRotateWithSystem(false) + .setReleaseWhenLossAudio(true) + .setLockLand(true) + .setLooping(true) + .build(videoView) + + videoView.updateViewDetail(it) + videoView.updateThumb("${it.url}?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0") + } } override fun onResume() { super.onResume() - videoView.startPlayLogic() - Log.d("lifeCycle", "onResume") - } - - override fun onPause() { - super.onPause() - Log.d("lifeCycle", "onPause") + if (!videoView.isInPlayingState) { + videoView.startButton.performClick() + } } companion object { - fun newInstance(url: String): VideoDetailFragment { - return VideoDetailFragment().apply { videoUrl = url } + private const val KEY_VIDEO = "key_video" + + fun instance(videoEntity: VideoEntity): VideoDetailFragment { + return VideoDetailFragment().apply { + with(Bundle().apply { putParcelable(KEY_VIDEO, videoEntity) }) + } } } 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 new file mode 100644 index 0000000000..4ee2fc6c58 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailViewModel.kt @@ -0,0 +1,11 @@ +package com.gh.gamecenter.video.detail + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import com.gh.gamecenter.entity.VideoEntity + +class VideoDetailViewModel(application: Application) : AndroidViewModel(application) { + + var videoDetail: VideoEntity? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoFragmentPagerAdapter.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoFragmentPagerAdapter.kt index 4904eb3f90..b36d7dc95a 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoFragmentPagerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoFragmentPagerAdapter.kt @@ -2,17 +2,26 @@ package com.gh.gamecenter.video.detail import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter +import com.gh.gamecenter.entity.VideoEntity class VideoFragmentPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { - var videoList = arrayListOf() + var videoList = arrayListOf() override fun getItemCount(): Int { - return videoList.size + return Int.MAX_VALUE } override fun createFragment(position: Int): Fragment { - return VideoDetailFragment.newInstance(videoList[position]) + return VideoDetailFragment.instance(getVideoWithRealPosition(position)) + } + + fun getRealPosition(position: Int): Int { + return position % videoList.size + } + + private fun getVideoWithRealPosition(position: Int): VideoEntity { + return videoList[getRealPosition(position)] } } \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_comments.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..b57b56eaabf74e466ba8f4f212991bd4cae2eabd GIT binary patch literal 2995 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_game.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_game.png new file mode 100644 index 0000000000000000000000000000000000000000..887cbf66addc67b87613745732dd58892818c947 GIT binary patch literal 2093 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¥MnZfKFu#Ej z@H%66%Nj3U>4O8hg4qoSf|-oj*(Kfrt-#UQvlt6X@k7XffHsOPGo7Nc(P zn&hk-kAud8U7*&ojSfd<-G0*#25{6+u(gH}u$jKJ{$Sz?12}9DSPzoQ3OcaY++A^e zSWg_+2P{hv0Sjn*aJWy~c8mcWsI`K59SDLaXw$_pb4}e+4B*Jl;PHq-u!njxO7&x9 zjx&H`Cjp(%m6Pr481J~5rhX*`aIg*uGk}(me*!zeN}z?LK9$<$ao_(YVtY-F`E@P; O0000`>pD$h$ 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 + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_video_detail_container.xml b/app/src/main/res/layout/fragment_video_detail_container.xml index c64feb1ebe..acf24770c1 100644 --- a/app/src/main/res/layout/fragment_video_detail_container.xml +++ b/app/src/main/res/layout/fragment_video_detail_container.xml @@ -30,6 +30,7 @@ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> @@ -75,23 +76,15 @@ - - + android:src="@drawable/ic_video_detail_play" + android:visibility="gone" + tools:visibility="visible" /> diff --git a/app/src/main/res/layout/layout_video_detail_surface.xml b/app/src/main/res/layout/layout_video_detail_surface.xml new file mode 100644 index 0000000000..448928a237 --- /dev/null +++ b/app/src/main/res/layout/layout_video_detail_surface.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file