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