diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt index 939a69e626..e8e5e01a5b 100644 --- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt +++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt @@ -51,8 +51,8 @@ import java.nio.charset.Charset object DefaultUrlHandler { @JvmStatic - fun interceptUrl(context: Context, url: String, entrance: String): Boolean { - return interceptUrl(context, url, null, entrance, false) + fun interceptUrl(context: Context, url: String, entrance: String, sourceEntrance: String = ""): Boolean { + return interceptUrl(context, url, null, entrance, false, sourceEntrance) } /** @@ -66,7 +66,8 @@ object DefaultUrlHandler { fun interceptUrl(context: Context, url: String, traceEvent: ExposureEvent? = null, entrance: String, - bringAppToFront: Boolean = false): Boolean { + bringAppToFront: Boolean = false, + sourceEntrance: String = ""): Boolean { val uri = Uri.parse(url) if ("ghzhushou" == uri.scheme) { Utils.log("url = $url") @@ -135,7 +136,7 @@ object DefaultUrlHandler { } } - "question" -> DirectUtils.directToQuestionDetail(context, id, entrance, "文章链接") + "question" -> DirectUtils.directToQuestionDetail(context, id, entrance, "文章链接", sourceEntrance) "real_name" -> DirectUtils.directToRealName(context) @@ -178,7 +179,7 @@ object DefaultUrlHandler { if ("articles" == type) { DirectUtils.directToCommunityArticle( context, typeId, communityId, - entrance, "文章链接" + entrance, "文章链接", sourceEntrance ) } } @@ -246,17 +247,18 @@ object DefaultUrlHandler { act, paginationType, fieldId, - sectionName + sectionName, + sourceEntrance = sourceEntrance ) } EntranceConsts.HOST_VIDEO_DETAIL -> { - DirectUtils.directToVideoDetail(context, id, entrance, path) + DirectUtils.directToVideoDetail(context, id, entrance, path, sourceEntrance) } EntranceConsts.HOST_VIDEO_SINGLE -> { val referer = uri.getQueryParameter("referer") ?: "" DirectUtils.directToVideoDetail( context, id, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.value, - false, "", entrance, "", if (TextUtils.isEmpty(referer)) "" else referer + false, "", entrance, "", if (TextUtils.isEmpty(referer)) "" else referer, sourceEntrance ) } EntranceConsts.HOST_VIDEO_STREAMING_HOME -> { @@ -325,7 +327,7 @@ object DefaultUrlHandler { val linkData = Base64.decode(dataString, Base64.DEFAULT) val linkDataString = String(linkData, Charset.defaultCharset()) val le = gson.fromJson(linkDataString, LinkEntity::class.java) - directToLinkPage(context, le, entrance, "") + directToLinkPage(context, le, entrance, sourceEntrance, "") } } catch (e: Exception) { e.printStackTrace() @@ -564,7 +566,7 @@ object DefaultUrlHandler { } // 处理内部页面逻辑 - if (transformNormalScheme(context, url, entrance)) { + if (transformNormalScheme(context, url, entrance, sourceEntrance)) { return true } @@ -573,14 +575,14 @@ object DefaultUrlHandler { } @JvmStatic - fun transformNormalScheme(context: Context, url: String, entrance: String): Boolean { - val b = transformNewNormalScheme(context, url, entrance) + fun transformNormalScheme(context: Context, url: String, entrance: String, sourceEntrance: String): Boolean { + val b = transformNewNormalScheme(context, url, entrance, sourceEntrance) if (b) return b - return transformOldNormalScheme(context, url, entrance) + return transformOldNormalScheme(context, url, entrance, sourceEntrance) } @JvmStatic - fun transformOldNormalScheme(context: Context, url: String, entrance: String): Boolean { + fun transformOldNormalScheme(context: Context, url: String, entrance: String, sourceEntrance: String): Boolean { val uri = Uri.parse(url) if (uri.host == "www.ghzs666.com" || uri.host == "www.ghzs.com" @@ -605,7 +607,7 @@ object DefaultUrlHandler { val questionId = split("/")[2] val answerId = uri.getQueryParameter("answer") if (answerId.isNullOrEmpty()) { - DirectUtils.directToQuestionDetail(context, questionId, entrance, "") + DirectUtils.directToQuestionDetail(context, questionId, entrance, "", sourceEntrance) } else { DirectUtils.directToAnswerDetail(context, answerId, entrance, "") } @@ -635,7 +637,7 @@ object DefaultUrlHandler { if ("articles" == type || "article" == type) { DirectUtils.directToCommunityArticle( context, typeId, communityId, - entrance, "文章链接" + entrance, "文章链接", sourceEntrance ) } } @@ -666,7 +668,7 @@ object DefaultUrlHandler { } @JvmStatic - fun transformNewNormalScheme(context: Context, url: String, entrance: String): Boolean { + fun transformNewNormalScheme(context: Context, url: String, entrance: String, sourceEntrance: String): Boolean { val uri = Uri.parse(url) if (uri.host == "www.ghzs666.com" || uri.host == "www.ghzs.com" @@ -684,7 +686,7 @@ object DefaultUrlHandler { val articleId = splits[2].substring(7) DirectUtils.directToCommunityArticle( context, articleId, "", - entrance, "文章链接" + entrance, "文章链接", sourceEntrance ) } //https://m.ghzs666.com/article/文章ID @@ -704,7 +706,7 @@ object DefaultUrlHandler { //https://m.ghzs666.com/bbs/video-视频ID splits.size >= 3 && splits[1] == "bbs" && splits[2].startsWith("video-") -> { val videoId = splits[2].substring(6) - DirectUtils.directToVideoDetail(context, videoId, entrance) + DirectUtils.directToVideoDetail(context, videoId, entrance, sourceEntrance) } else -> return false } diff --git a/app/src/main/java/com/gh/common/browse/BrowseTimer.kt b/app/src/main/java/com/gh/common/browse/BrowseTimer.kt new file mode 100644 index 0000000000..7b2c1d2335 --- /dev/null +++ b/app/src/main/java/com/gh/common/browse/BrowseTimer.kt @@ -0,0 +1,351 @@ +package com.gh.common.browse + +import android.os.Handler +import android.os.Looper +import android.os.Message +import androidx.lifecycle.* +import androidx.lifecycle.Lifecycle.Event + +/** + * 浏览时长计时器核心接口类,用于页面浏览时长相关埋点上报 + */ +interface IBrowseTimerCore { + /** + * 开始计时 + */ + fun start() + + /** + * 结束计时 + */ + fun stop() +} + +/** + * 浏览时长计时器核心实现类 + */ +class BrowseTimerCore internal constructor() : IBrowseTimerCore { + + /** + * 延迟执行的时间 + */ + var delayInMills: Long = 3000L + + /** + * 开始计时函数回调 + */ + var onStart: (() -> Unit)? = null + + /** + * 结束计时函数回调 + */ + var onResult: ((Long) -> Unit)? = null + + /** + * 开始计时的时间点 + */ + private var startTimeInMills: Long = 0L + + /** + * Handler操作类 + */ + private val handler = object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + if (msg.what == MESSAGE_START) { + dispatchOnStart() + } + } + } + + /** + * 延迟执行开始计时 + * @see delayInMills + * @see onStart + */ + override fun start() { + if (delayInMills <= 0) { + dispatchOnStart() + } else { + handler.sendEmptyMessageDelayed(MESSAGE_START, delayInMills) + } + } + + /** + * 结束计时,统计浏览时长并回调结束计时函数 + * @see onResult + */ + override fun stop() { + handler.removeMessages(MESSAGE_START) + if (startTimeInMills > 0L) { + onResult?.invoke(System.currentTimeMillis() - startTimeInMills) + startTimeInMills = 0L + } + } + + /** + * 开始计时,回调开始计时函数 + */ + private fun dispatchOnStart() { + startTimeInMills = System.currentTimeMillis() + onStart?.invoke() + } + + companion object { + private const val MESSAGE_START = 1 + } +} + +/** + * 无数据浏览计时器接口类 + */ +interface IBrowseTimer : IBrowseTimerCore { + + fun withDelayInMills(delayInMills: Long): IBrowseTimer + + fun withStart(onStart: () -> Unit): IBrowseTimer + + fun withResult(onResult: (Long) -> Unit): IBrowseTimer +} + +/** + * 无数据的浏览计时器实现类 + */ +class BrowseTimer : IBrowseTimer { + + private val core = BrowseTimerCore() + + private var isStarted: Boolean = false + + override fun withDelayInMills(delayInMills: Long): IBrowseTimer { + core.delayInMills = delayInMills + return this + } + + override fun withStart(onStart: () -> Unit): IBrowseTimer { + core.onStart = onStart + return this + } + + override fun withResult(onResult: (Long) -> Unit): IBrowseTimer { + core.onResult = onResult + return this + } + + override fun start() { + if (isStarted) return + + isStarted = true + core.start() + } + + override fun stop() { + if (!isStarted) return + + core.stop() + isStarted = false + } + +} + +/** + * 支持Lifecycle的无数据的浏览计时器 + */ +class LifecycleBoundBrowseTimer internal constructor( + private val base: IBrowseTimer, + private val onStateChanged: (IBrowseTimer, Event) -> Unit +) : IBrowseTimer, LifecycleEventObserver { + override fun withDelayInMills(delayInMills: Long): IBrowseTimer { + return base.withDelayInMills(delayInMills) + } + + override fun withStart(onStart: () -> Unit): IBrowseTimer { + return base.withStart(onStart) + } + + override fun withResult(onResult: (Long) -> Unit): IBrowseTimer { + return base.withResult(onResult) + } + + override fun start() { + base.start() + } + + override fun stop() { + base.stop() + } + + override fun onStateChanged(source: LifecycleOwner, event: Event) { + onStateChanged.invoke(this, event) + } + +} + +fun IBrowseTimer.withLifecycle( + owner: LifecycleOwner, + onStateChanged: (IBrowseTimer, Event) -> Unit = { timer, event -> + when(event) { + Event.ON_START -> timer.start() + Event.ON_STOP -> timer.stop() + else -> {} + } + } +): LifecycleBoundBrowseTimer = LifecycleBoundBrowseTimer(this, onStateChanged).apply { + owner.lifecycle.addObserver(this) +} + +/** + * 带数据的浏览计时器接口类 + */ +interface IValueBrowseTimer : IBrowseTimerCore { + + fun withDelayInMills(delayInMills: Long): IValueBrowseTimer + + fun withStart(onStart: (T?) -> Unit): IValueBrowseTimer + + fun withResult(onResult: (T?, Long) -> Unit): IValueBrowseTimer + + fun dispatchValue(value: T?) +} + +/** + * 带数据的浏览计时器实现类 + */ +class ValueBrowseTimer : IValueBrowseTimer { + + private val core = BrowseTimerCore() + + private var isDispatchValue: Boolean = false + + private var isStarted: Boolean = false + + private var value: T? = null + + override fun withDelayInMills(delayInMills: Long): IValueBrowseTimer { + core.delayInMills = delayInMills + return this + } + + override fun withStart(onStart: (T?) -> Unit): IValueBrowseTimer { + core.onStart = { onStart.invoke(value) } + return this + } + + override fun withResult(onResult: (T?, Long) -> Unit): IValueBrowseTimer { + core.onResult = { onResult.invoke(value, it) } + return this + } + + override fun start() { + if (isStarted) return + + isStarted = true + + if (isDispatchValue) { + core.start() + } + } + + override fun stop() { + if (!isStarted) return + + core.stop() + isStarted = false + } + + override fun dispatchValue(value: T?) { + this.value = value + + if (isStarted && !isDispatchValue) { + core.start() + } + isDispatchValue = true + } + +} + +/** + * 支持LiveData的带数据的浏览计时器 + */ +class ObserverBoundValueBrowseTimer internal constructor(private val base: IValueBrowseTimer) : IValueBrowseTimer, Observer { + override fun withDelayInMills(delayInMills: Long): IValueBrowseTimer { + return base.withDelayInMills(delayInMills) + } + + override fun withResult(onResult: (T?, Long) -> Unit): IValueBrowseTimer { + return base.withResult(onResult) + } + + override fun withStart(onStart: (T?) -> Unit): IValueBrowseTimer { + return base.withStart(onStart) + } + + override fun start() { + base.start() + } + + override fun stop() { + base.stop() + } + + override fun dispatchValue(value: T?) { + base.dispatchValue(value) + } + + override fun onChanged(t: T) { + dispatchValue(t) + } +} + + +/** + * 支持Lifecycle的带数据的浏览计时器 + */ +class LifecycleBoundValueBrowseTimer internal constructor( + private val base: IValueBrowseTimer, + private val onStateChanged: (IValueBrowseTimer, Event) -> Unit +) : IValueBrowseTimer, LifecycleEventObserver { + override fun withDelayInMills(delayInMills: Long): IValueBrowseTimer { + return base.withDelayInMills(delayInMills) + } + + override fun withResult(onResult: (T?, Long) -> Unit): IValueBrowseTimer { + return base.withResult(onResult) + } + + override fun withStart(onStart: (T?) -> Unit): IValueBrowseTimer { + return base.withStart(onStart) + } + + override fun start() { + base.start() + } + + override fun stop() { + base.stop() + } + + override fun dispatchValue(value: T?) { + base.dispatchValue(value) + } + + override fun onStateChanged(source: LifecycleOwner, event: Event) { + onStateChanged.invoke(this, event) + } + +} + +fun IValueBrowseTimer.asObserver(): ObserverBoundValueBrowseTimer = ObserverBoundValueBrowseTimer(this) + +fun IValueBrowseTimer.withLifecycle( + owner: LifecycleOwner, + onStateChanged: (IValueBrowseTimer, Event) -> Unit = { timer, event -> + when(event) { + Event.ON_START -> timer.start() + Event.ON_STOP -> timer.stop() + else -> {} + } + } +): LifecycleBoundValueBrowseTimer = LifecycleBoundValueBrowseTimer(this, onStateChanged).apply { + owner.lifecycle.addObserver(this) +} + diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index aecc61116a..1746347638 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -96,13 +96,23 @@ public class BindingAdapters { } } - // 大图下的进度条 public static void setDownloadButton(DownloadButton progressBar, GameEntity gameEntity, ExposureEvent traceEvent, @Nullable View.OnClickListener clickCallBack, @Nullable String entrance, @Nullable String location) { + setDownloadButton(progressBar, gameEntity, traceEvent, clickCallBack, entrance, location, "其他"); + } + + // 大图下的进度条 + public static void setDownloadButton(DownloadButton progressBar, + GameEntity gameEntity, + ExposureEvent traceEvent, + @Nullable View.OnClickListener clickCallBack, + @Nullable String entrance, + @Nullable String location, + String sourceEntrance) { // 恢复DialogFragment restoreDialogFragment(progressBar); @@ -272,7 +282,7 @@ public class BindingAdapters { case RESERVABLE: GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> { CheckLoginUtils.checkLogin(progressBar.getContext(), "", () -> { - ReservationHelper.reserve(v.getContext(), gameEntity, () -> { + ReservationHelper.reserve(v.getContext(), gameEntity, sourceEntrance, () -> { LogUtils.logReservation(gameEntity, traceEvent); updateReservation(progressBar, gameEntity); }); diff --git a/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt b/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt index 65b7d72fab..48647a7985 100644 --- a/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt +++ b/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt @@ -70,11 +70,11 @@ class CertificationDialog( actionRightTv.text = "去实名认证" noRemindAgainCb.visibility = View.GONE actionLeftTv.setOnClickListener { - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionLeftTv.text.toString()) + SensorsBridge.trackVerificationPopupClick(actionLeftTv.text.toString()) dismiss() } actionRightTv.setOnClickListener { - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionRightTv.text.toString()) + SensorsBridge.trackVerificationPopupClick(actionRightTv.text.toString()) if (UserManager.getInstance().isLoggedIn) { gotoAuthPage() } else { @@ -87,7 +87,7 @@ class CertificationDialog( actionRightTv.text = "继续下载" noRemindAgainCb.visibility = View.GONE actionLeftTv.setOnClickListener { - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionLeftTv.text.toString()) + SensorsBridge.trackVerificationPopupClick(actionLeftTv.text.toString()) if (UserManager.getInstance().isLoggedIn) { gotoAuthPage() } else { @@ -95,7 +95,7 @@ class CertificationDialog( } } actionRightTv.setOnClickListener { - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionRightTv.text.toString()) + SensorsBridge.trackVerificationPopupClick(actionRightTv.text.toString()) listener.onConfirm() dismiss() } @@ -105,7 +105,7 @@ class CertificationDialog( actionRightTv.text = "继续下载" noRemindAgainCb.visibility = View.VISIBLE actionLeftTv.setOnClickListener { - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionLeftTv.text.toString()) + SensorsBridge.trackVerificationPopupClick(actionLeftTv.text.toString()) if (noRemindAgainCb.isChecked) { SPUtils.setBoolean(gameEntity.id, true) } @@ -116,7 +116,7 @@ class CertificationDialog( } } actionRightTv.setOnClickListener { - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionRightTv.text.toString()) + SensorsBridge.trackVerificationPopupClick(actionRightTv.text.toString()) if (noRemindAgainCb.isChecked) { SPUtils.getBoolean(gameEntity.id, true) } @@ -126,14 +126,12 @@ class CertificationDialog( } } - SensorsBridge.trackEvent( - "VerificationDialogShow", - "game_id", - gameEntity.id, - "game_name", - gameEntity.name ?: "", - "game_type", - gameEntity.categoryChinese + SensorsBridge.trackVerificationDialogShow( + gameId = gameEntity.id, + gameName = gameEntity.name ?: "", + gameType = gameEntity.categoryChinese, + articleType = "", + verificationType = "游戏实名" ) } @@ -162,6 +160,7 @@ class CertificationDialog( context, ShellActivity.Type.REAL_NAME_INFO, ).apply { + putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, "游戏实名") putExtra(EntranceConsts.KEY_GAME_ID, gameEntity.id) }, object : Callback { override fun onActivityResult(resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt index d446fff269..85de595340 100644 --- a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt +++ b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt @@ -19,7 +19,7 @@ import com.halo.assistant.HaloApp @Database( entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class, GamesCollectionEntity::class], - version = 13, + version = 14, exportSchema = false ) @TypeConverters( @@ -41,7 +41,8 @@ import com.halo.assistant.HaloApp SimpleGameListConverter::class, TagInfoListConverter::class, ActivityLabelListConverter::class, - IconFloatConverter::class + IconFloatConverter::class, + SectionConverter::class ) abstract class HistoryDatabase : RoomDatabase() { @@ -143,6 +144,14 @@ abstract class HistoryDatabase : RoomDatabase() { } } + val MIGRATION_13_14: Migration = object : Migration(13, 14) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("Alter TABLE ArticleEntity add type TEXT NOT NULL DEFAULT 'community_article'") + database.execSQL("Alter TABLE ArticleEntity add sections TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add tagActivityName TEXT NOT NULL DEFAULT ''") + } + } + val instance by lazy { Room.databaseBuilder( HaloApp.getInstance().application, @@ -160,6 +169,7 @@ abstract class HistoryDatabase : RoomDatabase() { .addMigrations(MIGRATION_10_11) .addMigrations(MIGRATION_11_12) .addMigrations(MIGRATION_12_13) + .addMigrations(MIGRATION_13_14) .build() } } diff --git a/app/src/main/java/com/gh/common/history/HistoryHelper.kt b/app/src/main/java/com/gh/common/history/HistoryHelper.kt index 42dda6cfeb..64a30ae0b0 100644 --- a/app/src/main/java/com/gh/common/history/HistoryHelper.kt +++ b/app/src/main/java/com/gh/common/history/HistoryHelper.kt @@ -6,11 +6,7 @@ import com.gh.gamecenter.common.utils.removeVideoContent import com.gh.gamecenter.common.utils.tryCatchInRelease import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.entity.* -import com.gh.gamecenter.feature.entity.AnswerEntity -import com.gh.gamecenter.feature.entity.ArticleEntity -import com.gh.gamecenter.feature.entity.GameEntity -import com.gh.gamecenter.feature.entity.NewsEntity -import com.gh.gamecenter.feature.entity.User +import com.gh.gamecenter.feature.entity.* import com.gh.gamecenter.qa.entity.AnswerDetailEntity import com.gh.gamecenter.qa.entity.ArticleDetailEntity @@ -109,7 +105,7 @@ object HistoryHelper { fun deleteArticleEntity(articleId: String) { runOnIoThread { tryCatchInRelease { - HistoryDatabase.instance.articleDao().deleteArticle(ArticleEntity(id = articleId)) + HistoryDatabase.instance.articleDao().deleteArticle(ArticleEntity(_id = articleId)) } } } @@ -170,6 +166,9 @@ object HistoryHelper { articleEntity.images = articleDetailEntity.images articleEntity.imagesInfo = articleDetailEntity.imagesInfo articleEntity.videos = articleDetailEntity.videos + articleEntity.tagActivityName = articleDetailEntity.tagActivityName + articleEntity.sections = articleDetailEntity.sections ?: emptyList() + articleEntity.type = "community_article" return articleEntity } diff --git a/app/src/main/java/com/gh/common/provider/DefaultUrlHandlerProviderImpl.kt b/app/src/main/java/com/gh/common/provider/DefaultUrlHandlerProviderImpl.kt index 25e419c031..acf980ad20 100644 --- a/app/src/main/java/com/gh/common/provider/DefaultUrlHandlerProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/DefaultUrlHandlerProviderImpl.kt @@ -13,9 +13,10 @@ class DefaultUrlHandlerProviderImpl : IDefaultUrlHandlerProvider { context: Context, url: String, entrance: String, - bringAppToFront: Boolean + bringAppToFront: Boolean, + sourceEntrance: String ): Boolean { - return DefaultUrlHandler.interceptUrl(context, url, null, entrance, bringAppToFront) + return DefaultUrlHandler.interceptUrl(context, url, null, entrance, bringAppToFront, sourceEntrance) } override fun init(context: Context?) { diff --git a/app/src/main/java/com/gh/common/provider/DirectProviderImpl.kt b/app/src/main/java/com/gh/common/provider/DirectProviderImpl.kt index f59ebf2a0d..790fc2190a 100644 --- a/app/src/main/java/com/gh/common/provider/DirectProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/DirectProviderImpl.kt @@ -83,13 +83,14 @@ class DirectProviderImpl : IDirectProvider { articleId: String?, communityId: String?, entrance: String?, - path: String? + path: String?, + sourceEntrance: String ) { - DirectUtils.directToCommunityArticle(context, articleId, communityId, entrance, path) + DirectUtils.directToCommunityArticle(context, articleId, communityId, entrance, path, sourceEntrance) } - override fun directToVideoDetail(context: Context, videoId: String, entrance: String?, path: String?) { - DirectUtils.directToVideoDetail(context, videoId, entrance, path) + override fun directToVideoDetail(context: Context, videoId: String, entrance: String?, path: String?, sourceEntrance: String) { + DirectUtils.directToVideoDetail(context, videoId, entrance, path, sourceEntrance) } override fun directToAmway(context: Context, fixedTopAmwayCommentId: String?, entrance: String?, path: String?) { 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 c77588eae5..bc9034bf30 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -112,8 +112,8 @@ import kotlin.math.roundToInt object DirectUtils { @JvmStatic - fun directToLinkPage(context: Context, linkEntity: LinkEntity, entrance: String, path: String) { - directToLinkPage(context, linkEntity, entrance, path, null) + fun directToLinkPage(context: Context, linkEntity: LinkEntity, entrance: String, path: String, sourceEntrance: String = "") { + directToLinkPage(context, linkEntity, entrance, path, null, sourceEntrance) } @JvmStatic @@ -122,9 +122,10 @@ object DirectUtils { linkEntity: LinkEntity, entrance: String, path: String, - exposureEvent: ExposureEvent? = null + exposureEvent: ExposureEvent? = null, + sourceEntrance: String = "" ) { - directToLinkPage(context, linkEntity, entrance, path, exposureEvent, null) + directToLinkPage(context, linkEntity, entrance, path, exposureEvent, null, sourceEntrance) } // 用于判断是否已经对接相关类型 @@ -169,6 +170,7 @@ object DirectUtils { path: String, exposureEvent: ExposureEvent? = null, unknownCallback: (() -> Unit)?, + sourceEntrance: String = "" ) { when (linkEntity.type) { "article", "news", "文章" -> { @@ -203,7 +205,7 @@ object DirectUtils { "question", "社区问题" -> directToQuestionDetail( context, linkEntity.link - ?: "", entrance, path + ?: "", entrance, path, sourceEntrance ) "answer", "社区回答" -> directToAnswerDetail(context, linkEntity.link ?: "", entrance, path) @@ -218,7 +220,8 @@ object DirectUtils { linkEntity.community!!, linkEntity.link!!, entrance, - path + path, + sourceEntrance, ) "community_column", "社区专题" -> directToCommunityColumn( @@ -310,7 +313,8 @@ object DirectUtils { videoId = linkEntity.link!!, fromLocation = VideoDetailContainerViewModel.Location.VIDEO_CHOICENESS.value, entrance = entrance, - path = path + path = path, + sourceEntrance = sourceEntrance ) "game_video" -> directToGameVideo(context, linkEntity.link ?: "", entrance, path) @@ -886,13 +890,14 @@ object DirectUtils { } @JvmStatic - fun directToQuestionDetail(context: Context, id: String, entrance: String? = null, path: String? = null) { + fun directToQuestionDetail(context: Context, id: String, entrance: String? = null, path: String? = null, sourceEntrance: String = "") { if (id.isEmpty()) return val bundle = Bundle() bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) bundle.putString(KEY_TO, NewQuestionDetailActivity::class.java.name) bundle.putString(KEY_PATH, path) bundle.putString(KEY_QUESTIONS_ID, id) + bundle.putString(KEY_SOURCE_ENTRANCE, sourceEntrance) jumpActivity(context, bundle) } @@ -1036,13 +1041,15 @@ object DirectUtils { articleId: String?, communityId: String?, entrance: String?, - path: String? + path: String?, + sourceEntrance: String = "" ) { val bundle = Bundle() bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) bundle.putString(KEY_PATH, path) bundle.putString(KEY_TO, ArticleDetailActivity::class.java.name) bundle.putString(KEY_COMMUNITY_ARTICLE_ID, articleId) + bundle.putString(KEY_SOURCE_ENTRANCE, sourceEntrance) bundle.putParcelable(KEY_COMMUNITY_DATA, CommunityEntity(id = communityId!!)) jumpActivity(context, bundle) } @@ -1053,7 +1060,8 @@ object DirectUtils { community: CommunityEntity?, articleId: String?, entrance: String?, - path: String? + path: String?, + sourceEntrance: String = "", ) { if (articleId.isNullOrEmpty()) return val bundle = Bundle() @@ -1061,6 +1069,7 @@ object DirectUtils { bundle.putString(KEY_PATH, path) bundle.putString(KEY_TO, ArticleDetailActivity::class.java.name) bundle.putString(KEY_COMMUNITY_ARTICLE_ID, articleId) + bundle.putString(KEY_SOURCE_ENTRANCE, sourceEntrance) bundle.putParcelable(KEY_COMMUNITY_DATA, community) jumpActivity(context, bundle) } @@ -1090,7 +1099,8 @@ object DirectUtils { fun directToVideoDetail( context: Context, videoId: String, entrance: String? = null, - path: String? = "" + path: String? = "", + sourceEntrance: String = "" ) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { val bundle = Bundle() @@ -1098,6 +1108,7 @@ object DirectUtils { bundle.putString(KEY_TO, ForumVideoDetailActivity::class.java.name) bundle.putString(KEY_VIDEO_ID, videoId); bundle.putString(KEY_PATH, path) + bundle.putString(KEY_SOURCE_ENTRANCE, sourceEntrance) jumpActivity(context, bundle) } else { DialogHelper.showVideoUnsupportedDialog(context) @@ -1123,7 +1134,8 @@ object DirectUtils { paginationType: String = "", fieldId: String = "", sectionName: String = "", - isHomeVideo: Boolean = false + isHomeVideo: Boolean = false, + sourceEntrance: String = "" ) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { val bundle = Bundle() @@ -1142,6 +1154,7 @@ object DirectUtils { bundle.putString(KEY_FIELD_ID, fieldId) bundle.putString(KEY_SECTION_NAME, sectionName) bundle.putBoolean(KEY_IS_HOME_VIDEO, isHomeVideo) + SensorsBridge.trackAccessVideoStreaming(sourceEntrance) jumpActivity(context, bundle) } else { DialogHelper.showVideoUnsupportedDialog(context) @@ -1157,9 +1170,10 @@ object DirectUtils { gameId: String = "", entrance: String? = null, path: String? = "", - referer: String = "" + referer: String = "", + sourceEntrance: String = "" ) { - directToVideoDetail(context, videoId, entrance, path) + directToVideoDetail(context, videoId, entrance, path, sourceEntrance) } /** diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt b/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt index 88f1d73d73..812e2a1263 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt @@ -624,9 +624,10 @@ object DownloadItemUtils { position: Int, adapter: RecyclerView.Adapter?, entrance: String, - location: String + location: String, + sourceEntrance: String = "其他" ) { - setOnClickListener(context, downloadBtn, gameEntity, position, adapter, entrance, location, null) + setOnClickListener(context, downloadBtn, gameEntity, position, adapter, entrance, sourceEntrance, location, null) } @JvmStatic @@ -637,10 +638,11 @@ object DownloadItemUtils { position: Int, adapter: RecyclerView.Adapter?, entrance: String, + sourceEntrance: String = "其他", location: String, - traceEvent: ExposureEvent? + traceEvent: ExposureEvent?, ) { - setOnClickListener(context, downloadBtn, gameEntity, position, adapter, entrance, location, traceEvent, null) + setOnClickListener(context, downloadBtn, gameEntity, position, adapter, entrance, sourceEntrance, location, traceEvent, null) } /** @@ -654,9 +656,10 @@ object DownloadItemUtils { position: Int, adapter: RecyclerView.Adapter?, entrance: String, + sourceEntrance: String = "其他", location: String, traceEvent: ExposureEvent?, - clickCallback: EmptyCallback? + clickCallback: EmptyCallback?, ) { setOnClickListener( context, @@ -665,6 +668,7 @@ object DownloadItemUtils { position, adapter, entrance, + sourceEntrance, location, traceEvent, clickCallback, @@ -684,6 +688,7 @@ object DownloadItemUtils { position: Int, adapter: RecyclerView.Adapter?, entrance: String, + sourceEntrance: String = "其他", location: String, traceEvent: ExposureEvent?, clickCallback: EmptyCallback?, @@ -780,14 +785,17 @@ object DownloadItemUtils { "game_id", gameEntity.id, "game_type", - gameEntity.categoryChinese + gameEntity.categoryChinese, + "source_entrance", + sourceEntrance ) allStateClickCallback?.onCallback() CheckLoginUtils.checkLogin(context, entrance) { clickCallback?.onCallback() ReservationHelper.reserve( context, - gameEntity + gameEntity, + sourceEntrance ) { LogUtils.logReservation(gameEntity, traceEvent) adapter?.notifyItemChanged(position) diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index 8456500e44..698a048db8 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -509,6 +509,7 @@ object DownloadObserver { "last_page_name", getLastPageEntity().pageName, "last_page_id", getLastPageEntity().pageId, "last_page_business_id", getLastPageEntity().pageBusinessId, + "download_status", downloadEntity.meta[Constants.DOWNLOAD_STATUS_IN_CHINESE] ?: "", "download_type", if (downloadEntity.asVGame()) "畅玩下载" else "本地下载", ) } diff --git a/app/src/main/java/com/gh/common/util/ErrorHelper.kt b/app/src/main/java/com/gh/common/util/ErrorHelper.kt index 3316e863d7..af2646436a 100644 --- a/app/src/main/java/com/gh/common/util/ErrorHelper.kt +++ b/app/src/main/java/com/gh/common/util/ErrorHelper.kt @@ -13,11 +13,14 @@ import com.gh.gamecenter.VerifyPhoneActivity import com.gh.gamecenter.WebActivity import com.gh.gamecenter.common.avoidcallback.AvoidOnResultManager import com.gh.gamecenter.common.avoidcallback.Callback +import com.gh.gamecenter.common.callback.CancelListener import com.gh.gamecenter.common.callback.ConfirmListener import com.gh.gamecenter.common.constant.Constants +import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.entity.ErrorEntity import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.utils.SensorsBridge +import com.gh.gamecenter.feature.entity.GameEntity import com.halo.assistant.fragment.user.UserInfoEditFragment import com.halo.assistant.fragment.user.VerifyPhoneFragment import com.lightgame.utils.AppManager @@ -39,8 +42,12 @@ object ErrorHelper { context: Context, errorString: String?, showHighPriorityHint: Boolean = false, + sourceEntrance: String = "", + articleType: String = "", + verificationType: String = "内容实名", + gameEntity: GameEntity? = null, realNameConfirmListener: ConfirmListener? = null, - customizedHandler: (code: Int) -> Boolean + customizedHandler: (code: Int) -> Boolean, ) { val errorEntity = errorString?.toObject() @@ -58,7 +65,17 @@ object ErrorHelper { return } - handleError(context, showHighPriorityHint, errorEntity, realNameConfirmListener) + handleError( + context, + showHighPriorityHint, + errorEntity, + "", + sourceEntrance, + articleType, + verificationType, + gameEntity, + realNameConfirmListener, + ) } /** @@ -70,8 +87,12 @@ object ErrorHelper { context: Context, errorString: String?, showHighPriorityHint: Boolean = false, - realNameConfirmListener: ConfirmListener? = null, - entrance: String = "" + entrance: String = "", + sourceEntrance: String = "", + articleType: String = "", + verificationType: String = "内容实名", + gameEntity: GameEntity? = null, + realNameConfirmListener: ConfirmListener? = null ) { val errorEntity = errorString?.toObject() @@ -85,7 +106,17 @@ object ErrorHelper { return } - handleError(context, showHighPriorityHint, errorEntity, realNameConfirmListener, entrance) + handleError( + context, + showHighPriorityHint, + errorEntity, + entrance, + sourceEntrance, + articleType, + verificationType, + gameEntity, + realNameConfirmListener + ) } /*** @@ -109,8 +140,12 @@ object ErrorHelper { context: Context, showHighPriorityHint: Boolean = false, errorEntity: ErrorEntity, + entrance: String = "", + sourceEntrance: String = "", + articleType: String = "", + verificationType: String = "内容实名", + gameEntity: GameEntity? = null, realNameConfirmListener: ConfirmListener? = null, - entrance: String = "" ) { when (errorEntity.code) { 403050, @@ -131,6 +166,7 @@ object ErrorHelper { 403057, 403068 -> handleErrorWithCommentBannedDialog(context, errorEntity) + 403200, 403201, 403202 -> handleErrorWithGameCollectionBannedDialog(context, errorEntity) @@ -177,9 +213,17 @@ object ErrorHelper { // 多设备登录同一帐号,不需要这里处理 } - 403209 -> handleRealNameError(context, errorEntity, realNameConfirmListener) + 403209 -> handleRealNameError( + context, + errorEntity, + sourceEntrance, + articleType, + verificationType, + gameEntity, + realNameConfirmListener, + ) - 403210 -> handleVerifyPhoneError(context, errorEntity, realNameConfirmListener, entrance) + 403210 -> handleVerifyPhoneError(context, errorEntity, entrance, articleType, realNameConfirmListener) // 禁言(发布内容) 403402 -> Utils.toast(context, "您的账号存在违规,不允许发布内容") @@ -207,8 +251,21 @@ object ErrorHelper { private fun handleRealNameError( context: Context, errorEntity: ErrorEntity, - realNameConfirmListener: ConfirmListener? + sourceEntrance: String = "", + articleType: String = "", + verificationType: String = "内容实名", + gameEntity: GameEntity? = null, + realNameConfirmListener: ConfirmListener?, ) { + + SensorsBridge.trackVerificationDialogShow( + gameId = gameEntity?.id ?: "", + gameName = gameEntity?.name ?: "", + gameType = gameEntity?.categoryChinese ?:"", + articleType = articleType, + verificationType = verificationType + ) + DialogHelper.showDialog( context, "实名提醒", @@ -243,23 +300,25 @@ object ErrorHelper { } }, confirmClickCallback = { + SensorsBridge.trackVerificationPopupClick("前往实名认证") val currentActivity = AppManager.getInstance().currentActivity() ?: return@showDialog + val intent = ShellActivity.getIntent(context, ShellActivity.Type.REAL_NAME_INFO) + .putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) AvoidOnResultManager.getInstance(currentActivity as AppCompatActivity) - .startForResult( - ShellActivity.getIntent( - context, - ShellActivity.Type.REAL_NAME_INFO, - ), object : Callback { - override fun onActivityResult(resultCode: Int, data: Intent?) { - if (resultCode == Activity.RESULT_OK && data != null) { - val isAuthSuccess = - data.getBooleanExtra(UserInfoEditFragment.AUTH_SUCCESS, false) - if (isAuthSuccess) { - realNameConfirmListener?.onConfirm() - } + .startForResult(intent, object : Callback { + override fun onActivityResult(resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK && data != null) { + val isAuthSuccess = + data.getBooleanExtra(UserInfoEditFragment.AUTH_SUCCESS, false) + if (isAuthSuccess) { + realNameConfirmListener?.onConfirm() } } - }) + } + }) + }, + cancelClickCallback = { + SensorsBridge.trackVerificationPopupClick("以后再说") } ) } @@ -267,9 +326,15 @@ object ErrorHelper { private fun handleVerifyPhoneError( context: Context, errorEntity: ErrorEntity, + entrance: String, + articleType: String, realNameConfirmListener: ConfirmListener?, - entrance: String ) { + + SensorsBridge.trackMobileNumberVerificationDialog( + articleType = articleType + ) + DialogHelper.showDialog( context, "手机号验证", @@ -319,10 +384,12 @@ object ErrorHelper { } } }) + SensorsBridge.trackMobileNumberVerificationPopupClick(buttonName = "前往手机号验证") NewFlatLogUtils.logPhoneNumberVerifyDialogClick(entrance, "前往手机号验证") NewFlatLogUtils.logPhoneNumberVerifyDialogShow("手机号验证弹窗-前往验证") }, cancelClickCallback = { + SensorsBridge.trackMobileNumberVerificationPopupClick(buttonName = "以后再说") NewFlatLogUtils.logPhoneNumberVerifyDialogClick(entrance, "以后再说") } ) diff --git a/app/src/main/java/com/gh/common/util/RealNameHelper.kt b/app/src/main/java/com/gh/common/util/RealNameHelper.kt index 94b11311ac..ceca3adebd 100644 --- a/app/src/main/java/com/gh/common/util/RealNameHelper.kt +++ b/app/src/main/java/com/gh/common/util/RealNameHelper.kt @@ -60,14 +60,12 @@ object RealNameHelper { downloadEntity?.let { NewLogUtils.logCertificationTrigger(downloadEntity.gameId, downloadEntity.name) - SensorsBridge.trackEvent( - "VerificationDialogShow", - "game_id", - downloadEntity.gameId, - "game_name", - downloadEntity.name ?: "", - "game_type", - downloadEntity.meta[Constants.GAME_CATEGORY_IN_CHINESE] ?: "" + SensorsBridge.trackVerificationDialogShow( + gameId = downloadEntity.gameId, + gameName = downloadEntity.name ?: "", + gameType = downloadEntity.meta[Constants.GAME_CATEGORY_IN_CHINESE] ?: "", + articleType = "", + verificationType = "游戏实名" ) } @@ -96,6 +94,7 @@ object RealNameHelper { currentActivity, ShellActivity.Type.REAL_NAME_INFO ).apply { + putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, "游戏实名") putExtra(EntranceConsts.KEY_IS_FORCED_TO_CERTIFICATE, true) putExtra(EntranceConsts.KEY_IS_FORCED_TO_CERTIFICATE_BUT_WITH_BACKDOOR, !isForced) } @@ -104,11 +103,11 @@ object RealNameHelper { pendingInstallPkgPath = downloadEntity.path } NewLogUtils.logCertificationHintDialogOptionsClicked("前往实名认证") - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", "前往实名认证") + SensorsBridge.trackVerificationPopupClick("前往实名认证") }, cancelClickCallback = { NewLogUtils.logCertificationHintDialogOptionsClicked("取消") - SensorsBridge.trackEvent("VerificationPopupClick", "button_name", "取消") + SensorsBridge.trackVerificationPopupClick("取消") if (!isForced) { DownloadManager.getInstance() .resumeAllInvisiblePendingTask() diff --git a/app/src/main/java/com/gh/common/util/ReservationHelper.kt b/app/src/main/java/com/gh/common/util/ReservationHelper.kt index c2b23f0fe9..dc837ac38c 100644 --- a/app/src/main/java/com/gh/common/util/ReservationHelper.kt +++ b/app/src/main/java/com/gh/common/util/ReservationHelper.kt @@ -69,7 +69,7 @@ object ReservationHelper { @JvmStatic @SuppressLint("CheckResult") - fun reserve(context: Context, game: GameEntity?, callback: EmptyCallback) { + fun reserve(context: Context, game: GameEntity?, sourceEntrance: String = "其他", callback: EmptyCallback) { val requestMap = hashMapOf() requestMap["game_id"] = game?.id ?: "" RetrofitManager.getInstance().api @@ -87,7 +87,9 @@ object ReservationHelper { "game_type", game?.categoryChinese ?: "", "result", - "成功" + "成功", + "source_entrance", + sourceEntrance ) ReservationRepository.addReservationToMemoryAndRefresh(game?.id ?: "") @@ -130,7 +132,9 @@ object ReservationHelper { "game_type", game?.categoryChinese ?: "", "result", - "失败" + "失败", + "source_entrance", + sourceEntrance ) ToastUtils.showToast(exception.message ?: "") } diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 4f66975ff9..1b9360c8b6 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -330,6 +330,7 @@ public class DownloadManager implements DownloadStatusListener { ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_CATEGORY_IN_CHINESE, gameEntity.getCategoryChinese()); ExtensionsKt.addMetaExtra(downloadEntity, Constants.AD_ICON_ACTIVE, String.valueOf(gameEntity.getAdIconActive())); ExtensionsKt.addMetaExtra(downloadEntity, Constants.IS_AD_DATA, String.valueOf(gameEntity.isAdData())); + ExtensionsKt.addMetaExtra(downloadEntity, Constants.DOWNLOAD_STATUS_IN_CHINESE, gameEntity.getDownloadStatusChinese()); ExtensionsKt.putGameCategory(downloadEntity, gameCategory != null ? gameCategory : ""); ExtensionsKt.addMetaExtra(downloadEntity, Constants.APK_SIZE, apkEntity.getSize()); if (gameEntity.getIconFloat() != null) { @@ -434,6 +435,7 @@ public class DownloadManager implements DownloadStatusListener { "last_page_name", GlobalActivityManager.getLastPageEntity().getPageName(), "last_page_id", GlobalActivityManager.getLastPageEntity().getPageId(), "last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId(), + "download_status", gameEntity.getDownloadStatusChinese(), "download_type", trackDownloadType ); diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 5c37c6a0b2..dfd97d8585 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -614,7 +614,7 @@ public class MainActivity extends BaseActivity { if (ad.getButton()) { View adBtn = findViewById(R.id.adBtn); adBtn.setOnClickListener(v -> { - DirectUtils.directToLinkPage(this, ad.getJump(), "(启动广告)", ""); + DirectUtils.directToLinkPage(this, ad.getJump(), "(启动广告)", "", "开屏文案"); LogUtils.logStartAd("click_watch_start_ads", ad); }); adBtn.setVisibility(View.VISIBLE); @@ -774,23 +774,20 @@ public class MainActivity extends BaseActivity { public void onFailure(@Nullable HttpException e) { super.onFailure(e); try { - ErrorHelper.handleErrorWithCustomizedHandler(MainActivity.this, e.response().errorBody().string(), false, null, new Function1() { - @Override - public Boolean invoke(Integer code) { - if (code == 404001) { - if (mShouldShowAd) { - AppExecutor.getUiExecutor().executeWithDelay(() -> { - toast("抱歉,暂未找到相关内容"); - }, 1000); - } else { + ErrorHelper.handleErrorWithCustomizedHandler(MainActivity.this, e.response().errorBody().string(), false, "", "", "内容实名", null, null, code -> { + if (code == 404001) { + if (mShouldShowAd) { + AppExecutor.getUiExecutor().executeWithDelay(() -> { toast("抱歉,暂未找到相关内容"); - } - LogUtils.uploadPackageSkip("external_jump", "进入游戏库", "", ""); - EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_GAME)); - return true; + }, 1000); + } else { + toast("抱歉,暂未找到相关内容"); } - return false; + LogUtils.uploadPackageSkip("external_jump", "进入游戏库", "", ""); + EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_GAME)); + return true; } + return false; }); } catch (IOException ex) { ex.printStackTrace(); diff --git a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt index ea29355ca1..9761905478 100644 --- a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt @@ -46,6 +46,8 @@ open class SearchActivity : BaseActivity() { private var mPublishSubject: PublishSubject? = null + private var mSourceEntrance: String = "" + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt(KEY_DISPLAY_TYPE, mDisplayType.value) @@ -68,6 +70,7 @@ open class SearchActivity : BaseActivity() { deleteIv = findViewById(R.id.deleteIv) backBtn = findViewById(R.id.backBtn) + mSourceEntrance = intent.getStringExtra(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "" val hint = intent.getStringExtra(EntranceConsts.KEY_HINT) val searchImmediately = intent.getBooleanExtra(KEY_SEARCH_IMMEDIATELY, false) var ignoreTextChanges = savedInstanceState != null @@ -183,7 +186,14 @@ open class SearchActivity : BaseActivity() { mSearchKey = key updateDisplayType(GAME_DIGEST) LogUtils.uploadSearchGame("searching", "搜索页", key, "自动搜索") - trackSearchButtonClick(key, TRACK_SEARCH_TYPE_INPUT) + + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key ?: "", + TRACK_SEARCH_TYPE_INPUT, + mSourceEntrance + ) } } @@ -194,7 +204,13 @@ open class SearchActivity : BaseActivity() { updateDisplayType(GAME_DETAIL) LogUtils.uploadSearchGame("searching", "搜索页", key, "默认搜索") - trackSearchButtonClick(key, TRACK_SEARCH_TYPE_DEFAULT) + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key ?: "", + TRACK_SEARCH_TYPE_DEFAULT, + mSourceEntrance + ) // MtaHelper.onEvent("游戏搜索", "默认搜索", key) } @@ -211,7 +227,14 @@ open class SearchActivity : BaseActivity() { searchEt.setSelection(searchEt.text.length) updateDisplayType(GAME_DETAIL) LogUtils.uploadSearchGame("searching", "搜索页", key, "历史搜索") - trackSearchButtonClick(key, TRACK_SEARCH_TYPE_HISTORY) + + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key ?: "", + TRACK_SEARCH_TYPE_HISTORY, + mSourceEntrance + ) // MtaHelper.onEvent("游戏搜索", "历史搜索", key) } @@ -226,7 +249,13 @@ open class SearchActivity : BaseActivity() { } else if (newSearchKey != mSearchKey || mDisplayType != GAME_DETAIL) { mSearchKey = newSearchKey if (!TextUtils.isEmpty(mSearchKey)) { - trackSearchButtonClick(newSearchKey, TRACK_SEARCH_TYPE_INPUT) + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + newSearchKey, + TRACK_SEARCH_TYPE_INPUT, + mSourceEntrance + ) mDao?.add(mSearchKey) updateDisplayType(GAME_DETAIL) @@ -326,37 +355,6 @@ open class SearchActivity : BaseActivity() { else -> TRACK_SEARCH_TYPE_DEFAULT } - @JvmStatic - fun trackSearchResultClick(key: String, type: String) { - SensorsBridge.trackSearchResultClick( - GlobalActivityManager.getCurrentPageEntity().pageId, - GlobalActivityManager.getCurrentPageEntity().pageName, - key, - toTrackSearchType(type) - ) - } - - @JvmStatic - fun trackSearchButtonClick(key: String?, type: String) { - SensorsBridge.trackSearchButtonClick( - GlobalActivityManager.getCurrentPageEntity().pageId, - GlobalActivityManager.getCurrentPageEntity().pageName, - key ?: "", - type - ) - } - - @JvmStatic - fun trackSearchResultReturn(key: String?, type: String, hasResult: Boolean) { - SensorsBridge.trackSearchResultReturn( - GlobalActivityManager.getCurrentPageEntity().pageId, - GlobalActivityManager.getCurrentPageEntity().pageName, - key ?: "", - toTrackSearchType(type), - hasResult - ) - } - @JvmStatic fun getIntent( context: Context, diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index cb4c66ce7f..e0b473257b 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -165,7 +165,7 @@ public class SkipActivity extends BaseActivity { DirectUtils.directToAnswerDetail(this, path, ENTRANCE_BROWSER, "浏览器"); break; case HOST_QUESTION: - DirectUtils.directToQuestionDetail(this, path, ENTRANCE_BROWSER, "浏览器"); + DirectUtils.directToQuestionDetail(this, path, ENTRANCE_BROWSER, "浏览器", ""); break; case HOST_TOOLBOX: DirectUtils.directToToolbox(this, uri.getQueryParameter("gameId"), uri.getQueryParameter("toolboxUrl"), ENTRANCE_BROWSER); @@ -185,7 +185,7 @@ public class SkipActivity extends BaseActivity { break; // 社区文章格式一 case "community.article": - DirectUtils.directToCommunityArticle(this, uri.getQueryParameter("articleId"), uri.getQueryParameter("communityId"), ENTRANCE_BROWSER, "浏览器"); + DirectUtils.directToCommunityArticle(this, uri.getQueryParameter("articleId"), uri.getQueryParameter("communityId"), ENTRANCE_BROWSER, "浏览器", ""); break; // 社区文章格式二 case "communities": @@ -206,13 +206,13 @@ public class SkipActivity extends BaseActivity { } } if ("articles".equals(type)) { - DirectUtils.directToCommunityArticle(this, typeId, communityId, ENTRANCE_BROWSER, "浏览器"); + DirectUtils.directToCommunityArticle(this, typeId, communityId, ENTRANCE_BROWSER, "浏览器", ""); break; } break; case HOST_VIDEO: DirectUtils.directToVideoDetail(this, path, VideoDetailContainerViewModel.Location.HOTTEST_GAME_VIDEO.getValue(), - false, id, ENTRANCE_BROWSER, "浏览器", TextUtils.isEmpty(referer) ? "" : referer); + false, id, ENTRANCE_BROWSER, "浏览器", TextUtils.isEmpty(referer) ? "" : referer, ""); break; case HOST_UPLOAD_VIDEO://跳转上传视频 String titleParameter = uri.getQueryParameter("title"); @@ -232,7 +232,7 @@ public class SkipActivity extends BaseActivity { break; case HOST_VIDEO_SINGLE: DirectUtils.directToVideoDetail(this, path, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.getValue(), - false, "", ENTRANCE_BROWSER, "浏览器", TextUtils.isEmpty(referer) ? "" : referer); + false, "", ENTRANCE_BROWSER, "浏览器", TextUtils.isEmpty(referer) ? "" : referer, ""); break; case HOST_VIDEO_MORE: gameId = uri.getQueryParameter("gameId"); @@ -251,7 +251,7 @@ public class SkipActivity extends BaseActivity { DirectUtils.directToLegacyVideoDetail(this, path, location, false, TextUtils.isEmpty(gameId) ? "" : gameId, ENTRANCE_BROWSER, "浏览器", TextUtils.isEmpty(referer) ? "" : referer, TextUtils.isEmpty(type) ? "" : type, TextUtils.isEmpty(act) ? "" : act, TextUtils.isEmpty(paginationType) ? "page" : paginationType, TextUtils.isEmpty(fieldId) ? "" : fieldId, - TextUtils.isEmpty(sectionName) ? "" : sectionName, false); + TextUtils.isEmpty(sectionName) ? "" : sectionName, false, ""); break; case HOST_VIDEO_STREAMING_HOME: // 把切换放到 MainActivity 处理 @@ -299,7 +299,7 @@ public class SkipActivity extends BaseActivity { EntranceUtils.jumpActivityCompat(this, bundle); break; case EntranceConsts.HOST_VIDEO_DETAIL: - DirectUtils.directToVideoDetail(this, path, ENTRANCE_BROWSER, ""); + DirectUtils.directToVideoDetail(this, path, ENTRANCE_BROWSER, "", ""); break; case HOST_LIBAO: DirectUtils.directToGiftDetail(this, path, ENTRANCE_BROWSER); @@ -366,7 +366,7 @@ public class SkipActivity extends BaseActivity { byte[] linkData = Base64.decode(dataString, Base64.DEFAULT); String linkDataString = new String(linkData, "UTF-8"); LinkEntity le = GsonUtils.INSTANCE.getGson().fromJson(linkDataString, LinkEntity.class); - DirectUtils.directToLinkPage(this, le, ENTRANCE_BROWSER, ""); + DirectUtils.directToLinkPage(this, le, ENTRANCE_BROWSER, "", ""); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index 0a27bad1dc..f8b547997e 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -273,6 +273,17 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { com.gh.gamecenter.common.utils.NewLogUtils.logShareResult(ShareUtils.additionalParams, true); + SensorsBridge.trackArticleShareResult( + ShareUtils.additionalParams.getCustomerType(), + ShareUtils.additionalParams.getContentId(), + ShareUtils.additionalParams.getBbsId(), + ShareUtils.additionalParams.getBbsType(), + ShareUtils.additionalParams.getActivityTagName(), + ShareUtils.additionalParams.getGameForumType(), + ShareUtils.additionalParams.getContentType(), + "新浪微博", + "分享成功" + ); } else if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.gameCollection) { com.gh.gamecenter.common.utils.NewLogUtils.logViewOrClickGameCollectionDetail( "click_game_collect_detail_favorite_success", @@ -307,6 +318,23 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { com.gh.gamecenter.common.utils.NewLogUtils.logShareResult(ShareUtils.additionalParams, false); } + + if(ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video + || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShareResult( + ShareUtils.additionalParams.getCustomerType(), + ShareUtils.additionalParams.getContentId(), + ShareUtils.additionalParams.getBbsId(), + ShareUtils.additionalParams.getBbsType(), + ShareUtils.additionalParams.getActivityTagName(), + ShareUtils.additionalParams.getGameForumType(), + ShareUtils.additionalParams.getContentType(), + "新浪微博", + "分享失败" + ); + } } else { IntegralLogHelper.INSTANCE.logInviteResult("失败", "微博"); } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java index c5e353da8b..6d11716d53 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java @@ -141,7 +141,7 @@ public class ImagePagerAdapter extends RecyclingPagerAdapter { PageSwitchDataHelper.pushCurrentPageData(map); DirectUtils.INSTANCE.directToLinkPage(mContext, slideEntity, entrance, "轮播图[" + slideEntity - .getText() + "=" + slideEntity.getType() + "=" + indexName + "]", finalExposureEvent); + .getText() + "=" + slideEntity.getType() + "=" + indexName + "]", finalExposureEvent, ""); JSONObject trackEvent = new JSONObject(); try { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt index 8d058c0748..c01d91ccdb 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt @@ -401,7 +401,10 @@ class DetailViewHolder( mGameEntity.name!!, "game_id", mGameEntity.id, - "game_type" + "game_type", + mGameEntity.categoryChinese, + "source_entrance", + "其他" ) CheckLoginUtils.checkLogin(mViewHolder.context, mEntrance) { ReservationHelper.reserve(mViewHolder.context, mGameEntity) { diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt index 7861080fd9..71deadefa9 100644 --- a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt @@ -141,8 +141,8 @@ class NewCatalogListAdapter( "])" ) ), - StringUtils.buildString(selectedCatalogName, ":", gameEntity.name), - event + location = StringUtils.buildString(selectedCatalogName, ":", gameEntity.name), + traceEvent = event ) DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), "star&brief") diff --git a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt index a396373f03..39f8e429c9 100644 --- a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt @@ -139,8 +139,8 @@ class NewCategoryListAdapter( "])" ) ), - StringUtils.buildString(selectedCategoryName, ":", gameEntity.name), - event + location = StringUtils.buildString(selectedCategoryName, ":", gameEntity.name), + traceEvent = event ) DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding)) diff --git a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt index 55efa09bbc..5def4b0595 100644 --- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt @@ -168,8 +168,8 @@ class CategoryV2ListAdapter( "])" ) ), - StringUtils.buildString(selectedSubCatalogName, ":", gameEntity.name), - event + location = StringUtils.buildString(selectedSubCatalogName, ":", gameEntity.name), + traceEvent = event, ) { val trackEvent = JSONObject() try { diff --git a/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java b/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java index e8919b6bec..476af1e3f7 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/collection/AnswerAdapter.java @@ -160,7 +160,7 @@ public class AnswerAdapter extends ListAdapter implements ISyncAda viewHolder.getBinding().title.setOnClickListener(v -> { if (mCurrentOption == ManageOption.OPTION_MANAGER) { Questions questions = entity.getQuestions(); - mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path)); + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path, "")); } }); break; diff --git a/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt b/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt index 3469201ab0..6ae91ff9ee 100644 --- a/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/discovery/DiscoveryAdapter.kt @@ -162,8 +162,8 @@ class DiscoveryAdapter( position, this, StringUtils.buildString("(${mEntrance}", "-列表[", (position).toString(), "])"), - StringUtils.buildString(mEntrance, ":", gameEntity.name), - event + location = StringUtils.buildString(mEntrance, ":", gameEntity.name), + traceEvent = event ) } is RecommendInterestViewHolder -> { diff --git a/app/src/main/java/com/gh/gamecenter/download/AdGameBannerAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/AdGameBannerAdapter.kt index d6c2fcb1be..7d8518cfeb 100644 --- a/app/src/main/java/com/gh/gamecenter/download/AdGameBannerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/AdGameBannerAdapter.kt @@ -61,8 +61,8 @@ class AdGameBannerAdapter( position, this, mEntrance, - "banner广告", - exposureEvent, + location = "banner广告", + traceEvent = exposureEvent, clickCallback = { NewFlatLogUtils.logClickGameAd( mAdConfig.id, diff --git a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt index 8b732fd46f..558ab1c3b7 100644 --- a/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/NewInstalledGameFragmentAdapter.kt @@ -97,8 +97,9 @@ class NewInstalledGameFragmentAdapter(context: Context, private var mViewModel: gameEntity, 1, this@NewInstalledGameFragmentAdapter, - "(我的光环-已安装)", "我的光环-已安装" + ":" + gameEntity.name, - gameEntity.exposureEvent + "(我的光环-已安装)", + location = "我的光环-已安装" + ":" + gameEntity.name, + traceEvent = gameEntity.exposureEvent ) binding.downloadBtn.putWidgetBusinessName("下载管理") DownloadItemUtils.updateItem(binding.root.context, gameEntity, GameViewHolder(binding)) diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index 3e70a964dd..1e994521b5 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -698,6 +698,7 @@ class UpdatableGameViewModel( "last_page_name", getLastPageEntity().pageName, "last_page_id", getLastPageEntity().pageId, "last_page_business_id", getLastPageEntity().pageBusinessId, + "download_status", update.downloadStatusChinese, "download_type", "本地下载", ) } diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt index 86467c9e58..d073e610ea 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt @@ -30,6 +30,11 @@ class ForumDetailEntity( var backgroundLayerColor: String = "" // 背景图色值 ) { + val typeChinese: String get() = when (type) { + "game_bbs" -> "游戏论坛" + else -> "综合论坛" + } + class TopLinkEntity( var category: CategoryEntity? = null ) : LinkEntity() diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt index cb473014ae..662106d8c9 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt @@ -27,6 +27,12 @@ data class ForumEntity( @Ignore var hot: Int = 0 // 热度值 ) { + + val typeChinese: String get() = when (type) { + "game_bbs" -> "游戏论坛" + else -> "综合论坛" + } + fun transformUnreadEntity(): ForumUnreadEntity { val forumUnreadEntity = ForumUnreadEntity() forumUnreadEntity.id = id diff --git a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt index 6ed1cdca44..51839b56ba 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.entity import android.os.Parcel import android.os.Parcelable +import androidx.room.Ignore import com.gh.gamecenter.common.annotation.SyncPage import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.entity.CommunityEntity @@ -19,35 +20,148 @@ import kotlinx.parcelize.Parcelize @Parcelize data class PersonalHistoryEntity( @SerializedName("_id") - val id: String = "", - val type: String = "", + private var _id: String = "", + @SerializedName("type") + private var _type: String = "", var question: Question = Question(), - var brief: String = "", + @SerializedName("brief") + private var _brief: String = "", var des: String = "", var url: String = "", - var status: String? = "", + @SerializedName("status") + private var _status: String? = "", @SerializedName("video_info") var videoInfo: VideoInfo = VideoInfo(), var poster: String = "", var length: Long = 0, - var count: Count = Count(), + @SerializedName("count") + private var _count: Count = Count(), val time: Long = 0, - var title: String = "", + @SerializedName("title") + private var _title: String = "", var description: String = "", - val community: CommunityEntity = CommunityEntity(), + @SerializedName("community") + private var _community: CommunityEntity = CommunityEntity(), var videos: List = ArrayList(), - var user: PersonalEntity? = null, + @SerializedName("user") + private var _user: UserEntity? = null, @SerializedName("fold_users") var foldUsers: List? = null, - val images: List = ArrayList(), + @SerializedName("images") + private var _images: List = ArrayList(), @SerializedName("images_info") var imagesInfo: List = ArrayList(), - val me: MeEntity = MeEntity(), + @SerializedName("me") + private var _me: MeEntity = MeEntity(), var comment: Comment = Comment(), - var commentable: Boolean = true, + private var _commentable: Boolean = true, @SerializedName("is_edit") - var isEdit: Boolean = false -) : Parcelable { + var isEdit: Boolean = false, + @SerializedName("active") + private var _active: Boolean? = true, + private var _tagActivityName: String = "", + @SerializedName("sections") + @Ignore + private var _sections: List = ArrayList(), +) : Parcelable, CommunityItemData { + + override var id: String + get() = _id + set(value) { + _id = value + } + + override var type: String + get() = _type + set(value) { + _type = value + } + + override var active: Boolean + get() = true + set(_) {} + + override var commentable: Boolean + get() = _commentable + set(value) { + _commentable = value + } + + override var me: MeEntity + get() = _me + set(value) { + _me = value + } + + override var count: com.gh.gamecenter.feature.entity.Count + get() = _count.transformForumCount(type) + set(value) { + _count = Count( + comment = value.comment, + vote = value.vote, + reply = value.reply, + ) + } + + override var community: CommunityEntity + get() = _community + set(value) { + _community = value + } + + override var title: String + get() = _title + set(value) { + _title = value + } + + override var brief: String + get() = _brief + set(value) { + _brief = value + } + + override var images: List + get() = _images + set(value) { + _images = value + } + + override var user: UserEntity + get() = _user ?: UserEntity() + set(value) { + _user = value + } + + override var status: String + get() = _status ?: "" + set(value) { + _status = value + } + + override var questions: Questions + get() = Questions() + set(value) {} + + override var tagActivityName: String + get() = _tagActivityName + set(value) { + _tagActivityName = value + } + + override var sections: List + get() = _sections + set(value) { + _sections = value + } + + override var communityId: String? + get() = community.id + set(_) {} + + override var communityName: String? + get() = community.name + set(_) {} fun getPassVideos(): List { val passVideos = arrayListOf() @@ -167,7 +281,7 @@ data class PersonalHistoryEntity( answer.images = images answer.videos = videos answer.time = time - answer.count = count.transformForumCount(type) + answer.count = count answer.me = me answer.commentable = commentable answer.articleCommunityId = community.id diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt index d106a0995c..9a580aff68 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt @@ -85,8 +85,8 @@ class ForumArticleAskListAdapter( val answer = mEntityList[position] if (answer.type != "answer") { val questions = Questions() - questions.id = answer.id ?: "" - questions.title = answer.articleTitle + questions.id = answer.id + questions.title = answer.title questions.description = answer.description questions.answerCount = answer.count.answer answer.questions = questions @@ -131,7 +131,7 @@ class ForumArticleAskListAdapter( MtaHelper.onEvent( holder.getEventId(entrance), holder.getKey(entrance), - "${answer.articleTitle}(${answer.id})" + "${answer.title}(${answer.id})" ) mContext.startActivity( ArticleDetailActivity.getIntent( @@ -139,7 +139,8 @@ class ForumArticleAskListAdapter( CommunityEntity(bbsId), answer.id!!, entrance, - path + path, + sourceEntrance = "论坛详情-信息流", ) ) } @@ -157,9 +158,9 @@ class ForumArticleAskListAdapter( MtaHelper.onEvent( holder.getEventId(entrance), holder.getKey(entrance), - "${answer.articleTitle}(${answer.id})" + "${answer.title}(${answer.id})" ) - mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?: "", bbsId)) + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?: "", bbsId, "论坛详情-信息流")) } "question" -> { NewLogUtils.logForumDetailFeedContentClick( @@ -175,12 +176,11 @@ class ForumArticleAskListAdapter( MtaHelper.onEvent( holder.getEventId(entrance), holder.getKey(entrance), - "${answer.articleTitle}(${answer.id})" + "${answer.title}(${answer.id})" ) mContext.startActivity( NewQuestionDetailActivity.getIntent( - mContext, answer.id - ?: "", entrance, path + mContext, answer.id, entrance, path, sourceEntrance = "论坛详情-信息流" ) ) } @@ -198,12 +198,11 @@ class ForumArticleAskListAdapter( MtaHelper.onEvent( holder.getEventId(entrance), holder.getKey(entrance), - "${answer.articleTitle}(${answer.id})" + "${answer.title}(${answer.id})" ) mContext.startActivity( NewQuestionDetailActivity.getCommentIntent( - mContext, answer.questions.id, answer.id - ?: "", entrance, path + mContext, answer.questions.id, answer.id, entrance, path ) ) } diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt index 665e509ea3..6180a3b92b 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt @@ -37,6 +37,10 @@ import com.facebook.drawee.drawable.ScalingUtils import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder import com.facebook.drawee.generic.RoundingParams import com.facebook.drawee.view.SimpleDraweeView +import com.gh.common.browse.BrowseTimer +import com.gh.common.browse.ValueBrowseTimer +import com.gh.common.browse.asObserver +import com.gh.common.browse.withLifecycle import com.gh.common.util.LogUtils import com.gh.common.util.NewFlatLogUtils import com.gh.common.util.NewLogUtils @@ -87,6 +91,7 @@ import com.halo.assistant.fragment.WebFragment import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import com.gh.gamecenter.common.mvvm.Resource import kotlin.math.abs class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { @@ -118,6 +123,26 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { private var mAskIndex = INDEX_ASK private var mVideoIndex = INDEX_VIDEO + private val browseTimer = ValueBrowseTimer>() + .withLifecycle(this) + .withStart { + SensorsBridge.trackViewForum( + bbsId = mBbsId, + bbsType = mBbsType, + forumName = it?.data?.name ?: "", + gameForumType = it?.data?.game?.categoryChinese ?: "" + ) + } + .withResult { r, t -> + SensorsBridge.trackForumBrowsingDuration( + bbsId = mBbsId, + bbsType = mBbsType, + forumName = r?.data?.name ?: "", + gameForumType = r?.data?.game?.categoryChinese ?: "", + stayLength = t / 1000.0 + ) + } + override fun initFragmentList(fragments: MutableList) { mAllForumArticleAskListFragment = ForumArticleAskListFragment().with( bundleOf( @@ -216,17 +241,6 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { userId, entrance = if (mEntrance.contains("游戏详情")) "游戏详情页" else "论坛tab页" ) - mBaseHandler.postDelayed({ - SensorsBridge.trackEvent( - "ViewForum", - "bbs_id", - mBbsId, - "forum_name", - mForumDetail?.name ?: "", - "bbs_type", - mBbsType - ) - }, 3000) initUI() } } else { @@ -286,6 +300,8 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { insertDataToAllTab(it) } + mViewModel?.forumDetail?.observe(viewLifecycleOwner, browseTimer.asObserver()) + ViewCompat.setOnApplyWindowInsetsListener(mBinding.forumAppbar) { _, insets -> (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop insets.consumeSystemWindowInsets() @@ -590,6 +606,7 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { requireContext(), topLink, mViewModel?.bbsId ?: "", + mForumDetail?.name ?: "", mForumDetail?.type ?: "" ) } @@ -845,14 +862,12 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { } mBinding.followTv.setOnClickListener { debounceActionWithInterval(R.id.followTv) { - SensorsBridge.trackEvent( - "FollowForumClick", - "bbs_id", - mBbsId, - "forum_name", - mForumDetail?.name ?: "", - "bbs_type", - mBbsType + SensorsBridge.trackFollowForumClick( + bbsId = mBbsId, + forumName = mForumDetail?.name ?: "", + bbsType = mForumDetail?.typeChinese ?: "", + buttonName = mBinding.followTv.text.toString(), + gameForumType = mForumDetail?.game?.categoryChinese?:"" ) ifLogin(mEntrance) { val forumEntity = ForumEntity( @@ -1065,7 +1080,8 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { mForumDetail?.name ?: "", icon = mForumDetail?.game?.getIcon(), - iconSubscript = mForumDetail?.game?.iconSubscript + iconSubscript = mForumDetail?.game?.iconSubscript, + game = mForumDetail?.game?.toCommunityGameEntity() ), mForumDetail?.type ?: "", "论坛详情页" diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailViewModel.kt index ef9cb207d5..8d5ea7da7a 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailViewModel.kt @@ -173,7 +173,7 @@ class ForumDetailViewModel(application: Application, val bbsId: String) : Androi val answerEntity = AnswerEntity() answerEntity.id = articleDetailEntity.id - answerEntity.articleTitle = articleDetailEntity.title + answerEntity.title = articleDetailEntity.title answerEntity.brief = articleDetailEntity.content.removeVideoContent().clearHtmlFormatCompletely() answerEntity.count = articleDetailEntity.count articleDetailEntity.community.id = articleDetailEntity.communityId @@ -194,7 +194,7 @@ class ForumDetailViewModel(application: Application, val bbsId: String) : Androi val answerEntity = AnswerEntity() answerEntity.id = questionDetailEntity.id ?: "" - answerEntity.articleTitle = questionDetailEntity.title + answerEntity.title = questionDetailEntity.title ?: "" answerEntity.brief = questionDetailEntity.description?.removeVideoContent()?.clearHtmlFormatCompletely() ?: "" answerEntity.description = questionDetailEntity.description?.removeVideoContent()?.clearHtmlFormatCompletely() ?: "" @@ -215,7 +215,7 @@ class ForumDetailViewModel(application: Application, val bbsId: String) : Androi val answerEntity = AnswerEntity() answerEntity.id = forumVideoEntity.id - answerEntity.articleTitle = forumVideoEntity.title + answerEntity.title = forumVideoEntity.title answerEntity.des = forumVideoEntity.des answerEntity.url = forumVideoEntity.url answerEntity.status = forumVideoEntity.status diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumTopLinkAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumTopLinkAdapter.kt index b6524c4dc1..92fe53739a 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumTopLinkAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumTopLinkAdapter.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.* +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.hexStringToIntColor import com.gh.gamecenter.common.utils.toBinding import com.gh.gamecenter.common.view.DrawableView @@ -19,6 +20,7 @@ class ForumTopLinkAdapter( context: Context, val links: ArrayList, val bbsId: String, + val bbsName: String, val bbsType: String ) : BaseRecyclerAdapter(context) { @@ -52,7 +54,7 @@ class ForumTopLinkAdapter( root.setOnClickListener { MtaHelper.onEvent("论坛详情", "论坛置顶", linkEntity.text) - DirectUtils.directToLinkPage(mContext, linkEntity, "论坛详情页置顶栏", "") + DirectUtils.directToLinkPage(mContext, linkEntity, "论坛详情页置顶栏", "", "论坛详情-置顶公告栏") val bbsType = if (bbsType == "game_bbs") "游戏论坛" else "综合论坛" NewLogUtils.logForumDetailEnterOrClick("click_top_content", bbsId, bbsType) NewLogUtils.logForumLinkTopClick(bbsId, bbsType) @@ -62,6 +64,12 @@ class ForumTopLinkAdapter( position, bbsId ) + SensorsBridge.trackForumDetailsAnnouncementBoardClick( + toppingType = linkEntity.type ?: "", + title = linkEntity.title ?: "", + forumName = bbsName, + forumType = bbsType + ) } if (position == 0) { val params = root.layoutParams as RecyclerView.LayoutParams diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt index 5fdecb5fb2..eb674d49fe 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt @@ -12,9 +12,11 @@ import android.widget.TextView import androidx.core.content.ContextCompat import com.facebook.drawee.view.SimpleDraweeView import com.gh.gamecenter.R +import com.gh.gamecenter.common.entity.AdditionalParamsEntity import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.MD5Utils import com.gh.gamecenter.feature.entity.ForumVideoEntity +import com.gh.gamecenter.login.user.UserManager import com.gh.gamecenter.video.detail.CustomManager import com.lightgame.utils.Utils import com.shuyu.gsyvideoplayer.utils.CommonUtil @@ -43,6 +45,10 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At var pendingView: TextView = findViewById(R.id.pendingView) var titleTv: TextView = findViewById(R.id.title) + private var mMaxPlayedProgress: Int = 0 + private var mStartTrackRunnable: Runnable? = null + private var mStopTrackRunnable: Runnable? = null + override fun getLayoutId(): Int { return R.layout.layout_article_item_video } @@ -216,6 +222,8 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } fun updateVideoData(video: ForumVideoEntity) { + this.mStopTrackRunnable = null + mVideoEntity = video titleTv.text = if (mIfCurrentIsFullscreen) video.title else "" } @@ -243,7 +251,77 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At // we do not need double click to play or pause } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + super.onProgressChanged(seekBar, progress, fromUser) + // 记录播放进度的最大值,用于埋点上报 + if (mMaxPlayedProgress < progress) { + mMaxPlayedProgress = progress + } + } + override fun setStateAndUi(state: Int) { + if (state != currentState + && state == CURRENT_STATE_PLAYING + && currentState != CURRENT_STATE_PLAYING_BUFFERING_START) {// 上报开始视频播放埋点 + // 视频停止播放后再恢复播放的间隔时间未超过3秒,则取消上报结束视频播放埋点 + mStopTrackRunnable?.let { runnable -> + handler.removeCallbacks(runnable) + } + + mVideoEntity?.let { + val startTrackRunnable = Runnable { + SensorsBridge.trackVideoStartPlaying( + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "综合论坛", + customerType = it.user.auth?.text ?: "", + videoId = it.id, + playType = "视频贴", + gameForumType = it.bbs?.game?.categoryChinese ?: "", + activityTag = it.tagActivityName, + articleType = it.typeChinese + ) + mStartTrackRunnable = null + }.also { + mStartTrackRunnable = it + } + // 埋点要求视频播放3秒后再上报埋点 + handler.postDelayed(startTrackRunnable, 3000) + } + } else if (currentState != state + && (state == CURRENT_STATE_AUTO_COMPLETE + || state == CURRENT_STATE_ERROR + || state == CURRENT_STATE_PAUSE + || (currentState == CURRENT_STATE_PLAYING && state == CURRENT_STATE_NORMAL)) + ) {// 上报结束视频播放埋点 + // 从开始播放视频到停止播放视频的间隔时间没有超过3秒,则取消上报开始视频播放埋点 + this.mStartTrackRunnable?.let { + handler.removeCallbacks(it) + mStartTrackRunnable = null + } ?: let { + mVideoEntity?.let { + val stopTrackRunnable = Runnable { + SensorsBridge.trackVideoEndPlaying( + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "综合论坛", + customerType = it.user.auth?.text ?: "", + videoId = it.id, + playType = "视频贴", + gameForumType = it.bbs?.game?.categoryChinese ?: "", + activityTag = it.tagActivityName, + articleType = it.typeChinese, + result = if (mMaxPlayedProgress >= 95) "是" else "否" + ) + }.also { + this.mStopTrackRunnable = it + } + // 埋点要求停止视频播放3秒后再上报埋点 + handler.postDelayed(stopTrackRunnable, 3000) + } + } + } + super.setStateAndUi(state) if (currentState == GSYVideoView.CURRENT_STATE_PREPAREING) { setViewShowState(durationTv, View.GONE) @@ -333,13 +411,23 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } else { "https://resource.ghzs.com/page/video_play/video/video.html?video=${it.id}" } + val additionalParams = AdditionalParamsEntity().apply { + contentType = "视频帖" + contentId = mVideoEntity?.id ?: "" + bbsId = mVideoEntity?.bbs?.id ?: "" + bbsType = mVideoEntity?.bbs?.typeChinese ?: "综合论坛" + customerType = mVideoEntity?.user?.auth?.text ?: "" + activityTagName = mVideoEntity?.tagActivityName ?: "" + gameForumType = mVideoEntity?.bbs?.game?.categoryChinese ?: "" + refUserId = UserManager.getInstance().userId + } ShareUtils.getInstance(context).showShareWindowsCallback(context as Activity, this, shareUrl, shareIcon, it.title, it.des, - ShareUtils.ShareEntrance.video, it.id, object : ShareUtils.ShareCallBack { + ShareUtils.ShareEntrance.video, it.id, additionalParams, object : ShareUtils.ShareCallBack { override fun onSuccess(label: String) { // if ("短信" == label || "复制链接" == label) viewModel?.shareVideoStatistics(it) } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt index 72e5120ae8..e6f6b92a7e 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt @@ -16,8 +16,10 @@ import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.viewpager.widget.ViewPager -import com.gh.common.util.DirectUtils +import com.gh.common.browse.BrowseTimer +import com.gh.common.browse.withLifecycle import com.gh.common.util.NewFlatLogUtils +import com.gh.common.util.DirectUtils import com.gh.common.util.NewLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.common.base.TrackableDialog @@ -70,6 +72,12 @@ class CommunityHomeFragment : LazyFragment() { private var mNavigationBitmap: Bitmap? = null private var mShowVideo = false + private val browseTimer = BrowseTimer() + .withLifecycle(this) + .withResult { + SensorsBridge.trackCommunityBrowsingDuration(it / 1000.0) + } + override fun getRealLayoutId(): Int { return R.layout.fragment_community_home } @@ -135,13 +143,7 @@ class CommunityHomeFragment : LazyFragment() { topBg.visibleIf(!mIsDarkModeOn) videoLottie.setOnClickListener { - DirectUtils.directToLegacyVideoDetail( - requireContext(), - "", - VideoDetailContainerViewModel.Location.VIDEO_ACTIVITY.value, - referer = "视频流-社区右上角", - isHomeVideo = true - ) + DirectUtils.directToLegacyVideoDetail(requireContext(), "", VideoDetailContainerViewModel.Location.VIDEO_ACTIVITY.value, referer = "视频流-社区右上角", isHomeVideo = true) } listOf(searchContainer, searchIconIv).forEach { it.setOnClickListener { @@ -189,6 +191,15 @@ class CommunityHomeFragment : LazyFragment() { savedInstanceState?.let { mDefaultSelectedTab = it.getInt(LAST_SELECTED_POSITION) } } + override fun setUserVisibleHint(isVisibleToUser: Boolean) { + super.setUserVisibleHint(isVisibleToUser) + if (isVisibleToUser) { + browseTimer.start() + } else { + browseTimer.stop() + } + } + override fun onSaveInstanceState(outState: Bundle) { mBinding?.viewPager?.let { outState.putInt(LAST_SELECTED_POSITION, it.currentItem) } super.onSaveInstanceState(outState) @@ -248,7 +259,7 @@ class CommunityHomeFragment : LazyFragment() { topBg.translationY = 0F changeNavigationBg() NewLogUtils.logCommunityHomeEvent("click_for_you_tab") - SensorsBridge.trackEvent("CommunityTopTabSelected", "tab_type", "推荐") + SensorsBridge.trackCommunityTopTabSelected("推荐") } TAB_FORUM_INDEX -> { @@ -258,7 +269,7 @@ class CommunityHomeFragment : LazyFragment() { changeNavigationBg(this) } NewLogUtils.logCommunityHomeEvent("click_forum_tab") - SensorsBridge.trackEvent("CommunityTopTabSelected", "tab_type", "论坛") + SensorsBridge.trackCommunityTopTabSelected("论坛") } TAB_ACTIVITY_INDEX -> { @@ -268,7 +279,7 @@ class CommunityHomeFragment : LazyFragment() { changeNavigationBg(this) } NewLogUtils.logCommunityHomeEvent("click_activity_tab") - SensorsBridge.trackEvent("CommunityTopTabSelected", "tab_type", "活动") + SensorsBridge.trackCommunityTopTabSelected("活动") } } }, diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt index 8463c17fed..b1825db7b0 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt @@ -181,7 +181,8 @@ class ForumActivityAdapter( mContext, activityEntity.link, mEntrance, - "" + "", + "社区-活动Tab" ) } } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt index 1781eb04bf..51102769f8 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt @@ -27,6 +27,7 @@ import com.gh.gamecenter.qa.answer.BaseAnswerOrArticleItemViewHolder import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.feature.entity.AnswerEntity import com.gh.gamecenter.feature.entity.ArticleEntity +import com.gh.gamecenter.feature.entity.CommunityItemData import com.gh.gamecenter.forum.search.CommunitySearchEventListener import com.gh.gamecenter.forum.search.CommunitySearchEventListener.Companion.SEARCH_BUTTON_COMMENT import com.gh.gamecenter.forum.search.CommunitySearchEventListener.Companion.SEARCH_BUTTON_DISLIKE @@ -49,8 +50,7 @@ import org.greenrobot.eventbus.EventBus class ForumArticleAskItemViewHolder( val binding: CommunityAnswerItemBinding, private val clickListener: CommunitySearchEventListener? = null -) : - BaseAnswerOrArticleItemViewHolder(binding.root) { +) : BaseAnswerOrArticleItemViewHolder(binding.root) { fun bindForumAnswerItem(entity: AnswerEntity, entrance: String, path: String, position: Int) { bindItem(entity, entrance, path, position) @@ -100,7 +100,7 @@ class ForumArticleAskItemViewHolder( } ) title.goneIf(entity.type == "answer") - title.text = if (entity.type.contains("video")) entity.articleTitle else entity.questions.title + title.text = if (entity.type.contains("video")) entity.title else entity.questions.title content.text = if (entity.type.contains("video")) entity.des else entity.brief popularAnswerContainer.background = GradientDrawable().apply { setColor(Color.parseColor("#F5F6F7")) @@ -237,7 +237,11 @@ class ForumArticleAskItemViewHolder( } binding.concernBtn.setOnClickListener { debounceActionWithInterval(R.id.concernBtn, 1000) { - SensorsBridge.trackEvent("FollowUserClick", "mongold_id", userId) + SensorsBridge.trackUserFollowClick( + userId = entity.user.id ?: "", + userName = entity.user.name ?: "", + buttonName = binding.concernBtn.text.toString() + ) CheckLoginUtils.checkLogin(itemView.context, entrance) { if (entrance == "社区") { NewLogUtils.logRecommendFeedUserClick("click_for_you_follow", userId, contentType) @@ -343,7 +347,7 @@ class ForumArticleAskItemViewHolder( } } - override fun bindCommendAndVote(entity: AnswerEntity, entrance: String, path: String?, position: Int?) { + override fun bindCommendAndVote(entity: CommunityItemData, entrance: String, path: String?, position: Int?) { inviteAnswer.visibility = View.GONE voteCountContainer.visibility = View.VISIBLE @@ -359,13 +363,13 @@ class ForumArticleAskItemViewHolder( voteCountContainer.visibility = View.GONE } - if (entity.bbs.type == "official_bbs") { - forumIcon?.displayGameIcon(entity.bbs.icon, null) + if (entity.community.type == "official_bbs") { + forumIcon?.displayGameIcon(entity.community.icon, null) } else { forumIcon?.displayGameIcon( - entity.bbs.game?.getIcon(), - entity.bbs.game?.iconSubscript, - entity.bbs.game?.iconFloat + entity.community.game?.getIcon(), + entity.community.game?.iconSubscript, + entity.community.game?.iconFloat ) } @@ -377,9 +381,9 @@ class ForumArticleAskItemViewHolder( position ?: 0, SEARCH_BUTTON_VIEW_FORUM_DETAIL ) - MtaHelper.onEvent(getEventId(entrance), getKey(entrance), entity.bbs.name) - itemView.context.startActivity(ForumDetailActivity.getIntent(itemView.context, entity.bbs.id, entrance)) - LogUtils.uploadAccessToBbs(entity.bbs.id, "文章外所属论坛") + MtaHelper.onEvent(getEventId(entrance), getKey(entrance), entity.community.name) + itemView.context.startActivity(ForumDetailActivity.getIntent(itemView.context, entity.community.id, entrance)) + LogUtils.uploadAccessToBbs(entity.community.id, "文章外所属论坛") } forumNameContainer?.setOnClickListener { @@ -425,8 +429,8 @@ class ForumArticleAskItemViewHolder( else -> "提问帖评论" } val sequence = position + 1 - val bbsId = entity.bbs.id - val bbsType = if (entity.bbs.type == "official_bbs") "综合论坛" else "游戏论坛" + val bbsId = entity.community.id + val bbsType = if (entity.community.type == "official_bbs") "综合论坛" else "游戏论坛" val tabInfo = "${path}tab" val commentType = when (entity.type) { "community_article" -> "帖子评论" @@ -455,7 +459,7 @@ class ForumArticleAskItemViewHolder( ) when (entity.type) { "community_article" -> { - val communityId = entity.bbs.id + val communityId = entity.community.id val intent = ArticleDetailActivity.getCommentIntent( itemView.context, CommunityEntity(communityId, entity.communityName ?: ""), @@ -467,7 +471,7 @@ class ForumArticleAskItemViewHolder( } "video" -> { - val communityId = entity.bbs.id + val communityId = entity.community.id itemView.context.startActivity( ForumVideoDetailActivity.getIntent( itemView.context, entity.id @@ -520,8 +524,8 @@ class ForumArticleAskItemViewHolder( else -> "提问帖评论" } val sequence = position + 1 - val bbsId = entity.bbs.id - val bbsType = if (entity.bbs.type == "official_bbs") "综合论坛" else "游戏论坛" + val bbsId = entity.community.id + val bbsType = if (entity.community.type == "official_bbs") "综合论坛" else "游戏论坛" val tabInfo = "${path}tab" NewLogUtils.logForumDetailFeedContentClick( "click_forum_detail_like", @@ -550,8 +554,17 @@ class ForumArticleAskItemViewHolder( button ) MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "点赞图标") - if (!voteIcon.isChecked) voteAnswer(entity) - else cancelAnswerVote(entity) + SensorsBridge.trackArticleLikeClick( + customerType = entity.user.auth?.text ?: "", + articleId = entity.id, + bbsId = entity.community.id, + bbsType = entity.community.typeChinese, + activityTag = entity.tagActivityName, + gameForumType = entity.community.game?.categoryChinese ?: "", + articleType = entity.typeChinese, + buttonName = if (voteIcon.isChecked) "取消点赞" else "赞同" + ) + if (!voteIcon.isChecked) voteAnswer(entity) else cancelAnswerVote(entity) } else { clickListener?.onItemChildClick( entity.id, diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt index b454e3d2e6..afabc50940 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt @@ -131,7 +131,8 @@ class ForumArticleListAdapter( articleEntity.id, articleEntity.recommendId, "", - path + path, + "社区-推荐信息流" ) ) } @@ -151,7 +152,8 @@ class ForumArticleListAdapter( mContext, articleEntity.id, articleEntity.community.id, - articleEntity.recommendId + articleEntity.recommendId, + "社区-推荐信息流" ) ) } @@ -173,7 +175,8 @@ class ForumArticleListAdapter( "", articleEntity.recommendId, mEntrance, - path + path, + sourceEntrance = "社区-推荐信息流" ) ) } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt index 5190b59b85..08c90a7b69 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt @@ -10,6 +10,7 @@ import com.gh.common.util.NewLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.adapter.RecyclingPagerAdapter import com.gh.gamecenter.common.utils.ImageUtils +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.entity.ForumBannerEntity import com.gh.gamecenter.login.user.UserManager @@ -53,8 +54,9 @@ class ForumBannerAdapter( view.setOnClickListener { val userId = UserManager.getInstance().userId - DirectUtils.directToLinkPage(mContext, banner, "论坛banner", "") + DirectUtils.directToLinkPage(mContext, banner, "论坛banner", "", "社区-论坛Tab-banner") NewLogUtils.logClickBBSCarousel(banner.type ?: "", banner.link ?: "", index, userId) + SensorsBridge.trackForumBannerClick(banner.title ?: "") } return view diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerPageAdapter.java b/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerPageAdapter.java index 8aa1dc5af4..710c68608c 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerPageAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerPageAdapter.java @@ -49,7 +49,7 @@ public class ForumBannerPageAdapter extends RecyclingPagerAdapter { ImageUtils.display(binding.subjectIcon, entity.getIcon()); binding.getRoot().setOnClickListener(v -> { MtaHelper.onEvent("论坛首页", "轮播图", entity.getText()); - DirectUtils.directToLinkPage(mContext, entity, "论坛首页", "轮播图"); + DirectUtils.directToLinkPage(mContext, entity, "论坛首页", "轮播图", ""); }); binding.getRoot().setOnTouchListener((v, event) -> { diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt index 387b5d4ca1..36a0fe8a5f 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/HorizontalForumsAdapter.kt @@ -87,6 +87,13 @@ class HorizontalForumsAdapter( private fun handleFollowTvClick(binding: HorizontalForumItemBinding, forumEntity: ForumEntity) { binding.run { debounceActionWithInterval(R.id.followTv) { + SensorsBridge.trackFollowForumClick( + bbsId = forumEntity.id, + forumName = forumEntity.name, + bbsType = forumEntity.typeChinese, + buttonName = followTv.text.toString(), + gameForumType = forumEntity.game.categoryChinese + ) CheckLoginUtils.checkLogin(mContext, mEntrance) { if (forumEntity.me.isFollowForum) { mViewModel?.unFollowForum(forumEntity.id) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt index 052ff98ecc..fc1eccd9f4 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt @@ -7,14 +7,12 @@ import androidx.recyclerview.widget.RecyclerView import com.gh.gamecenter.common.base.BaseRecyclerViewHolder import com.gh.gamecenter.common.constant.ItemViewType import com.gh.common.util.* +import com.gh.common.util.NewLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.common.viewholder.FooterViewHolder import com.gh.gamecenter.common.baselist.ListAdapter +import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.ToastUtils -import com.gh.gamecenter.common.utils.debounceActionWithInterval -import com.gh.gamecenter.common.utils.toBinding -import com.gh.gamecenter.common.utils.toColor -import com.gh.gamecenter.common.utils.toDrawable import com.gh.gamecenter.core.utils.NumberUtils import com.gh.gamecenter.databinding.ForumMyFollowBinding import com.gh.gamecenter.entity.ForumEntity @@ -96,6 +94,13 @@ class ForumListAdapter( followTv.setOnClickListener { debounceActionWithInterval(R.id.followTv) { + SensorsBridge.trackFollowForumClick( + bbsId = forumEntity.id, + forumName = forumEntity?.name ?: "", + bbsType = forumEntity.typeChinese, + buttonName = followTv.text.toString(), + gameForumType = forumEntity?.game?.categoryChinese?:"" + ) CheckLoginUtils.checkLogin(mContext, entrance) { if (forumEntity.me.isFollowForum) { mViewModel?.unFollowForum(forumEntity.id) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListAdapter.kt index 031e7113ec..e6e35a0cb0 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListAdapter.kt @@ -65,6 +65,11 @@ class ModeratorListAdapter(context: Context, val mViewModel: ModeratorListViewMo root.performClick() } followTv.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = personalEntity.id, + userName = personalEntity.name, + buttonName = followTv.text.toString() + ) mContext.ifLogin("板块成员") { if (personalEntity.id == UserManager.getInstance().userId) return@ifLogin debounceActionWithInterval(it.id) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt index 884a27814a..4ef583a762 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt @@ -106,8 +106,8 @@ class ForumContentSearchListAdapter( val answer = mEntityList[position] val questions = Questions() - questions.id = answer.id ?: "" - questions.title = answer.articleTitle + questions.id = answer.id + questions.title = answer.title questions.answerCount = answer.count.answer answer.questions = questions @@ -168,7 +168,7 @@ class ForumContentSearchListAdapter( MtaHelper.onEvent( holder.getEventId(entrance), holder.getKey(entrance), - "${answer.articleTitle}(${answer.id})" + "${answer.title}(${answer.id})" ) mContext.startActivity( ArticleDetailActivity.getIntent( @@ -176,7 +176,8 @@ class ForumContentSearchListAdapter( CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, - "" + "", + sourceEntrance = "社区-搜索-内容榜单" ) ) } @@ -190,18 +191,19 @@ class ForumContentSearchListAdapter( "视频帖", answer.user.id ?: "", mListViewModel.searchKey, - position + 1 + position + 1, ) MtaHelper.onEvent( holder.getEventId(entrance), holder.getKey(entrance), - "${answer.articleTitle}(${answer.id})" + "${answer.title}(${answer.id})" ) mContext.startActivity( ForumVideoDetailActivity.getIntent( mContext, answer.id ?: "", - answer.bbs.id + answer.bbs.id, + sourceEntrance = "社区-搜索-内容榜单" ) ) } @@ -220,14 +222,15 @@ class ForumContentSearchListAdapter( MtaHelper.onEvent( holder.getEventId(entrance), holder.getKey(entrance), - "${answer.articleTitle}(${answer.id})" + "${answer.title}(${answer.id})" ) mContext.startActivity( NewQuestionDetailActivity.getIntent( mContext, answer.id ?: "", mEntrance, - "" + "", + sourceEntrance = "社区-搜索-内容榜单" ) ) } @@ -283,7 +286,7 @@ class ForumContentSearchListAdapter( ) title.goneIf(answer.type == "answer") title.text = - if (answer.type.contains("video")) answer.articleTitle else answer.questions.title + if (answer.type.contains("video")) answer.title else answer.questions.title content.text = if (answer.type.contains("video")) answer.des else answer.brief popularAnswerContainer.background = GradientDrawable().apply { setColor(Color.parseColor("#F5F6F7")) @@ -383,7 +386,8 @@ class ForumContentSearchListAdapter( CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, - "" + "", + sourceEntrance = "论坛-搜索-搜索结果" ) ) } @@ -424,7 +428,8 @@ class ForumContentSearchListAdapter( mContext, answer.id ?: "", mEntrance, - "" + "", + sourceEntrance = "论坛-搜索-搜索结果" ) ) } diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListFragment.kt index 0788d60dd4..e2671e0301 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListFragment.kt @@ -4,19 +4,28 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.NewFlatLogUtils +import com.gh.common.util.NewLogUtils import com.gh.gamecenter.R -import com.gh.gamecenter.SearchActivity.Companion.trackSearchResultClick +import com.gh.gamecenter.SearchActivity import com.gh.gamecenter.SearchType +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.baselist.LazyListFragment import com.gh.gamecenter.common.baselist.ListAdapter import com.gh.gamecenter.common.constant.EntranceConsts +import com.gh.gamecenter.common.utils.SensorsBridge +import com.gh.gamecenter.common.utils.safelyGetInRelease +import com.gh.gamecenter.common.utils.tryCatchInRelease import com.gh.gamecenter.common.utils.viewModelProvider import com.gh.gamecenter.common.view.divider.HorizontalDividerItemDecoration import com.gh.gamecenter.core.utils.DisplayUtils +import com.gh.gamecenter.core.utils.MD5Utils import com.gh.gamecenter.databinding.FragmentForumContentSearchListBinding import com.gh.gamecenter.feature.entity.AnswerEntity +import com.gh.gamecenter.forum.home.ForumScrollCalculatorHelper import com.gh.gamecenter.forum.search.CommunitySearchEventListener.Companion.SEARCH_BUTTON_VIEW_CONTENT_DETAIL import com.gh.gamecenter.forum.search.ForumOrUserSearchActivity.Companion.LOCATION_COMMUNITY +import com.gh.gamecenter.video.detail.CustomManager +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView class ForumContentSearchListFragment : LazyListFragment(), CommunitySearchEventListener { @@ -29,6 +38,10 @@ class ForumContentSearchListFragment : LazyListFragment { return mAdapter ?: ForumContentSearchListAdapter( @@ -42,8 +55,12 @@ class ForumContentSearchListFragment : LazyListFragment(factory).apply { + this.sourceEntrance = sourceEntrance + } + return viewModel } override fun getRealLayoutId(): Int { @@ -62,7 +79,71 @@ class ForumContentSearchListFragment : LazyListFragment= 0 + && currentPosition < mListViewModel?.videoList?.size ?: 0 + ) { + val video = mListViewModel?.videoList?.safelyGetInRelease(currentPosition) + if (video != null) { + val position = ForumScrollCalculatorHelper.getPlaySchedule(MD5Utils.getContentMD5(video.url)) + //这里必须要延迟操作,否则会白屏 + mBaseHandler.postDelayed({ + tryCatchInRelease { + if (position != 0L) { + if (currentPlayer?.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { + currentPlayer?.startPlayLogic(true) + } + } else { + currentPlayer?.release() + } + } + }, 50) + } + } + } + } + + fun refreshScrollHelper() { + mBaseHandler.postDelayed({ + tryCatchInRelease { + scroll() + mScrollCalculatorHelper?.onScrollStateChanged(mListRv, RecyclerView.SCROLL_STATE_IDLE) + } + }, 100) + } + + override fun onFragmentPause() { + pauseVideo() + super.onFragmentPause() + } + + private fun pauseVideo() { + mScrollCalculatorHelper?.run { + if (currentPlayer != null + && currentPosition >= 0 + && currentPosition < mListViewModel?.videoList?.size ?: 0 + ) { + currentPlayer?.onVideoPause() + val position = currentPlayer?.getCurrentPosition() ?: 0L + val video = mListViewModel?.videoList?.safelyGetInRelease(currentPosition) + if (video != null) { + ForumScrollCalculatorHelper.savePlaySchedule(MD5Utils.getContentMD5(video.url), position) + } + } + } + } + override fun onRefresh() { + mScrollCalculatorHelper?.currentPlayer?.release() + mScrollCalculatorHelper?.reset() + if (isFilterViewShow()) { mBinding?.fixedTopFilterView?.filterView?.visibility = View.GONE } @@ -74,6 +155,25 @@ class ForumContentSearchListFragment : LazyListFragment(application) { var searchKey = "" var mSort = "" + var sourceEntrance = "" private var mPage = 0 private var mPageSize = 20 private var mTotal = 0 private var searchType = SearchType.DEFAULT.value + var videoList = arrayListOf() + override fun provideDataObservable(page: Int): Observable>? { mPage = page if (page == 1) { @@ -76,9 +82,21 @@ class ForumContentSearchListViewModel(application: Application, val bbsId: Strin override fun mergeResultLiveData() { mResultLiveData.addSource(mListLiveData) { + videoList = ArrayList(it.map { answer -> + answer.transformForumVideoEntity() + }) + mResultLiveData.postValue(it) + if (mPage == 1) { - SearchActivity.trackSearchResultReturn(searchKey, searchType, it.isNotEmpty()) + SensorsBridge.trackSearchResultReturn( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + searchKey, + SearchActivity.toTrackSearchType(searchType), + it.isNotEmpty(), + sourceEntrance + ) } } } diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt index 6d2daf7e7e..5557291bb3 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt @@ -10,7 +10,9 @@ import com.gh.gamecenter.DisplayType import com.gh.gamecenter.R import com.gh.gamecenter.SearchActivity import com.gh.gamecenter.SearchType +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.constant.EntranceConsts +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.showKeyBoard import com.gh.gamecenter.common.utils.toColor import com.gh.gamecenter.search.SearchDefaultFragment @@ -20,12 +22,14 @@ class ForumOrUserSearchActivity : SearchActivity() { private var mBbsId = "" private var mLocation = "" + private var mSourceEntrance = "" private val mSearchHistoryDao by lazy { ForumSearchDao() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mBbsId = intent.getStringExtra(EntranceConsts.KEY_BBS_ID) ?: "" mLocation = intent.getStringExtra(EntranceConsts.KEY_LOCATION) ?: "" + mSourceEntrance = intent.getStringExtra(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "" searchEt.hint = if (mEntrance == "论坛首页") { "搜索论坛内容、用户" } else { @@ -62,7 +66,13 @@ class ForumOrUserSearchActivity : SearchActivity() { SearchType.AUTO -> { mSearchKey = key updateDisplayType(DisplayType.FORUM_OR_USER) - trackSearchButtonClick(key, TRACK_SEARCH_TYPE_INPUT) + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key ?: "", + TRACK_SEARCH_TYPE_INPUT, + mSourceEntrance + ) } SearchType.HISTORY -> { @@ -70,7 +80,13 @@ class ForumOrUserSearchActivity : SearchActivity() { searchEt.setText(key) searchEt.setSelection(searchEt.text.length) updateDisplayType(DisplayType.FORUM_OR_USER) - trackSearchButtonClick(key, TRACK_SEARCH_TYPE_HISTORY) + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key ?: "", + TRACK_SEARCH_TYPE_HISTORY, + mSourceEntrance + ) } else -> { @@ -81,9 +97,21 @@ class ForumOrUserSearchActivity : SearchActivity() { mSearchHistoryDao.add(mSearchKey!!) updateDisplayType(DisplayType.FORUM_OR_USER) if (type == SearchType.MANUAL) { - trackSearchButtonClick(key, TRACK_SEARCH_TYPE_INPUT) + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + newSearchKey, + TRACK_SEARCH_TYPE_INPUT, + mSourceEntrance + ) } else { - trackSearchButtonClick(key, TRACK_SEARCH_TYPE_DEFAULT) + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + newSearchKey, + TRACK_SEARCH_TYPE_DEFAULT, + mSourceEntrance + ) } } else { toast("请先输入搜索内容再搜索~") diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchFragment.kt index 507ae081b5..dcca81e687 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchFragment.kt @@ -11,6 +11,7 @@ import com.gh.gamecenter.common.base.fragment.BaseFragment_TabLayout import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.dip2px import com.gh.gamecenter.common.utils.doOnPageSelected +import com.gh.gamecenter.common.utils.safelyGetInRelease import com.gh.gamecenter.qa.dialog.ChooseForumContainerFragment import com.google.android.material.tabs.TabLayout @@ -69,6 +70,13 @@ class ForumOrUserSearchFragment : BaseFragment_TabLayout() { if (it == 1) { SensorsBridge.trackArticleSearchTabClick(mSearchKey, toTrackSearchType(mSearchType)) } + + if (it < mFragmentsList.size) { + val fragment = mFragmentsList.safelyGetInRelease(it) + if (fragment is ForumContentSearchListFragment) { + fragment.refreshScrollHelper() + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListAdapter.kt index 0a5a44ca85..f56c149ee0 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListAdapter.kt @@ -121,6 +121,11 @@ class UserSearchListAdapter( }) } holder.binding.attentionTv.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = entity.id, + userName = entity.name, + buttonName = holder.binding.attentionTv.text.toString() + ) CheckLoginUtils.checkLogin(mContext, "用户搜索") { if (entity.me.isFollower) { mViewModel.unFollow(entity.id) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListFragment.kt index c9d6a5f39b..3aa94bd3e8 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListFragment.kt @@ -7,8 +7,12 @@ import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.SearchActivity import com.gh.gamecenter.SearchType +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.baselist.LazyListFragment import com.gh.gamecenter.common.baselist.ListAdapter +import com.gh.gamecenter.common.constant.EntranceConsts +import com.gh.gamecenter.common.utils.SensorsBridge +import com.gh.gamecenter.common.utils.viewModelProvider import com.gh.gamecenter.entity.FollowersOrFansEntity import com.gh.gamecenter.eventbus.EBUserFollow import org.greenrobot.eventbus.Subscribe @@ -23,7 +27,13 @@ class UserSearchListFragment : LazyListFragment { return mAdapter ?: UserSearchListAdapter(requireContext(), mEntrance, mListViewModel) { userId, name, position -> - SearchActivity.trackSearchResultClick(mSearchKey, mSearchType) + SensorsBridge.trackSearchResultClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + mSearchKey, + SearchActivity.toTrackSearchType(mSearchType), + mListViewModel.sourceEntrance + ) NewFlatLogUtils.logSearchUserClick( SearchType.fromString(mSearchType).toChinese(), mSearchKey, @@ -34,6 +44,14 @@ class UserSearchListFragment : LazyListFragment().apply { + this.sourceEntrance = sourceEntrance + } + return viewModel + } + override fun isAutomaticLoad(): Boolean = false fun setSearchKeyAndType(searchKey: String, searchType: String) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt index c1a706465d..bf8064d7c6 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt @@ -5,11 +5,13 @@ import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.SearchActivity import com.gh.gamecenter.SearchType +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.baselist.ListViewModel import com.gh.gamecenter.common.baselist.LoadType import com.gh.gamecenter.entity.FollowersOrFansEntity import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.common.retrofit.Response +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils import io.reactivex.Observable @@ -22,6 +24,7 @@ import retrofit2.HttpException class UserSearchListViewModel(application: Application) : ListViewModel(application) { var searchKey = "" + var sourceEntrance = "" private var page = 0 private var searchType = SearchType.DEFAULT.value @@ -41,7 +44,14 @@ class UserSearchListViewModel(application: Application) : mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) if (page == 1) { - SearchActivity.trackSearchResultReturn(searchKey, searchType, it.isNotEmpty()) + SensorsBridge.trackSearchResultReturn( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + searchKey, + SearchActivity.toTrackSearchType(searchType), + it.isNotEmpty(), + sourceEntrance + ) } } } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index 179efddd73..26ab950a26 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -412,9 +412,9 @@ class HomeSearchToolWrapperFragment : HomeTabWrapperFragment() { 0, null, "新首页-下拉推送", - "", - mExposureEvent, - { + location = "", + traceEvent = mExposureEvent, + clickCallback = { updateHomePushDownloadBtn() SensorsBridge.trackEvent( "HomePushClick", @@ -430,8 +430,8 @@ class HomeSearchToolWrapperFragment : HomeTabWrapperFragment() { "下载按钮" ) }, - { updateHomePushDownloadBtn() }, - null + refreshCallback = { updateHomePushDownloadBtn() }, + allStateClickCallback = null ) } } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt index a8adf92cd1..1c62e50ea7 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.kt @@ -520,10 +520,13 @@ class MainWrapperFragment : BaseFragment_ViewPager_Checkable(), OnBackPressedLis changeColor(toCheck) mHomeFragment?.finishTwoLevel("跳转收起") val trackEvent = JSONObject() + val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_HOME_BOTTOM_TAB_SELECT, true) tryWithDefaultCatch { trackEvent.put("position", toCheck) trackEvent.put("tab_content", getTabName(toCheck)) + trackEvent.put("\$is_first_time", isFirstTime) } + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_HOME_BOTTOM_TAB_SELECT, false) SensorsBridge.trackEvent("HomeBottomTabSelect", trackEvent) return super.handleOnClick(view) } @@ -741,6 +744,7 @@ class MainWrapperFragment : BaseFragment_ViewPager_Checkable(), OnBackPressedLis if (entity == null) { entity = HomeBottomBarHelper.getDefaultVideoData() } + SensorsBridge.trackAccessVideoStreaming("光环底部tab") NewLogUtils.logCommunityHomeEvent("click_button_video_tab") NewLogUtils.logBottomNavigationClick(entity.linkTypeChinese, entity.type ?: "", entity.text ?: "", entity.link ?: "", index) } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt index 0650d26be9..c1f6c69190 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt @@ -92,7 +92,7 @@ class WelcomeDialogFragment : BaseDialogFragment() { SensorsBridge.trackEvent("HomeDialogClick") mWelcomeEntity?.let { - DirectUtils.directToLinkPage(requireContext(), it, EntranceConsts.ENTRANCE_WELCOME, "") + DirectUtils.directToLinkPage(requireContext(), it, EntranceConsts.ENTRANCE_WELCOME, "", "首页弹窗") if (mShowEnterAnimation) { val floatingWindowProvider = ARouter.getInstance().build(RouteConsts.provider.floatingwindow) diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt index 62f530aba4..e624dbcf6c 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt @@ -1293,10 +1293,14 @@ class GameFragmentAdapter( } DownloadItemUtils.setOnClickListener( - mContext, holder.binding.downloadBtn, gameEntity, position, + mContext, + holder.binding.downloadBtn, + gameEntity, + position, this@GameFragmentAdapter, StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (position + 1).toString(), "])"), - StringUtils.buildString("游戏-专题-", subjectData.name, ":", gameEntity.name), itemData.exposureEvent + location = StringUtils.buildString("游戏-专题-", subjectData.name, ":", gameEntity.name), + traceEvent = itemData.exposureEvent ) DownloadItemUtils.updateItem( mContext, diff --git a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt index ab6d314a7a..31bbef51fc 100644 --- a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalAdapter.kt @@ -152,8 +152,8 @@ class GameHorizontalAdapter( position, this, entranceResult, - locationResult, - if (position < (exposureEventList?.size ?: 0)) exposureEventList!![position] else null + location = locationResult, + traceEvent = if (position < (exposureEventList?.size ?: 0)) exposureEventList!![position] else null ) DownloadItemUtils.updateItem( diff --git a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt index 7532845a81..f7c0043c4c 100644 --- a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt @@ -101,8 +101,8 @@ class GameHorizontalSlideAdapter( position, this, StringUtils.buildString("(游戏-专题:", mSubjectEntity.name, "-列表[", (position + 1).toString(), "])"), - StringUtils.buildString("游戏-专题-", mSubjectEntity.name, ":", gameEntity.name), - if (position < (exposureEventList?.size ?: 0)) exposureEventList!![position] else null + location = StringUtils.buildString("游戏-专题-", mSubjectEntity.name, ":", gameEntity.name), + traceEvent = if (position < (exposureEventList?.size ?: 0)) exposureEventList!![position] else null ) DownloadItemUtils.updateItem( diff --git a/app/src/main/java/com/gh/gamecenter/game/rank/RankAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/rank/RankAdapter.kt index 2259323c4b..6b4f35eb13 100644 --- a/app/src/main/java/com/gh/gamecenter/game/rank/RankAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/rank/RankAdapter.kt @@ -182,8 +182,8 @@ class RankAdapter( position, this@RankAdapter, entrance, - "专题合集-排行榜-$columnName:${gameEntity.name}", - exposureEvent + location = "专题合集-排行榜-$columnName:${gameEntity.name}", + traceEvent = exposureEvent ) DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(root).also { diff --git a/app/src/main/java/com/gh/gamecenter/game/rank/RankGameItem.kt b/app/src/main/java/com/gh/gamecenter/game/rank/RankGameItem.kt index b7598413d1..50297e394c 100644 --- a/app/src/main/java/com/gh/gamecenter/game/rank/RankGameItem.kt +++ b/app/src/main/java/com/gh/gamecenter/game/rank/RankGameItem.kt @@ -58,8 +58,8 @@ class RankGameItem(val rankItemUi: RankGameItemUi) { position, null, entrance, - "专题合集-排行榜-$columnName:${gameEntity.name}", - exposureEvent, + location = "专题合集-排行榜-$columnName:${gameEntity.name}", + traceEvent = exposureEvent, clickCallback = null, refreshCallback = { DownloadItemUtils.updateItem(root.context, gameEntity, GameViewHolder(root).also { diff --git a/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt index 9eeba611aa..662483f844 100644 --- a/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/vertical/GameVerticalAdapter.kt @@ -232,7 +232,7 @@ class GameVerticalAdapter( DownloadItemUtils.setOnClickListener( context, downloadTv, gameEntity, position, - adapter, entrance, location, gameEntity.exposureEvent + adapter, entrance, location = location, traceEvent = gameEntity.exposureEvent ) root.setPadding(paddingStart, 8F.dip2px(), paddingEnd, 8F.dip2px()) diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt index 98620d41fd..670f50a318 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailAdapter.kt @@ -650,8 +650,8 @@ open class GameCollectionDetailAdapter( position, this@GameCollectionDetailAdapter, mEntrance, - "游戏单详情-游戏列表:${gameEntity.name}", - exposureEvent + location = "游戏单详情-游戏列表:${gameEntity.name}", + traceEvent = exposureEvent ) DownloadItemUtils.updateItem( diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailFragment.kt index 37bc4bb349..fe8ed20419 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailFragment.kt @@ -986,6 +986,11 @@ class GameCollectionDetailFragment : R.id.imageItemFollowedTv, R.id.videoItemFollowTv, R.id.videoItemFollowedTv -> { + SensorsBridge.trackUserFollowClick( + userId = mEntity?.user?.id ?: "", + userName = mEntity?.user?.name ?: "", + buttonName = mBinding?.videoItem?.videoItemFollowTv?.text.toString() + ) ifLogin("游戏单详情") { if (mEntity?.me?.isFollower == false) { logEvent("click_game_collect_detail_follow") diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionPosterFragment.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionPosterFragment.kt index 52fea3c1c9..d02df89bf6 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionPosterFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionPosterFragment.kt @@ -120,6 +120,11 @@ class GameCollectionPosterFragment : ToolbarFragment() { } R.id.followTv -> { + SensorsBridge.trackUserFollowClick( + userId = mEntity.user?.id ?: "", + userName = mEntity.user?.name ?: "", + buttonName = mBinding.followTv.text.toString() + ) ifLogin("游戏单详情-封面页") { if (mBinding.followTv.text == "关注") { mViewModel?.followingCommand(mEntity.user?.id ?: "", true) diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/hotlist/GameCollectionPlayerCreationAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/hotlist/GameCollectionPlayerCreationAdapter.kt index 8d841890bd..a18d3c8679 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/hotlist/GameCollectionPlayerCreationAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/hotlist/GameCollectionPlayerCreationAdapter.kt @@ -130,6 +130,11 @@ class GameCollectionPlayerCreationAdapter( mContext ) followTv.setOnClickListener { view -> + SensorsBridge.trackUserFollowClick( + userId = entity.user.id, + userName = entity.user.name, + buttonName = followTv.text.toString() + ) mContext.ifLogin("板块成员") { if (entity.user.id == UserManager.getInstance().userId) return@ifLogin debounceActionWithInterval(view.id) { diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditActivity.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditActivity.kt index 1c4fdf9494..0a1d0f7d18 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/publish/GameCollectionEditActivity.kt @@ -286,11 +286,11 @@ class GameCollectionEditActivity : ToolBarActivity() { CheckLoginUtils.checkLogin(this, mEntrance) {} return@observe } - ErrorHelper.handleError(this, errorMsg, false, { + ErrorHelper.handleError(this, errorMsg, false, "发布游戏单", "社区实名") { if (::mMenuPost.isInitialized) { onMenuItemClick(mMenuPost) } - }, "发布游戏单") + } } } mViewModel.detailLiveData.observe(this) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index cd9a954995..8625bf1ee8 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -368,7 +368,8 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { ExposureSource("游戏详情", mGameEntity?.id ?: ""), ExposureSource("内容卡片", contentCardEntity.id) ) - ) + ), + "游戏详情页-内容卡片" ) } } @@ -866,7 +867,7 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { GameBigEventDialog.showGameBigEventDialog( requireContext(), mGameEntity?.name ?: "", mGameEntity?.id ?: "", it ) { link, position -> - DirectUtils.directToLinkPage(requireContext(), link, mEntrance, "游戏大事件弹窗") + DirectUtils.directToLinkPage(requireContext(), link, mEntrance, "游戏大事件弹窗", "游戏详情页-大事件") NewFlatLogUtils.logGameDetailMajorEventDetailClick( mGameEntity?.name ?: "", mGameEntity?.id ?: "", @@ -1771,7 +1772,8 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { ReservationHelper.reserve( requireContext(), mGameEntity, - getCallback() + callback = getCallback(), + ) } else { if ("download" == mGameEntity?.reserveStatus) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt index 429cafe58b..ef700640ee 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt @@ -212,9 +212,20 @@ class DescAdapter( gamedetailItemNotice.setOnClickListener { val index = gamedetailItemNotice.displayedChild val linkEntity = noticeList[index] - DirectUtils.directToLinkPage(mContext, linkEntity, StringUtils.buildString(mEntrance, "游戏详情[", mGameName, "]:公告"), "") + DirectUtils.directToLinkPage( + mContext, + linkEntity, + StringUtils.buildString(mEntrance, "游戏详情[", mGameName, "]:公告"), + "" + ) MtaHelper.onEvent(MTA_KEY_GAME_NEW, "详情_公告", "${mGameName}+${gamedetailItemNotice.notices[index]}") - NewFlatLogUtils.logGameDetailNoticeClick(mGameId, mGameName, linkEntity.link ?: "", linkEntity.type ?: "", linkEntity.text ?: "") + NewFlatLogUtils.logGameDetailNoticeClick( + mGameId, + mGameName, + linkEntity.link ?: "", + linkEntity.type ?: "", + linkEntity.text ?: "" + ) } } } @@ -359,7 +370,8 @@ class DescAdapter( containerWrapper.setPadding(0, itemData.paddingTop, 0, itemData.paddingBottom) galleryRv.isNestedScrollingEnabled = false if (galleryRv.adapter == null) { - val relatedVersionAdapter = GameRelatedVersionAdapter(mContext, mGameId, mGameName, mGame, relatedVersion, mEntrance) + val relatedVersionAdapter = + GameRelatedVersionAdapter(mContext, mGameId, mGameName, mGame, relatedVersion, mEntrance) galleryRv.run { background = R.drawable.background_shape_white_radius_5.toDrawable(mContext) setPadding(0F.dip2px(), 8F.dip2px(), 0F.dip2px(), 8F.dip2px()) @@ -961,7 +973,11 @@ class DescAdapter( PicassoImageGetter(contentTv), ExtraTagHandler() ) - setTextWithInterceptingInternalUrl(shrankText = shrankSpanned, expandedText = expandedSpanned) { + setTextWithInterceptingInternalUrl( + shrankText = shrankSpanned, + expandedText = expandedSpanned, + sourceEntrance = "游戏详情页-自定义栏目" + ) { val linkEntity = DefaultUrlHandler.urlToLinkEntity(it) logCustomColumnLinkClicked(title = customColumn.name, linkEntity, "正文说明") } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt index 183a61ef45..d932c65018 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt @@ -147,7 +147,7 @@ class GameDetailInfoItemAdapter( } "隐私政策" -> { gameInfo.privacyPolicyUrl?.let { - if (!DefaultUrlHandler.transformNormalScheme(holder.binding.root.context, it, "隐私政策")) { + if (!DefaultUrlHandler.transformNormalScheme(holder.binding.root.context, it, "隐私政策", "")) { val intent = WebActivity.getIntent(holder.binding.root.context, it, "隐私政策", false, false) holder.binding.root.context.startActivity(intent) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GamePermissionDialogFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GamePermissionDialogFragment.kt index ea68d1644a..ef22bcbcff 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GamePermissionDialogFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GamePermissionDialogFragment.kt @@ -57,7 +57,7 @@ class GamePermissionDialogFragment : BaseDialogFragment() { binding.privacyContainer.goneIf(mGameInfo?.privacyPolicyUrl.isNullOrEmpty()) binding.privacyContainer.setOnClickListener { mGameInfo?.privacyPolicyUrl?.let { - if (!DefaultUrlHandler.transformNormalScheme(binding.root.context, it, "隐私政策")) { + if (!DefaultUrlHandler.transformNormalScheme(binding.root.context, it, "隐私政策", "")) { val intent = WebActivity.getIntent(binding.root.context, it, "隐私政策", false, false) binding.root.context.startActivity(intent) } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt index da499bcae3..1c6165460e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt @@ -46,7 +46,7 @@ class GameDetailAnswerAdapter( val entity = mAnswerList[position] if ("community_article" == entity.type) { val questions = Questions() - questions.title = entity.articleTitle + questions.title = entity.title entity.questions = questions } val path = "游戏详情-动态" @@ -62,7 +62,8 @@ class GameDetailAnswerAdapter( CommunityEntity(entity.articleCommunityId, ""), entity.id!!, mEntrance, - path + path, + sourceEntrance = "游戏详情页-游戏专区tab" ) ) } else { @@ -72,7 +73,8 @@ class GameDetailAnswerAdapter( mContext, entity.questions.id, mEntrance, - path + path, + sourceEntrance = "游戏详情页-游戏专区tab" ) ) } @@ -89,7 +91,8 @@ class GameDetailAnswerAdapter( CommunityEntity(entity.articleCommunityId, ""), entity.id!!, mEntrance, - path + path, + sourceEntrance = "游戏详情页-游戏专区tab" ) ) } else { @@ -101,7 +104,7 @@ class GameDetailAnswerAdapter( mContext.startActivity( SimpleAnswerDetailActivity.getIntent( mContext, entity.id - ?: "", mEntrance, path + ?: "", mEntrance, path, ) ) } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt index 42ccd4fede..ec90bb5630 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt @@ -103,8 +103,8 @@ class HistoryApkListAdapter( 0, this@HistoryApkListAdapter, "$mEntrance+(历史版本)", - "历史版本", - exposureEvent + location = "历史版本", + traceEvent = exposureEvent ) if (apkEntity.downloadStatus == "off" || apkEntity.url.isNullOrEmpty()) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt index b6ccfa8ab0..3f9ee31c5e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt @@ -175,7 +175,9 @@ class RatingReplyAdapter( DownloadItemUtils.setOnClickListener( mContext, this, game, 0, this@RatingReplyAdapter, - entrance, BaseActivity.mergeEntranceAndPath(entrance, path), mExposureEvent, + entrance, + location = BaseActivity.mergeEntranceAndPath(entrance, path), + traceEvent = mExposureEvent, clickCallback = { NewLogUtils.logDownloadBtnClick( game.id, diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyViewModel.kt index 344fc31255..b174f3ddfb 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyViewModel.kt @@ -238,8 +238,9 @@ class RatingReplyViewModel( getApplication(), e?.response()?.errorBody()?.string(), false, - realNameConfirmListener, - "游戏评论及回复" + "游戏评论及回复", + "社区实名", + realNameConfirmListener = realNameConfirmListener ) } }) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt index c84811368f..37fa3ae64e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt @@ -454,9 +454,9 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver { CheckLoginUtils.checkLogin(this, mEntrance) {} } else -> { - ErrorHelper.handleError(this@RatingEditActivity, errorString, false, { + ErrorHelper.handleError(this@RatingEditActivity, errorString, false, "游戏评论及回复", "社区实名") { postGameComment(again = false) - }, "游戏评论及回复") + } } } } diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt index dff5b2bdde..968d7cea46 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt @@ -170,8 +170,8 @@ class HomeGameItemViewHolder(val binding: HomeGameItemBinding) : BaseRecyclerVie position, adapter, entrance, - "", - exposureEvent + location = "", + traceEvent = exposureEvent ) DownloadItemUtils.updateItem( binding.root.context, diff --git a/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt b/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt index bd972b9337..10a311c662 100644 --- a/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt +++ b/app/src/main/java/com/gh/gamecenter/home/LegacyHomeFragmentAdapterAssistant.kt @@ -680,7 +680,8 @@ class LegacyHomeFragmentAdapterAssistant( mContext, holder.binding.downloadBtn, gameEntity, position, mAdapter, StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (position + 1).toString(), "])"), - StringUtils.buildString("游戏-专题-", subjectData.name, ":", gameEntity.name), item.exposureEvent + location = StringUtils.buildString("游戏-专题-", subjectData.name, ":", gameEntity.name), + traceEvent = item.exposureEvent ) DownloadItemUtils.updateItem( mContext, diff --git a/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt index d39e61a8d8..be9f67a912 100644 --- a/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/discovercard/DiscoverCardGameAdapter.kt @@ -86,8 +86,8 @@ class DiscoverCardGameAdapter( position, this, StringUtils.buildString("(${mEntrance}", "-发现页卡片[", (position).toString(), "])"), - StringUtils.buildString(mEntrance, ":", gameEntity.name), - gameEntity.exposureEvent + location = StringUtils.buildString(mEntrance, ":", gameEntity.name), + traceEvent = gameEntity.exposureEvent ) } diff --git a/app/src/main/java/com/gh/gamecenter/home/gamecollection/slide/HomeGameCollectionSlideAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/gamecollection/slide/HomeGameCollectionSlideAdapter.kt index 463df241d9..f21123af6c 100644 --- a/app/src/main/java/com/gh/gamecenter/home/gamecollection/slide/HomeGameCollectionSlideAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/gamecollection/slide/HomeGameCollectionSlideAdapter.kt @@ -5,6 +5,7 @@ import android.util.SparseArray import android.view.View import android.view.ViewGroup import androidx.appcompat.content.res.AppCompatResources +import androidx.core.os.trace import androidx.core.util.forEach import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.DirectUtils @@ -387,8 +388,8 @@ class HomeGameCollectionSlideAdapter( position, null, mEntrance, - "游戏单合集", - gameEntity.exposureEvent, + location = "游戏单合集", + traceEvent = gameEntity.exposureEvent, clickCallback = null, refreshCallback = { DownloadItemUtils.updateItem( diff --git a/app/src/main/java/com/gh/gamecenter/home/horizontalslidevideo/HomeHorizontalSlideVideoItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/horizontalslidevideo/HomeHorizontalSlideVideoItemViewHolder.kt index 2ea3b81a6f..a3d349ee27 100644 --- a/app/src/main/java/com/gh/gamecenter/home/horizontalslidevideo/HomeHorizontalSlideVideoItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/horizontalslidevideo/HomeHorizontalSlideVideoItemViewHolder.kt @@ -85,8 +85,8 @@ class HomeHorizontalSlideVideoItemViewHolder(val binding: ItemHomeHorizontalSlid position, adapter, entrance, - "", - exposureEvent + location = "", + traceEvent = exposureEvent ) DownloadItemUtils.updateItem( binding.root.context, diff --git a/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt index cb6164951d..f1b2a56bcb 100644 --- a/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/skip/PackageSkipAdapter.kt @@ -87,12 +87,9 @@ class PackageSkipAdapter( DownloadItemUtils.setOnClickListener(mContext, holder.binding.downloadBtn, gameEntity, position, this, StringUtils.buildString("应用跳转:", subjectData?.name, "-列表[", (position + 1).toString(), "])"), - StringUtils.buildString("应用跳转-", subjectData?.name, ":", gameEntity.name), null, - object : EmptyCallback { - override fun onCallback() { - LogUtils.uploadPackageSkip("external_show", "下载游戏", gameEntity.id, gameEntity.name) - } - }) + location = StringUtils.buildString("应用跳转-", subjectData?.name, ":", gameEntity.name), + traceEvent = null + ) { LogUtils.uploadPackageSkip("external_show", "下载游戏", gameEntity.id, gameEntity.name) } DownloadItemUtils.updateItem( mContext, gameEntity, diff --git a/app/src/main/java/com/gh/gamecenter/home/test_v2/HomeGameTestV2GameListRvAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/test_v2/HomeGameTestV2GameListRvAdapter.kt index cb568e27e8..7fac8b538f 100644 --- a/app/src/main/java/com/gh/gamecenter/home/test_v2/HomeGameTestV2GameListRvAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/test_v2/HomeGameTestV2GameListRvAdapter.kt @@ -113,8 +113,8 @@ class HomeGameTestV2GameListRvAdapter( mContext, viewHolder.gameDownloadBtn, gameEntity, viewHolder.bindingAdapterPosition, this, StringUtils.buildString(mEntrance, "+(新游开测[", position.toString(), "])"), - StringUtils.buildString("新游开测:", gameEntity.name), - exposureEvent + location = StringUtils.buildString("新游开测:", gameEntity.name), + traceEvent = exposureEvent ) DownloadItemUtils.updateItem( diff --git a/app/src/main/java/com/gh/gamecenter/message/MessageDetailFragment.java b/app/src/main/java/com/gh/gamecenter/message/MessageDetailFragment.java index 2a84653668..1b3fc67cad 100644 --- a/app/src/main/java/com/gh/gamecenter/message/MessageDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/message/MessageDetailFragment.java @@ -382,7 +382,7 @@ public class MessageDetailFragment extends ToolbarFragment implements OnCommentC e1.printStackTrace(); } } - ErrorHelper.handleError(requireContext(), errorString, false, mBinding.pieceCommentTypingContainer.answerCommentSendBtn::performClick, "文章及帖子的评论和回复"); + ErrorHelper.handleError(requireContext(), errorString, false, "文章及帖子的评论和回复", "社区实名", "", "内容实名", null, mBinding.pieceCommentTypingContainer.answerCommentSendBtn::performClick); } }); }); diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt index abca992441..fb1c34fedb 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt @@ -144,7 +144,8 @@ class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewMo position, this, mEntrance, - StringUtils.buildString(mEntrance, ":", gameEntity.name), exposureEvent + location = StringUtils.buildString(mEntrance, ":", gameEntity.name), + traceEvent = exposureEvent ) } initDownloadButtonOffset(holder.binding) diff --git a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt index 38b792d680..c39a29991d 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt @@ -179,16 +179,15 @@ open class PlayedGameAdapter( position, this, "(${mEntrance})", - StringUtils.buildString(mEntrance, ":", gameEntity.name), exposureEvent, object : EmptyCallback { - override fun onCallback() { - NewFlatLogUtils.logMyGamePlayedTabGameCardClick( - "按钮", - gameEntity.id, - gameEntity.name ?: "" - ) - } - } - ) + location = StringUtils.buildString(mEntrance, ":", gameEntity.name), + traceEvent = exposureEvent + ) { + NewFlatLogUtils.logMyGamePlayedTabGameCardClick( + "按钮", + gameEntity.id, + gameEntity.name ?: "" + ) + } DownloadItemUtils.updateItem( mContext, gameEntity, diff --git a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java index 900aaf1e65..befbb414b2 100644 --- a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java @@ -280,9 +280,9 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { return true; } - boolean b = DefaultUrlHandler.transformNormalScheme(mContext, url, StringUtils.buildString(mEntrance, "+(新闻详情[", mNewsDetailEntity.getTitle(), "])")); + boolean b = DefaultUrlHandler.transformNormalScheme(mContext, url, StringUtils.buildString(mEntrance, "+(新闻详情[", mNewsDetailEntity.getTitle(), "])"), ""); if (!b) { - return DefaultUrlHandler.interceptUrl(mContext, url, StringUtils.buildString(mEntrance, "+(新闻详情[", mNewsDetailEntity.getTitle(), "])")); + return DefaultUrlHandler.interceptUrl(mContext, url, StringUtils.buildString(mEntrance, "+(新闻详情[", mNewsDetailEntity.getTitle(), "])"), ""); } return true; diff --git a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalBannerAdapter.kt b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalBannerAdapter.kt index f6b2f2f2ac..7c72d55dda 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalBannerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalBannerAdapter.kt @@ -39,9 +39,10 @@ class HaloPersonalBannerAdapter(context: Context) : BaseRecyclerAdapter(binding.root) { - fun bindBanner(entity: AddonLinkEntity) { + fun bindBanner(entity: AddonLinkEntity, position: Int) { ImageUtils.display(binding.bannerIv, entity.icon) binding.root.setOnClickListener { NewFlatLogUtils.logHaloSelfClick("活动位", entity.link?.text ?: "") @@ -78,6 +79,7 @@ class HaloPersonalBannerAdapter(context: Context) : BaseRecyclerAdapter { @@ -212,7 +214,7 @@ class HaloPersonalBannerAdapter(context: Context) : BaseRecyclerAdapter { - DirectUtils.directToLinkPage(mContext, it, "我的光环banner", "") + DirectUtils.directToLinkPage(mContext, it, "我的光环banner", "", "我的光环-活动banner") } } } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt index d3c755547a..67adead66f 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt @@ -88,6 +88,11 @@ class FollowersOrFansAdapter(context: Context, val mViewModel: FollowersOrFansVi } holder.binding.followerBtn.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = entity.id, + userName = entity.name, + buttonName = holder.binding.followerBtn.text.toString() + ) mContext.ifLogin("个人主页-粉丝-[关注]") { if (entity.id != UserManager.getInstance().userId) { if (entity?.me?.isFollower!!) { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt index 89518888bb..d0edd18fc3 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt @@ -11,7 +11,7 @@ class PersonalItemViewHolder(val binding: CommunityAnswerItemBinding) : fun bindPersonalItem(entity: PersonalHistoryEntity, entrance: String) { commentCount.isClickable = true - bindCommendAndVote(entity.transformAnswerEntity(), entrance) + bindCommendAndVote(entity, entrance) if (entity.community.type == "official_bbs") { forumIcon?.displayGameIcon(entity.community.icon, null) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt index adc2bb2626..44038f559d 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt @@ -113,6 +113,11 @@ class UserHomeFragment : ToolbarFragment() { it.background = data?.background } + SensorsBridge.trackPersonalHomepageBrowsing( + userId = it.id, + customerType = it.auth?.text ?: "" + ) + updateUserInfo(it) updateTab(it) trackMtaEvent(it.name) @@ -654,6 +659,11 @@ class UserHomeFragment : ToolbarFragment() { requireContext().startActivity(UserInfoActivity.getIntent(requireContext())) } userConcernContainer.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = personalData.id, + userName = personalData.name, + buttonName = "关注" + ) ifLogin("个人主页-关注-[关注]") { MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注按钮") mUserHomeViewModel.follow() @@ -661,6 +671,11 @@ class UserHomeFragment : ToolbarFragment() { } userConcernedBtn.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = personalData.id, + userName = personalData.name, + buttonName = "已关注" + ) ifLogin("个人主页-关注-[关注]") { MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注按钮") DialogHelper.showDialog( diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt index 9836dae782..c4b795e8e2 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt @@ -266,7 +266,8 @@ class UserHistoryFragment : ListFragment { val communityId = if (!entity.communityId.isNullOrEmpty()) entity.communityId - ?: "" else entity.bbs.id + ?: "" else entity.community.id val intent = ArticleDetailActivity.getCommentIntent( itemView.context, CommunityEntity(communityId, entity.communityName ?: ""), @@ -70,18 +70,17 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } "video" -> { val communityId = if (!entity.communityId.isNullOrEmpty()) entity.communityId - ?: "" else entity.bbs.id + ?: "" else entity.community.id itemView.context.startActivity( ForumVideoDetailActivity.getIntent( - itemView.context, entity.id - ?: "", communityId, true + itemView.context, entity.id, communityId, true ) ) } "answer" -> { val intent = CommentActivity.getAnswerCommentIntent( itemView.context, - entity.id ?: "", + entity.id, entity.count.comment, false ) @@ -89,8 +88,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } else -> { val intent = NewQuestionDetailActivity.getCommentIntent( - itemView.context, entity.id - ?: "", entrance, "" + itemView.context, entity.id, entrance, "" ) itemView.context.startActivity(intent) } @@ -103,6 +101,16 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH debounceActionWithInterval(R.id.container_like, 1000) { CheckLoginUtils.checkLogin(itemView.context, "${entrance}-点赞") { + SensorsBridge.trackArticleLikeClick( + customerType = entity.user.auth?.text ?: "", + articleId = entity.id, + bbsId = entity.community.id, + bbsType = entity.community.typeChinese, + activityTag = entity.tagActivityName, + gameForumType = entity.community.game?.categoryChinese ?: "", + articleType = entity.typeChinese, + buttonName = if (voteIcon.isChecked) "取消点赞" else "赞同" + ) if (!voteIcon.isChecked) voteAnswer(entity) else cancelAnswerVote(entity) } @@ -129,8 +137,8 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } } - open fun bindCommendAndVote(entity: ArticleEntity, entrance: String, position: Int? = null) { - binNormalView(entity.transformAnswerEntity()) + open fun bindCommendAndVote(entity: CommunityItemData, entrance: String, position: Int? = null) { + binNormalView(entity) if (entity.community.type == "official_bbs") { forumIcon?.displayGameIcon(entity.community.icon, null) @@ -274,8 +282,18 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } if (entity.type != "question") { - if (!voteIcon.isChecked) voteAnswer(entity.transformAnswerEntity()) - else cancelAnswerVote(entity.transformAnswerEntity()) + SensorsBridge.trackArticleLikeClick( + customerType = entity.user.auth?.text ?: "", + articleId = entity.id, + bbsId = entity.community.id, + bbsType = entity.community.typeChinese, + activityTag = entity.tagActivityName, + gameForumType = entity.community.game?.categoryChinese ?: "", + articleType = entity.typeChinese, + buttonName = if (voteIcon.isChecked) "取消点赞" else "赞同" + ) + if (!voteIcon.isChecked) voteAnswer(entity) + else cancelAnswerVote(entity) MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "点赞图标") } } @@ -283,7 +301,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } } - fun binNormalView(entity: AnswerEntity) { + fun binNormalView(entity: CommunityItemData) { setVoteAndCommentStyle(entity) inviteAnswer.visibility = View.GONE voteCountContainer.visibility = View.VISIBLE @@ -304,7 +322,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } } - private fun setVoteAndCommentStyle(entity: AnswerEntity) { + private fun setVoteAndCommentStyle(entity: CommunityItemData) { if (entity.type != "question") { if (!entity.active) { voteIcon.setImageResource(R.drawable.community_vote_unavailable) @@ -330,7 +348,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } @SuppressLint("CheckResult") - fun voteAnswer(entity: AnswerEntity) { + fun voteAnswer(entity: CommunityItemData) { if (entity.status == "pending") { ToastUtils.showToast("内容审核中") return @@ -417,7 +435,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } @SuppressLint("CheckResult") - fun cancelAnswerVote(entity: AnswerEntity) { + fun cancelAnswerVote(entity: CommunityItemData) { if (entity.type == "video") { RetrofitManager.getInstance() .api.undoVoteVideo(entity.id) @@ -528,13 +546,13 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } else if (404001 == it) { Utils.toast(itemView.context, "内容可能已被删除") entity.active = false - setVoteAndCommentStyle(entity.transformAnswerEntity()) + setVoteAndCommentStyle(entity) true } else { entity.count.vote = entity.count.vote - 1 entity.me.isCommunityArticleVote = false voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" - setVoteAndCommentStyle(entity.transformAnswerEntity()) + setVoteAndCommentStyle(entity) false } } @@ -573,13 +591,13 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } else if (404001 == it) { Utils.toast(itemView.context, "内容可能已被删除") entity.active = false - setVoteAndCommentStyle(entity.transformAnswerEntity()) + setVoteAndCommentStyle(entity) true } else { entity.count.vote = entity.count.vote + 1 entity.me.isCommunityArticleVote = true voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" - setVoteAndCommentStyle(entity.transformAnswerEntity()) + setVoteAndCommentStyle(entity) false } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt index c4ab5567b5..97243ecc1d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt @@ -111,7 +111,7 @@ class CommunityAnswerItemViewHolder(val binding: CommunityAnswerItemBinding) : } ) title.goneIf(entity.type == "answer") - title.text = if (entity.type.contains("video")) entity.articleTitle else entity.questions.title + title.text = if (entity.type.contains("video")) entity.title else entity.questions.title content.text = if (entity.type.contains("video")) entity.des else entity.brief popularAnswerContainer.background = GradientDrawable().apply { setColor(Color.parseColor("#F5F6F7")) diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt index 565e2d5b7d..254e4a3b47 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt @@ -896,6 +896,11 @@ open class AnswerDetailFragment : ToolbarFragment() { DirectUtils.directToHomeActivity(requireContext(), mViewModel.answerDetail!!.user.id, mEntrance, "回答详情") } mBinding.followTv.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = mViewModel.answerDetail?.user?.id ?: "", + userName = mViewModel.answerDetail?.user?.name ?: "", + buttonName = mBinding.followTv.text.toString() + ) ifLogin("回答详情-[关注]用户") { if (mBinding.followTv.text == "关注") { mViewModel.follow(mViewModel.answerDetail!!.user.id!!) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt index 2a85a419e5..04adff47b5 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt @@ -56,10 +56,12 @@ class ArticleDetailActivity : ToolBarActivity() { articleId: String, entrance: String, path: String, - specialColumn: SpecialColumn? = null + specialColumn: SpecialColumn? = null, + sourceEntrance: String = "", ): Intent { val intent = Intent(context, ArticleDetailActivity::class.java) intent.putExtra(EntranceConsts.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) intent.putExtra(EntranceConsts.KEY_COMMUNITY_ARTICLE_ID, articleId) intent.putExtra(EntranceConsts.KEY_COMMUNITY_DATA, community) intent.putExtra(EntranceConsts.KEY_PATH, path) @@ -95,9 +97,11 @@ class ArticleDetailActivity : ToolBarActivity() { recommendId: String, entrance: String, path: String, + sourceEntrance: String = "", ): Intent { val intent = Intent(context, ArticleDetailActivity::class.java) intent.putExtra(EntranceConsts.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) intent.putExtra(EntranceConsts.KEY_COMMUNITY_ARTICLE_ID, articleId) intent.putExtra(EntranceConsts.KEY_RECOMMEND_ID, recommendId) intent.putExtra(EntranceConsts.KEY_COMMUNITY_DATA, community) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt index f3f8cf90a3..c9778b2953 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt @@ -103,6 +103,11 @@ class ArticleDetailContentViewHolder( val bbsType = if (article.type == "game_bbs") "游戏论坛" else "综合论坛" followBtn.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = article.user.id ?: "", + userName = article.user.name ?: "", + buttonName = followBtn.text.toString() + ) MtaHelper.onEvent("帖子详情", "内容区域", "关注") NewLogUtils.logArticleDetailClick( "click_article_detail_follow", article.user.id diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index 6d1e10fb41..216439d6c2 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -15,6 +15,9 @@ import androidx.core.view.ViewCompat import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.RecyclerView import com.ethanhua.skeleton.Skeleton +import com.gh.common.browse.ValueBrowseTimer +import com.gh.common.browse.asObserver +import com.gh.common.browse.withLifecycle import com.gh.common.history.HistoryHelper import com.gh.common.util.* import com.gh.common.util.LogUtils @@ -68,6 +71,34 @@ class ArticleDetailFragment : BaseCommentFragment() + .withLifecycle(this) + .withStart { + SensorsBridge.trackArticleDetailsBrowsing( + bbsId = it?.community?.id ?: "", + bbsType = it?.community?.typeChinese ?: "综合论坛", + customerType = it?.user?.auth?.text ?: "", + gameForumType = it?.community?.game?.categoryChinese ?: "", + activityTag = it?.tagActivityName ?: "", + articleType = "帖子", + sourceEntrance = sourceEntrance + ) + } + .withResult { detail, time -> + SensorsBridge.trackArticleBrowsingDuration( + bbsId = detail?.community?.id ?: "", + bbsType = detail?.community?.typeChinese ?: "综合论坛", + customerType = detail?.user?.auth?.text ?: "", + gameForumType = detail?.community?.game?.categoryChinese ?: "", + activityTag = detail?.tagActivityName ?: "", + articleId = detail?.id ?: "", + articleType = "帖子", + stayLength = time / 1000.0, + sourceEntrance = sourceEntrance + ) + } override fun getLayoutId() = 0 @@ -83,7 +114,10 @@ class ArticleDetailFragment : BaseCommentFragment - val topSuccessToast = if(top) { + val topSuccessToast = if (top) { R.string.article_detail_top_success_toast } else { R.string.article_detail_cancel_top_success_toast @@ -552,30 +615,52 @@ class ArticleDetailFragment : BaseCommentFragment Permissions.GUEST ) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_unselect_title), R.drawable.icon_more_panel_essence_cancel)) + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_unselect_title), + R.drawable.icon_more_panel_essence_cancel + ) + ) } } else { if ((moderatorPermissions?.highlightCommunityArticle ?: Permissions.GUEST) > Permissions.GUEST ) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_select_title), R.drawable.icon_more_panel_essence)) + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_select_title), + R.drawable.icon_more_panel_essence + ) + ) } } } @@ -586,7 +671,12 @@ class ArticleDetailFragment : BaseCommentFragment Permissions.GUEST && mViewModel.detailEntity?.status == ArticleDetailEntity.STATUS_PASS ) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_edit_activity_tag_title), R.drawable.icon_more_panel_modify_label)) + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_edit_activity_tag_title), + R.drawable.icon_more_panel_modify_label + ) + ) } // 隐藏/删除 @@ -594,22 +684,44 @@ class ArticleDetailFragment : BaseCommentFragment Permissions.GUEST ) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_hide_title), R.drawable.icon_more_panel_delete)) + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_hide_title), + R.drawable.icon_more_panel_delete + ) + ) } else { if (mViewModel.detailEntity?.user?.id == UserManager.getInstance().userId) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_delete_title), R.drawable.icon_more_panel_delete)) + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_delete_title), + R.drawable.icon_more_panel_delete + ) + ) } } // 置顶/取消置顶 if (mViewModel.detailEntity?.me?.isModerator == true && mViewModel.detailEntity?.me?.isCommunityTop == false - && (moderatorPermissions?.topCommunityArticle ?: Permissions.GUEST) > Permissions.GUEST) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_top_title), R.drawable.icon_more_panel_top)) + && (moderatorPermissions?.topCommunityArticle ?: Permissions.GUEST) > Permissions.GUEST + ) { + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_top_title), + R.drawable.icon_more_panel_top + ) + ) } else if (mViewModel.detailEntity?.me?.isModerator == true && mViewModel.detailEntity?.me?.isCommunityTop == true - && (moderatorPermissions?.cancelTopCommunityArticle ?: Permissions.GUEST) > Permissions.GUEST) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_cancel_top_title), R.drawable.icon_more_panel_top_cancel)) + && (moderatorPermissions?.cancelTopCommunityArticle ?: Permissions.GUEST) > Permissions.GUEST + ) { + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_cancel_top_title), + R.drawable.icon_more_panel_top_cancel + ) + ) } MoreFunctionPanelDialog.showMoreDialog( @@ -624,7 +736,10 @@ class ArticleDetailFragment : BaseCommentFragment Unit { return { - val bbsType = if (mViewModel.detailEntity?.type == "game_bbs") "游戏论坛" else "综合论坛" when (it?.text) { getString(R.string.article_detail_more_edit_title) -> { startActivityForResult( @@ -657,48 +771,65 @@ class ArticleDetailFragment : BaseCommentFragment { ifLogin("帖子详情") { BbsReportHelper.showReportDialog(mViewModel.detailEntity?.id ?: "") } NewLogUtils.logSharePanelClick( - "click_report", mViewModel.detailEntity?.user?.id - ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType + "click_report", + mViewModel.detailEntity?.user?.id ?: "", + "帖子", + mViewModel.detailEntity?.id ?: "", + mViewModel.detailEntity?.community?.id ?: "", + mViewModel.detailEntity?.community?.typeChinese ?: "综合论坛" ) } + getString(R.string.article_detail_more_apply_select_title) -> { if (mViewModel.detailEntity?.getSimplifyChoicenessStatus() == "apply") { ToastUtils.showToast("申请加精审核中") } else { mViewModel.doApplyHighlightThisArticle(mViewModel.articleId) NewLogUtils.logSharePanelClick( - "click_apply_essence", mViewModel.detailEntity?.user?.id - ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType + "click_apply_essence", + mViewModel.detailEntity?.user?.id ?: "", + "帖子", + mViewModel.detailEntity?.id ?: "", + mViewModel.detailEntity?.community?.id ?: "", + mViewModel.detailEntity?.community?.typeChinese ?: "综合论坛" ) } } + getString(R.string.article_detail_more_select_title) -> { if (mViewModel.detailEntity?.getSimplifyChoicenessStatus() == "apply") { ToastUtils.showToast("加精审核中") } else { showHighlightDialog(true) NewLogUtils.logSharePanelClick( - "click_essence", mViewModel.detailEntity?.user?.id - ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType + "click_essence", + mViewModel.detailEntity?.user?.id ?: "", + "帖子", + mViewModel.detailEntity?.id ?: "", + mViewModel.detailEntity?.community?.id ?: "", + mViewModel.detailEntity?.community?.typeChinese ?: "综合论坛" ) } } + getString(R.string.article_detail_more_unselect_title) -> { showHighlightDialog(false) } + getString(R.string.article_detail_more_edit_activity_tag_title) -> { ChooseActivityDialogFragment.show( requireActivity() as AppCompatActivity, @@ -708,6 +839,7 @@ class ArticleDetailFragment : BaseCommentFragment { DialogHelper.showDialog( @@ -721,11 +853,15 @@ class ArticleDetailFragment : BaseCommentFragment { TopCommunityCategoryDialog.show( childFragmentManager @@ -733,6 +869,7 @@ class ArticleDetailFragment : BaseCommentFragment { DialogHelper.showDialog( requireContext(), @@ -751,9 +888,12 @@ class ArticleDetailFragment : BaseCommentFragment Unit { - val bbsType = if (mViewModel.detailEntity?.type == "game_bbs") "游戏论坛" else "综合论坛" return { label -> - showUpdateLabelDialog(mViewModel.detailEntity!!, label, bbsType) + showUpdateLabelDialog( + mViewModel.detailEntity!!, + label, + mViewModel.detailEntity?.community?.typeChinese ?: "综合论坛" + ) } } @@ -1024,10 +1164,13 @@ class ArticleDetailFragment : BaseCommentFragment() + val mFollowLiveData = MutableLiveData() val hide = MutableLiveData() @@ -131,6 +126,7 @@ class ArticleDetailViewModel( .subscribe(object : Response() { override fun onResponse(response: ArticleDetailEntity?) { detailEntity = response + detailEntityLD.value = response topItemData = CommentItemData(articleDetail = response) commentCount = response?.count?.comment ?: 0 loadResultLiveData.postValue(LoadResult.SUCCESS) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt index 4ce507277d..f98485adf7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt @@ -275,11 +275,11 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb }) mViewModel.error.observeNonNull(this) { - ErrorHelper.handleError(this, it, false, { + ErrorHelper.handleError(this, it, false, "发帖子(普通)", "社区实名", "帖子") { if (::mMenuPost.isInitialized) { onMenuItemClick(mMenuPost) } - }, "发帖子(普通)") + } } mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) @@ -602,7 +602,7 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb 200L } else 0L AppExecutor.uiExecutor.executeWithDelay(Runnable { - ChooseForumActivity.startChooseForumActivity(this) + ChooseForumActivity.startChooseForumActivity(this, "社区") }, delayTime) NewLogUtils.logChooseForumPanelEnter("发帖子") } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt index 76dc385345..c16cc8c10c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt @@ -170,8 +170,15 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a if (draftEntity?.id != null) { EventBus.getDefault().post(EBReuse(ArticleEditActivity.ARTICLE_DRAFT_CHANGE_TAG)) } - - SensorsBridge.trackEvent("ArticlePostResult", "post_result", "成功") + SensorsBridge.trackArticlePostResult( + postResult = "成功", + bbsId = mSelectCommunityData?.id ?: "", + bbsType = if (type == "official_bbs") "综合论坛" else "游戏论坛", + activityTag = selectActivityLabelEntity?.name ?: "", + articleType = "帖子", + customerType = UserManager.getInstance().userInfoEntity?.auth?.text ?: "", + gameForumType = mSelectCommunityData?.game?.categoryChinese ?: "" + ) } override fun onFailure(e: HttpException?) { @@ -184,7 +191,15 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a } error.postValue(errorString) // MtaHelper.onEvent("发表文章", "发布失败", CommunityManager.getInstance().community.name) - SensorsBridge.trackEvent("ArticlePostResult", "post_result", "失败") + SensorsBridge.trackArticlePostResult( + postResult = "失败", + bbsId = mSelectCommunityData?.id ?: "", + bbsType = if (type == "official_bbs") "综合论坛" else "游戏论坛", + activityTag = selectActivityLabelEntity?.name ?: "", + articleType = "帖子", + customerType = UserManager.getInstance().userInfoEntity?.auth?.text ?: "", + gameForumType = mSelectCommunityData?.game?.categoryChinese ?: "" + ) } }) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt index cf61818cd7..4a0f1e086b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt @@ -137,6 +137,8 @@ open class NewCommentFragment : ListFragment findView() initListener() + mViewModel.getArticleDetail() + mViewModel.postCommentLiveData.observe(this, Observer { apiResponse -> if (apiResponse == null) return@Observer when { @@ -230,9 +232,8 @@ open class NewCommentFragment : ListFragment else -> "" } ErrorHelper.handleError( - requireContext(), errorString, false, - { commentSendBtn.performClick() }, entrance - ) + requireContext(), errorString, false, entrance, "社区实名" + ) { commentSendBtn.performClick() } if (mCommentType == CommentType.GAME_COLLECTION) { SensorsBridge.trackEvent( "GameCollectDetailCommentClick", @@ -465,6 +466,7 @@ open class NewCommentFragment : ListFragment postComment() } } + mViewModel.trackArticleComment(mCommentEntity != null) } else { toast("操作太快,慢一点嘛") } diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt index 3c14be6da7..07ae53161b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt @@ -17,6 +17,9 @@ import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.GsonUtils import com.gh.gamecenter.entity.CommentDraft import com.gh.gamecenter.feature.entity.CommentEntity +import com.gh.gamecenter.feature.entity.ForumVideoEntity +import com.gh.gamecenter.qa.entity.ArticleDetailEntity +import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.retrofit.RetrofitManager import com.gh.gamecenter.room.AppDatabase import com.gh.gamecenter.room.dao.CommentDraftDao @@ -26,6 +29,7 @@ import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody +import org.json.JSONArray import org.json.JSONObject import retrofit2.HttpException @@ -53,6 +57,10 @@ open class NewCommentViewModel( val pictureList = ArrayList() val pictureLiveData = MutableLiveData>() + var articleDetail: ArticleDetailEntity? = null + var questionDetail: QuestionsDetailEntity? = null + var videoDetail: ForumVideoEntity? = null + init { commentDraftDao = AppDatabase.getInstance().commentDraftDao() } @@ -69,21 +77,270 @@ open class NewCommentViewModel( "time.create:1", page, mapOf() - ).map { + ).zipWith(api.getCommunityArticleDetail(articleId)) { commentList, articleDetail -> + this.articleDetail = articleDetail + commentList + }.map { val type = object : TypeToken>() {}.type GsonUtils.gson.fromJson(it.body()?.toJson() ?: "", type) } - CommentType.COMMUNITY_ARTICLE_CONVERSATION -> api.getCommunityArticleCommentConversation(commentId, page) - CommentType.VIDEO -> api.getVideoCommentList(videoId, page, mapOf()).map { - val type = object : TypeToken>() {}.type - GsonUtils.gson.fromJson(it.body()?.toJson() ?: "", type) - } + CommentType.COMMUNITY_ARTICLE_CONVERSATION -> api.getCommunityArticleCommentConversation(commentId, page) + .zipWith(api.getCommunityArticleDetail(articleId)) { commentList, articleDetail -> + this.articleDetail = articleDetail + commentList + } + + CommentType.VIDEO -> api.getVideoCommentList(videoId, page, mapOf()) + .zipWith(api.getBbsVideoDetail(videoId)) { commentList, videoDetail -> + this.videoDetail = videoDetail + commentList + } + .map { + val type = object : TypeToken>() {}.type + GsonUtils.gson.fromJson(it.body()?.toJson() ?: "", type) + } + CommentType.VIDEO_CONVERSATION -> api.getVideoCommentConversationList(videoId, commentId, page) + .zipWith(api.getBbsVideoDetail(videoId)) { commentList, videoDetail -> + this.videoDetail = videoDetail + commentList + } + + CommentType.COMMUNITY_QUESTION, CommentType.COMMUNITY_QUESTION_CONVERSATION -> { + api.getQuestionsById(questionId) + .observeOn(Schedulers.io()) + .subscribeOn(AndroidSchedulers.mainThread()) + .map { + this.questionDetail = it + emptyList() + } + } + else -> null } } + /** + * 获取帖子详情作为埋点数据源 + */ + @SuppressLint("CheckResult") + fun getArticleDetail() { + val api = RetrofitManager.getInstance().api + + when (commentType) { + CommentType.COMMUNITY_ARTICLE, + CommentType.COMMUNITY_ARTICLE_CONVERSATION -> { + api.getCommunityArticleDetail(articleId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + this.articleDetail = it + }, {}) + } + CommentType.VIDEO, + CommentType.VIDEO_CONVERSATION -> { + api.getBbsVideoDetail(videoId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + this.videoDetail = it + }, {}) + } + CommentType.COMMUNITY_QUESTION, + CommentType.COMMUNITY_QUESTION_CONVERSATION -> { + api.getQuestionsById(questionId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + this.questionDetail = it + }, {}) + } + else -> {} + } + } + + fun trackArticleComment(reply: Boolean) { + when (commentType) { + CommentType.COMMUNITY_QUESTION, + CommentType.COMMUNITY_QUESTION_CONVERSATION -> { + questionDetail?.let { + if (reply) + { + SensorsBridge.trackArticleReply( + customerType = it.user.auth?.text ?: "", + articleId = it.id ?: "", + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "提问帖" + ) + } else { + SensorsBridge.trackArticleComment( + customerType = it.user.auth?.text ?: "", + articleId = it.id ?: "", + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "提问帖" + ) + } + } + } + + CommentType.COMMUNITY_ARTICLE, + CommentType.COMMUNITY_ARTICLE_CONVERSATION -> { + articleDetail?.let { + if (reply) { + SensorsBridge.trackArticleReply( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "帖子" + ) + } else { + SensorsBridge.trackArticleComment( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "帖子" + ) + } + } + } + + CommentType.VIDEO, + CommentType.VIDEO_CONVERSATION -> { + videoDetail?.let { + if (reply) { + SensorsBridge.trackArticleReply( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "", + activityTag = it.tagActivityName, + gameForumType = it.bbs?.game?.categoryChinese ?: "", + articleType = "视频贴" + ) + } else { + SensorsBridge.trackArticleComment( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "", + activityTag = it.tagActivityName, + gameForumType = it.bbs?.game?.categoryChinese ?: "", + articleType = "视频贴" + ) + } + } + } + + else -> {} + } + } + + fun trackArticleCommentResult(reply: Boolean, result: String) { + when (commentType) { + CommentType.COMMUNITY_QUESTION, + CommentType.COMMUNITY_QUESTION_CONVERSATION -> { + questionDetail?.let { + if (reply) { + SensorsBridge.trackArticleReplyResult( + customerType = it.user.auth?.text ?: "", + articleId = it.id ?: "", + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "提问帖", + result = result + ) + } else { + SensorsBridge.trackArticleCommentResult( + customerType = it.user.auth?.text ?: "", + articleId = it.id ?: "", + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "提问帖", + result = result + ) + } + } + } + + CommentType.COMMUNITY_ARTICLE, + CommentType.COMMUNITY_ARTICLE_CONVERSATION -> { + articleDetail?.let { + if (reply) { + SensorsBridge.trackArticleReplyResult( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "帖子", + result = result + ) + } else { + SensorsBridge.trackArticleCommentResult( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.community.id, + bbsType = it.community.typeChinese, + activityTag = it.tagActivityName, + gameForumType = it.community.game?.categoryChinese ?: "", + articleType = "帖子", + result = result + ) + } + } + } + + CommentType.VIDEO, + CommentType.VIDEO_CONVERSATION -> { + videoDetail?.let { + if (reply) { + SensorsBridge.trackArticleReplyResult( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "", + activityTag = it.tagActivityName, + gameForumType = it.bbs?.game?.categoryChinese ?: "", + articleType = "视频贴", + result = result + ) + } else { + SensorsBridge.trackArticleCommentResult( + customerType = it.user.auth?.text ?: "", + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "", + activityTag = it.tagActivityName, + gameForumType = it.bbs?.game?.categoryChinese ?: "", + articleType = "视频贴", + result = result + ) + } + } + } + + else -> {} + } + } + fun postPictureAndComment(content: String, commentEntity: CommentEntity?) { if (pictureList.isNotEmpty()) { UploadImageUtils.compressAndUploadImageList( @@ -189,6 +446,7 @@ open class NewCommentViewModel( .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response() { override fun onResponse(response: ResponseBody?) { + pictureList.clear() deleteCommentDraft(commentEntity) @@ -214,6 +472,8 @@ open class NewCommentViewModel( ) ) } + + trackArticleCommentResult(commentEntity != null, "评论成功") } override fun onFailure(e: HttpException?) { @@ -224,6 +484,7 @@ open class NewCommentViewModel( } else { mPostCommentLiveData.postValue(apiResponse) } + trackArticleCommentResult(commentEntity != null, "评论失败") } }) } @@ -237,21 +498,27 @@ open class NewCommentViewModel( commentEntity != null -> { commentDraftDao?.getDraftById(commentEntity.id ?: "") } + commentType == CommentType.ANSWER || commentType == CommentType.ANSWER_CONVERSATION -> { commentDraftDao?.getDraftById(answerId) } + commentType == CommentType.COMMUNITY_ARTICLE || commentType == CommentType.COMMUNITY_ARTICLE_CONVERSATION -> { commentDraftDao?.getDraftById(articleId) } + commentType == CommentType.COMMUNITY_QUESTION || commentType == CommentType.COMMUNITY_QUESTION_CONVERSATION -> { commentDraftDao?.getDraftById(questionId) } + commentType == CommentType.VIDEO || commentType == CommentType.VIDEO_CONVERSATION -> { commentDraftDao?.getDraftById(videoId) } + commentType == CommentType.GAME_COLLECTION || commentType == CommentType.GAME_COLLECTION_CONVERSATION -> { commentDraftDao?.getDraftById(gameCollectionId) } + else -> return null } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt index ff8b2bc9bd..633d32b2c5 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt @@ -742,8 +742,10 @@ abstract class BaseCommentAdapter( } binding.likeCountTv.setDebouncedClickListener { - binding.likeCountTv.context.ifLogin("帖子评论-点赞") { - if (comment.me?.isCommentVoted != true) { + val isVoted = comment.me?.isCommentVoted == true + val loginEntrance = if (isVoted) "帖子评论-取消点赞" else "帖子评论-点赞" + binding.likeCountTv.context.ifLogin(loginEntrance) { + if (isVoted) { viewModel.like(comment) if (viewModel is ArticleDetailViewModel) { @@ -757,9 +759,7 @@ abstract class BaseCommentAdapter( ?: "", bbsId, bbsType ) } else { - binding.likeCountTv.context.ifLogin("帖子评论-取消点赞") { - viewModel.unLike(comment) - } + viewModel.unLike(comment) } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt index d43d107b1d..b724c0c1b4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt @@ -44,6 +44,8 @@ class ChooseForumActivity : BaseActivity() { DisplayUtils.transparentStatusBar(this) binding = DialogChooseForumBinding.bind(mContentView) + val sourceEntrance = intent.getStringExtra(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "" + initViewPager() binding.searchEt.doOnTextChanged { _, _, _, _ -> val searchKey = binding.searchEt.text?.toString() @@ -52,7 +54,13 @@ class ChooseForumActivity : BaseActivity() { } else { switchUI(true) mSearchResultFragment?.setSearchKeyAndType(searchKey, SearchType.MANUAL.value) - SearchActivity.trackSearchButtonClick(searchKey, TRACK_SEARCH_TYPE_INPUT) + SensorsBridge.trackSearchButtonClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + searchKey, + TRACK_SEARCH_TYPE_INPUT, + sourceEntrance + ) } } binding.searchEt.setOnTouchListener { _, event -> @@ -150,8 +158,9 @@ class ChooseForumActivity : BaseActivity() { companion object { const val CHOOSE_FORUM_REQUEST = 10 - fun startChooseForumActivity(context: Activity) { + fun startChooseForumActivity(context: Activity, sourceEntrance: String) { val intent = Intent(context, ChooseForumActivity::class.java) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) context.overridePendingTransition(0, 0) context.startActivityForResult(intent, CHOOSE_FORUM_REQUEST) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt index ae841c95c6..ae0e0db012 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt @@ -70,6 +70,9 @@ class ChooseForumContainerAdapter( val drawableResId = if (forumEntity.me.isFollowForum) R.drawable.bg_forum_already_follow else R.drawable.bg_forum_follow + + holder.binding.followTv.goneIf(type == ChooseForumContainerFragment.ChooseForumType.ATTENTION.value) + holder.binding.followTv.background = drawableResId.toDrawable(holder.itemView.context) holder.binding.followTv.text = if (forumEntity.me.isFollowForum) "已关注" else "关注" @@ -125,6 +128,13 @@ class ChooseForumContainerAdapter( private fun handleFollowTvClick(binding: ForumItemBinding, forumEntity: ForumEntity) { binding.run { debounceActionWithInterval(R.id.followTv) { + SensorsBridge.trackFollowForumClick( + bbsId = forumEntity.id, + forumName = forumEntity.name, + bbsType = forumEntity.typeChinese, + buttonName = followTv.text.toString(), + gameForumType = forumEntity.game.categoryChinese + ) CheckLoginUtils.checkLogin(mContext, entrance) { if (forumEntity.me.isFollowForum) { viewModel.unFollowForum(forumEntity.id) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt index 7d3eaabee2..b3a9008057 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt @@ -7,11 +7,13 @@ import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.NewFlatLogUtils import com.gh.common.util.NewLogUtils import com.gh.gamecenter.R -import com.gh.gamecenter.SearchActivity.Companion.trackSearchResultClick +import com.gh.gamecenter.SearchActivity import com.gh.gamecenter.SearchType +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.baselist.LazyListFragment import com.gh.gamecenter.common.baselist.ListAdapter import com.gh.gamecenter.common.constant.EntranceConsts +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.viewModelProvider import com.gh.gamecenter.core.utils.HtmlUtils import com.gh.gamecenter.entity.ForumEntity @@ -48,7 +50,13 @@ class ChooseForumContainerFragment : LazyListFragment - trackSearchResultClick(mSearchKey, mSearchType) + SensorsBridge.trackSearchResultClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + mSearchKey, + SearchActivity.toTrackSearchType(mSearchType), + mListViewModel.sourceEntrance + ) if (requireActivity() is ChooseForumActivity) { (requireActivity() as ChooseForumActivity).chooseSuccess(enity) val bbsType = if (enity.type == "game_bbs") "游戏论坛" else "综合论坛" @@ -62,7 +70,8 @@ class ChooseForumContainerFragment : LazyListFragment(application) { @@ -71,7 +74,14 @@ class ChooseForumContainerViewModel( mResultLiveData.addSource>(mListLiveData) { mResultLiveData.postValue(it) if (mPage == 1) { - SearchActivity.trackSearchResultReturn(searchKey, searchType, it.isNotEmpty()) + SensorsBridge.trackSearchResultReturn( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + searchKey, + SearchActivity.toTrackSearchType(searchType), + it.isNotEmpty(), + sourceEntrance + ) } } } @@ -106,10 +116,10 @@ class ChooseForumContainerViewModel( mCompositeDisposable.clear() } - class Factory(val type: String, val searchKey: String, val searchType: String) : + class Factory(val type: String, val searchKey: String, val searchType: String, private val sourceEntrance: String) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { - return ChooseForumContainerViewModel(HaloApp.getInstance().application, type, searchKey, searchType) as T + return ChooseForumContainerViewModel(HaloApp.getInstance().application, type, searchKey, searchType, sourceEntrance) as T } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/GameDefaultAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/GameDefaultAdapter.kt index f4a88dc7d8..06fd013821 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/editor/GameDefaultAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/GameDefaultAdapter.kt @@ -40,7 +40,7 @@ class GameDefaultAdapter( val intent = Intent() intent.putExtra( GameEntity::class.java.simpleName, - GameEntity(id = entity.gameId, mIcon = entity.gameIcon, mName = entity.gameName) + GameEntity(id = entity.gameId, mIcon = entity.gameIcon, mName = entity.gameName, mCategory = entity.category) ) (mContext as Activity).setResult(Activity.RESULT_OK, intent) (mContext as Activity).finish() diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt index eda9ead712..41e085b8ec 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt @@ -69,14 +69,6 @@ class ArticleDetailEntity( } } -@Parcelize -class SectionEntity( - @SerializedName("_id") - val id: String = "", - val name: String = "" -) : Parcelable - - @Parcelize class ActivityTagEntity( @SerializedName("_id") diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/EditorInsertDefaultEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/EditorInsertDefaultEntity.kt index 4446c2d016..47954c453a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/EditorInsertDefaultEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/EditorInsertDefaultEntity.kt @@ -9,5 +9,7 @@ data class EditorInsertDefaultEntity( val gameName: String = "", @SerializedName("game_icon") val gameIcon: String = "", + @SerializedName("game_category") + val category: String = "", val type: String = "" ) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt index fa64a03e6b..13ba568bc0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt @@ -67,6 +67,13 @@ class QuestionsDetailEntity( } } + val typeChinese: String get() = when(type) { + "question" -> "提问帖" + "community_article" -> "帖子" + "video" -> "视频贴" + else -> type ?: "" + } + fun setFollowCount(count: Int) { this.followCount = count } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt index 8466a7a8ac..08bb107ce6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt @@ -433,11 +433,11 @@ class QuestionEditActivity : BaseRichEditorActivity(), ) return@Observer } else if (errorCode == 403209) { - ErrorHelper.handleError(this, string, false, { + ErrorHelper.handleError(this, string, false, "发帖子(问答)", articleType = "提问帖") { if (::mMenuPost.isInitialized) { onMenuItemClick(mMenuPost) } - }, "发帖子(问答)") + } } } toast(R.string.post_failure_hint) @@ -638,7 +638,7 @@ class QuestionEditActivity : BaseRichEditorActivity(), 200L } else 0L AppExecutor.uiExecutor.executeWithDelay(Runnable { - ChooseForumActivity.startChooseForumActivity(this) + ChooseForumActivity.startChooseForumActivity(this, "社区") }, delayTime) NewLogUtils.logChooseForumPanelEnter("发提问") } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt index af72904d17..7830a721c4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt @@ -10,10 +10,6 @@ import com.gh.base.BaseRichEditorViewModel import com.gh.base.RichType import com.gh.gamecenter.common.base.fragment.WaitingDialogFragment import com.gh.gamecenter.R -import com.gh.gamecenter.common.utils.singleToMain -import com.gh.gamecenter.common.utils.toJson -import com.gh.gamecenter.common.utils.toRequestBody -import com.gh.gamecenter.common.utils.tryWithDefaultCatch import com.gh.gamecenter.core.utils.* import com.gh.gamecenter.entity.ActivityLabelEntity import com.gh.gamecenter.common.entity.CommunityEntity @@ -26,6 +22,7 @@ import com.gh.gamecenter.feature.entity.QuestionDraftEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.common.retrofit.BiResponse import com.gh.gamecenter.common.retrofit.Response +import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.entity.ForumDetailEntity import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers @@ -230,12 +227,31 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( if (!questionDraftEntity?.id.isNullOrEmpty()) { EventBus.getDefault().post(EBReuse(QuestionEditActivity.QUESTION_DRAFT_CHANGE_TAG)) } + + SensorsBridge.trackArticlePostResult( + postResult = "成功", + bbsId = communityEntity?.id ?: "", + bbsType = if (type == "official_bbs") "综合论坛" else "游戏论坛", + activityTag = selectActivityLabelEntity?.name ?: "", + articleType = "提问帖", + customerType = UserManager.getInstance().userInfoEntity?.auth?.text ?: "", + gameForumType = communityEntity?.game?.categoryChinese ?: "" + ) } override fun onFailure(e: HttpException?) { processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", false)) postLiveData.postValue(Resource.error(e)) MtaHelper.onEvent("发表问题", "提交失败", communityEntity?.name) + SensorsBridge.trackArticlePostResult( + postResult = "失败", + bbsId = communityEntity?.id ?: "", + bbsType = if (type == "official_bbs") "综合论坛" else "游戏论坛", + activityTag = selectActivityLabelEntity?.name ?: "", + articleType = "提问帖", + customerType = UserManager.getInstance().userInfoEntity?.auth?.text ?: "", + gameForumType = communityEntity?.game?.categoryChinese ?: "" + ) } }) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt index 0fa274cf6b..3abfad9724 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt @@ -188,7 +188,7 @@ class TagsSelectFragment : BaseFragment() { }) } else -> { - ErrorHelper.handleError(requireContext(), errorString, showHighPriorityHint = true) + ErrorHelper.handleError(requireContext(), errorString, true, sourceEntrance = "社区实名", articleType = "提问帖") } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt index c812075338..e1e8b5d3c4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt @@ -51,12 +51,14 @@ class NewQuestionDetailActivity : ToolBarActivity() { context: Context, questionId: String, entrance: String, - path: String + path: String, + sourceEntrance: String = "", ): Intent { val intent = Intent(context, NewQuestionDetailActivity::class.java) intent.putExtra(EntranceConsts.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) intent.putExtra(EntranceConsts.KEY_QUESTIONS_ID, questionId) intent.putExtra(EntranceConsts.KEY_PATH, path) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) return intent } @@ -103,7 +105,8 @@ class NewQuestionDetailActivity : ToolBarActivity() { recommendId: String, entrance: String, path: String, - scrollToComment: Boolean = false + scrollToComment: Boolean = false, + sourceEntrance: String = "", ): Intent { val intent = Intent(context, NewQuestionDetailActivity::class.java) intent.putExtra(EntranceConsts.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) @@ -112,6 +115,7 @@ class NewQuestionDetailActivity : ToolBarActivity() { intent.putExtra(EntranceConsts.KEY_RECOMMEND_ID, recommendId) intent.putExtra(EntranceConsts.KEY_SCROLL_TO_COMMENT_AREA, scrollToComment) intent.putExtra(EntranceConsts.KEY_PATH, path) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) return intent } @@ -121,7 +125,8 @@ class NewQuestionDetailActivity : ToolBarActivity() { questionId: String, topCommentId: String, entrance: String, - path: String + path: String, + sourceEntrance: String = "" ): Intent { val intent = Intent(context, NewQuestionDetailActivity::class.java) intent.putExtra(EntranceConsts.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) @@ -129,6 +134,7 @@ class NewQuestionDetailActivity : ToolBarActivity() { intent.putExtra(EntranceConsts.KEY_TOP_COMMENT_ID, topCommentId) intent.putExtra(EntranceConsts.KEY_SCROLL_TO_COMMENT_AREA, true) intent.putExtra(EntranceConsts.KEY_PATH, path) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) return intent } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt index 1e02931daa..ea11af2d9d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt @@ -15,6 +15,9 @@ import androidx.core.view.ViewCompat import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.RecyclerView import com.ethanhua.skeleton.Skeleton +import com.gh.common.browse.ValueBrowseTimer +import com.gh.common.browse.asObserver +import com.gh.common.browse.withLifecycle import com.gh.common.util.BbsReportHelper import com.gh.common.util.LogUtils import com.gh.common.util.NewLogUtils @@ -59,6 +62,34 @@ class NewQuestionDetailFragment : private lateinit var mBinding: FragmentArticleDetailBinding private var mAttentionMenu: MenuItem? = null private var mIsToolbarUserShow = false + private var sourceEntrance: String = "" + + private val browseTimer = ValueBrowseTimer() + .withLifecycle(this) + .withStart { + SensorsBridge.trackArticleDetailsBrowsing( + bbsId = it?.community?.id ?: "", + bbsType = if (it?.community?.type == "official_bbs") "综合论坛" else "游戏论坛", + customerType = it?.user?.auth?.text ?: "", + gameForumType = it?.community?.game?.categoryChinese ?: "", + activityTag = it?.tagActivityName ?: "", + articleType = "提问帖", + sourceEntrance = sourceEntrance + ) + } + .withResult { detail, time -> + SensorsBridge.trackArticleBrowsingDuration( + bbsId = detail?.community?.id ?: "", + bbsType = detail?.community?.typeChinese ?: "综合论坛", + customerType = detail?.user?.auth?.text ?: "", + gameForumType = detail?.community?.game?.categoryChinese ?: "", + activityTag = detail?.tagActivityName ?: "", + articleId = detail?.id ?: "", + articleType = "提问帖", + stayLength = time / 1000.0, + sourceEntrance = sourceEntrance + ) + } override fun getLayoutId() = 0 @@ -83,7 +114,9 @@ class NewQuestionDetailFragment : ?: false mIsRecommendsContent = arguments?.getBoolean(EntranceConsts.KEY_RECOMMENDS_CONTENTS, false) ?: false + sourceEntrance = arguments?.getString(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "" NewLogUtils.logQuestionDetailClick("view_question_detail") + mViewModel.questionDetailLD.observe(this, browseTimer.asObserver()) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -192,16 +225,18 @@ class NewQuestionDetailFragment : .load(R.layout.fragment_article_detail_skeleton) .show() - val bbsType = if (mViewModel.questionDetail?.type == "game_bbs") "游戏论坛" else "综合论坛" mBinding.inputContainer.replyTv.text = "说点什么吧" mBinding.inputContainer.replyTv.setRoundedColorBackground(R.color.ui_container_2, 19F) mBinding.inputContainer.replyTv.setDebouncedClickListener { clickToastByStatus(mViewModel.questionDetail?.status ?: "") { startCommentActivity() NewLogUtils.logCommentClick( - "click_comment_area_comment_input_box", mViewModel.questionDetail?.user?.id - ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType + "click_comment_area_comment_input_box", + mViewModel.questionDetail?.user?.id ?: "", + "提问帖", + mViewModel.questionDetail?.id ?: "", + mViewModel.questionDetail?.community?.id ?: "", + mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛" ) } } @@ -233,9 +268,22 @@ class NewQuestionDetailFragment : clickToastByStatus(mViewModel.questionDetail?.status ?: "") { mViewModel.postFavoriteQuestion() NewLogUtils.logCommentClick( - "click_comment_area_collect", mViewModel.questionDetail?.user?.id - ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType + "click_comment_area_collect", + mViewModel.questionDetail?.user?.id ?: "", + "提问帖", + mViewModel.questionDetail?.id ?: "", + mViewModel.questionDetail?.community?.id ?: "", + mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛" + ) + SensorsBridge.trackArticleCollectionClick( + customerType = mViewModel.questionDetail?.user?.auth?.text ?: "", + articleId = mViewModel.questionDetail?.id ?: "", + bbsId = mViewModel.questionDetail?.community?.id ?: "", + bbsType = mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛", + activityTag = mViewModel.questionDetail?.tagActivityName ?: "", + gameForumType = mViewModel.questionDetail?.community?.game?.categoryChinese ?: "", + articleType = "提问帖", + buttonName = if (mViewModel.questionDetail?.me?.isFavorite == true) "已收藏" else "收藏" ) } } @@ -591,6 +639,9 @@ class NewQuestionDetailFragment : contentId = mViewModel.questionDetail?.id ?: "" bbsId = mViewModel.questionDetail?.community?.id ?: "" bbsType = if (mViewModel.questionDetail?.community?.type == "game_bbs") "游戏论坛" else "综合论坛" + customerType = mViewModel.questionDetail?.user?.auth?.text ?: "" + activityTagName = mViewModel.questionDetail?.tagActivityName ?: "" + gameForumType = mViewModel.questionDetail?.community?.game?.categoryChinese ?: "" refUserId = UserManager.getInstance().userId } return NormalShareEntity( @@ -618,7 +669,6 @@ class NewQuestionDetailFragment : private fun getItemClickCallback(questionEntity: QuestionsDetailEntity): (menuItem: MenuItemEntity?) -> Unit { return { - val bbsType = if (mViewModel.questionDetail?.type == "game_bbs") "游戏论坛" else "综合论坛" when (it?.text) { "投诉" -> { ifLogin("提问贴") { @@ -628,10 +678,12 @@ class NewQuestionDetailFragment : ) } NewLogUtils.logSharePanelClick( - "click_report", mViewModel.questionDetail?.user?.id - ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id - ?: "", bbsType + "click_report", + mViewModel.questionDetail?.user?.id ?: "", + "提问帖", + mViewModel.questionDetail?.id ?: "", + mViewModel.questionDetail?.community?.id ?: "", + mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛" ) } "编辑" -> { @@ -648,9 +700,12 @@ class NewQuestionDetailFragment : QUESTIONS_EDIT_REQUEST ) NewLogUtils.logSharePanelClick( - "click_modification_question", mViewModel.questionDetail?.user?.id - ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType + "click_modification_question", + mViewModel.questionDetail?.user?.id ?: "", + "提问帖", + mViewModel.questionDetail?.id ?: "", + mViewModel.questionDetail?.community?.id ?: "", + mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛" ) } @@ -665,9 +720,12 @@ class NewQuestionDetailFragment : extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true) ) NewLogUtils.logSharePanelClick( - "click_delete", mViewModel.questionDetail?.user?.id - ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType + "click_delete", + mViewModel.questionDetail?.user?.id ?: "", + "提问帖", + mViewModel.questionDetail?.id ?: "", + mViewModel.questionDetail?.community?.id ?: "", + mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛" ) } "解决", "已解决" -> { @@ -678,13 +736,11 @@ class NewQuestionDetailFragment : }, extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)) NewLogUtils.logSharePanelClick( if (!questionEntity.finish) "click_solve" else "click_resolved", - mViewModel.questionDetail?.user?.id - ?: "", + mViewModel.questionDetail?.user?.id ?: "", "提问帖", - mViewModel.questionDetail?.id - ?: "", + mViewModel.questionDetail?.id ?: "", mViewModel.questionDetail?.community?.id ?: "", - bbsType + mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛" ) } getString(R.string.article_detail_more_top_title) -> { @@ -717,10 +773,13 @@ class NewQuestionDetailFragment : override fun onStop() { super.onStop() val stayTime = (System.currentTimeMillis() - startPageTime) / 1000 - val bbsType = if (mViewModel.questionDetail?.type == "game_bbs") "游戏论坛" else "综合论坛" NewLogUtils.logActivityPause( - "提问帖详情", "jump_question_detail", stayTime, - mViewModel.questionDetail?.community?.id ?: "", bbsType, "提问帖", + "提问帖详情", + "jump_question_detail", + stayTime, + mViewModel.questionDetail?.community?.id ?: "", + mViewModel.questionDetail?.community?.typeChinese ?: "综合论坛", + "提问帖", mViewModel.questionDetail?.id ?: "" ) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt index 496993f8d8..22405b7519 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt @@ -24,6 +24,7 @@ import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.login.user.UserManager import com.gh.gamecenter.qa.article.detail.CommentItemData import com.gh.gamecenter.qa.comment.base.BaseCommentViewModel +import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.google.gson.reflect.TypeToken import com.lightgame.utils.Utils @@ -60,6 +61,7 @@ class NewQuestionDetailViewModel( val top = MutableLiveData() val updateDetailLiveData = MutableLiveData() var questionDetail: QuestionsDetailEntity? = null + val questionDetailLD = MutableLiveData() val followLiveData = mFollowLiveData fun getQuestionDetail() { @@ -69,6 +71,7 @@ class NewQuestionDetailViewModel( override fun onResponse(response: QuestionsDetailEntity?) { super.onResponse(response) questionDetail = response + questionDetailLD.value = response topItemData = CommentItemData(questionDetail = response) commentCount = response?.count?.answer ?: 0 loadResultLiveData.postValue(LoadResult.SUCCESS) diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt index 3b45efd894..034c529168 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt @@ -83,6 +83,11 @@ class QuestionDetailContentViewHolder( val bbsType = if (question.type == "game_bbs") "游戏论坛" else "综合论坛" followBtn.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = question.user.id ?: "", + userName = question.user.name ?: "", + buttonName = followBtn.text.toString() + ) root.context.ifLogin("问题详情-[关注]用户") { if (followBtn.text == "关注") { viewModel.follow() diff --git a/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java b/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java index 75f2d81603..5b4f090788 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/qa/subject/AskSubjectAdapter.java @@ -119,7 +119,7 @@ public class AskSubjectAdapter extends ListAdapter implements ISyn CommunityAnswerItemBinding binding = viewHolder.getBinding(); if ("community_article".equals(entity.getType())) { Questions questions = new Questions(); - questions.setTitle(entity.getArticleTitle()); + questions.setTitle(entity.getTitle()); entity.setQuestions(questions); } @@ -127,9 +127,9 @@ public class AskSubjectAdapter extends ListAdapter implements ISyn binding.title.setOnClickListener(v -> { if ("answer".equals(entity.getType())) { Questions questions = entity.getQuestions(); - mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path)); + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path, "")); } else { - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getArticleCommunityId(), ""), entity.getId(), mEntrance, path, null)); + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getArticleCommunityId(), ""), entity.getId(), mEntrance, path, null, "")); } }); @@ -137,7 +137,7 @@ public class AskSubjectAdapter extends ListAdapter implements ISyn if ("answer".equals(entity.getType())) { mContext.startActivity(SimpleAnswerDetailActivity.getIntent(mContext, entity.getId(), mEntrance, path)); } else { - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getArticleCommunityId(), ""), entity.getId(), mEntrance, path, null)); + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, new CommunityEntity(entity.getArticleCommunityId(), ""), entity.getId(), mEntrance, path, null, "")); } }); } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt index 5ef2019ffd..33ed8265ae 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt @@ -14,6 +14,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import com.gh.gamecenter.R import com.gh.gamecenter.common.constant.Constants +import com.gh.gamecenter.common.entity.AdditionalParamsEntity import com.gh.gamecenter.common.entity.NormalShareEntity import com.gh.gamecenter.common.observer.MuteCallback import com.gh.gamecenter.common.observer.VolumeObserver @@ -23,7 +24,9 @@ import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.databinding.LayoutForumVideoDetailVideoviewPortraitBinding import com.gh.gamecenter.feature.entity.ForumVideoEntity import com.gh.gamecenter.forum.home.ForumScrollCalculatorHelper +import com.gh.gamecenter.login.user.UserManager import com.gh.gamecenter.qa.dialog.MoreFunctionPanelDialog +import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.video.detail.CustomManager import com.lightgame.utils.Utils import com.shuyu.gsyvideoplayer.utils.CommonUtil @@ -43,6 +46,11 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri var mForumVideoEntity: ForumVideoEntity? = null var viewModel: ForumVideoDetailViewModel? = null var uuid = UUID.randomUUID().toString() + var parentTag: String = "" + + private var mMaxPlayedProgress: Int = 0 + private var mStartTrackRunnable: Runnable? = null + private var mStopTrackRunnable: Runnable? = null init { post { @@ -94,12 +102,29 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri } } + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + super.onProgressChanged(seekBar, progress, fromUser) + // 记录播放进度的最大值,用于埋点上报 + if (mMaxPlayedProgress < progress) { + mMaxPlayedProgress = progress + } + } + + override fun startPlayLogic() { + super.startPlayLogic() + if (!isLooping) { + + } + } + override fun init(context: Context?) { super.init(context) mBinding = LayoutForumVideoDetailVideoviewPortraitBinding.bind(this.getChildAt(0)) } fun setForumVideoEntity(entity: ForumVideoEntity?) { + this.mStopTrackRunnable = null + this.mForumVideoEntity = entity mBinding.title.text = if (mIfCurrentIsFullscreen) entity?.title else "" } @@ -281,6 +306,69 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri } override fun setStateAndUi(state: Int) { + if (state != currentState + && state == CURRENT_STATE_PLAYING + && currentState != CURRENT_STATE_PLAYING_BUFFERING_START) {// 上报开始视频播放埋点 + // 视频停止播放后再恢复播放的间隔时间未超过3秒,则取消上报结束视频播放埋点 + mStopTrackRunnable?.let { runnable -> + handler.removeCallbacks(runnable) + } + + mForumVideoEntity?.let { + val startTrackRunnable = Runnable { + SensorsBridge.trackVideoStartPlaying( + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "综合论坛", + customerType = it.user.auth?.text ?: "", + videoId = it.id, + playType = "视频贴", + gameForumType = it.bbs?.game?.categoryChinese ?: "", + activityTag = it.tagActivityName, + articleType = it.typeChinese + ) + mStartTrackRunnable = null + }.also { + mStartTrackRunnable = it + } + // 埋点要求视频播放3秒后再上报埋点 + handler.postDelayed(startTrackRunnable, 3000) + } + } else if (currentState != state + && (state == CURRENT_STATE_AUTO_COMPLETE + || state == CURRENT_STATE_ERROR + || state == CURRENT_STATE_PAUSE + || (currentState == CURRENT_STATE_PLAYING && state == CURRENT_STATE_NORMAL)) + ) {// 上报结束视频播放埋点 + // 从开始播放视频到停止播放视频的间隔时间没有超过3秒,则取消上报开始视频播放埋点 + val startTrackRunnable = this.mStartTrackRunnable + if (startTrackRunnable != null) { + handler.removeCallbacks(startTrackRunnable) + mStartTrackRunnable = null + } else { + mForumVideoEntity?.let { + val stopTrackRunnable = Runnable { + SensorsBridge.trackVideoEndPlaying( + articleId = it.id, + bbsId = it.bbs?.id ?: "", + bbsType = it.bbs?.typeChinese ?: "综合论坛", + customerType = it.user.auth?.text ?: "", + videoId = it.id, + playType = "视频贴", + gameForumType = it.bbs?.game?.categoryChinese ?: "", + activityTag = it.tagActivityName, + articleType = it.typeChinese, + result = if (mMaxPlayedProgress >= 95) "是" else "否" + ) + }.also { + this.mStopTrackRunnable = it + } + // 埋点要求停止视频播放3秒后再上报埋点 + handler.postDelayed(stopTrackRunnable, 3000) + } + } + } + super.setStateAndUi(state) if (state == CURRENT_STATE_AUTO_COMPLETE) { @@ -302,6 +390,16 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri private fun share() { mForumVideoEntity?.let { + val params = AdditionalParamsEntity().apply { + contentType = "视频帖" + contentId = it.id + bbsId = it.bbs?.id ?: "" + bbsType = it.bbs?.typeChinese ?: "综合论坛" + customerType = it.user.auth?.text ?: "" + activityTagName = it.tagActivityName + gameForumType = it.bbs?.game?.categoryChinese ?: "" + refUserId = UserManager.getInstance().userId + } val shareEntity = NormalShareEntity( id = it.id, shareUrl = if (isPublishEnv()) { @@ -312,7 +410,8 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri shareIcon = it.poster, shareTitle = it.title, shareSummary = it.des, - shareEntrance = ShareUtils.ShareEntrance.video + shareEntrance = ShareUtils.ShareEntrance.video, + additionalParams = params ) MoreFunctionPanelDialog.showMoreDialog( context as AppCompatActivity, @@ -320,7 +419,7 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri shareEntity.shareTitle, shareEntity, "", - "" + parentTag ) } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt index 811757ecf3..66fbb9f14a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt @@ -59,27 +59,30 @@ class ForumVideoDetailActivity : BaseActivity() { fun getIntent( context: Context, videoId: String, - bbsId: String + bbsId: String, + sourceEntrance: String = "" ): Intent { - return getIntent(context, videoId, bbsId, "", "", false) + return getIntent(context, videoId, bbsId, "", "", false, sourceEntrance) } fun getIntent( context: Context, videoId: String, bbsId: String, - scrollToComment: Boolean = false + scrollToComment: Boolean = false, + sourceEntrance: String = "" ): Intent { - return getIntent(context, videoId, bbsId, "", "", scrollToComment) + return getIntent(context, videoId, bbsId, "", "", scrollToComment, sourceEntrance) } fun getRecommendIntent( context: Context, videoId: String, bbsId: String, - recommendId: String + recommendId: String, + sourceEntrance: String ): Intent { - return getIntent(context, videoId, bbsId, recommendId, "", false) + return getIntent(context, videoId, bbsId, recommendId, "", false, sourceEntrance) } fun getSpecifiedCommentIntent( @@ -96,13 +99,15 @@ class ForumVideoDetailActivity : BaseActivity() { bbsId: String, recommendId: String = "", topCommentId: String = "", - scrollToComment: Boolean = false + scrollToComment: Boolean = false, + sourceEntrance: String = "" ): Intent { val intent = Intent(context, ForumVideoDetailActivity::class.java) intent.putExtra(EntranceConsts.KEY_VIDEO_ID, videoId) intent.putExtra(EntranceConsts.KEY_BBS_ID, bbsId) intent.putExtra(EntranceConsts.KEY_RECOMMEND_ID, recommendId) intent.putExtra(EntranceConsts.KEY_TOP_COMMENT_ID, topCommentId) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) if (scrollToComment) { intent.putExtra(PAGE_INDEX, 1) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt index ea0f8291e5..2bbcdf9a8b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt @@ -21,6 +21,9 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import com.ethanhua.skeleton.Skeleton import com.ethanhua.skeleton.ViewSkeletonScreen +import com.gh.common.browse.ValueBrowseTimer +import com.gh.common.browse.asObserver +import com.gh.common.browse.withLifecycle import com.gh.common.databind.BindingAdapters import com.gh.common.util.* import com.gh.common.util.NewLogUtils @@ -33,6 +36,7 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.entity.AdditionalParamsEntity import com.gh.gamecenter.common.entity.NormalShareEntity +import com.gh.gamecenter.common.mvvm.Resource import com.gh.gamecenter.common.mvvm.Status import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.* @@ -82,6 +86,34 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private var mIsPortrait = false private var mVideoHeight = 0 private var mLastOffset = 0 + private var sourceEntrance: String = "" + + private val browserTimer = ValueBrowseTimer>() + .withLifecycle(this) + .withStart { + SensorsBridge.trackArticleDetailsBrowsing( + bbsId = it?.data?.bbs?.id ?: "", + bbsType = if (it?.data?.bbs?.type == "official_bbs") "综合论坛" else "游戏论坛", + customerType = it?.data?.user?.auth?.text ?: "", + gameForumType = it?.data?.bbs?.game?.categoryChinese ?: "", + activityTag = it?.data?.tagActivityName ?: "", + articleType = "视频贴", + sourceEntrance = sourceEntrance + ) + } + .withResult { detail, time -> + SensorsBridge.trackArticleBrowsingDuration( + bbsId = detail?.data?.bbs?.id ?: "", + bbsType = if (detail?.data?.bbs?.type == "official_bbs") "综合论坛" else "游戏论坛", + customerType = detail?.data?.user?.auth?.text ?: "", + gameForumType = detail?.data?.bbs?.game?.categoryChinese ?: "", + activityTag = detail?.data?.tagActivityName ?: "", + articleId = detail?.data?.id ?: "", + articleType = "视频贴", + stayLength = time / 1000.0, + sourceEntrance = sourceEntrance + ) + } private val dataWatcher = object : DataWatcher() { override fun onDataChanged(downloadEntity: DownloadEntity) { @@ -129,12 +161,14 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mVideoId = arguments?.getString(EntranceConsts.KEY_VIDEO_ID) ?: "" mBbsId = arguments?.getString(EntranceConsts.KEY_BBS_ID) ?: "" mTopCommentId = arguments?.getString(EntranceConsts.KEY_TOP_COMMENT_ID) ?: "" + sourceEntrance = arguments?.getString(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "" super.onCreate(savedInstanceState) NewLogUtils.logVideoDetailClick("view_video_detail") } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + mBinding.topVideoView.parentTag = tag ?: "" mBinding.toolbar.inflateMenu(R.menu.menu_forum_video_detail) mMoreMenuItem = mBinding.toolbar.menu.findItem(R.id.menu_more) ViewCompat.setOnApplyWindowInsetsListener(mBinding.appbar) { _, insets -> @@ -312,7 +346,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } } mViewModel.top.observeNonNull(this) { top -> - val topSuccessToast = if(top) { + val topSuccessToast = if (top) { R.string.article_detail_top_success_toast } else { R.string.article_detail_cancel_top_success_toast @@ -326,6 +360,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { ) } } + mViewModel.detailLiveData.observe(viewLifecycleOwner, browserTimer.asObserver()) } private fun setGameInfo(entity: ForumVideoEntity) { @@ -468,24 +503,24 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private fun setDownloadButton(gameEntity: GameEntity?) { if (gameEntity == null) return - DownloadItemUtils.setOnClickListener(requireContext(), mBinding.downloadBtn, + DownloadItemUtils.setOnClickListener( + requireContext(), mBinding.downloadBtn, gameEntity, 0, null, - mEntrance, "视频详情", null, object : EmptyCallback { - override fun onCallback() { - NewLogUtils.logVideoDetailGameClick( - "click_game_status", - gameEntity.id, - gameEntity.category ?: "", - mForumVideoEntity?.bbs?.id ?: "", - mForumVideoEntity?.id ?: "", - mBinding.downloadBtn.text.toString() - ) - } - }, object : EmptyCallback { - override fun onCallback() { - setDownloadButton(gameEntity) - } - }, null + mEntrance, + location = "视频详情", + traceEvent = null, + clickCallback = { + NewLogUtils.logVideoDetailGameClick( + "click_game_status", + gameEntity.id, + gameEntity.category ?: "", + mForumVideoEntity?.bbs?.id ?: "", + mForumVideoEntity?.id ?: "", + mBinding.downloadBtn.text.toString() + ) + }, + refreshCallback = { setDownloadButton(gameEntity) }, + allStateClickCallback = null ) DownloadItemUtils.updateItem( requireContext(), @@ -554,17 +589,32 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { // 置顶/取消置顶 if (mForumVideoEntity?.me?.isModerator == true && mForumVideoEntity?.me?.isCommunityTop == false - && (moderatorPermissions?.topVideo ?: Permissions.GUEST) > Permissions.GUEST) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_top_title), R.drawable.icon_more_panel_top)) + && (moderatorPermissions?.topVideo ?: Permissions.GUEST) > Permissions.GUEST + ) { + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_top_title), + R.drawable.icon_more_panel_top + ) + ) } else if (mForumVideoEntity?.me?.isModerator == true && mForumVideoEntity?.me?.isCommunityTop == true - && (moderatorPermissions?.cancelTopVideo ?: Permissions.GUEST) > Permissions.GUEST) { - entities.add(MenuItemEntity(getString(R.string.article_detail_more_cancel_top_title), R.drawable.icon_more_panel_top_cancel)) + && (moderatorPermissions?.cancelTopVideo ?: Permissions.GUEST) > Permissions.GUEST + ) { + entities.add( + MenuItemEntity( + getString(R.string.article_detail_more_cancel_top_title), + R.drawable.icon_more_panel_top_cancel + ) + ) } MoreFunctionPanelDialog.showMoreDialog( - requireActivity() as AppCompatActivity, entities, mForumVideoEntity?.title - ?: "", getShareEntity(), mForumVideoEntity?.status ?: "", tag ?: "" + requireActivity() as AppCompatActivity, + entities, mForumVideoEntity?.title ?: "", + getShareEntity(), + mForumVideoEntity?.status ?: "", + tag ?: "" ) } } @@ -574,7 +624,10 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { contentType = "视频帖" contentId = mForumVideoEntity?.id ?: "" bbsId = mForumVideoEntity?.bbs?.id ?: "" - bbsType = if (mForumVideoEntity?.bbs?.type == "game_bbs") "游戏论坛" else "综合论坛" + bbsType = mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛" + customerType = mForumVideoEntity?.user?.auth?.text ?: "" + activityTagName = mForumVideoEntity?.tagActivityName ?: "" + gameForumType = mForumVideoEntity?.bbs?.game?.categoryChinese ?: "" refUserId = UserManager.getInstance().userId } return NormalShareEntity( @@ -597,7 +650,6 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private fun getItemClickCallback(): (menuItem: MenuItemEntity?) -> Unit { return { - val bbsType = if (mForumVideoEntity?.type == "game_bbs") "游戏论坛" else "综合论坛" when (it?.text) { "修改" -> { startActivityForResult( @@ -609,40 +661,55 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { ), ForumVideoDetailActivity.VIDEO_PATCH_REQUEST ) NewLogUtils.logSharePanelClick( - "click_modification", mForumVideoEntity?.user?.id - ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + "click_modification", + mForumVideoEntity?.user?.id ?: "", + "视频帖", + mForumVideoEntity?.id ?: "", + mForumVideoEntity?.bbs?.id ?: "", + mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛" ) } + "投诉" -> { BbsReportHelper.showReportDialog(mForumVideoEntity?.id ?: "") NewLogUtils.logSharePanelClick( - "click_report", mForumVideoEntity?.user?.id - ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + "click_report", + mForumVideoEntity?.user?.id ?: "", + "视频帖", + mForumVideoEntity?.id ?: "", + mForumVideoEntity?.bbs?.id ?: "", + mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛" ) } + "申请加精" -> { if (mForumVideoEntity?.getSimplifyChoicenessStatus() == "apply") { ToastUtils.showToast("申请加精审核中") } else { mViewModel.doApplyHighlightCommunityVideo(mVideoId) NewLogUtils.logSharePanelClick( - "click_apply_essence", mForumVideoEntity?.user?.id - ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + "click_apply_essence", + mForumVideoEntity?.user?.id ?: "", + "视频帖", + mForumVideoEntity?.id ?: "", + mForumVideoEntity?.bbs?.id ?: "", + mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛" ) } } + "加精选" -> { if (mForumVideoEntity?.getSimplifyChoicenessStatus() == "apply") { ToastUtils.showToast("加精审核中") } else { showHighlightDialog(true) NewLogUtils.logSharePanelClick( - "click_essence", mForumVideoEntity?.user?.id - ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + "click_essence", + mForumVideoEntity?.user?.id ?: "", + "视频帖", + mForumVideoEntity?.id ?: "", + mForumVideoEntity?.bbs?.id ?: "", + mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛" ) } } @@ -669,11 +736,15 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true) ) NewLogUtils.logSharePanelClick( - "click_delete", mForumVideoEntity?.user?.id - ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + "click_delete", + mForumVideoEntity?.user?.id ?: "", + "视频帖", + mForumVideoEntity?.id ?: "", + mForumVideoEntity?.bbs?.id ?: "", + mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛" ) } + getString(R.string.article_detail_more_top_title) -> { TopCommunityCategoryDialog.show( childFragmentManager @@ -700,9 +771,8 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } private fun getChooseSelectCallback(): (entity: ActivityLabelEntity?) -> Unit { - val bbsType = if (mForumVideoEntity?.type == "game_bbs") "游戏论坛" else "综合论坛" return { label -> - showUpdateLabelDialog(label, bbsType) + showUpdateLabelDialog(label, mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛") } } @@ -727,9 +797,12 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { { mViewModel.modifyVideoActivityTag(mForumVideoEntity, label) NewLogUtils.logSharePanelClick( - "click_modification_activity_tag", mForumVideoEntity?.user?.id - ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + "click_modification_activity_tag", + mForumVideoEntity?.user?.id ?: "", + "视频帖", + mForumVideoEntity?.id ?: "", + mForumVideoEntity?.bbs?.id ?: "", + bbsType ) }, extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true) ) @@ -832,10 +905,13 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.topVideoView.release() mBinding.topVideoView.disposableTimer() val stayTime = (System.currentTimeMillis() - startPageTime) / 1000 - val bbsType = if (mForumVideoEntity?.type == "game_bbs") "游戏论坛" else "综合论坛" NewLogUtils.logActivityPause( - "视频帖详情页", "jump_video_detail ", stayTime, - mForumVideoEntity?.bbs?.id ?: "", bbsType, "视频帖", + "视频帖详情页", + "jump_video_detail ", + stayTime, + mForumVideoEntity?.bbs?.id ?: "", + mForumVideoEntity?.bbs?.typeChinese ?: "综合论坛", + "视频帖", mForumVideoEntity?.id ?: "" ) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt index b3fe6b908f..5563de6661 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt @@ -194,7 +194,7 @@ class ForumVideoDetailViewModel( time = System.currentTimeMillis() title = videoEntity.title user = User( - videoEntity.user.id, videoEntity.user.name, videoEntity.user.icon + videoEntity.user.id ?: "", videoEntity.user.name ?: "", videoEntity.user.icon ?: "" ) commentCount = videoEntity.count.comment videoStreamRecord = 0 diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt index 69ada40c4a..1c55a6555b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt @@ -108,27 +108,36 @@ class VideoDescTopViewHolder( } initAnimation(entity) - val bbsType = if (entity.bbs?.type == "game_bbs") "游戏论坛" else "综合论坛" binding.userAvatar.setOnClickListener { DirectUtils.directToHomeActivity(binding.root.context, entity.user.id, "视频详情", "") NewLogUtils.logVideoDetailClick( - "click_detail_tab_profile_photo", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType + "click_detail_tab_profile_photo", entity.user.id ?: "", + "视频贴", entity.bbs?.id ?: "", entity.bbs?.typeChinese ?: "综合论坛" ) } binding.userNameTv.setOnClickListener { DirectUtils.directToHomeActivity(binding.root.context, entity.user.id, "视频详情", "") NewLogUtils.logVideoDetailClick( - "click_detail_tab_nickname", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType + "click_detail_tab_nickname", entity.user.id ?: "", + "视频贴", entity.bbs?.id ?: "", entity.bbs?.typeChinese ?: "综合论坛" ) } binding.likeContainer.setOnClickListener { debounceActionWithInterval(it.id, 2000) { mViewModel.postVote() NewLogUtils.logVideoDetailClick( - "click_detail_tab_like", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType, entity.id + "click_detail_tab_like", entity.user.id ?: "", + "视频贴", entity.bbs?.id ?: "", entity.bbs?.typeChinese ?: "综合论坛", entity.id + ) + SensorsBridge.trackArticleLikeClick( + customerType = entity.user.auth?.text ?: "", + articleId = entity.id, + bbsId = entity.bbs?.id ?: "", + bbsType = entity.bbs?.typeChinese ?: "综合论坛", + activityTag = entity.tagActivityName, + gameForumType = entity.bbs?.game?.categoryChinese ?: "", + articleType = "视频贴", + buttonName = if (mViewModel.topVideoDetail?.me?.isVoted == true) "取消点赞" else "赞同" ) } } @@ -136,12 +145,27 @@ class VideoDescTopViewHolder( debounceActionWithInterval(it.id) { mViewModel.postFavorite() NewLogUtils.logVideoDetailClick( - "click_detail_tab_collect", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType, entity.id + "click_detail_tab_collect", entity.user.id ?: "", + "视频贴", entity.bbs?.id ?: "", entity.bbs?.typeChinese ?: "综合论坛", entity.id + ) + SensorsBridge.trackArticleCollectionClick( + customerType = entity.user.auth?.text ?: "", + articleId = entity.id, + bbsId = entity.bbs?.id ?: "", + bbsType = entity.bbs?.typeChinese ?: "综合论坛", + activityTag = entity.tagActivityName, + gameForumType = entity.bbs?.game?.categoryChinese ?: "", + articleType = "视频贴", + buttonName = if (mViewModel.topVideoDetail?.me?.isVideoFavorite == true) "已收藏" else "收藏" ) } } binding.concernBtn.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = entity.user.id ?: "", + userName = entity.user.name ?: "", + buttonName = binding.concernBtn.text.toString() + ) if (entity.user.id != UserManager.getInstance().userId) { debounceActionWithInterval(it.id) { if (!entity.me.isFollower) { @@ -158,8 +182,8 @@ class VideoDescTopViewHolder( }) } NewLogUtils.logVideoDetailClick( - "click_detail_tab_follow", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType + "click_detail_tab_follow", entity.user.id ?: "", + "视频贴", entity.bbs?.id ?: "", entity.bbs?.typeChinese ?: "综合论坛" ) } } @@ -167,21 +191,19 @@ class VideoDescTopViewHolder( binding.shareContainer.setOnClickListener { share(entity) NewLogUtils.logVideoDetailClick( - "click_detail_tab_share", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType, entity.id + "click_detail_tab_share", entity.user.id ?: "", + "视频贴", entity.bbs?.id ?: "", entity.bbs?.typeChinese ?: "综合论坛", entity.id ) } binding.badgeIv.setOnClickListener { - DialogUtils.showViewBadgeDialog(binding.root.context, entity.user.badge, object : ConfirmListener { - override fun onConfirm() { - DirectUtils.directToBadgeWall( - binding.root.context, - entity.user.id, - entity.user.name, - entity.user.badge?.icon - ) - } - }) + DialogUtils.showViewBadgeDialog(binding.root.context, entity.user.badge) { + DirectUtils.directToBadgeWall( + binding.root.context, + entity.user.id, + entity.user.name, + entity.user.badge?.icon + ) + } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt index 61b1fdcd39..fcda12e3b4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt @@ -225,7 +225,7 @@ class VideoPublishFragment : ToolbarFragment(), KeyboardHeightObserver { ), REQUEST_GAME_CODE ) } else { - ChooseForumActivity.startChooseForumActivity(requireActivity()) + ChooseForumActivity.startChooseForumActivity(requireActivity(), "社区") NewLogUtils.logChooseForumPanelEnter("发视频帖") } } @@ -339,13 +339,14 @@ class VideoPublishFragment : ToolbarFragment(), KeyboardHeightObserver { requireContext(), it.exception?.response()?.errorBody()?.string(), false, - { - if (::mMenuPost.isInitialized) { - onMenuItemClick(mMenuPost) - } - }, - "发帖子(视频)" - ) + "发帖子(视频)", + "社区实名", + "视频贴" + ) { + if (::mMenuPost.isInitialized) { + onMenuItemClick(mMenuPost) + } + } } } mViewModel.sectionListLiveData.observeNonNull(this) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt index a97343e9e8..25a09247a0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt @@ -234,12 +234,30 @@ class VideoPublishViewModel(application: Application) : AndroidViewModel(applica ) } } + SensorsBridge.trackArticlePostResult( + postResult = "成功", + bbsId = communityEntity?.id ?: "", + bbsType = if (type == "official_bbs") "综合论坛" else "游戏论坛", + activityTag = selectActivityLabelEntity?.name ?: "", + articleType = "视频帖", + customerType = UserManager.getInstance().userInfoEntity?.auth?.text ?: "", + gameForumType = communityEntity?.game?.categoryChinese ?: "" + ) } override fun onFailure(e: HttpException?) { super.onFailure(e) processDialog.postValue(WaitingDialogFragment.WaitingDialogData("", false)) postLiveData.postValue(Resource.error(e)) + SensorsBridge.trackArticlePostResult( + postResult = "失败", + bbsId = communityEntity?.id ?: "", + bbsType = if (type == "official_bbs") "综合论坛" else "游戏论坛", + activityTag = selectActivityLabelEntity?.name ?: "", + articleType = "视频帖", + customerType = UserManager.getInstance().userInfoEntity?.auth?.text ?: "", + gameForumType = communityEntity?.game?.categoryChinese ?: "" + ) } }) } diff --git a/app/src/main/java/com/gh/gamecenter/qgame/QGameSearchResultFragment.kt b/app/src/main/java/com/gh/gamecenter/qgame/QGameSearchResultFragment.kt index f576a49b4f..428074d4ef 100644 --- a/app/src/main/java/com/gh/gamecenter/qgame/QGameSearchResultFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qgame/QGameSearchResultFragment.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.qgame import com.gh.gamecenter.SearchActivity.Companion.TRACK_SEARCH_TYPE_INPUT +import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.utils.viewModelProvider import com.gh.gamecenter.search.SearchGameResultFragment import com.gh.gamecenter.search.SearchGameResultViewModel @@ -20,7 +21,8 @@ class QGameSearchResultFragment : SearchGameResultFragment() { mKey, true, QGameSearchResultRepository(), - TRACK_SEARCH_TYPE_INPUT + TRACK_SEARCH_TYPE_INPUT, + activity?.intent?.getStringExtra(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "" ) return viewModelProvider(factory) } diff --git a/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListRecommendAdapter.kt b/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListRecommendAdapter.kt index 452a8b34ed..770226488f 100644 --- a/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListRecommendAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListRecommendAdapter.kt @@ -100,8 +100,8 @@ class GameArchiveListRecommendAdapter(context: Context, var mViewModel: GameArch position, this, mEntrance, - "游戏存档-推荐游戏:${gameEntity.name}", - exposureEvent + location = "游戏存档-推荐游戏:${gameEntity.name}", + traceEvent = exposureEvent ) DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding)) diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt index 401acee441..8b23b27dac 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultFragment.kt @@ -21,6 +21,7 @@ import com.gh.common.util.DirectUtils import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.common.base.fragment.BaseFragment +import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.exposure.ExposureSource import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.view.DrawableView @@ -55,6 +56,8 @@ open class SearchDefaultFragment : BaseFragment() { private var mIsGameSearch = false // 是否为游戏搜索 + private var mSourceEntrance: String = "" + val defaultViewModel: SearchDefaultViewModel? get() = mViewModel @@ -95,6 +98,7 @@ open class SearchDefaultFragment : BaseFragment() { mViewModel = viewModelProvider() mIsGameSearch = arguments?.getBoolean(KEY_IS_GAME_SEARCH) ?: false + mSourceEntrance = arguments?.getString(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "" initDao() initView() @@ -200,7 +204,7 @@ open class SearchDefaultFragment : BaseFragment() { visibility = View.VISIBLE offscreenPageLimit = mRankList!!.size pageMargin = 12F.dip2px() - adapter = SearchDefaultRankListAdapter(requireContext(), mRankList!!, pageRatio, mIsGameSearch) + adapter = SearchDefaultRankListAdapter(requireContext(), mRankList!!, pageRatio, mIsGameSearch, mSourceEntrance) postExposureEvent(0) doOnPageSelected { postExposureEvent(it) diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankListAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankListAdapter.kt index 6ba4d7cbb1..3c47215c2b 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankListAdapter.kt @@ -13,7 +13,8 @@ class SearchDefaultRankListAdapter( private val mContext: Context, private val mRankList: List, private val mPageWidth: Float, - private val mIsGameSearch: Boolean + private val mIsGameSearch: Boolean, + private val mSourceEntrance: String ) : RecyclingPagerAdapter() { override fun getCount() = mRankList.size diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameFirstItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameFirstItemViewHolder.kt index ba143c4f08..0a0ac89f74 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameFirstItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameFirstItemViewHolder.kt @@ -32,6 +32,7 @@ class SearchGameFirstItemViewHolder( private val type: String, private val searchMap: ArrayMap, private val entrance: String, + private val sourceEntrance: String, fragment: Fragment, val binding: SearchGameFirstItemBinding ) : RecyclerView.ViewHolder(binding.root) { @@ -177,12 +178,12 @@ class SearchGameFirstItemViewHolder( tagContainer.goneIf(!isShowTagByMirror) if (isShowTagByMirror && gameEntity.contentTag != contentTag) { contentTag = gameEntity.contentTag - showContentTag(entrance, type, key, bindingAdapterPosition, exposureEvent, gameEntity, tagContainer) + showContentTag(entrance, type, key, bindingAdapterPosition, exposureEvent, gameEntity, tagContainer, sourceEntrance) } } binding.root.setOnClickListener { - setItemCLick(entrance, type, key, searchMap, exposureEvent, item, bindingAdapterPosition, context) + setItemCLick(entrance, type, key, searchMap, exposureEvent, item, bindingAdapterPosition, context, sourceEntrance) } downloadListener(exposureEvent) diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt index ba8edc723b..a4a5dadda8 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt @@ -21,6 +21,7 @@ import com.gh.gamecenter.SearchActivity import com.gh.gamecenter.SearchType import com.gh.gamecenter.adapter.viewholder.GameViewHolder import com.gh.gamecenter.adapter.viewholder.SearchHistoryViewHolder +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.baselist.ListAdapter import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.ItemViewType @@ -48,7 +49,8 @@ class SearchGameIndexAdapter( context: Context, val fragment: SearchGameIndexFragment, val entrance: String, - val type: String + val type: String, + val sourceEntrance: String ) : ListAdapter(context), IExposable { private val dao = SearchHistoryDao(mContext) @@ -109,7 +111,7 @@ class SearchGameIndexAdapter( override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is SearchSubjectItemViewHolder) { holder.binding.topDivider.goneIf(position == 0) - holder.bindSubjectItem(mContext, mEntityList[position], SearchType.fromString(type).toChinese(), key, dao) + holder.bindSubjectItem(mContext, mEntityList[position], SearchType.fromString(type).toChinese(), key, dao, sourceEntrance) } else { val gameEntity = mEntityList[position].game!! @@ -375,7 +377,13 @@ class SearchGameIndexAdapter( gameEntity.adSpaceId, gameEntity.gameAdSourceId ) - SearchActivity.trackSearchResultClick(key, type) + SensorsBridge.trackSearchResultClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key, + SearchActivity.toTrackSearchType(type), + sourceEntrance + ) } @@ -399,42 +407,39 @@ class SearchGameIndexAdapter( (holder.getAdapterPosition() + 1).toString(), "])" ), - "搜索-列表:" + gameEntity.name!!, - exposureEvent, - null, - null, - object : EmptyCallback { - override fun onCallback() { - Util_System_Keyboard.hideSoftKeyboardByIBinder( - mContext, - binding.gameItemIncluded.downloadBtn.windowToken - ) + location = "搜索-列表:" + gameEntity.name!!, + traceEvent = exposureEvent, + clickCallback = null, + refreshCallback = null + ) { + Util_System_Keyboard.hideSoftKeyboardByIBinder( + mContext, + binding.gameItemIncluded.downloadBtn.windowToken + ) - if (searchMap[gameEntity.id] == null) { - EventBus.getDefault() - .post(EBSearch("search", gameEntity.id, gameEntity.name)) - searchMap[gameEntity.id] = gameEntity.name - } - - if (SearchType.fromString(type) == SearchType.AUTO) { - dao.add(key) - } - - LogUtils.uploadSearchClick( - "search_click", - "搜索页", - key, - SearchType.fromString(type).toChinese(), - gameEntity.id, - gameEntity.name, - gameEntity.getMirrorPosition(), - gameEntity.adIconActive, - gameEntity.adSpaceId, - gameEntity.gameAdSourceId - ) - } + if (searchMap[gameEntity.id] == null) { + EventBus.getDefault() + .post(EBSearch("search", gameEntity.id, gameEntity.name)) + searchMap[gameEntity.id] = gameEntity.name } - ) + + if (SearchType.fromString(type) == SearchType.AUTO) { + dao.add(key) + } + + LogUtils.uploadSearchClick( + "search_click", + "搜索页", + key, + SearchType.fromString(type).toChinese(), + gameEntity.id, + gameEntity.name, + gameEntity.getMirrorPosition(), + gameEntity.adIconActive, + gameEntity.adSpaceId, + gameEntity.gameAdSourceId + ) + } DownloadItemUtils.updateItem( mContext, @@ -482,7 +487,13 @@ class SearchGameIndexAdapter( gameEntity.gameAdSourceId ) - SearchActivity.trackSearchResultClick(key, type) + SensorsBridge.trackSearchResultClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key, + SearchActivity.toTrackSearchType(type), + sourceEntrance + ) } } } diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexFragment.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexFragment.kt index 601b7334c7..cafd4be42e 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexFragment.kt @@ -70,13 +70,20 @@ class SearchGameIndexFragment : ListFragment(context), IExposable { private var searchMap: ArrayMap = ArrayMap() @@ -130,7 +131,7 @@ class SearchGameResultAdapter( ITEM_GAME_FIRST -> { val binding = SearchGameFirstItemBinding.inflate(mLayoutInflater, viewGroup, false) - SearchGameFirstItemViewHolder(type, searchMap, entrance, fragment, binding) + SearchGameFirstItemViewHolder(type, searchMap, entrance, sourceEntrance, fragment, binding) } ItemViewType.ITEM_BODY -> { @@ -183,7 +184,7 @@ class SearchGameResultAdapter( } bottomDivider.visibility = View.VISIBLE } - holder.bindSubjectItem(mContext, mEntityList[position], SearchType.fromString(type).toChinese(), key) + holder.bindSubjectItem(mContext, mEntityList[position], SearchType.fromString(type).toChinese(), key, sourceEntrance = sourceEntrance) } is SearchGameFirstItemViewHolder -> { @@ -344,7 +345,8 @@ class SearchGameResultAdapter( holder.bindingAdapterPosition, exposureEvent, gameEntity, - tagContainer + tagContainer, + sourceEntrance ) } else { @@ -361,7 +363,8 @@ class SearchGameResultAdapter( exposureEvent, item, holder.bindingAdapterPosition, - mContext + mContext, + sourceEntrance ) } @@ -449,7 +452,8 @@ class SearchGameResultAdapter( position: Int, exposureEvent: ExposureEvent, gameEntity: GameEntity, - tagContainer: LinearLayout + tagContainer: LinearLayout, + sourceEntrance: String ) { val context = tagContainer.context val layoutInflater = LayoutInflater.from(context) @@ -470,7 +474,8 @@ class SearchGameResultAdapter( context, it.link, entrance, - "" + "", + "${sourceEntrance}搜索-搜索结果-内容标签" ) gameEntity.run { @@ -629,7 +634,8 @@ class SearchGameResultAdapter( exposureEvent: ExposureEvent, item: SearchItemData, position: Int, - context: Context + context: Context, + sourceEntrance: String ) { val gameEntity = item.game ?: return if (searchMap[gameEntity.id] == null) { @@ -680,7 +686,13 @@ class SearchGameResultAdapter( ) } - SearchActivity.trackSearchResultClick(key, type) + SensorsBridge.trackSearchResultClick( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + key, + SearchActivity.toTrackSearchType(type), + sourceEntrance + ) } @@ -718,8 +730,8 @@ class SearchGameResultAdapter( "${position + 1}", "])" ), - "搜索-列表:" + gameEntity.name!!, - exposureEvent, + location = "搜索-列表:" + gameEntity.name!!, + traceEvent = exposureEvent, clickCallback = { if (adConfig != null) { NewFlatLogUtils.logClickGameAd( @@ -734,7 +746,7 @@ class SearchGameResultAdapter( ) } }, - null + refreshCallback = null ) { Util_System_Keyboard.hideSoftKeyboardByIBinder( context, diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultFragment.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultFragment.kt index 77f473d0c3..0a942f3547 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultFragment.kt @@ -78,14 +78,22 @@ open class SearchGameResultFragment : ListFragment(application) { private var mPage = 0 @@ -277,8 +280,14 @@ class SearchGameResultViewModel( private fun postResultList(resultList: ArrayList, list: List) { mResultLiveData.postValue(resultList) if (mPage == 1) { - val hasResult = list.isNotEmpty() - SearchActivity.trackSearchResultReturn(mSearchKey, mSearchType, hasResult) + SensorsBridge.trackSearchResultReturn( + GlobalActivityManager.getCurrentPageEntity().pageId, + GlobalActivityManager.getCurrentPageEntity().pageName, + mSearchKey ?: "", + SearchActivity.toTrackSearchType(mSearchType), + list.isNotEmpty(), + sourceEntrance + ) } } @@ -327,10 +336,11 @@ class SearchGameResultViewModel( private val mSearchKey: String?, private val mIsManuallySearch: Boolean, private val repository: ISearchGameResultRepository, - private val mSearchType: String + private val mSearchType: String, + private val mSourceEntrance: String ) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { - return SearchGameResultViewModel(mApplication, mSearchKey, mIsManuallySearch, repository, mSearchType) as T + return SearchGameResultViewModel(mApplication, mSearchKey, mIsManuallySearch, repository, mSearchType, mSourceEntrance) as T } } diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt index 3b96efbdcd..8366e248cc 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt @@ -347,8 +347,8 @@ class GameServersContentAdapter( mContext, viewHolder.gameDownloadBtn, gameEntity, viewHolder.adapterPosition, this@GameServersContentAdapter, StringUtils.buildString(mEntrance, "+(开服表[", viewHolder.adapterPosition.toString(), "])"), - StringUtils.buildString("开服表:", gameEntity.name), - mExposureEventArray.get(viewHolder.adapterPosition) + location = StringUtils.buildString("开服表:", gameEntity.name), + traceEvent = mExposureEventArray.get(viewHolder.adapterPosition) ) DownloadItemUtils.updateItem(mContext, gameEntity, viewHolder) diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt index 922a1d9373..e6584d1622 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt @@ -121,8 +121,8 @@ class GameServersTestAdapter( mContext, viewHolder.binding.downloadBtn, gameEntity, viewHolder.adapterPosition, this, StringUtils.buildString(mEntrance, "+(开服表[", viewHolder.adapterPosition.toString(), "])"), - StringUtils.buildString("开服表:", gameEntity.name), - mExposureEventArray[viewHolder.adapterPosition] + location = StringUtils.buildString("开服表:", gameEntity.name), + traceEvent = mExposureEventArray[viewHolder.adapterPosition] ) DownloadItemUtils.updateItem( mContext, diff --git a/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameBigImageViewHolder.kt b/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameBigImageViewHolder.kt index 21c1be7b18..746ceaae74 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameBigImageViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameBigImageViewHolder.kt @@ -120,8 +120,8 @@ class GameBigImageViewHolder(val binding: ItemGameServerTestBigImageBinding) : position, adapter, entrance, - "", - exposureEvent + location = "", + traceEvent = exposureEvent ) DownloadItemUtils.updateItem( binding.root.context, diff --git a/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameServerTestV2ListAdapter.kt b/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameServerTestV2ListAdapter.kt index a3dbc58862..144859c2e6 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameServerTestV2ListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/gametest2/GameServerTestV2ListAdapter.kt @@ -154,8 +154,8 @@ class GameServerTestV2ListAdapter( mContext, viewHolder.binding.downloadBtn, gameEntity, position, this, StringUtils.buildString(mEntrance, "+(新游开测[", position.toString(), "])"), - StringUtils.buildString("新游开测:", gameEntity.name), - exposureEvent + location = StringUtils.buildString("新游开测:", gameEntity.name), + traceEvent = exposureEvent ) DownloadItemUtils.updateItem( mContext, diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt index cd1ed54892..c6ad035bdb 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt @@ -230,18 +230,15 @@ class SimulatorGameListAdapter( position, this@SimulatorGameListAdapter, "(${mEntrance})", - StringUtils.buildString(mEntrance, ":", gameEntity.name), - null, - object : EmptyCallback { - override fun onCallback() { - // 若当前点击为启动模拟器游戏,且当前item不是近期玩过的游戏(即未显示"近期玩过"标签),则将标志位mLaunchGameFlag置为true - if (gameItemIncluded.downloadBtn.text == R.string.launch.toResString() - && gameItemIncluded.recentPlayedTag.visibility == View.GONE - ) { - mLaunchGameFlag = true - } - } - }) + location = StringUtils.buildString(mEntrance, ":", gameEntity.name), + traceEvent = null + ) { // 若当前点击为启动模拟器游戏,且当前item不是近期玩过的游戏(即未显示"近期玩过"标签),则将标志位mLaunchGameFlag置为true + if (gameItemIncluded.downloadBtn.text == R.string.launch.toResString() + && gameItemIncluded.recentPlayedTag.visibility == View.GONE + ) { + mLaunchGameFlag = true + } + } DownloadItemUtils.updateItem( mContext, diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt b/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt index bb61346264..34fb827c2e 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectAdapter.kt @@ -253,8 +253,8 @@ class SubjectAdapter( else "最热", "=", (humanReadablePosition).toString(), "])" ), - StringUtils.buildString(subjectData.subjectName, ":", gameEntity.name), - exposureEvent + location = StringUtils.buildString(subjectData.subjectName, ":", gameEntity.name), + traceEvent = exposureEvent ) DownloadItemUtils.updateItem( diff --git a/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt b/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt index e296d24fb5..9f23fa4f40 100644 --- a/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt @@ -120,8 +120,8 @@ class TagsListAdapter( (position + 1).toString(), "])" ), - StringUtils.buildString(mViewModel.selectedTag.name, ":", gameEntity.name), - exposureEvent + location = StringUtils.buildString(mViewModel.selectedTag.name, ":", gameEntity.name), + traceEvent = exposureEvent ) DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding)) } else if (holder is FooterViewHolder) { 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 defd619287..7bef6cc7f7 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 @@ -293,6 +293,11 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib } mBinding.attentionIv.setOnClickListener { + SensorsBridge.trackUserFollowClick( + userId = videoEntity.user.id ?: "", + userName = videoEntity.user.name ?: "", + buttonName = "关注" + ) if (!videoEntity.me.isFollower) { if (!CheckLoginUtils.isLogin()) { CheckLoginUtils.checkLogin(context, mEntrance) {} diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt index 1e318d370f..c353654562 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/HomeVideoFragment.kt @@ -157,6 +157,7 @@ class HomeVideoFragment : BaseLazyFragment() { "play" ) } + SensorsBridge.trackVideoStreamingTabSelect(titles[it]) } } mBinding.mTabLayout.setupWithViewPager(mBinding.mViewPager) @@ -255,6 +256,12 @@ class HomeVideoFragment : BaseLazyFragment() { it.uploadVideoStreamingPlaying("点击广告") } + SensorsBridge.trackVideoStreamingAdvertisingSpaceClick( + advertisementType = center!![0].typeChinese, + location = "", + title = center!![0].title + ) + DirectUtils.directToLinkPage( requireContext(), LinkEntity( @@ -264,7 +271,7 @@ class HomeVideoFragment : BaseLazyFragment() { display = center!![0].display, community = center!![0].linkCommunity ), - "", "视频详情" + "", "视频详情", "视频流广告位" ) } if (center!![0].duration > 0 && mAdCountDownTimer == null) { @@ -273,15 +280,20 @@ class HomeVideoFragment : BaseLazyFragment() { } } if (!left.isNullOrEmpty()) { - setAdBanner(mBinding.adBannerLeft, left!!, position) + setAdBanner(mBinding.adBannerLeft, left!!, position, "左上角") } if (!right.isNullOrEmpty()) { - setAdBanner(mBinding.adBannerRight, right!!, position) + setAdBanner(mBinding.adBannerRight, right!!, position, "右上角") } } } - private fun setAdBanner(banner: HorizontalScrollableView, ads: ArrayList, position: Int) { + private fun setAdBanner( + banner: HorizontalScrollableView, + ads: ArrayList, + position: Int, + location: String + ) { val adDatas = banner.getAdDatas() if (adDatas.isEmpty() && position == ads[0].frequency) { banner.visibility = View.VISIBLE @@ -293,6 +305,11 @@ class HomeVideoFragment : BaseLazyFragment() { val linkEntity = ads[pos] NewFlatLogUtils.logVideoAdsClick(linkEntity.link, linkEntity.linkType, linkEntity.title) + SensorsBridge.trackVideoStreamingAdvertisingSpaceClick( + advertisementType = linkEntity.typeChinese, + location = location, + title = linkEntity.title + ) getCurrentFragment()?.findVisibleVideoViewByPosition()?.let { it.recordMta("视频广告", linkEntity.title) it.uploadVideoStreamingPlaying("点击广告") @@ -313,7 +330,7 @@ class HomeVideoFragment : BaseLazyFragment() { display = linkEntity.display, community = linkEntity.linkCommunity ), - "", "视频详情" + "", "视频详情", "视频流广告位" ) } } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoAdapter.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoAdapter.kt index 28e28b9eaa..384723fcf7 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoAdapter.kt @@ -181,31 +181,31 @@ class VideoAdapter( 0, this@VideoAdapter, mViewModel.path, - BaseActivity.mergeEntranceAndPath(mViewModel.path, "视频详情"), - exposureEvent, - object : EmptyCallback { - override fun onCallback() { - when (btn.text) { - "下载" -> { - videoView.recordMta("下载游戏") - MtaHelper.onEvent( - "视频详情", - "下载游戏", - "${videoList[position].title}(${videoList[position].id})" - ) - } - "预约" -> { - videoView.recordMta("预约游戏") - MtaHelper.onEvent( - "视频详情", - "预约游戏", - "${videoList[position].title}(${videoList[position].id})" - ) - } - } - videoView.uploadVideoStreamingPlaying("点击下载按钮", btn.text.toString()) + sourceEntrance = "视频流", + location = BaseActivity.mergeEntranceAndPath(mViewModel.path, "视频详情"), + traceEvent = exposureEvent + ) { + when (btn.text) { + "下载" -> { + videoView.recordMta("下载游戏") + MtaHelper.onEvent( + "视频详情", + "下载游戏", + "${videoList[position].title}(${videoList[position].id})" + ) } - }) + + "预约" -> { + videoView.recordMta("预约游戏") + MtaHelper.onEvent( + "视频详情", + "预约游戏", + "${videoList[position].title}(${videoList[position].id})" + ) + } + } + videoView.uploadVideoStreamingPlaying("点击下载按钮", btn.text.toString()) + } DownloadItemUtils.updateItem( mFragment.requireContext(), game, diff --git a/app/src/main/java/com/halo/assistant/fragment/comment/CommentDetailFragment.java b/app/src/main/java/com/halo/assistant/fragment/comment/CommentDetailFragment.java index 06e845895e..7c28c61f56 100644 --- a/app/src/main/java/com/halo/assistant/fragment/comment/CommentDetailFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/comment/CommentDetailFragment.java @@ -241,7 +241,7 @@ public class CommentDetailFragment extends ToolbarFragment implements OnCommentC e1.printStackTrace(); } } - ErrorHelper.handleError(requireContext(), errorString, false, mCommentSend::performClick, "文章及帖子的评论和回复"); + ErrorHelper.handleError(requireContext(), errorString, false, "文章及帖子的评论和回复", "", "", "内容实名", null, mCommentSend::performClick); } }); } diff --git a/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java b/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java index 753f476375..a5e78d5fca 100644 --- a/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java +++ b/app/src/main/java/com/halo/assistant/fragment/game/GamePluginAdapter.java @@ -130,6 +130,7 @@ public class GamePluginAdapter extends BaseRecyclerAdapter { DownloadItemUtils.setOnClickListener(mContext, binding.gameItemIncluded.downloadBtn, gameEntity, 1, GamePluginAdapter.this, StringUtils.buildString("(游戏-专题:", "插件化", "-列表[", String.valueOf(1), "])"), + "其他", StringUtils.buildString("游戏-专题-", "插件化", ":", gameEntity.getName()), gameEntity.getExposureEvent(), () -> MtaHelper.onEvent("首页_新", "点击", "插件化" + (position + 1) + "_" + gameEntity.getName() + "_" + binding.gameItemIncluded.downloadBtn.getText().toString())); DownloadItemUtils.updateItem(mContext, gameEntity, new GameViewHolder(holder.getBinding().gameItemIncluded), PluginLocation.only_index, false, null); diff --git a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt index 7107b430b4..ca36a6dee1 100644 --- a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt @@ -52,6 +52,8 @@ class RealNameInfoFragment : ToolbarFragment() { ?: false mGameId = arguments?.getString(EntranceConsts.KEY_GAME_ID) ?: "" + mViewModel.sourceEntrance = arguments?.getString(EntranceConsts.KEY_SOURCE_ENTRANCE) ?: "主动进入" + mBinding.toolbar.normalTitle.text = "实名认证" mBinding.toolbar.normalToolbar.setNavigationOnClickListener { requireActivity().finish() } @@ -76,7 +78,7 @@ class RealNameInfoFragment : ToolbarFragment() { SensorsBridge.trackEvent( "VerificationPageShow", "source_entrance", - if (mGameId.isNotEmpty() || mIsForcedToCertificate) "游戏实名" else "主动进入" + mViewModel.sourceEntrance ) } @@ -206,6 +208,7 @@ class RealNameInfoFragment : ToolbarFragment() { mBinding.reEditInfoBtn.setOnClickListener { startActivity( ShellActivity.getIntent(requireContext(), ShellActivity.Type.REAL_NAME_INFO).apply { + putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, mViewModel.sourceEntrance) putExtra(EntranceConsts.KEY_IS_FORCED_TO_CERTIFICATE, true) } ) diff --git a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoViewModel.kt b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoViewModel.kt index 917365a730..5b30be000a 100644 --- a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoViewModel.kt +++ b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoViewModel.kt @@ -33,6 +33,8 @@ class RealNameInfoViewModel(application: Application) : AndroidViewModel(applica val certificateResultLiveData = MutableLiveData() + var sourceEntrance: String = "" + fun getUserInfo(): UserInfoEntity? { var userInfoEntity = UserManager.getInstance().userInfoEntity val certificationOnlyInfoEntity: UserInfoEntity? @@ -75,7 +77,7 @@ class RealNameInfoViewModel(application: Application) : AndroidViewModel(applica SensorsBridge.trackEvent( "VerificationComplete", "source_entrance", - if (gameId.isNotEmpty() || isForced) "游戏实名" else "主动进入", + sourceEntrance, "result", "认证失败" ) @@ -105,7 +107,7 @@ class RealNameInfoViewModel(application: Application) : AndroidViewModel(applica SensorsBridge.trackEvent( "VerificationComplete", "source_entrance", - if (gameId.isNotEmpty() || isForced) "游戏实名" else "主动进入", + sourceEntrance, "result", "认证中" ) @@ -115,7 +117,7 @@ class RealNameInfoViewModel(application: Application) : AndroidViewModel(applica SensorsBridge.trackEvent( "VerificationComplete", "source_entrance", - if (gameId.isNotEmpty() || isForced) "游戏实名" else "主动进入", + sourceEntrance, "result", if (qualifyInt == 1) "未成年" else "成年" ) diff --git a/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneFragment.kt b/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneFragment.kt index dc04bb1435..d19e3d8e95 100644 --- a/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneFragment.kt @@ -53,6 +53,8 @@ class VerifyPhoneFragment : ToolbarFragment() { setTextChangedListener() setObserver() + + SensorsBridge.trackMobileNumberVerificationPageShow() } private fun setObserver() { diff --git a/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneViewModel.kt b/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneViewModel.kt index dac719038c..cd59602ac8 100644 --- a/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneViewModel.kt +++ b/app/src/main/java/com/halo/assistant/fragment/user/VerifyPhoneViewModel.kt @@ -9,6 +9,7 @@ import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.common.entity.LinkEntity import com.gh.gamecenter.common.utils.DeviceUtils import com.gh.gamecenter.common.retrofit.BiResponse +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.toObject import com.gh.gamecenter.feature.entity.MobileAuthEntity import com.gh.gamecenter.login.user.UserRepository @@ -96,11 +97,13 @@ class VerifyPhoneViewModel(application: Application) : AndroidViewModel(applicat UserRepository.getInstance().cacheAndNotifyUserInfo(cachedUserInfo, true) } finishLiveData.postValue(true) + SensorsBridge.trackMobileNumberVerificationComplete("验证成功") NewFlatLogUtils.logPhoneNumberVerifyDialogSuccess() } override fun onFailure(e: Exception) { super.onFailure(e) + SensorsBridge.trackMobileNumberVerificationComplete("验证错误") if (e is HttpException) { try { val responseBody = e.response().errorBody() diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java index 8337f7aca9..945b7e7145 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/Constants.java @@ -469,12 +469,28 @@ public class Constants { public static final String AD_ICON_ACTIVE = "ad_icon_active"; public static final String IS_AD_DATA = "is_ad_data"; + public static final String DOWNLOAD_STATUS_IN_CHINESE = "download_status_in_chinese"; + public static final String EB_REALNAME_RESULT = "realname_result"; public static final String SP_REALNAME_ERROR_HINT_IGNORED = "realname_error_hint_ignored"; public static final String SP_SENSORS_IS_FIRST_TIME = "sensors_is_first_time"; + public static final String SP_SENSORS_IS_FIRST_TIME_HOME_BOTTOM_TAB_SELECT = "sensors_is_first_time_home_bottom_tab_select"; + + public static final String SP_SENSORS_IS_FIRST_TIME_VIEW_FORUM = "sensors_is_first_time_view_forum"; + + public static final String SP_SENSORS_IS_FIRST_TIME_ARTICLE_LIKE_CLICK = "sensors_is_first_time_article_like_click"; + + public static final String SP_SENSORS_IS_FIRST_TIME_ARTICLE_COLLECTION_CLICK = "sensors_is_first_time_article_collection_click"; + + public static final String SP_SENSORS_IS_FIRST_TIME_ARTICLE_COMMENT = "sensors_is_first_time_article_comment"; + + public static final String SP_SENSORS_IS_FIRST_TIME_ARTICLE_REPLY = "sensors_is_first_time_article_reply"; + + public static final String SP_SENSORS_IS_FIRST_TIME_ARTICLE_SHARE = "sensors_is_first_time_article_share"; + public static final String SP_HOME_PUSH_POP_UP_SET = "home_push_pop_up_map"; public static final String FINISH_HOME_PUSH = "finish_home_push"; public static final String APK_SIZE = "apk_size"; diff --git a/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt b/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt index d53806baef..f96139c02e 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/entity/CommunityEntity.kt @@ -20,6 +20,11 @@ data class CommunityEntity( ) : Parcelable { constructor(id: String = "", name: String = "") : this(id, name, "choiceness") + val typeChinese: String get() = when (type) { + "game_bbs" -> "游戏论坛" + else -> "综合论坛" + } + @Parcelize class CommunityGameEntity( @SerializedName("_id") @@ -35,7 +40,8 @@ data class CommunityEntity( @SerializedName("icon_subscript") var iconSubscript: String? = null, @SerializedName("icon_float") - var iconFloat: IconFloat? = null + var iconFloat: IconFloat? = null, + var category: String? = "" ) : Parcelable { @IgnoredOnParcel @@ -45,6 +51,16 @@ data class CommunityEntity( fun getIcon(): String { return mRawIcon ?: mIcon ?: "" } + + @IgnoredOnParcel + val categoryChinese: String + get() = when (category) { + "online" -> "网络" + "local" -> "单机" + "welfare" -> "福利" + "simulator" -> "模拟器" + else -> category ?: "" + } } companion object { diff --git a/module_common/src/main/java/com/gh/gamecenter/common/entity/NormalShareEntity.kt b/module_common/src/main/java/com/gh/gamecenter/common/entity/NormalShareEntity.kt index 83fafbb63c..ed488083b7 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/entity/NormalShareEntity.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/entity/NormalShareEntity.kt @@ -21,5 +21,8 @@ class AdditionalParamsEntity( var contentId: String = "",//内容id var bbsId: String = "",//论坛id var bbsType: String = "",//论坛类型:游戏论坛、综合论坛 + var customerType: String = "",//用户分类:游戏达人、专区版主等 + var gameForumType: String = "",//论坛游戏分类:gj单机\福利游戏等 + var activityTagName: String = "",//活动标签名称 var refUserId: String = "",//分享用户所属的用户Id ) : Parcelable \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt index 1e4e2ed102..cf8c22b702 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt @@ -845,10 +845,11 @@ fun List.toArrayList(): ArrayList { fun ExpandTextView.setTextWithInterceptingInternalUrl( shrankText: CharSequence, expandedText: CharSequence, - clickedCallback: (url: String) -> Unit + sourceEntrance: String = "", + clickedCallback: (url: String) -> Unit, ) { - var shrankSsb = shrankText.interceptUrlSpanAndRoundImageSpan(clickedCallback) - var expandedSsb = expandedText.interceptUrlSpanAndRoundImageSpan(clickedCallback) + var shrankSsb = shrankText.interceptUrlSpanAndRoundImageSpan(clickedCallback, sourceEntrance) + var expandedSsb = expandedText.interceptUrlSpanAndRoundImageSpan(clickedCallback, sourceEntrance) // 去掉旧版本 Android 系统 [Html.FROM_HTML_MODE_LEGACY] 产生的两个换行符 (丑陋的代码) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { @@ -932,7 +933,10 @@ fun TextView.maxWidthExcludeZero(width: Int) { } } -fun CharSequence.interceptUrlSpanAndRoundImageSpan(clickedCallback: ((url: String) -> Unit)? = null): SpannableStringBuilder { +fun CharSequence.interceptUrlSpanAndRoundImageSpan( + clickedCallback: ((url: String) -> Unit)? = null, + sourceEntrance: String = "" +): SpannableStringBuilder { return SpannableStringBuilder.valueOf(this).apply { getSpans(0, length, URLSpan::class.java).forEach { setSpan( @@ -952,7 +956,7 @@ fun CharSequence.interceptUrlSpanAndRoundImageSpan(clickedCallback: ((url: Strin ARouter.getInstance().build(RouteConsts.provider.webActivity).navigation() as? IWebProvider val provider = ARouter.getInstance().build(RouteConsts.provider.defaultUrlHandler) .navigation() as IDefaultUrlHandlerProvider - if (!provider.interceptUrl(widget.context, it.url, "")) { + if (!provider.interceptUrl(widget.context, it.url, "", sourceEntrance = sourceEntrance)) { webActivityProvider?.getIntent(widget.context, it.url, true)?.run { widget.context.startActivity(this) } 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 3b3d780814..4892085067 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 @@ -2,10 +2,12 @@ package com.gh.gamecenter.common.utils import android.app.Application import com.alibaba.android.arouter.launcher.ARouter +import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.RouteConsts import com.gh.gamecenter.common.exposure.ExposureSource import com.gh.gamecenter.common.json.json import com.gh.gamecenter.core.provider.ISensorsProvider +import com.gh.gamecenter.core.utils.SPUtils import org.json.JSONObject /** @@ -59,6 +61,29 @@ object SensorsBridge { private const val KEY_MESSAGE_TYPE = "message_type" private const val KEY_DIALOG_REMINDER_TIME = "dialog_reminder_time" private const val KEY_DIALOG_CLOSE = "dialog_close" + private const val KEY_POST_RESULT = "post_result" + private const val KEY_RESULT = "result" + private const val KEY_BBS_ID = "bbs_id" + private const val KEY_BBS_TYPE = "bbs_type" + private const val KEY_FORUM_NAME = "forum_name" + private const val KEY_CUSTOMER_TYPE = "customer_type" + private const val KEY_ARTICLE_ID = "article_id" + private const val KEY_ARTICLE_TYPE = "article_type" + private const val KEY_ACTIVITY_TAG = "activity_tag" + private const val KEY_GAME_FORUM_TYPE = "game_forum_type" + private const val KEY_STAY_LENGTH = "stay_length" + private const val KEY_SHARE_TYPE = "share_type" + private const val KEY_IS_FIRST_TIME = "\$is_first_time" + private const val KEY_TAB_TYPE = "tab_type" + private const val KEY_BANNER_NAME = "banner_name" + private const val KEY_TOPPING_TYPE = "topping_type" + private const val KEY_FORUM_TYPE = "forum_type" + private const val KEY_ADVERTISEMENT_TYPE = "advertisement_type" + private const val KEY_USER_ID = "ghuser_id" + private const val KEY_USER_NAME = "user_name" + private const val KEY_VERIFICATION_TYPE = "verification_type" + private const val KEY_VIDEO_ID = "video_id" + private const val KEY_PLAY_TYPE = "play_type" private const val EVENT_GAME_DETAIL_PAGE_TAB_SELECT = "GameDetailPageTabSelect" private const val EVENT_GAME_DETAIL_PAGE_TAG_CLICK = "GameDetailPageGameTagClick" @@ -130,6 +155,39 @@ object SensorsBridge { private const val EVENT_LAUNCH_SERVER_REMINDER_CANCEL_CLICK = "LaunchServerReminderCancelClick" private const val EVENT_GAME_SEARCH_FIRST_GAME_BANNER_CLICK = "GameSearchFirstGameBannerClick" private const val EVENT_GAME_SEARCH_FIRST_GAME_CARD_CLICK = "GameSearchFirstGameCardClick" + private const val EVENT_ARTICLE_POST_RESULT = "ArticlePostResult" + private const val EVENT_ARTICLE_DETAILS_BROWSING = "ArticleDetailsBrowsing" + private const val EVENT_ARTICLE_BROWSING_DURATION = "ArticleBrowsingDuration" + private const val EVENT_ARTICLE_LIKE_CLICK = "ArticleLikeClick" + private const val EVENT_ARTICLE_COLLECTION_CLICK = "ArticleCollectionClick" + private const val EVENT_ARTICLE_COMMENT = "ArticleComment" + private const val EVENT_ARTICLE_COMMENT_RESULT = "ArticleCommentResult" + private const val EVENT_ARTICLE_REPLY = "ArticleReply" + private const val EVENT_ARTICLE_REPLY_RESULT = "ArticleReplyResult" + private const val EVENT_ARTICLE_SHARE = "ArticleShare" + private const val EVENT_ARTICLE_SHARE_RESULT = "ArticleShareResult" + private const val EVENT_VIDEO_START_PLAYING = "VideoStartPlaying" + private const val EVENT_VIDEO_END_PLAYING = "VideoEndPlaying" + private const val EVENT_FOLLOW_FORUM_CLICK = "FollowForumClick" + private const val EVENT_USER_FOLLOW_CLICK = "UserFollowClick" + private const val EVENT_VIEW_FORUM = "ViewForum" + private const val EVENT_COMMUNITY_TOP_TAB_SELECTED = "CommunityTopTabSelected" + private const val EVENT_FORUM_BANNER_CLICK = "ForumBannerClick" + private const val EVENT_FORUM_DETAILS_ANNOUNCEMENT_BOARD_CLICK = "ForumDetailsAnnouncementBoardClick" + private const val EVENT_ACCESS_VIDEO_STREAMING = "AccessVideoStreaming" + private const val EVENT_VIDEO_STREAMING_TAB_SELECT = "VideoStreamingTabSelect" + private const val EVENT_VIDEO_STREAMING_ADVERTISING_SPACE_CLICK = "VideoStreamingAdvertisingSpaceClick" + private const val EVENT_MY_PAGE_BANNER_CLICK = "MyPageBannerClick" + private const val EVENT_MOBILE_NUMBER_VERIFICATION_SHOW = "MobileNumberVerificationPageShow" + private const val EVENT_MOBILE_NUMBER_VERIFICATION_COMPLETE = "MobileNumberVerificationComplete" + private const val EVENT_MOBILE_NUMBER_VERIFICATION_DIALOG = "MobileNumberVerificationDialog" + private const val EVENT_MOBILE_NUMBER_VERIFICATION_POPUP_CLICK = "MobileNumberVerificationPopupClick" + private const val EVENT_VERIFICATION_DIALOG_SHOW = "VerificationDialogShow" + private const val EVENT_VERIFICATION_POPUP_CLICK = "VerificationPopupClick" + + private const val EVENT_PERSONAL_HOME_PAGE_BROWSING = "PersonalHomepageBrowsing" + private const val EVENT_FORUM_BROWSING_DURATION = "ForumBrowsingDuration" + private const val EVENT_COMMUNITY_BROWSING_DURATION = "CommunityBrowsingDuration" private var mIsSensorsEnabled = false @@ -232,18 +290,21 @@ object SensorsBridge { * @param pageName 页面名称 * @param searchContent 搜索内容 * @param searchType 搜索内型 + * @param sourceEntrance 入口来源:首页、游戏库、游戏详情、QQ小游戏、社区、论坛、webView */ fun trackSearchButtonClick( pageId: String, pageName: String, searchContent: String, - searchType: String + searchType: String, + sourceEntrance: String ) { val json = json { KEY_PAGE_ID to pageId KEY_PAGE_NAME to pageName KEY_SEARCH_CONTENT to searchContent KEY_SEARCH_TYPE to searchType + KEY_SOURCE_ENTRANCE to sourceEntrance } trackEvent(EVENT_SEARCH_BUTTON_CLICK, json) } @@ -257,13 +318,15 @@ object SensorsBridge { * @param searchContent 搜索内容 * @param searchType 搜索类型 * @param searchResult 搜索结果 true or false + * @param sourceEntrance 入口来源:首页、游戏库、游戏详情、QQ小游戏、社区、论坛、webView */ fun trackSearchResultReturn( pageId: String, pageName: String, searchContent: String, searchType: String, - searchResult: Boolean + searchResult: Boolean, + sourceEntrance: String ) { val json = json { KEY_PAGE_ID to pageId @@ -271,6 +334,7 @@ object SensorsBridge { KEY_SEARCH_CONTENT to searchContent KEY_SEARCH_TYPE to searchType KEY_SEARCH_RESULT to searchResult + KEY_SOURCE_ENTRANCE to sourceEntrance } trackEvent(EVENT_SEARCH_RESULT_RETURN, json) } @@ -282,18 +346,21 @@ object SensorsBridge { * @param pageName 页面名称 * @param searchContent 搜索内容 * @param searchType 搜索类型 + * @param sourceEntrance 入口来源:首页、游戏库、游戏详情、QQ小游戏、社区、论坛、webView */ fun trackSearchResultClick( pageId: String, pageName: String, searchContent: String, - searchType: String + searchType: String, + sourceEntrance: String ) { val json = json { KEY_PAGE_ID to pageId KEY_PAGE_NAME to pageName KEY_SEARCH_CONTENT to searchContent KEY_SEARCH_TYPE to searchType + KEY_SOURCE_ENTRANCE to sourceEntrance } trackEvent(EVENT_SEARCH_RESULT_CLICK, json) } @@ -2201,4 +2268,825 @@ object SensorsBridge { trackEvent(EVENT_GAME_SEARCH_FIRST_GAME_CARD_CLICK, json) } + /** + * 事件ID:ViewForum + * 事件名称:内容发布结果事件 + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param forumName 论坛名称 + * @param gameForumType 游戏论坛分类: gj单机\福利游戏等 + */ + fun trackViewForum( + bbsId: String, + bbsType: String, + forumName: String, + gameForumType: String + ) { + val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_VIEW_FORUM, true) + val json = json { + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_FORUM_NAME to forumName + KEY_GAME_FORUM_TYPE to gameForumType + KEY_IS_FIRST_TIME to isFirstTime + } + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_VIEW_FORUM, false) + trackEvent(EVENT_VIEW_FORUM, json) + } + + /** + * 事件ID:ArticlePostResult + * 事件名称:内容发布结果事件 + * @param postResult 发布结果: 成功\失败 + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param customerType 用户分类:认证-游戏达人\专区版主等 + */ + @JvmStatic + fun trackArticlePostResult( + postResult: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + customerType: String + ) { + val json = json { + KEY_POST_RESULT to postResult + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_CUSTOMER_TYPE to customerType + } + trackEvent(EVENT_ARTICLE_POST_RESULT, json) + } + + /** + * 事件ID:ArticleDetailsBrowsing + * 事件名称:帖子详情浏览事件 + * @param customerType 用户分类:认证-游戏达人\专区版主等 + * @param subSection 子版块名称 + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param sourceEntrance 来源 + * + */ + fun trackArticleDetailsBrowsing( + customerType: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + sourceEntrance: String + ) { + val json = json { + KEY_SOURCE_ENTRANCE to sourceEntrance + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + } + trackEvent(EVENT_ARTICLE_DETAILS_BROWSING, json) + } + + /** + * 事件ID:ArticleBrowsingDuration + * 事件名称:帖子浏览时长事件 + * @param customerType 用户分类:认证-游戏达人\专区版主等 + * @param subSection 子版块名称 + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleId 帖子的ID + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param sourceEntrance 来源 + * @param stayLength 用户在页面停留的时长 + * + */ + fun trackArticleBrowsingDuration( + customerType: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleId: String, + articleType: String, + sourceEntrance: String, + stayLength: Double + ) { + val json = json { + KEY_SOURCE_ENTRANCE to sourceEntrance + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_STAY_LENGTH to stayLength + } + trackEvent(EVENT_ARTICLE_BROWSING_DURATION, json) + } + + /** + * 事件ID:ArticleLikeClick + * 事件名称:帖子点赞按钮点击事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param buttonName 按钮名称 + */ + fun trackArticleLikeClick( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + buttonName: String + ) { + val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_LIKE_CLICK, true) + val json = json { + KEY_IS_FIRST_TIME to isFirstTime + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_BUTTON_NAME to buttonName + } + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_LIKE_CLICK, false) + trackEvent(EVENT_ARTICLE_LIKE_CLICK, json) + } + + /** + * 事件ID:ArticleCollectionClick + * 事件名称:帖子收藏按钮点击事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param buttonName 按钮名称 + */ + fun trackArticleCollectionClick( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + buttonName: String + ) { + val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COLLECTION_CLICK, true) + val json = json { + KEY_IS_FIRST_TIME to isFirstTime + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_BUTTON_NAME to buttonName + } + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COLLECTION_CLICK, false) + trackEvent(EVENT_ARTICLE_COLLECTION_CLICK, json) + } + + /** + * 事件ID:ArticleComment + * 事件名称:帖子评论按钮点击事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + */ + fun trackArticleComment( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + ) { + val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COMMENT, true) + val json = json { + KEY_IS_FIRST_TIME to isFirstTime + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + } + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_COMMENT, false) + trackEvent(EVENT_ARTICLE_COMMENT, json) + } + + /** + * 事件ID:ArticleCommentResult + * 事件名称:帖子评论结果返回事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param result 返回结果:评论成功\评论失败 + */ + fun trackArticleCommentResult( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + result: String + ) { + val json = json { + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_RESULT to result + } + trackEvent(EVENT_ARTICLE_COMMENT_RESULT, json) + } + + /** + * 事件ID:ArticleShare + * 事件名称:帖子分享按钮点击事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param shareType 分享方式:微信、朋友圈、QQ好友、QQ空间、新浪微博、短信、复制链接 + */ + @JvmStatic + fun trackArticleShare( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + shareType: String + ) { + val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_SHARE, true) + val json = json { + KEY_IS_FIRST_TIME to isFirstTime + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_SHARE_TYPE to shareType + } + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_SHARE, false) + trackEvent(EVENT_ARTICLE_SHARE, json) + } + + /** + * 事件ID:ArticleShareResult + * 事件名称:帖子分享按钮点击事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param shareType 分享方式:微信、朋友圈、QQ好友、QQ空间、新浪微博、短信、复制链接 + * @param result 点击按钮的结果:分享成功\分享失败 + */ + @JvmStatic + fun trackArticleShareResult( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + shareType: String, + result: String + ) { + val json = json { + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_SHARE_TYPE to shareType + KEY_RESULT to result + } + trackEvent(EVENT_ARTICLE_SHARE_RESULT, json) + } + + /** + * 事件ID:ArticleReply + * 事件名称:帖子回复按钮点击事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + */ + fun trackArticleReply( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + ) { + val isFirstTime = SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_REPLY, true) + val json = json { + KEY_IS_FIRST_TIME to isFirstTime + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + } + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME_ARTICLE_REPLY, false) + trackEvent(EVENT_ARTICLE_REPLY, json) + } + + /** + * 事件ID:ArticleReplyResult + * 事件名称:帖子回复结果返回事件 + * @param customerType 用户分类 + * @param subSection 子版块名称 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param result 返回结果:回复成功\回复失败 + */ + fun trackArticleReplyResult( + customerType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + result: String + ) { + val json = json { + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_RESULT to result + } + trackEvent(EVENT_ARTICLE_REPLY_RESULT, json) + } + + /** + * 事件ID:VideoStartPlaying + * 事件名称:帖子回复按钮点击事件 + * @param customerType 用户分类 + * @param videoId 视频ID + * @param playType 播放形式:视频贴\视频流 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + */ + fun trackVideoStartPlaying( + customerType: String, + videoId: String, + playType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + ) { + val json = json { + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_VIDEO_ID to videoId + KEY_PLAY_TYPE to playType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + } + trackEvent(EVENT_VIDEO_START_PLAYING, json) + } + + /** + * 事件ID:VideoEndPlaying + * 事件名称:视频结束播放上报事件 + * @param customerType 用户分类 + * @param videoId 视频ID + * @param playType 播放形式:视频贴\视频流 + * @param articleId 帖子的ID + * @param bbsId 论坛ID + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param activityTag 活动标签名称 + * @param gameForumType: 游戏论坛分类: gj单机\福利游戏等 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + * @param result 结果:是否播放进度达到95% + */ + fun trackVideoEndPlaying( + customerType: String, + videoId: String, + playType: String, + articleId: String, + bbsId: String, + bbsType: String, + activityTag: String, + gameForumType: String, + articleType: String, + result: String + ) { + val json = json { + KEY_ARTICLE_ID to articleId + KEY_CUSTOMER_TYPE to customerType + KEY_VIDEO_ID to videoId + KEY_PLAY_TYPE to playType + KEY_BBS_ID to bbsId + KEY_BBS_TYPE to bbsType + KEY_ACTIVITY_TAG to activityTag + KEY_GAME_FORUM_TYPE to gameForumType + KEY_ARTICLE_TYPE to articleType + KEY_RESULT to result + } + trackEvent(EVENT_VIDEO_END_PLAYING, json) + } + + /** + * 事件ID:FollowForumClick + * 事件名称:关注论坛按钮点击事件 + * @param bbsId 论坛ID + * @param forumName 论坛名称 + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param gameForumType 游戏论坛分类: gj单机\福利游戏等 + * @param buttonName 按钮名称:关注\已关注 + */ + fun trackFollowForumClick( + bbsId: String, + forumName: String, + bbsType: String, + gameForumType: String, + buttonName: String + ) { + val json = json { + KEY_BBS_ID to bbsId + KEY_FORUM_NAME to forumName + KEY_BBS_TYPE to bbsType + KEY_GAME_FORUM_TYPE to gameForumType + KEY_BUTTON_NAME to buttonName + } + trackEvent(EVENT_FOLLOW_FORUM_CLICK, json) + } + + /** + * 事件ID:UserFollowClick + * 事件名称:关注用户按钮点击事件 + * @param userId 用户ID + * @param userName 用户名称 + * @param buttonName 按钮名称:关注\已关注 + */ + fun trackUserFollowClick( + userId: String, + userName: String, + buttonName: String + ) { + val json = json { + KEY_USER_ID to userId + KEY_USER_NAME to userName + KEY_BUTTON_NAME to buttonName + } + trackEvent(EVENT_USER_FOLLOW_CLICK, json) + } + + /** + * 事件ID:CommunityTopTabSelected + * 事件名称:社区顶部Tab选中事件 + * @param tabType 选中tab类型: 推荐\论坛\活动 + */ + fun trackCommunityTopTabSelected( + tabType: String + ) { + val json = json { + KEY_TAB_TYPE to tabType + } + trackEvent(EVENT_COMMUNITY_TOP_TAB_SELECTED, json) + } + + /** + * 事件ID:ForumBannerClick + * 事件名称:论坛banner点击事件 + * @param bannerName 后台填写的轮播图标题 + */ + fun trackForumBannerClick( + bannerName: String + ) { + val json = json { + KEY_BANNER_NAME to bannerName + } + trackEvent(EVENT_FORUM_BANNER_CLICK, json) + } + + /** + * 事件ID:ForumDetailsAnnouncementBoardClick + * 事件名称:论坛详情公告栏点击事件 + * @param toppingType 置顶的公告类型 + * @param title 公告的标题 + * @param forumName 论坛名称 + * @param forumType 论坛类型 + */ + fun trackForumDetailsAnnouncementBoardClick( + toppingType: String, + title: String, + forumName: String, + forumType: String + ) { + val json = json { + KEY_TOPPING_TYPE to toppingType + KEY_TITLE to title + KEY_FORUM_NAME to forumName + KEY_FORUM_TYPE to forumType + } + trackEvent(EVENT_FORUM_DETAILS_ANNOUNCEMENT_BOARD_CLICK, json) + } + + /** + * 事件ID:AccessVideoStreaming + * 事件名称:视频流访问事件 + * @param sourceEntrance 来源:光环底部tab\社区的右上角入口 + */ + fun trackAccessVideoStreaming( + sourceEntrance: String, + ) { + val json = json { + KEY_SOURCE_ENTRANCE to sourceEntrance + } + trackEvent(EVENT_ACCESS_VIDEO_STREAMING, json) + } + + /** + * 事件ID:VideoStreamingTabSelect + * 事件名称:视频流Tab选中事件 + * @param tabContent 选中Tab的名称 + */ + fun trackVideoStreamingTabSelect( + tabContent: String + ) { + val json = json { + KEY_TAB_CONTENT to tabContent + } + trackEvent(EVENT_VIDEO_STREAMING_TAB_SELECT, json) + } + + /** + * 事件ID:VideoStreamingAdvertisingSpaceClick + * 事件名称:视频流广告位点击事件 + * @param advertisementType 广告的类型 + * @param location 广告的位置 + * @param title 广告的标题 + */ + fun trackVideoStreamingAdvertisingSpaceClick( + advertisementType: String, + location: String, + title: String + ) { + val json = json { + KEY_ADVERTISEMENT_TYPE to advertisementType + KEY_LOCATION to location + title to title + } + trackEvent(EVENT_VIDEO_STREAMING_ADVERTISING_SPACE_CLICK, json) + } + + /** + * 事件ID:MyPageBannerClick + * 事件名称:我的光环banner点击事件 + * @param position 序号 + */ + fun trackMyPageBannerClick( + position: Int, + ) { + val json = json { + KEY_POSITION to position + } + trackEvent(EVENT_MY_PAGE_BANNER_CLICK, json) + } + + /** + * 事件ID:VerificationDialogShow + * 事件名称:实名认证弹窗展示事件 + * @param gameId 游戏ID + * @param gameName 游戏名称 + * @param gameType 游戏类型:单机、网游等 + * @param verificationType 实名类型:游戏实名\内容实名 + * @param articleType 发帖类型: 帖子\提问帖\视频贴 + */ + fun trackVerificationDialogShow( + gameId: String, + gameName: String, + gameType: String, + verificationType: String, + articleType: String + ) { + val json = json { + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName + KEY_GAME_TYPE to gameType + KEY_VERIFICATION_TYPE to verificationType + KEY_ARTICLE_TYPE to articleType + } + + trackEvent(EVENT_VERIFICATION_DIALOG_SHOW, json) + } + + /** + * 事件ID:VerificationPopupClick + * 事件名称:实名认证弹窗点击事件 + * @param buttonName 按钮名称 + */ + fun trackVerificationPopupClick( + buttonName: String + ) { + val json = json { + KEY_BUTTON_NAME to buttonName + } + + trackEvent(EVENT_VERIFICATION_POPUP_CLICK, json) + } + + /** + * 事件ID:MobileNumberVerificationDialog + * 事件名称:社区手机号验证弹窗展示事件 + * @param articleType 发帖时所选择的类型 + */ + fun trackMobileNumberVerificationDialog( + articleType: String + ) { + val json = json { + KEY_ARTICLE_TYPE to articleType + } + trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_DIALOG, json) + } + + /** + * 事件ID:MobileNumberVerificationPopupClick + * 事件名称:社区手机号验证弹窗点击事件 + * @param buttonName 按钮名称:前往手机号验证\以后再说 + */ + fun trackMobileNumberVerificationPopupClick( + buttonName: String + ) { + val json = json { + KEY_BUTTON_NAME to buttonName + } + trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_POPUP_CLICK, json) + } + + /** + * 事件ID:MobileNumberVerificationPageShow + * 事件名称:手机号验证界面展示事件 + */ + fun trackMobileNumberVerificationPageShow() { + val json = json {} + trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_SHOW, json) + } + + /** + * 事件ID:MobileNumberVerificationComplete + * 事件名称:完成手机号验证事件 + * @param result 返回结果: 验证成功\验证错误 + */ + fun trackMobileNumberVerificationComplete( + result: String + ) { + val json = json { + KEY_RESULT to result + } + trackEvent(EVENT_MOBILE_NUMBER_VERIFICATION_COMPLETE, json) + } + + /** + * 事件ID:PersonalHomepageBrowsing + * 事件名称:个人主页浏览事件 + * @param userId 用户ID + * @param customerType 用户分类 + */ + fun trackPersonalHomepageBrowsing( + userId: String, + customerType: String + ) { + val json = json { + KEY_USER_ID to userId + KEY_CUSTOMER_TYPE to customerType + } + trackEvent(EVENT_PERSONAL_HOME_PAGE_BROWSING, json) + } + + /** + * 事件ID:ForumBrowsingDuration + * 事件名称:论坛浏览时长事件 + * @param bbsId 论坛ID + * @param forumName 论坛名称 + * @param bbsType 论坛类型: 游戏论坛\综合论坛 + * @param gameForumType 游戏论坛分类: gj单机\福利游戏等 + */ + fun trackForumBrowsingDuration( + bbsId: String, + forumName: String, + bbsType: String, + gameForumType: String, + stayLength: Double + ) { + val json = json { + KEY_BBS_ID to bbsId + KEY_FORUM_NAME to forumName + KEY_BBS_TYPE to bbsType + KEY_GAME_FORUM_TYPE to gameForumType + KEY_STAY_LENGTH to stayLength + } + trackEvent(EVENT_FORUM_BROWSING_DURATION, json) + } + + /** + * 事件ID:CommunityBrowsingDuration + * 事件名称:社区浏览时长事件 + * @param stayLength 用户在页面停留的时长 + */ + fun trackCommunityBrowsingDuration( + stayLength: Double + ) { + val json = json { + KEY_STAY_LENGTH to stayLength + } + trackEvent(EVENT_COMMUNITY_BROWSING_DURATION, json) + } } \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/ShareUtils.java b/module_common/src/main/java/com/gh/gamecenter/common/utils/ShareUtils.java index b0a699a8d2..8ce5b4f845 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/ShareUtils.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/ShareUtils.java @@ -169,6 +169,18 @@ public class ShareUtils { ShareUtils.shareEntrance == ShareEntrance.communityArticle || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { NewLogUtils.logShareResult(ShareUtils.additionalParams, true); + + SensorsBridge.trackArticleShareResult( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + shareType, + "分享成功" + ); } else if (ShareUtils.shareEntrance == ShareEntrance.gameCollection) { NewLogUtils.logViewOrClickGameCollectionDetail( "click_game_collect_detail_favorite_success", @@ -183,6 +195,7 @@ public class ShareUtils { "share_type", shareType ); } + EventBus.getDefault().post(new EBShare(ShareUtils.shareEntrance, shareType)); } @@ -198,6 +211,17 @@ public class ShareUtils { ShareUtils.shareEntrance == ShareEntrance.communityArticle || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { NewLogUtils.logShareResult(ShareUtils.additionalParams, false); + SensorsBridge.trackArticleShareResult( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + shareType, + "分享失败" + ); } } @@ -353,7 +377,30 @@ public class ShareUtils { }); } - public void showShareWindowsCallback(Activity activity, View view, String url, String icon, String shareTitle, String shareSummary, ShareEntrance shareEntrance, String id, ShareCallBack callBack) { + public void showShareWindowsCallback( + Activity activity, + View view, String url, + String icon, + String shareTitle, + String shareSummary, + ShareEntrance shareEntrance, + String id, + ShareCallBack callBack + ) { + showShareWindowsCallback(activity, view, url, icon, shareTitle, shareSummary, shareEntrance, id, null, callBack); + } + + public void showShareWindowsCallback( + Activity activity, + View view, String url, + String icon, + String shareTitle, + String shareSummary, + ShareEntrance shareEntrance, + String id, + AdditionalParamsEntity additionalParams, + ShareCallBack callBack + ) { if (activity.isFinishing()) return; this.mActivity = new WeakReference<>(activity); this.shareIcon = getHttpsUrl(icon); @@ -364,6 +411,7 @@ public class ShareUtils { ShareUtils.shareEntrance = mShareEntrance; ShareUtils.resourceId = id; ShareUtils.shareEntity = new ShareEntity(shareUrl, mTitle, mSummary); + ShareUtils.additionalParams = additionalParams; LogUtils.uploadShareEnter(mShareEntrance.getName(), shareUrl, mTitle, mSummary, id); View contentView = View.inflate(mActivity.get(), R.layout.share_popup_layout, null); @@ -473,6 +521,22 @@ public class ShareUtils { shareType = "qq_friend"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + if(ShareUtils.shareEntrance == ShareEntrance.video + || ShareUtils.shareEntrance == ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShare( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "QQ好友" + ); + } + Bundle params = new Bundle(); switch (mShareEntrance) { @@ -515,6 +579,23 @@ public class ShareUtils { shareType = "wechat_friend"; mShareType = ShareType.wechat; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + + if(ShareUtils.shareEntrance == ShareEntrance.video + || ShareUtils.shareEntrance == ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShare( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "朋友圈" + ); + } + if (!mIWXAPI.isWXAppInstalled() && !PermissionHelper.isGetInstalledListPermissionDisabled(mContext)) { Utils.toast(mContext, mContext.getString(R.string.share_no_wechat_hint)); return; @@ -643,6 +724,22 @@ public class ShareUtils { MtaHelper.onEvent("内容分享", "QQ空间", mTitle); LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + if(ShareUtils.shareEntrance == ShareEntrance.video + || ShareUtils.shareEntrance == ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShare( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "QQ空间" + ); + } + Bundle params = new Bundle(); switch (mShareEntrance) { @@ -689,6 +786,23 @@ public class ShareUtils { mShareType = ShareType.wechatMoments; shareType = "wechat_moment"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + + if(ShareUtils.shareEntrance == ShareEntrance.video + || ShareUtils.shareEntrance == ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShare( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "朋友圈" + ); + } + if (!mIWXAPI.isWXAppInstalled() && !PermissionHelper.isGetInstalledListPermissionDisabled(mContext)) { Utils.toast(mContext, mContext.getString(R.string.share_no_wechat_hint)); return; @@ -738,6 +852,22 @@ public class ShareUtils { shareType = "sina_weibo"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + if(ShareUtils.shareEntrance == ShareEntrance.video + || ShareUtils.shareEntrance == ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShare( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "新浪微博" + ); + } + if (mShareEntrance == ShareEntrance.qaDetail) { mTitle = "向你推荐:" + mTitle + " @光环助手 " + shareUrl; mSummary = ""; @@ -771,6 +901,34 @@ public class ShareUtils { shareType = "sms"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + if(ShareUtils.shareEntrance == ShareEntrance.video + || ShareUtils.shareEntrance == ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShare( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "短信" + ); + + SensorsBridge.trackArticleShareResult( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "短信", + "分享成功" + ); + } + String smsBody; switch (mShareEntrance) { case news: @@ -821,6 +979,35 @@ public class ShareUtils { shareType = "copy_link"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); LogUtils.uploadShareResult(shareType, shareEntrance.getName(), "success", shareUrl, mTitle, mSummary, resourceId); + + if(ShareUtils.shareEntrance == ShareEntrance.video + || ShareUtils.shareEntrance == ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareEntrance.askNormal) + { + SensorsBridge.trackArticleShare( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "短信" + ); + + SensorsBridge.trackArticleShareResult( + additionalParams.getCustomerType(), + additionalParams.getContentId(), + additionalParams.getBbsId(), + additionalParams.getBbsType(), + additionalParams.getActivityTagName(), + additionalParams.getGameForumType(), + additionalParams.getContentType(), + "短信", + "分享成功" + ); + } + if (mShareEntrance != ShareEntrance.shareGh) { ExtensionsKt.copyTextAndToast(copyContent, "复制成功"); safelyDismiss(); diff --git a/module_common/src/main/res/values/strings.xml b/module_common/src/main/res/values/strings.xml index 9eb19dcb37..4b354a86e8 100644 --- a/module_common/src/main/res/values/strings.xml +++ b/module_common/src/main/res/values/strings.xml @@ -21,6 +21,7 @@ QQ好友 QQ空间 微博 + 新浪微博 解析包出错(可能被误删了),请重新下载 https://www.ghzs.com?source=appshare100 @@ -88,5 +89,7 @@ 请输入文字... 搜索 1. 游戏下载功能(XAPK与APKS文件下载)\n2. 图片上传功能(头像、主页背景、帖子、游戏单)\n3. 视频上传功能(视频流、帖子)\n4. 图片保存功能\n5. 游戏投稿功能 + 短信 + 复制链接 \ No newline at end of file diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IDefaultUrlHandlerProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IDefaultUrlHandlerProvider.kt index eda835d30d..3e67425bfd 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IDefaultUrlHandlerProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IDefaultUrlHandlerProvider.kt @@ -5,5 +5,11 @@ import com.alibaba.android.arouter.facade.template.IProvider interface IDefaultUrlHandlerProvider : IProvider { - fun interceptUrl(context: Context, url: String, entrance: String, bringAppToFront: Boolean = false): Boolean + fun interceptUrl( + context: Context, + url: String, + entrance: String, + bringAppToFront: Boolean = false, + sourceEntrance: String = "" + ): Boolean } \ No newline at end of file diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IDirectProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IDirectProvider.kt index 72b6f1098a..d7503e1364 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IDirectProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IDirectProvider.kt @@ -44,14 +44,16 @@ interface IDirectProvider : IProvider { articleId: String?, communityId: String?, entrance: String?, - path: String? + path: String?, + sourceEntrance: String = "" ) fun directToVideoDetail( context: Context, videoId: String, entrance: String? = null, - path: String? = "" + path: String? = "", + sourceEntrance: String = "" ) fun directToAmway( diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/AnswerEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/AnswerEntity.kt index 4d5ff02ae0..29d9bfaeb8 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/AnswerEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/AnswerEntity.kt @@ -3,6 +3,7 @@ package com.gh.gamecenter.feature.entity import android.os.Parcel import android.os.Parcelable import androidx.annotation.NonNull +import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Ignore import androidx.room.PrimaryKey @@ -24,13 +25,15 @@ import com.google.gson.annotations.SerializedName * Created by khy on 12/12/17. */ @Entity -class AnswerEntity() : Parcelable { +class AnswerEntity() : Parcelable, CommunityItemData { @NonNull @PrimaryKey var primaryKey: String = "" // db key - var communityId: String? = null // communityId + userId 社区推荐数据库存储专用,社区推荐接口不能给该字段 + @SerializedName("communityId") + @ColumnInfo(name = "communityId") + private var _communityId: String? = null // communityId + userId 社区推荐数据库存储专用,社区推荐接口不能给该字段 @Ignore @SerializedName("community_id") @@ -39,18 +42,23 @@ class AnswerEntity() : Parcelable { var orderTag: Long = 0 @SerializedName("_id") - var id: String? = null + @ColumnInfo(name = "id") + private var _id: String? = null @SerializedName("sequence_id") var sequenceId: String? = null - var brief: String? = null + @SerializedName("brief") + @ColumnInfo(name = "brief") + private var _brief: String? = null @SerializedName("title") var articleTitle: String? = null @TypeConverters(ListStringConverter::class) - var images: List = ArrayList() + @SerializedName("images") + @ColumnInfo(name = "images") + private var _images: List = ArrayList() @TypeConverters(ImageInfoConverter::class) @SerializedName("images_info") @@ -63,23 +71,31 @@ class AnswerEntity() : Parcelable { var vote: Int = 0 @TypeConverters(AnswerUserConverter::class) - var user: UserEntity = UserEntity() + @SerializedName("user") + @ColumnInfo(name = "user") + private var _user: UserEntity = UserEntity() @SyncIgnore // questions里的vote当前entity的vote冲突 @TypeConverters(QuestionsConverter::class) @SerializedName("question") - var questions: Questions = Questions() + @ColumnInfo(name = "questions") + private var _questions: Questions = Questions() @SerializedName("community_name") - var communityName: String? = null + @ColumnInfo(name = "communityName") + private var _communityName: String? = null // @SyncPage(syncNames = [SyncFieldConstants.ANSWER_COMMENT_COUNT, SyncFieldConstants.ARTICLE_COMMENT_COUNT]) @SerializedName("comment_count") var commentCount: Int = 0 - var active: Boolean = true + @SerializedName("active") + @ColumnInfo(name = "active") + private var _active: Boolean = true - var type: String = "" + @SerializedName("type") + @ColumnInfo(name = "type") + private var _type: String = "" var time: Long? = 0 @@ -91,10 +107,14 @@ class AnswerEntity() : Parcelable { var read: Boolean = true @Ignore - var me: MeEntity = MeEntity() + @SerializedName("me") + @ColumnInfo(name = "me") + private var _me: MeEntity = MeEntity() @Ignore - var commentable: Boolean = true + @SerializedName("commentable") + @ColumnInfo(name = "commentable") + private var _commentable: Boolean = true // 只用于回答草稿列表 @Ignore @@ -129,10 +149,14 @@ class AnswerEntity() : Parcelable { var length: Long = 0 @Ignore - var count: Count = Count() + @SerializedName("count") + @ColumnInfo(name = "count") + private var _count: Count = Count() // 有三种状态 pass通过,fail未通过,pending审核中 - var status: String = "" + @SerializedName("status") + @ColumnInfo(name = "status") + private var _status: String = "" var content: String = "" @@ -140,6 +164,14 @@ class AnswerEntity() : Parcelable { @SerializedName("section_id") var sectionIdList: List = ArrayList() + @SerializedName("tag_activity_name") + @Ignore + private var _tagActivityName: String = "" + + @SerializedName("sections") + @Ignore + private var _sections: List = ArrayList() + fun getPassVideos(): List { val passVideos = arrayListOf() for (video in videos) { @@ -153,9 +185,9 @@ class AnswerEntity() : Parcelable { communityId = parcel.readString() ?: "" articleCommunityId = parcel.readString() ?: "" orderTag = parcel.readLong() - id = parcel.readString() - brief = parcel.readString() - articleTitle = parcel.readString() + id = parcel.readString() ?: "" + brief = parcel.readString() ?: "" + title = parcel.readString() ?: "" questions = parcel.readParcelable(Questions::class.java.classLoader) ?: Questions() images = parcel.createStringArrayList() ?: arrayListOf() commentCount = parcel.readInt() @@ -182,7 +214,7 @@ class AnswerEntity() : Parcelable { parcel.writeLong(orderTag) parcel.writeString(id) parcel.writeString(brief) - parcel.writeString(articleTitle) + parcel.writeString(title) parcel.writeParcelable(questions, flags) parcel.writeStringList(images) parcel.writeInt(vote) @@ -202,6 +234,108 @@ class AnswerEntity() : Parcelable { parcel.writeString(content) } + override var id: String + get() = _id ?: "" + set(value) { + _id = value + } + + override var type: String + get() = _type + set(value) { + _type = value + } + + override var active: Boolean + get() = _active + set(value) { + _active = value + } + + override var commentable: Boolean + get() = _commentable + set(value) { + _commentable = value + } + + override var me: MeEntity + get() = _me + set(value) { + _me = value + } + + override var count: Count + get() = _count + set(value) { + _count = value + } + + override var community: CommunityEntity + get() = bbs + set(value) { + bbs = value + } + + override var title: String + get() = articleTitle ?: "" + set(value) { + articleTitle = value + } + + override var brief: String + get() = _brief ?: "" + set(value) { + _brief = value + } + + override var images: List + get() = _images + set(value) { + _images = value + } + + override var user: UserEntity + get() = _user + set(value) { + _user = value + } + + override var status: String + get() = _status + set(value) { + _status = value + } + + override var questions: Questions + get() = _questions + set(value) { + _questions = value + } + + override var tagActivityName: String + get() = _tagActivityName + set(value) { + _tagActivityName = value + } + + override var sections: List + get() = _sections + set(value) { + _sections = value + } + + override var communityId: String? + get() = _communityId + set(value) { + _communityId = value + } + + override var communityName: String? + get() = _communityName + set(value) { + _communityName = value + } + override fun describeContents(): Int { return 0 } @@ -209,8 +343,8 @@ class AnswerEntity() : Parcelable { fun transformForumVideoEntity(): ForumVideoEntity { val forumVideoEntity = ForumVideoEntity() if (type.contains("video")) { - forumVideoEntity.id = id ?: "" - forumVideoEntity.title = articleTitle ?: "" + forumVideoEntity.id = id + forumVideoEntity.title = title forumVideoEntity.des = des forumVideoEntity.url = url forumVideoEntity.status = status @@ -218,10 +352,20 @@ class AnswerEntity() : Parcelable { forumVideoEntity.length = length forumVideoEntity.duration = TimeUtils.formatVideoDuration(length) forumVideoEntity.videoInfo = videoInfo + forumVideoEntity.bbs = community + forumVideoEntity.user = user + forumVideoEntity.tagActivityName = tagActivityName + forumVideoEntity.sections = sections forumVideoEntity.videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) + forumVideoEntity.type = type } else { forumVideoEntity.title = questions.title ?: "" forumVideoEntity.des = brief ?: "" + forumVideoEntity.user = user + forumVideoEntity.bbs = community + forumVideoEntity.tagActivityName = tagActivityName + forumVideoEntity.sections = sections + forumVideoEntity.type = type forumVideoEntity.videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) val userManagerProvider = ARouter.getInstance().build(RouteConsts.provider.userManager).navigation() as? IUserManagerProvider @@ -240,9 +384,9 @@ class AnswerEntity() : Parcelable { fun transformArticleEntity(): ArticleEntity { val articleEntity = ArticleEntity() - articleEntity.id = id ?: "" - articleEntity.brief = if (!brief.isNullOrEmpty()) brief ?: "" else description ?: "" - articleEntity.title = articleTitle ?: "" + articleEntity.id = id + articleEntity.brief = brief.ifEmpty { description ?: "" } + articleEntity.title = title articleEntity.images = images articleEntity.videos = videos articleEntity.user = user @@ -269,6 +413,8 @@ class AnswerEntity() : Parcelable { articleEntity.length = length articleEntity.type = type articleEntity.count = count + articleEntity.sections = sections + articleEntity.tagActivityName = tagActivityName return articleEntity } diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ArticleEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ArticleEntity.kt index f678e249a3..0feeeb656c 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ArticleEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ArticleEntity.kt @@ -2,10 +2,7 @@ package com.gh.gamecenter.feature.entity import android.os.Parcel import android.os.Parcelable -import androidx.room.Entity -import androidx.room.Ignore -import androidx.room.PrimaryKey -import androidx.room.TypeConverters +import androidx.room.* import com.alibaba.android.arouter.launcher.ARouter import com.gh.gamecenter.common.annotation.SyncIgnore import com.gh.gamecenter.common.annotation.SyncPage @@ -27,29 +24,47 @@ import kotlinx.parcelize.Parcelize data class ArticleEntity( @PrimaryKey @SerializedName("_id") - var id: String = "", - var title: String = "", - var brief: String = "", - var active: Boolean = true, + @ColumnInfo(name = "id") + private var _id: String = "", + @SerializedName("title") + @ColumnInfo(name = "title") + private var _title: String = "", + @SerializedName("brief") + @ColumnInfo(name = "brief") + private var _brief: String = "", + @SerializedName("active") + @ColumnInfo(name = "active") + private var _active: Boolean = true, var orderTag: Long = 0, @TypeConverters(ListStringConverter::class) - var images: List = ArrayList(), + @SerializedName("images") + @ColumnInfo(name = "images") + private var _images: List = ArrayList(), @TypeConverters(ImageInfoConverter::class) @SerializedName("images_info") var imagesInfo: List = ArrayList(), @TypeConverters(CommunityVideoConverter::class) var videos: List = ArrayList(), - var count: Count = Count(), + @SerializedName("count") + @ColumnInfo(name = "count") + private var _count: Count = Count(), @SerializedName("community", alternate = ["bbs"]) - var community: CommunityEntity = CommunityEntity(), + @ColumnInfo(name = "community") + private var _community: CommunityEntity = CommunityEntity(), var time: TimeEntity? = TimeEntity(), - var user: UserEntity = UserEntity(), + @SerializedName("user") + @ColumnInfo(name = "user") + private var _user: UserEntity = UserEntity(), @Ignore var read: Boolean = true, @Ignore - var me: MeEntity = MeEntity(), + @SerializedName("me") + @ColumnInfo(name = "me") + private var _me: MeEntity = MeEntity(), @Ignore - var commentable: Boolean = true, + @SerializedName("commentable") + @ColumnInfo(name = "commentable") + private var _commentable: Boolean = true, var des: String = "", var url: String = "", @TypeConverters(VideoInfoConverter::class) @@ -57,18 +72,127 @@ data class ArticleEntity( var videoInfo: VideoInfo = VideoInfo(), var poster: String = "", var length: Long = 0, - @Ignore - var type: String = "", - var status: String = "", + @SerializedName("type") + @ColumnInfo(name = "type") + private var _type: String = "", + @SerializedName("status") + @ColumnInfo(name = "status") + private var _status: String = "", var content: String = "", @SyncIgnore // questions里的vote当前entity的vote冲突 @TypeConverters(QuestionsConverter::class) @SerializedName("question") - var questions: Questions = Questions(), + @ColumnInfo(name = "questions") + private var _questions: Questions = Questions(), @Ignore @SerializedName("recommend_id") - var recommendId: String = "" -) : Parcelable { + var recommendId: String = "", + @SerializedName("tag_activity_name") + @ColumnInfo(name = "tagActivityName") + private var _tagActivityName: String = "", + @SerializedName("sections") + @ColumnInfo(name = "sections") + @TypeConverters(SectionConverter::class) + private var _sections: List = ArrayList(), +) : Parcelable, CommunityItemData { + + override var id: String + get() = _id + set(value) { + _id = value + } + + override var type: String + get() = _type + set(value) { + _type = value + } + + override var active: Boolean + get() = _active + set(value) { + _active = value + } + + override var commentable: Boolean + get() = _commentable + set(value) { + _commentable = value + } + + override var me: MeEntity + get() = _me + set(value) { + _me = value + } + + override var count: Count + get() = _count + set(value) { + _count = value + } + + override var community: CommunityEntity + get() = _community + set(value) { + _community = value + } + + override var title: String + get() = _title + set(value) { + _title = value + } + + override var brief: String + get() = _brief + set(value) { + _brief = value + } + + override var images: List + get() = _images + set(value) { + _images = value + } + + override var user: UserEntity + get() = _user + set(value) { + _user = value + } + + override var status: String + get() = _status + set(value) { + _status = value + } + + override var questions: Questions + get() = _questions + set(value) { + _questions = value + } + + override var tagActivityName: String + get() = _tagActivityName + set(value) { + _tagActivityName = value + } + + override var sections: List + get() = _sections + set(value) { + _sections = value + } + + override var communityId: String? + get() = community.id + set(_) {} + + override var communityName: String? + get() = community.name + set(_) {} fun getPassVideos(): List { val passVideos = arrayListOf() @@ -84,7 +208,7 @@ data class ArticleEntity( } val answer = AnswerEntity() answer.id = id - answer.articleTitle = title + answer.title = title answer.questions = questions answer.brief = brief answer.images = images @@ -116,6 +240,9 @@ data class ArticleEntity( answer.count = count answer.status = status answer.content = content + answer.type = type + answer.sections = sections + answer.tagActivityName = tagActivityName return answer } @@ -165,7 +292,19 @@ class Count( @SerializedName("game_played") var playedGame: Int = 0, var hot: Int = 0, - var share: Int = 0 + var share: Int = 0, + var question: Int = 0, + var fans: Int = 0, + val follower: Int = 0, + @SerializedName("community_article") + var communityArticle: Int = 0, + @SerializedName("game_comment") + val gameComment: Int = 0, + var video: Int = 0, + @SerializedName("game_list") + val gameList: Int = 0, + @SerializedName("today_visit") + val todayVisit: Int? = 0 ) : Parcelable { @SyncPage(syncNames = [SyncFieldConstants.ANSWER_COUNT]) diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/CommunityItemData.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/CommunityItemData.kt new file mode 100644 index 0000000000..0ad3a749e5 --- /dev/null +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/CommunityItemData.kt @@ -0,0 +1,30 @@ +package com.gh.gamecenter.feature.entity + +import com.gh.gamecenter.common.entity.CommunityEntity + +interface CommunityItemData { + var id: String + var title: String + var brief: String + var images: List + var type: String + var active: Boolean + var commentable: Boolean + var me: MeEntity + var count: Count + var communityId: String? // communityId + userId 社区推荐数据库存储专用,社区推荐接口不能给该字段 + var communityName: String? + var community: CommunityEntity + var user: UserEntity + var status: String + var questions: Questions + var tagActivityName: String + var sections: List + + val typeChinese: String get() = when(type) { + "question" -> "提问帖" + "community_article" -> "帖子" + "video" -> "视频贴" + else -> type + } +} \ No newline at end of file diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ForumVideoEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ForumVideoEntity.kt index 885712b001..2808cfe26f 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ForumVideoEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/ForumVideoEntity.kt @@ -17,7 +17,7 @@ open class ForumVideoEntity( var des: String = "", var poster: String = "", var url: String = "", - val user: PersonalEntity = PersonalEntity(), + var user: UserEntity = UserEntity(), val me: MeEntity = MeEntity(), val size: Long = 0, var length: Long = 0, @@ -65,15 +65,15 @@ open class ForumVideoEntity( else -> choicenessStatus } } - @Parcelize - class Time(val upload: Long = 0, val audit: Long = 0, val update: Long = 0) : Parcelable + val typeChinese: String get() = when(type) { + "question" -> "提问帖" + "community_article" -> "帖子" + "video" -> "视频贴" + else -> type ?: "" + } @Parcelize - class SectionEntity( - @SerializedName("_id") - val id: String = "", - val name: String = "" - ) : Parcelable + class Time(val upload: Long = 0, val audit: Long = 0, val update: Long = 0) : Parcelable @Parcelize class ActivityTagEntity( diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt index 97e39ec28c..5aa6b37a16 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/GameEntity.kt @@ -1226,7 +1226,7 @@ class SimpleGame( var advanceDownload: Boolean = false, @SerializedName("icon_float") var iconFloat: IconFloat? = null, - var category: String = "" + var category: String? = null ) : Parcelable { @IgnoredOnParcel @@ -1252,6 +1252,16 @@ class SimpleGame( return mIcon ?: "" } + @IgnoredOnParcel + val categoryChinese: String + get() = when (category) { + "online" -> "网络" + "local" -> "单机" + "welfare" -> "福利" + "simulator" -> "模拟器" + else -> category ?: "" + } + fun toGameEntity(): GameEntity { val gameEntity = GameEntity(id = id, name = name) gameEntity.nameSuffix = nameSuffix ?: "" @@ -1273,16 +1283,6 @@ class SimpleGame( return gameEntity } - @IgnoredOnParcel - val categoryChinese: String - get() = when (category) { - "online" -> "网络" - "local" -> "单机" - "welfare" -> "福利" - "simulator" -> "模拟器" - else -> category ?: "" - } - fun toCommunityGameEntity(): CommunityEntity.CommunityGameEntity { val gameEntity = CommunityEntity.CommunityGameEntity(id = id, mName = name) gameEntity.nameSuffix = nameSuffix ?: "" @@ -1290,6 +1290,7 @@ class SimpleGame( gameEntity.mRawIcon = mRawIcon gameEntity.iconSubscript = iconSubscript gameEntity.iconFloat = iconFloat + gameEntity.category = category return gameEntity } } diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SectionEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SectionEntity.kt new file mode 100644 index 0000000000..9aac311471 --- /dev/null +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SectionEntity.kt @@ -0,0 +1,12 @@ +package com.gh.gamecenter.feature.entity + +import android.os.Parcelable +import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize + +@Parcelize +class SectionEntity( + @SerializedName("_id") + val id: String = "", + val name: String = "" +) : Parcelable \ No newline at end of file diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt index 65528c9f1a..c11d809203 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/SettingsEntity.kt @@ -266,7 +266,12 @@ class SettingsEntity( @SerializedName("link_text") var text: String = "", var display: Display? = Display() - ) + ) { + val typeChinese: String get() = when(type) { + "revolving" -> "走马灯" + else -> "图片" + } + } class PermissionPopupAppliedVersions( val install: ArrayList = arrayListOf(), diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/UserEntity.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/UserEntity.kt index a1482c2032..e76024a656 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/UserEntity.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/entity/UserEntity.kt @@ -18,5 +18,6 @@ class UserEntity( var auth: Auth? = null, val badge: Badge? = null, @SerializedName("icon_border_url") - val border: String = "" + val border: String = "", + val count: Count = Count() ) : Parcelable diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/room/converter/SectionConverter.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/room/converter/SectionConverter.kt new file mode 100644 index 0000000000..9a4de70738 --- /dev/null +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/room/converter/SectionConverter.kt @@ -0,0 +1,18 @@ +package com.gh.gamecenter.feature.room.converter + +import androidx.room.TypeConverter +import com.gh.gamecenter.common.utils.toJson +import com.gh.gamecenter.common.utils.toObject +import com.gh.gamecenter.feature.entity.SectionEntity + +class SectionConverter { + @TypeConverter + fun toSectionEntityString(data: List?): String { + return data?.toJson() ?: "" + } + + @TypeConverter + fun toSectionEntity(token: String?): List { + return token?.toObject() ?: arrayListOf() + } +} diff --git a/module_login/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java b/module_login/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java index de50736b50..051e0207fa 100644 --- a/module_login/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java +++ b/module_login/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java @@ -66,7 +66,7 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler, WeC String messageExt = ((ShowMessageFromWX.Req) baseReq).message.messageExt; if (!TextUtils.isEmpty(messageExt)) { IDefaultUrlHandlerProvider defaultUrlHandler = (IDefaultUrlHandlerProvider) ARouter.getInstance().build(RouteConsts.provider.defaultUrlHandler).navigation(); - defaultUrlHandler.interceptUrl(this, messageExt, "浏览器", true); + defaultUrlHandler.interceptUrl(this, messageExt, "浏览器", true, ""); finishActivity(); } } @@ -126,6 +126,17 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler, WeC ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { com.gh.gamecenter.common.utils.NewLogUtils.logShareResult(ShareUtils.additionalParams, true); + SensorsBridge.trackArticleShareResult( + ShareUtils.additionalParams.getCustomerType(), + ShareUtils.additionalParams.getContentId(), + ShareUtils.additionalParams.getBbsId(), + ShareUtils.additionalParams.getBbsType(), + ShareUtils.additionalParams.getActivityTagName(), + ShareUtils.additionalParams.getGameForumType(), + ShareUtils.additionalParams.getContentType(), + shareType, + "分享成功" + ); } else if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.gameCollection) { com.gh.gamecenter.common.utils.NewLogUtils.logViewOrClickGameCollectionDetail( "click_game_collect_detail_favorite_success", @@ -185,6 +196,30 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler, WeC ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { com.gh.gamecenter.common.utils.NewLogUtils.logShareResult(ShareUtils.additionalParams, false); } + + if(ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video + || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle + || ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal) + { + String shareType; + if ("wechat_friend".equals(ShareUtils.shareType)) { + shareType = "微信好友"; + } else { + shareType = "朋友圈"; + } + + SensorsBridge.trackArticleShareResult( + ShareUtils.additionalParams.getCustomerType(), + ShareUtils.additionalParams.getContentId(), + ShareUtils.additionalParams.getBbsId(), + ShareUtils.additionalParams.getBbsType(), + ShareUtils.additionalParams.getActivityTagName(), + ShareUtils.additionalParams.getGameForumType(), + ShareUtils.additionalParams.getContentType(), + shareType, + "分享失败" + ); + } } else { resultString = "登录错误"; } diff --git a/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java b/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java index 122ba0eca9..f9ab787600 100644 --- a/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java +++ b/module_message/src/main/java/com/gh/gamecenter/message/view/KeFuFragmentAdapter.java @@ -379,7 +379,7 @@ public class KeFuFragmentAdapter extends ListAdapter { break; case "社区文章": if (!TextUtils.isEmpty(data.getId()) && data.getCommunity() != null) { - mDirectUtils.directToCommunityArticle(mContext, data.getId(), data.getCommunity().getId(), mEntrance, "(消息-客服)"); + mDirectUtils.directToCommunityArticle(mContext, data.getId(), data.getCommunity().getId(), mEntrance, "(消息-客服)", ""); } break; case "社区专题": @@ -389,7 +389,7 @@ public class KeFuFragmentAdapter extends ListAdapter { break; case "视频": if (!TextUtils.isEmpty(data.getId())) { - mDirectUtils.directToVideoDetail(mContext, data.getId(), mEntrance, "系统_二级列表"); + mDirectUtils.directToVideoDetail(mContext, data.getId(), mEntrance, "系统_二级列表", ""); } break; case "安利墙评论": diff --git a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java index 0045ff44c5..bf7655ae3d 100644 --- a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java +++ b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageItemViewHolder.java @@ -1031,7 +1031,8 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder context, entity.getVideo().getId(), entrance, - outerInfo + outerInfo, + "" ); break; case "video_comment": diff --git a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt index f4c7148259..bd7de601a4 100644 --- a/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt +++ b/module_message/src/main/java/com/gh/gamecenter/message/view/message/MessageListAdapter.kt @@ -562,7 +562,7 @@ class MessageListAdapter( } "社区文章" -> if (!TextUtils.isEmpty(data.id) && data.community != null) { - mDirectUtils.directToCommunityArticle(mContext, data.id, data.community!!.id, mEntrance, "(消息-客服)") + mDirectUtils.directToCommunityArticle(mContext, data.id, data.community!!.id, mEntrance, "(消息-客服)", "") } "社区专题" -> if (!TextUtils.isEmpty(data.id) && data.community != null) {