diff --git a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt
index 7f08ee4b60..03fbb625b2 100644
--- a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt
+++ b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.kt
@@ -114,7 +114,6 @@ class GameDetailActivity : DownloadToolbarActivity() {
view,
listOf(
R.id.menu_download_iv,
- R.id.gameBigEvent,
R.id.cardContainer,
R.id.iv_reserve,
R.id.iv_concern,
diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt
index 78365545d1..0ccd1ddd22 100644
--- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt
+++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt
@@ -127,6 +127,8 @@ class GameDetailViewModel(
var isSkipOnPageSelected = false // 是否触发论坛/专区Tab跳转
var defaultCoverEntity: CoverEntity? = null
+ var coverTabSequence = 1 // 用于埋点,详情视频/图集tab 当前选中tab的序号,从1开始
+ var coverTabName = "" // 用于埋点,详情视频/图集tab 详情视频/图集tab 当前选中tab的tab名称
var isGameInstalled = false
private var isGameUpdatable = false
diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt
index cc4b65c816..91ad234f20 100644
--- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt
@@ -187,15 +187,19 @@ class GameDetailFragment : LazyFragment(), IScrollable {
coverSfv.goneIf(!shouldShowCoverFilter) {
val defaultTabPosition =
tabNameList.indexOfFirst { tabName -> viewModel.defaultCoverEntity?.tabName == tabName }
+ viewModel.coverTabSequence = defaultTabPosition + 1
+ viewModel.coverTabName = viewModel.defaultCoverEntity?.tabName ?: ""
coverSfv.setItemList(tabNameList, if (defaultTabPosition != -1) defaultTabPosition else 0)
coverSfv.setOnCheckedCallback { position ->
val checkedText = tabNameList.getOrNull(position)
val currentCoverEntity = it.getOrNull(coverPosition)
+ viewModel.coverTabSequence = position + 1
+ viewModel.coverTabName = checkedText ?: ""
SensorsBridge.trackEvent("GameDetailMediaTabClick", json {
"game_id" to gameEntity?.id
"game_name" to gameEntity?.name
- "sequence" to position + 1
- "tab_name" to checkedText
+ "sequence" to viewModel.coverTabSequence
+ "tab_name" to viewModel.coverTabName
})
if (currentCoverEntity?.tabName == checkedText) return@setOnCheckedCallback
diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt
index 6c59e513cd..17102cb23d 100644
--- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt
@@ -115,7 +115,6 @@ class GameDetailCoverAdapter(
})
.build(holder.binding.player)
- holder.binding.player.gameName = viewModel.game?.name ?: ""
holder.binding.player.viewModel = viewModel
holder.binding.player.showOrHideCoverFilter = showOrHideCoverFilter
holder.binding.player.video = topVideo
diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt
index 08f7473e39..242b6ae965 100644
--- a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt
+++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt
@@ -14,6 +14,7 @@ import androidx.fragment.app.Fragment
import com.gh.common.util.LogUtils
import com.gh.download.cache.ExoCacheManager
import com.gh.gamecenter.R
+import com.gh.gamecenter.common.base.GlobalActivityManager
import com.gh.gamecenter.common.observer.MuteCallback
import com.gh.gamecenter.common.observer.VolumeObserver
import com.gh.gamecenter.common.utils.*
@@ -40,7 +41,6 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
private var mMuteCallback: MuteCallback
private var mVolumeObserver: VolumeObserver? = null
- var gameName = ""
var video: CoverTabEntity.Video? = null
var viewModel: GameDetailViewModel? = null
var uuid = UUID.randomUUID().toString()
@@ -87,11 +87,21 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
}
setBackFromFullScreenListener {
-// if (it.id == R.id.fullscreen) {
-// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-退出全屏", combinedTitleAndId)
-// } else if (it.id == R.id.back) {
-// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-点击返回", combinedTitleAndId)
-// }
+ if (it.id == R.id.fullscreen || it.id == R.id.back) {
+ SensorsBridge.trackGameDetailVideoClick(
+ gameName = viewModel?.game?.name ?: "",
+ gameId = viewModel?.game?.id ?: "",
+ gameType = viewModel?.game?.categoryChinese ?: "",
+ lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
+ lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
+ action = if (it.id == R.id.fullscreen) "退出全屏" else "点击返回",
+ playType = if (mIsAutoPlay) "自动播放" else "主动播放",
+ isFullScreen = mIfCurrentIsFullscreen,
+ sequence = viewModel?.coverTabSequence ?: 1,
+ tabName = viewModel?.coverTabName ?: "",
+ playLength = (currentPositionWhenPlaying / 1000).toString()
+ )
+ }
clearFullscreenLayout()
}
@@ -126,13 +136,22 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
fun startPlayLogic(isAutoPlay: Boolean) {
mIsAutoPlay = isAutoPlay
violenceUpdateMuteStatus()
-// if (isAutoPlay) {
-// MtaHelper.onEvent("游戏详情_顶部视频", "视频播放方式", "自动播放")
-// MtaHelper.onEvent("游戏详情_顶部视频", "顶部视频-自动播放", combinedTitleAndId)
-// } else {
-// MtaHelper.onEvent("游戏详情_顶部视频", "视频播放方式", "手动播放")
-// }
+
if (isAutoPlay) {
+ SensorsBridge.trackGameDetailVideoClick(
+ gameName = viewModel?.game?.name ?: "",
+ gameId = viewModel?.game?.id ?: "",
+ gameType = viewModel?.game?.categoryChinese ?: "",
+ lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
+ lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
+ action = "自动播放",
+ playType = if (mIsAutoPlay) "自动播放" else "主动播放",
+ isFullScreen = mIfCurrentIsFullscreen,
+ sequence = viewModel?.coverTabSequence ?: 1,
+ tabName = viewModel?.coverTabName ?: "",
+ playLength = (currentPositionWhenPlaying / 1000).toString()
+ )
+
val seekTime = ScrollCalculatorHelper.getPlaySchedule(MD5Utils.getContentMD5(video?.url))
seekOnStart = seekTime
mTouchingProgressBar = false
@@ -289,7 +308,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
override fun onStopTrackingTouch(seekBar: SeekBar?) {
super.onStopTrackingTouch(seekBar)
- uploadVideoStreamingPlaying("拖动")
+ uploadVideoStreamingPlaying("拖动进度条", seekBar)
}
override fun isShowNetConfirm(): Boolean {
@@ -533,7 +552,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
}
override fun releaseVideos() {
- uploadVideoStreamingPlaying("结束播放")
+ uploadVideoStreamingPlaying("播放完毕")
CustomManager.releaseAllVideos(getKey())
}
@@ -556,11 +575,21 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
override fun onClick(v: View) {
when (v.id) {
R.id.start -> {
-// if (currentState == GSYVideoView.CURRENT_STATE_PLAYING) {
-// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-点击暂停", combinedTitleAndId)
-// } else {
-// MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-点击播放", combinedTitleAndId)
-// }
+ SensorsBridge.trackGameDetailVideoClick(
+ gameName = viewModel?.game?.name ?: "",
+ gameId = viewModel?.game?.id ?: "",
+ gameType = viewModel?.game?.categoryChinese ?: "",
+ lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
+ lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
+ action = if (currentState == GSYVideoView.CURRENT_STATE_PLAYING) "点击暂停" else "点击播放",
+ playType = if (mIsAutoPlay) "自动播放" else "主动播放",
+ isFullScreen = mIfCurrentIsFullscreen,
+ sequence = viewModel?.coverTabSequence ?: 1,
+ tabName = viewModel?.coverTabName ?: "",
+ playLength = (currentPositionWhenPlaying / 1000).toString()
+ )
+ // 手动触发暂停/播放,后续行为都算主动播放
+ mIsAutoPlay = false
super.onClick(v)
}
@@ -568,13 +597,11 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
}
}
- private fun getMtaKeyPrefix() = if (mIfCurrentIsFullscreen) "顶部视频(全屏)" else "顶部视频"
-
fun getCurrentPosition(): Long {
return mCurrentPosition
}
- fun uploadVideoStreamingPlaying(action: String) {
+ fun uploadVideoStreamingPlaying(action: String, seekBar: SeekBar? = null) {
if (video == null || video?.url.isNullOrEmpty()) return
runOnIoThread(isHeavyWightTask = true) {
val isLandscape = mOrientationUtils != null
@@ -598,6 +625,26 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS
action, video?.videoId, video?.title, viewModel?.game?.id, viewModel?.game?.name,
videoPlayModel, videoPlayStatus(), mContentLength, videoTotalTime, videoPlayTs, progress.toInt()
)
+ if (action != "开始播放" && action != "暂停播放" && action != "退出全屏") {
+ val playLength = when (action) {
+ "播放完毕" -> (duration / 1000).toString()
+ "拖动进度条" -> ((seekBar?.progress ?: 0) * duration / 100000).toString()
+ else -> (currentPositionWhenPlaying / 1000).toString()
+ }
+ SensorsBridge.trackGameDetailVideoClick(
+ gameName = viewModel?.game?.name ?: "",
+ gameId = viewModel?.game?.id ?: "",
+ gameType = viewModel?.game?.categoryChinese ?: "",
+ lastPageName = GlobalActivityManager.getLastPageEntity().pageName,
+ lastPageId = GlobalActivityManager.getLastPageEntity().pageId,
+ action = action,
+ playType = if (mIsAutoPlay) "自动播放" else "主动播放",
+ isFullScreen = mIfCurrentIsFullscreen,
+ sequence = viewModel?.coverTabSequence ?: 1,
+ tabName = viewModel?.coverTabName ?: "",
+ playLength = playLength
+ )
+ }
}
}
}
diff --git a/app/src/main/res/layout/gamedetail_body.xml b/app/src/main/res/layout/gamedetail_body.xml
deleted file mode 100644
index 5e44e99cc0..0000000000
--- a/app/src/main/res/layout/gamedetail_body.xml
+++ /dev/null
@@ -1,310 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/piece_game_detail_video.xml b/app/src/main/res/layout/piece_game_detail_video.xml
deleted file mode 100644
index c366e43aa7..0000000000
--- a/app/src/main/res/layout/piece_game_detail_video.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt
index 1d3cd9e4d5..de2d92c6bd 100644
--- a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt
+++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt
@@ -337,6 +337,7 @@ object SensorsBridge {
private const val EVENT_CALENDAR_PERMISSIONS_DIALOG_SHOW = "CalendarPermissionsDialogShow"
private const val EVENT_CALENDAR_PERMISSIONS_DIALOG_CLICK = "CalendarPermissionsDialogClick"
private const val CALENDAR_PERMISSIONS_DIALOG_RESULT = "CalendarPermissionsDialogResult"
+ private const val EVENT_GAME_DETAIL_VIDEO_CLICK= "GameDetailVideoClick"
private var mIsSensorsEnabled = false
@@ -5340,4 +5341,37 @@ object SensorsBridge {
}
trackEvent(CALENDAR_PERMISSIONS_DIALOG_RESULT, json)
}
+
+ /**
+ * 事件ID:GameDetailVideoClick
+ * 事件名称:游戏详情视频点击事件
+ */
+ fun trackGameDetailVideoClick(
+ gameName: String,
+ gameId: String,
+ gameType: String,
+ lastPageName: String,
+ lastPageId: String,
+ action: String,
+ playType: String,
+ isFullScreen: Boolean,
+ sequence: Int,
+ tabName: String,
+ playLength: String
+ ) {
+ val json = json {
+ KEY_GAME_ID to gameId
+ KEY_GAME_NAME to gameName
+ KEY_GAME_TYPE to gameType
+ KEY_LAST_PAGE_ID to lastPageId
+ KEY_LAST_PAGE_NAME to lastPageName
+ KEY_ACTION to action
+ KEY_PLAY_TYPE to playType
+ "is_full_screen" to isFullScreen
+ KEY_SEQUENCE to sequence
+ "tab_name" to tabName
+ "play_length" to playLength
+ }
+ trackEvent(EVENT_GAME_DETAIL_VIDEO_CLICK, json)
+ }
}
\ No newline at end of file