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 0000000000..b57b56eaab Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_video_detail_comments.png differ 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 0000000000..887cbf66ad Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_video_detail_game.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_like.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_like.png new file mode 100644 index 0000000000..1e80925bef Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_video_detail_like.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_play.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_play.png new file mode 100644 index 0000000000..548cef81d6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_video_detail_play.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_share.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_share.png new file mode 100644 index 0000000000..66278c77b2 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_video_detail_share.png differ diff --git a/app/src/main/res/drawable/progressbar_video_detail.xml b/app/src/main/res/drawable/progressbar_video_detail.xml new file mode 100644 index 0000000000..94072387f2 --- /dev/null +++ b/app/src/main/res/drawable/progressbar_video_detail.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + 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