From 71f69bc528689fe1902202bd261a801cbf21fdf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E5=AD=90=E7=BB=B4?= Date: Tue, 21 Mar 2023 13:53:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BA=91=E5=AD=98=E6=A1=A3=E5=9F=8B?= =?UTF-8?q?=E7=82=B9=E8=A1=A5=E5=85=85=E2=80=94=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=20https://jira.shanqu.cc/browse/GHZS-1682?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/GlobalActivityLifecycleObserver.kt | 1 + .../java/com/gh/base/GlobalActivityManager.kt | 14 ---- .../main/java/com/gh/common/DefaultJsApi.kt | 23 +++++- .../gh/common/databind/BindingAdapters.java | 2 +- .../gh/common/dialog/CertificationDialog.kt | 27 +++++-- .../provider/ErrorHelperProviderImpl.kt | 10 ++- .../util/ArchiveDownloadButtonHelper.kt | 71 +++++++++++++---- .../java/com/gh/common/util/DataUtils.java | 2 +- .../java/com/gh/common/util/DialogUtils.java | 5 ++ .../com/gh/common/util/DownloadItemUtils.kt | 53 ++++++++++--- .../com/gh/common/util/DownloadObserver.kt | 16 ++++ .../java/com/gh/common/util/ErrorHelper.kt | 44 ++++++++--- .../common/util/GameActivityDownloadHelper.kt | 2 +- .../java/com/gh/common/util/LibaoUtils.java | 78 +++++++++++++++++-- .../com/gh/common/util/NewFlatLogUtils.kt | 20 +++-- .../java/com/gh/common/util/RealNameHelper.kt | 13 ++++ .../com/gh/common/util/ReservationHelper.kt | 29 ++++++- .../com/gh/common/util/SensorsLogUtils.kt | 29 +++++++ .../java/com/gh/download/DownloadManager.java | 13 ++++ .../java/com/gh/gamecenter/SearchActivity.kt | 14 +++- .../com/gh/gamecenter/WeiBoShareActivity.java | 7 ++ .../adapter/LibaoDetailAdapter.java | 4 +- .../adapter/viewholder/DetailViewHolder.java | 22 +++++- .../category2/CategoryV2Fragment.kt | 1 + .../category2/CategoryV2ListAdapter.kt | 18 ++++- .../CloudArchiveManagerActivity.kt | 38 ++++++++- .../cloudarchive/MyArchiveAdapter.kt | 29 +++++-- .../cloudarchive/MyArchiveFragment.kt | 2 +- .../MyArchiveOptionDialogFragment.kt | 56 ++++++++++--- .../forum/detail/ForumDetailFragment.kt | 26 ++++++- .../forum/home/CommunityHomeFragment.kt | 10 ++- .../home/ForumArticleAskItemViewHolder.kt | 1 + .../fragment/HomeSearchToolWrapperFragment.kt | 12 +++ .../fragment/MainWrapperFragment.java | 30 +++++++ .../fragment/SearchToolbarFragment.java | 4 +- .../fragment/WelcomeDialogFragment.kt | 3 + .../detail/GameCollectionDetailFragment.kt | 31 ++++++++ .../detail/GameCollectionShareDialog.kt | 11 ++- .../square/GameCollectionSquareFragment.kt | 20 ++++- .../gamedetail/GameDetailFragment.kt | 37 ++++++++- .../cloudarchive/CloudArchiveFragment.kt | 4 +- .../cloudarchive/CloudArchiveListAdapter.kt | 7 +- .../cloudarchive/CloudArchiveListFragment.kt | 6 +- .../gamedetail/desc/GameLibaoAdapter.kt | 11 ++- .../home/HomeRecommendItemViewHolder.kt | 22 ++++-- .../libao/Libao2FragmentAdapter.java | 2 +- .../gh/gamecenter/libao/LibaoFragment.java | 2 + .../gh/gamecenter/libao/LibaoNewAdapter.kt | 3 +- .../gh/gamecenter/libao/LibaoSearchAdapter.kt | 3 +- .../personal/HaloPersonalBannerAdapter.kt | 5 ++ .../personal/HaloPersonalFragment.kt | 6 ++ .../personal/HaloPersonalFunctionAdapter.kt | 1 + .../personal/HaloPersonalRecommendAdapter.kt | 5 ++ .../qa/article/edit/ArticleEditActivity.kt | 35 ++++++++- .../qa/article/edit/ArticleEditViewModel.kt | 3 + .../qa/questions/edit/QuestionEditActivity.kt | 38 ++++++++- .../qa/video/publish/VideoPublishFragment.kt | 36 ++++++++- .../savegame/GameArchiveListActivity.kt | 2 + .../GameArchiveListInstalledFragment.kt | 2 + .../search/SearchDefaultFragment.kt | 12 +++ .../search/SearchDefaultRankAdapter.kt | 15 +++- .../search/SearchGameResultViewModel.kt | 11 +++ .../gh/gamecenter/subject/SubjectActivity.kt | 17 ++-- app/src/main/java/com/gh/vspace/VHelper.kt | 18 +++-- .../com/gh/vspace/VSpaceDialogFragment.kt | 39 ++++++++-- .../fragment/user/RealNameInfoFragment.kt | 6 ++ .../fragment/user/RealNameInfoViewModel.kt | 22 ++++++ .../base/GlobalActivityLifecycleObserver.kt | 32 +++++++- .../common/base/GlobalActivityManager.kt | 32 ++++++++ .../gamecenter/common/constant/Constants.java | 3 + .../common/constant/EntranceConsts.java | 2 + .../gh/gamecenter/common/entity/PageEntity.kt | 7 ++ .../common/tracker/TrackerLogger.kt | 19 +++++ .../gh/gamecenter/common/utils/Extensions.kt | 4 + .../gamecenter/common/utils/SensorsBridge.kt | 10 +++ .../gamecenter/common/utils/ShareUtils.java | 6 ++ .../core/provider/IErrorHelperProvider.kt | 7 +- .../core/provider/ISensorsProvider.kt | 4 + .../gamecenter/feature/entity/GameEntity.kt | 10 +++ .../gh/gamecenter/login/user/UserManager.java | 2 +- .../gamecenter/login/user/UserRepository.java | 8 +- .../gamecenter/login/view/LoginFragment.java | 7 +- .../gh/gamecenter/wxapi/WXEntryActivity.java | 7 ++ .../gamecenter/sensorsdata/SensorsHelper.kt | 47 +++++++++-- .../provider/SensorsProviderImpl.kt | 8 ++ .../setting/view/SettingsFragment.kt | 1 + .../activity/ComposeSettingActivity.kt | 1 + 87 files changed, 1204 insertions(+), 174 deletions(-) delete mode 100644 app/src/main/java/com/gh/base/GlobalActivityManager.kt create mode 100644 app/src/main/java/com/gh/common/util/SensorsLogUtils.kt create mode 100644 module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityManager.kt create mode 100644 module_common/src/main/java/com/gh/gamecenter/common/entity/PageEntity.kt diff --git a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt index 2afc5f31a0..564994decf 100644 --- a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt +++ b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt @@ -8,6 +8,7 @@ import com.gh.common.util.FloatingBackViewManager import com.gh.download.DownloadManager import com.gh.gamecenter.SingletonWebActivity import com.gh.gamecenter.SplashScreenActivity +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.gamecenter.common.utils.PackageFlavorHelper import com.gh.vspace.VHelper import com.halo.assistant.HaloApp diff --git a/app/src/main/java/com/gh/base/GlobalActivityManager.kt b/app/src/main/java/com/gh/base/GlobalActivityManager.kt deleted file mode 100644 index 558c3fadb5..0000000000 --- a/app/src/main/java/com/gh/base/GlobalActivityManager.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.gh.base - -import android.app.Activity -import java.lang.ref.WeakReference - -object GlobalActivityManager { - private var mCurrentActivityWeakRef: WeakReference? = null - - var currentActivity: Activity? - get() = mCurrentActivityWeakRef?.get() - set(activity) { - mCurrentActivityWeakRef = WeakReference(activity) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 6a0da671a6..276327393a 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -33,6 +33,7 @@ import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.runOnUiThread import com.gh.gamecenter.core.utils.* import com.gh.gamecenter.energy.EnergyBridge +import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.eventbus.EBPackage import com.gh.gamecenter.feature.entity.Badge import com.gh.gamecenter.feature.entity.GameEntity @@ -50,6 +51,9 @@ import com.lightgame.download.DataWatcher import com.lightgame.download.DownloadEntity import com.lightgame.download.DownloadStatus.* import com.lightgame.utils.Utils +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode import org.json.JSONObject import java.io.BufferedOutputStream import java.io.File @@ -59,12 +63,13 @@ import java.util.* class DefaultJsApi(var context: Context, val entrance: String = "", private var mFragment: Fragment? = null) { private var mLoginHandler: CompletionHandler? = null - private var mDownloadWatcher: DataWatcher? = null - private var mDownloadUrlSet: HashSet? = null - private var mDownloadHandler: CompletionHandler? = null + private var mDownloadWatcher: DataWatcher? = null // 下载观察者 + private var mDownloadUrlSet: HashSet? = null // 下载的 url 集合 + private var mDownloadHandler: CompletionHandler? = null // 下载信息回调 init { if (mFragment != null) { + EventBus.getDefault().register(this) autoUnregisterDownloadObserverIfNeeded(mFragment) } } @@ -187,7 +192,7 @@ class DefaultJsApi(var context: Context, val entrance: String = "", private var runOnUiThread { // 若畅玩列表中安装了,优先启动畅玩游戏 if (VHelper.isInstalled(packageName)) { - if (!VHelper.showDialogIfVSpaceIsNeeded(context)) { + if (!VHelper.showDialogIfVSpaceIsNeeded(context, "", "")) { VHelper.launch(context, packageName) } } else { @@ -596,6 +601,8 @@ class DefaultJsApi(var context: Context, val entrance: String = "", private var if (mDownloadWatcher != null) { DownloadManager.getInstance().removeObserver(mDownloadWatcher) } + + EventBus.getDefault().unregister(this@DefaultJsApi) } } @@ -618,6 +625,14 @@ class DefaultJsApi(var context: Context, val entrance: String = "", private var ) } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(status: EBDownloadStatus) { + // 将下载任务删除事件回调给网页 + if (mDownloadHandler != null && "delete" == status.status) { + mDownloadHandler?.setProgressData(SimpleDownloadEntity(status.url, 0F, "UNKNOWN").toJson()) + } + } + @Keep internal class ImageEvent(var imageList: ArrayList = arrayListOf(), var position: Int = 0) 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 d6e2f34bdf..dd2ec33337 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -488,7 +488,7 @@ public class BindingAdapters { case RESERVABLE: GamePermissionDialogFragment.show((AppCompatActivity) v.getContext(), gameEntity, gameEntity.getInfo(), () -> { CheckLoginUtils.checkLogin(progressBar.getContext(), "", () -> { - ReservationHelper.reserve(v.getContext(), gameEntity.getId(), () -> { + ReservationHelper.reserve(v.getContext(), gameEntity.getId(), gameEntity.getName(), () -> { 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 73177b5ed6..5e67bfd0e3 100644 --- a/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt +++ b/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt @@ -22,6 +22,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.ShellActivity import com.gh.gamecenter.common.callback.ConfirmListener import com.gh.gamecenter.common.constant.EntranceConsts +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.core.utils.GsonUtils import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.feature.entity.AuthDialogEntity @@ -35,7 +36,7 @@ import com.lightgame.utils.AppManager class CertificationDialog( context: Context, private val authDialogEntity: AuthDialogEntity, - val gameId: String, + val gameEntity: GameEntity, val listener: ConfirmListener ) : Dialog(context, R.style.GhAlertDialog) { @@ -69,9 +70,11 @@ class CertificationDialog( actionRightTv.text = "去实名认证" noRemindAgainCb.visibility = View.GONE actionLeftTv.setOnClickListener { + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionLeftTv.text.toString()) dismiss() } actionRightTv.setOnClickListener { + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionRightTv.text.toString()) if (UserManager.getInstance().isLoggedIn) { gotoAuthPage() } else { @@ -84,6 +87,7 @@ class CertificationDialog( actionRightTv.text = "继续下载" noRemindAgainCb.visibility = View.GONE actionLeftTv.setOnClickListener { + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionLeftTv.text.toString()) if (UserManager.getInstance().isLoggedIn) { gotoAuthPage() } else { @@ -91,6 +95,7 @@ class CertificationDialog( } } actionRightTv.setOnClickListener { + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionRightTv.text.toString()) listener.onConfirm() dismiss() } @@ -100,8 +105,9 @@ class CertificationDialog( actionRightTv.text = "继续下载" noRemindAgainCb.visibility = View.VISIBLE actionLeftTv.setOnClickListener { + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionLeftTv.text.toString()) if (noRemindAgainCb.isChecked) { - SPUtils.setBoolean(gameId, true) + SPUtils.setBoolean(gameEntity.id, true) } if (UserManager.getInstance().isLoggedIn) { gotoAuthPage() @@ -110,14 +116,25 @@ class CertificationDialog( } } actionRightTv.setOnClickListener { + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", actionRightTv.text.toString()) if (noRemindAgainCb.isChecked) { - SPUtils.getBoolean(gameId, true) + SPUtils.getBoolean(gameEntity.id, true) } listener.onConfirm() dismiss() } } } + + SensorsBridge.trackEvent( + "VerificationDialogShow", + "game_id", + gameEntity.id, + "game_name", + gameEntity.name ?: "", + "game_type", + gameEntity.gameType + ) } //跳转登录页面 @@ -145,7 +162,7 @@ class CertificationDialog( context, ShellActivity.Type.REAL_NAME_INFO, ).apply { - putExtra(EntranceConsts.KEY_GAME_ID, gameId) + putExtra(EntranceConsts.KEY_GAME_ID, gameEntity.id) }, object : Callback { override fun onActivityResult(resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK && data != null) { @@ -194,7 +211,7 @@ class CertificationDialog( } val isCloseAuthDialog = SPUtils.getBoolean(game.id, false) if (authDialog != null && (authDialog.level != AuthDialogLevel.OPTIONAL_HINT.value || !isCloseAuthDialog)) { - val dialog = CertificationDialog(context, authDialog, game.id, listener) + val dialog = CertificationDialog(context, authDialog, game, listener) dialog.show() } else { listener.onConfirm() diff --git a/app/src/main/java/com/gh/common/provider/ErrorHelperProviderImpl.kt b/app/src/main/java/com/gh/common/provider/ErrorHelperProviderImpl.kt index d2d2ecfe06..ce1e4ea851 100644 --- a/app/src/main/java/com/gh/common/provider/ErrorHelperProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/ErrorHelperProviderImpl.kt @@ -5,6 +5,7 @@ import com.alibaba.android.arouter.facade.annotation.Route import com.gh.common.util.ErrorHelper import com.gh.gamecenter.common.constant.RouteConsts import com.gh.gamecenter.core.provider.IErrorHelperProvider +import com.gh.gamecenter.login.user.LoginTag import retrofit2.HttpException @Route(path = RouteConsts.provider.errorHelper, name = "ErrorHelper暴露服务") @@ -18,8 +19,13 @@ class ErrorHelperProviderImpl : IErrorHelperProvider { ErrorHelper.handleError(context, errorString, showHighPriorityHint) } - override fun handleLoginError(context: Context, httpException: HttpException?) { - ErrorHelper.handleLoginError(context, httpException) + override fun handleLoginError( + context: Context, + httpException: HttpException?, + loginTagChinese: String, + isCertificate: Boolean + ) { + ErrorHelper.handleLoginError(context, httpException, loginTagChinese, isCertificate) } override fun init(context: Context?) { diff --git a/app/src/main/java/com/gh/common/util/ArchiveDownloadButtonHelper.kt b/app/src/main/java/com/gh/common/util/ArchiveDownloadButtonHelper.kt index 4c70147b62..6bf3cc5df5 100644 --- a/app/src/main/java/com/gh/common/util/ArchiveDownloadButtonHelper.kt +++ b/app/src/main/java/com/gh/common/util/ArchiveDownloadButtonHelper.kt @@ -10,15 +10,13 @@ import com.gh.download.simple.AutoUnregisteredSimpleDownloadListener import com.gh.download.simple.DownloadListener import com.gh.gamecenter.R import com.gh.gamecenter.common.eventbus.EBReuse -import com.gh.gamecenter.common.utils.DialogHelper -import com.gh.gamecenter.common.utils.dip2px -import com.gh.gamecenter.common.utils.roundTo -import com.gh.gamecenter.common.utils.toResString +import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.runOnUiThread import com.gh.gamecenter.core.utils.DisplayUtils import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.databinding.DialogArchiveLoadingBinding import com.gh.gamecenter.entity.ArchiveEntity +import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.retrofit.RetrofitManager import com.gh.vspace.VArchiveHelper import com.gh.vspace.VHelper @@ -40,6 +38,7 @@ object ArchiveDownloadButtonHelper { packageName: String, archiveEntity: ArchiveEntity, downloadBtn: TextView, + gameEntity: GameEntity?, downloadCompletedListener: (() -> Unit)? = null ) { downloadBtn.text = if (VArchiveHelper.isArchiveDownloaded(archiveEntity.md5)) { @@ -50,7 +49,7 @@ object ArchiveDownloadButtonHelper { downloadBtn.setOnClickListener { when { // 检查是否已安装畅玩助手 - !VHelper.isVSpaceInstalled(context) -> showVspaceTipDialog(context) + !VHelper.isVSpaceInstalled(context) -> showVspaceTipDialog(context, gameEntity) // 检查是否已安装游戏 !VHelper.isInstalled(packageName) -> { // 检查游戏是否在安装中 @@ -65,7 +64,8 @@ object ArchiveDownloadButtonHelper { context, entrance, packageName, - archiveEntity + archiveEntity, + gameEntity ) // 检查完毕下载存档 else -> downloadArchive( @@ -75,13 +75,14 @@ object ArchiveDownloadButtonHelper { packageName, archiveEntity, downloadBtn, + gameEntity, downloadCompletedListener ) } } } - private fun showVspaceTipDialog(context: Context) { + private fun showVspaceTipDialog(context: Context, gameEntity: GameEntity?) { NewFlatLogUtils.logCloudArchiveVSpaceDownloadDialogShow() DialogHelper.showDialog( context, @@ -91,7 +92,7 @@ object ArchiveDownloadButtonHelper { R.string.cancel.toResString(), { NewFlatLogUtils.logCloudArchiveVSpaceDownloadDialogClick(R.string.archive_vspace_dialog_confirm.toResString()) - VHelper.showVspaceDialog(context) + VHelper.showVspaceDialog(context, gameEntity) }, { NewFlatLogUtils.logCloudArchiveVSpaceDownloadDialogClick(R.string.cancel.toResString()) @@ -124,7 +125,8 @@ object ArchiveDownloadButtonHelper { context: Context, entrance: String, packageName: String, - archiveEntity: ArchiveEntity + archiveEntity: ArchiveEntity, + gameEntity: GameEntity? ) { VArchiveHelper.getArchiveFile(archiveEntity.md5)?.run { @@ -144,7 +146,12 @@ object ArchiveDownloadButtonHelper { } } - NewFlatLogUtils.logCloudArchiveDownloadOrApply(archiveEntity.name, entrance) + NewFlatLogUtils.logCloudArchiveDownloadOrApply( + archiveEntity.name, + entrance, + gameEntity?.id ?: "", + gameEntity?.name ?: "" + ) } private fun downloadArchive( @@ -154,6 +161,7 @@ object ArchiveDownloadButtonHelper { packageName: String, archiveEntity: ArchiveEntity, downloadBtn: TextView, + gameEntity: GameEntity?, downloadCompletedListener: (() -> Unit)? = null ) { // 执行下载 @@ -187,7 +195,7 @@ object ArchiveDownloadButtonHelper { DownloadStatus.COMPLETED -> { dismissArchiveLoadingDialog(archiveLoadingDialog) downloadBtn.text = R.string.archive_apply.toResString() - showApplyArchiveTipDialog(context, entrance, packageName, archiveEntity) + showApplyArchiveTipDialog(context, entrance, packageName, archiveEntity, gameEntity) downloadCompletedListener?.invoke() } else -> { @@ -202,7 +210,20 @@ object ArchiveDownloadButtonHelper { }) - NewFlatLogUtils.logCloudArchiveDownloadOrApply(archiveEntity.name, entrance) + NewFlatLogUtils.logCloudArchiveDownloadOrApply( + archiveEntity.name, + entrance, + gameEntity?.id ?: "", + gameEntity?.name ?: "" + ) + + SensorsBridge.trackEvent( + "CloudSaveDownload", + "cloud_save_name", archiveEntity.name, + "game_id", gameEntity?.id ?: "", + "game_name", gameEntity?.name ?: "", + "source_entrance", entrance + ) } private fun showArchiveLoadingDialog( @@ -226,7 +247,8 @@ object ArchiveDownloadButtonHelper { context: Context, entrance: String, packageName: String, - archiveEntity: ArchiveEntity + archiveEntity: ArchiveEntity, + gameEntity: GameEntity? ) { DialogHelper.showDialog( context, @@ -235,14 +257,33 @@ object ArchiveDownloadButtonHelper { R.string.archive_apply.toResString(), R.string.cancel.toResString(), { - applyArchive(context, entrance, packageName, archiveEntity) + applyArchive(context, entrance, packageName, archiveEntity, gameEntity) NewFlatLogUtils.logCloudArchiveApplyDialogRelated("cloud_save_overwrite_dialog_click", "使用") + SensorsBridge.trackEvent( + "CloudSaveOverwriteDialogClick", + "game_id", gameEntity?.id ?: "", + "game_name", gameEntity?.name ?: "", + "button_name", "使用" + ) + }, + { + NewFlatLogUtils.logCloudArchiveApplyDialogRelated("cloud_save_overwrite_dialog_click", "取消") + SensorsBridge.trackEvent( + "CloudSaveOverwriteDialogClick", + "game_id", gameEntity?.id ?: "", + "game_name", gameEntity?.name ?: "", + "button_name", "取消" + ) }, - { NewFlatLogUtils.logCloudArchiveApplyDialogRelated("cloud_save_overwrite_dialog_click", "取消") }, extraConfig = DialogHelper.Config(centerTitle = true) ) NewFlatLogUtils.logCloudArchiveApplyDialogRelated("cloud_save_overwrite_dialog_show") + SensorsBridge.trackEvent( + "CloudSaveOverwriteDialogShow", + "game_id", gameEntity?.id ?: "", + "game_name", gameEntity?.name ?: "" + ) } private fun dismissArchiveLoadingDialog(archiveLoadingDialog: Dialog) { diff --git a/app/src/main/java/com/gh/common/util/DataUtils.java b/app/src/main/java/com/gh/common/util/DataUtils.java index f18f358b0f..9dab71fce9 100644 --- a/app/src/main/java/com/gh/common/util/DataUtils.java +++ b/app/src/main/java/com/gh/common/util/DataUtils.java @@ -9,7 +9,7 @@ import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; -import com.gh.base.GlobalActivityManager; +import com.gh.gamecenter.common.base.GlobalActivityManager; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.common.base.activity.BaseActivity; import com.gh.gamecenter.common.constant.Constants; diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index 35315ae185..be6d4f06bc 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -56,6 +56,7 @@ import com.gh.gamecenter.common.utils.DialogHelper; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.ImageUtils; import com.gh.gamecenter.common.utils.NetworkUtils; +import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.common.view.CustomLinkMovementMethod; import com.gh.gamecenter.common.view.DrawableView; import com.gh.gamecenter.common.view.FixLinearLayoutManager; @@ -910,6 +911,8 @@ public class DialogUtils { public static void showRegulationTestDialog(Context context, @NonNull ConfirmListener confirmListener, @NonNull CancelListener cancelListener) { context = checkDialogContext(context); + SensorsBridge.trackEvent("EtiquetteTestDialogShow"); + final Dialog dialog = new TrackableDialog( context, R.style.GhAlertDialog, @@ -935,6 +938,7 @@ public class DialogUtils { cancelListener.onCancel(); MtaHelper.onEvent("礼仪考试", "礼仪考试弹窗", "跳过"); + SensorsBridge.trackEvent("EtiquetteTestDialogClick", "button_name", "跳过"); dialog.dismiss(); }); @@ -943,6 +947,7 @@ public class DialogUtils { Util_System_Keyboard.hideSoftKeyboard((Activity) finalContext1); MtaHelper.onEvent("礼仪考试", "礼仪考试弹窗", "确定"); + SensorsBridge.trackEvent("EtiquetteTestDialogClick", "button_name", "进入考试"); confirmListener.onConfirm(); dialog.dismiss(); }); 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 318422ba8e..3568598aa3 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.kt @@ -7,17 +7,16 @@ import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.collection.ArrayMap import androidx.recyclerview.widget.RecyclerView +import com.gh.gamecenter.common.base.GlobalActivityManager import com.gh.common.chain.* import com.gh.common.constant.Config import com.gh.common.dialog.DeviceRemindDialog -import com.gh.gamecenter.feature.exposure.ExposureEvent import com.gh.common.filter.RegionSettingHelper import com.gh.common.history.HistoryHelper import com.gh.common.repository.ReservationRepository import com.gh.common.simulator.NewSimulatorGameManager import com.gh.common.simulator.SimulatorDownloadManager import com.gh.common.simulator.SimulatorGameManager -import com.gh.gamecenter.feature.view.DownloadButton import com.gh.common.xapk.XapkInstaller import com.gh.common.xapk.XapkInstaller.cancelUnzipTask import com.gh.common.xapk.XapkUnzipStatus @@ -35,6 +34,8 @@ import com.gh.gamecenter.core.utils.* import com.gh.gamecenter.energy.EnergyBridge import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.feature.entity.PluginLocation +import com.gh.gamecenter.feature.exposure.ExposureEvent +import com.gh.gamecenter.feature.view.DownloadButton import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment import com.gh.gamecenter.manager.PackagesManager import com.gh.gamecenter.teenagermode.TeenagerModeActivity @@ -592,6 +593,7 @@ object DownloadItemUtils { gamePermissionDialogFragment?.dismissAllowingStateLoss() if (SPUtils.getBoolean(Constants.SP_TEENAGER_MODE)) { downloadBtn.setOnClickListener { + logDownloadButtonClick(gameEntity, downloadBtn) DialogHelper.showDialog( context, "提示", @@ -611,6 +613,7 @@ object DownloadItemUtils { if (gameEntity.isSpecialDownload()) { val info = RegionSettingHelper.getGameSpecialDownloadInfo(gameEntity.id) ?: return downloadBtn.setOnClickListener { + logDownloadButtonClick(gameEntity, downloadBtn) DialogHelper.showDialog( context, "提示", @@ -638,16 +641,27 @@ object DownloadItemUtils { if (gameEntity.isReservable) { if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.id)) { downloadBtn.setOnClickListener { + SensorsBridge.trackEvent( + "AppointmentGame", + "game_name", + gameEntity.name ?: "", + "game_id", + gameEntity.id + ) allStateClickCallback?.onCallback() CheckLoginUtils.checkLogin(context, entrance) { clickCallback?.onCallback() - ReservationHelper.reserve(context, gameEntity.id, object : EmptyCallback { - override fun onCallback() { - LogUtils.logReservation(gameEntity, traceEvent) - adapter?.notifyItemChanged(position) - refreshCallback?.onCallback() - } - }) + ReservationHelper.reserve( + context, + gameEntity.id, + gameEntity.name ?: "", + object : EmptyCallback { + override fun onCallback() { + LogUtils.logReservation(gameEntity, traceEvent) + adapter?.notifyItemChanged(position) + refreshCallback?.onCallback() + } + }) } } } else { @@ -689,12 +703,14 @@ object DownloadItemUtils { val gameH5Download = RegionSettingHelper.getGameH5DownloadByGameId(gameEntity.id) if (gameH5Download != null) { downloadBtn.setOnClickListener { + logDownloadButtonClick(gameEntity, downloadBtn) DialogUtils.showGameH5DownloadDialog(context, gameEntity, gameH5Download) } return } if (gameEntity.getApk().size == 0 && gameEntity.h5Link != null) { downloadBtn.setOnClickListener { + logDownloadButtonClick(gameEntity, downloadBtn) allStateClickCallback?.onCallback() MtaHelper.onEvent("H5页面", "入口", "列表页_" + gameEntity.name) val linkEntity = gameEntity.h5Link @@ -713,6 +729,7 @@ object DownloadItemUtils { } } else if (gameEntity.getApk().size == 1) { downloadBtn.setOnClickListener { + logDownloadButtonClick(gameEntity, downloadBtn) val clickRunnable = EmptyCallback { allStateClickCallback?.onCallback() clickCallback?.onCallback() @@ -1039,4 +1056,22 @@ object DownloadItemUtils { ) { DownloadManager.createDownload(context, gameEntity, "更新", entrance, location, isSubscribe, traceEvent) } + + private fun logDownloadButtonClick(gameEntity: GameEntity, downloadBtn: View) { + val buttonName = if (downloadBtn is DownloadButton) downloadBtn.text else "" + SensorsBridge.trackEvent( + "DownLoadbuttonClick", + "game_id", gameEntity.id, + "game_name", gameEntity.name ?: "", + "game_type", gameEntity.category ?: "", + "download_status", gameEntity.downloadStatusChinese ?: "", + "button_name", buttonName, + "page_name", GlobalActivityManager.getCurrentPageEntity().pageName, + "page_id", GlobalActivityManager.getCurrentPageEntity().pageId, + "page_business_id", GlobalActivityManager.getCurrentPageEntity().pageBusinessId, + "last_page_name", GlobalActivityManager.getLastPageEntity().pageName, + "last_page_id", GlobalActivityManager.getLastPageEntity().pageId, + "last_page_business_id", GlobalActivityManager.getLastPageEntity().pageBusinessId + ) + } } \ No newline at end of file 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 6ce826c8a7..66ce358c69 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -1,5 +1,7 @@ package com.gh.common.util +import com.gh.gamecenter.common.base.GlobalActivityManager.getCurrentPageEntity +import com.gh.gamecenter.common.base.GlobalActivityManager.getLastPageEntity import com.gh.common.constant.Config import com.gh.common.exposure.ExposureUtils import com.gh.common.simulator.SimulatorDownloadManager @@ -16,6 +18,7 @@ import com.gh.gamecenter.common.entity.SuggestType import com.gh.gamecenter.common.eventbus.EBShowDialog import com.gh.gamecenter.common.retrofit.Response import com.gh.gamecenter.common.utils.* +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.core.utils.* import com.gh.gamecenter.energy.EnergyBridge import com.gh.gamecenter.eventbus.EBDownloadStatus @@ -414,6 +417,19 @@ object DownloadObserver { ) DataCollectionUtils.uploadDownload(mApplication, downloadEntity, "完成") + + SensorsBridge.trackEvent( + "DownloadProcessFinish", + "game_id", downloadEntity.gameId, + "game_name", downloadEntity.meta[Constants.GAME_NAME] ?: "", + "game_type", downloadEntity.meta[Constants.GAME_TYPE] ?: "", + "page_name", getCurrentPageEntity().pageName, + "page_id", getCurrentPageEntity().pageId, + "page_business_id", getCurrentPageEntity().pageBusinessId, + "last_page_name", getLastPageEntity().pageName, + "last_page_id", getLastPageEntity().pageId, + "last_page_business_id", getLastPageEntity().pageBusinessId + ) } private fun processHijack(downloadEntity: DownloadEntity) { 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 bedbbdfeef..cc185f36b4 100644 --- a/app/src/main/java/com/gh/common/util/ErrorHelper.kt +++ b/app/src/main/java/com/gh/common/util/ErrorHelper.kt @@ -15,11 +15,10 @@ import com.gh.gamecenter.common.avoidcallback.AvoidOnResultManager import com.gh.gamecenter.common.avoidcallback.Callback import com.gh.gamecenter.common.callback.ConfirmListener import com.gh.gamecenter.common.constant.Constants -import com.gh.gamecenter.common.utils.DialogHelper -import com.gh.gamecenter.common.utils.dip2px -import com.gh.gamecenter.common.utils.toColor -import com.gh.gamecenter.common.utils.toObject import com.gh.gamecenter.common.entity.ErrorEntity +import com.gh.gamecenter.common.utils.* +import com.gh.gamecenter.common.utils.SensorsBridge +import com.gh.gamecenter.login.user.LoginTag import com.halo.assistant.fragment.user.UserInfoEditFragment import com.halo.assistant.fragment.user.VerifyPhoneFragment import com.lightgame.utils.AppManager @@ -403,23 +402,50 @@ object ErrorHelper { } @JvmStatic - fun handleLoginError(context: Context, httpException: HttpException?) { + fun handleLoginError( + context: Context, + httpException: HttpException?, + loginTagChinese: String, + isCertificate: Boolean + ) { try { + var errorReason = "" val errorEntity: ErrorEntity? = httpException?.response()?.errorBody()?.string()?.toObject() when { - errorEntity?.code == 403099 -> Utils.toast(context, "当前账号正在注销,禁止登录") + errorEntity?.code == 403099 -> { + errorReason = "当前账号正在注销,禁止登录" + Utils.toast(context, errorReason) + } // 用户禁止登录 - errorEntity?.code == 403401 -> Utils.toast(context, "您的账号存在违规,不允许登录") + errorEntity?.code == 403401 -> { + errorReason = "您的账号存在违规,不允许登录" + Utils.toast(context, errorReason) + } // 设备禁止登录 - errorEntity?.code == 403404 -> Utils.toast(context, "您的设备存在违规,不允许登录") + errorEntity?.code == 403404 -> { + errorReason = "您的设备存在违规,不允许登录" + Utils.toast(context, errorReason) + } - errorEntity?.toast?.isNotEmpty() == true -> Utils.toast(context, errorEntity.toast) + errorEntity?.toast?.isNotEmpty() == true -> { + Utils.toast(context, errorEntity.toast) + errorReason = errorEntity.toast!! + } else -> Utils.toast(context, R.string.login_failure) } + if (!isCertificate) SensorsBridge.trackEvent( + "LoginResult", + "login_type", + loginTagChinese, + "login_result", + "失败", + "defeated_reason", + errorReason + ) } catch (e: Exception) { e.printStackTrace() Utils.toast(context, R.string.login_failure) diff --git a/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt b/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt index a85dcb0db3..c80eb9fa27 100644 --- a/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt +++ b/app/src/main/java/com/gh/common/util/GameActivityDownloadHelper.kt @@ -138,7 +138,7 @@ object GameActivityDownloadHelper { ) { if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.id)) { CheckLoginUtils.checkLogin(context, entrance) { - ReservationHelper.reserve(context, gameEntity.id, object : EmptyCallback { + ReservationHelper.reserve(context, gameEntity.id, gameEntity.name ?: "", object : EmptyCallback { override fun onCallback() { LogUtils.logReservation(gameEntity, traceEvent) clear() diff --git a/app/src/main/java/com/gh/common/util/LibaoUtils.java b/app/src/main/java/com/gh/common/util/LibaoUtils.java index 2aee53e460..afa8754273 100644 --- a/app/src/main/java/com/gh/common/util/LibaoUtils.java +++ b/app/src/main/java/com/gh/common/util/LibaoUtils.java @@ -18,6 +18,7 @@ import com.gh.gamecenter.adapter.LibaoDetailAdapter; import com.gh.gamecenter.common.utils.DialogHelper; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.NotificationHelper; +import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.core.utils.ToastUtils; import com.gh.gamecenter.core.utils.UrlFilterUtils; import com.gh.gamecenter.feature.entity.ApkEntity; @@ -305,7 +306,7 @@ public class LibaoUtils { public static void initLibaoBtn(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity, final boolean isInstallRequired, final LibaoDetailAdapter adapter, boolean shouldUpdateStatus, - final String entrance, final OnLibaoStatusChangeListener listener) { + final String entrance, final String sourceEntrance, final OnLibaoStatusChangeListener listener) { setLiBaoBtnStatusRound(libaoBtn, libaoEntity, shouldUpdateStatus, context); String status = libaoEntity.getStatus(); @@ -406,13 +407,29 @@ public class LibaoUtils { if ("repeatLing".equals(status)) { ToastUtils.showToast("礼包每天0点刷新,明日0点后可再领一个"); } else { - libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, null, entrance, listener); + libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, null, entrance, sourceEntrance, listener); } + SensorsBridge.trackEvent("GameGiftDraw", + "gift_type", "普通礼包", + "game_name", libaoEntity.getGame().getName(), + "game_id", libaoEntity.getGame().getId(), + "gift_id", libaoEntity.getId(), + "gift_name", libaoEntity.getName(), + "source_entrance", sourceEntrance + ); break; case "再淘": case "再淘一个": case "淘号": - libaoTao(context, libaoBtn, libaoEntity, isInstallRequired, adapter, status, entrance, listener); + libaoTao(context, libaoBtn, libaoEntity, isInstallRequired, adapter, status, entrance, sourceEntrance, listener); + SensorsBridge.trackEvent("GameGiftDraw", + "gift_type", "淘号礼包", + "game_name", libaoEntity.getGame().getName(), + "game_id", libaoEntity.getGame().getId(), + "gift_id", libaoEntity.getId(), + "gift_name", libaoEntity.getName(), + "source_entrance", sourceEntrance + ); break; } }); @@ -420,7 +437,7 @@ public class LibaoUtils { } private static void libaoTao(Context context, TextView libaoBtn, LibaoEntity libaoEntity, boolean isInstallRequired, LibaoDetailAdapter adapter, - String status, String entrance, final OnLibaoStatusChangeListener listener) { + String status, String entrance, String sourceEntrance, final OnLibaoStatusChangeListener listener) { if ("repeatTao".equals(status)) { Utils.toast(context, "没到重复淘号时间, 礼包每天0点刷新"); return; @@ -475,6 +492,16 @@ public class LibaoUtils { des = "您已领取过相同的礼包,可能无法成功兑换"; } ToastUtils.showToast(des); + + SensorsBridge.trackEvent("GameGiftDrawResult", + "draw_result", "成功", + "gift_type", "淘号礼包", + "game_name", libaoEntity.getGame().getName(), + "game_id", libaoEntity.getGame().getId(), + "gift_id", libaoEntity.getId(), + "gift_name", libaoEntity.getName(), + "source_entrance", sourceEntrance + ); } @Override @@ -533,12 +560,22 @@ public class LibaoUtils { } } Utils.toast(context, "发生异常"); + + SensorsBridge.trackEvent("GameGiftDrawResult", + "draw_result", "失败", + "gift_type", "淘号礼包", + "game_name", libaoEntity.getGame().getName(), + "game_id", libaoEntity.getGame().getId(), + "gift_id", libaoEntity.getId(), + "gift_name", libaoEntity.getName(), + "source_entrance", sourceEntrance + ); } }); } private static void libaoLing(final Context context, TextView libaoBtn, final LibaoEntity libaoEntity, final LibaoDetailAdapter adapter, - final boolean isInstallRequired, String captchaCode, final String entrance, final OnLibaoStatusChangeListener listener) { + final boolean isInstallRequired, String captchaCode, final String entrance, final String sourceEntrance, final OnLibaoStatusChangeListener listener) { if (BuildConfig.DEBUG) { if (libaoBtn != null) { @@ -569,6 +606,15 @@ public class LibaoUtils { } if (TextUtils.isEmpty(libaoCode)) { Utils.toast(context, "领取异常"); + SensorsBridge.trackEvent("GameGiftDrawResult", + "draw_result", "失败", + "gift_type", "普通礼包", + "game_name", libaoEntity.getGame().getName(), + "game_id", libaoEntity.getGame().getId(), + "gift_id", libaoEntity.getId(), + "gift_name", libaoEntity.getName(), + "source_entrance", sourceEntrance + ); return; } libaoEntity.setAvailable(libaoEntity.getAvailable() - 1); @@ -596,6 +642,15 @@ public class LibaoUtils { } return null; }); + SensorsBridge.trackEvent("GameGiftDrawResult", + "draw_result", "成功", + "gift_type", "普通礼包", + "game_name", libaoEntity.getGame().getName(), + "game_id", libaoEntity.getGame().getId(), + "gift_id", libaoEntity.getId(), + "gift_name", libaoEntity.getName(), + "source_entrance", sourceEntrance + ); } @Override @@ -641,7 +696,7 @@ public class LibaoUtils { }, false, "", ""); libaoEntity.setStatus("used_up"); if (libaoBtn != null) { - initLibaoBtn(context, libaoBtn, libaoEntity, isInstallRequired, adapter, false, entrance, listener); + initLibaoBtn(context, libaoBtn, libaoEntity, isInstallRequired, adapter, false, entrance, sourceEntrance, listener); } break; case "maintaining": @@ -659,13 +714,22 @@ public class LibaoUtils { } else if (exception.code() == 412) { // 需要验证 GeetestUtils.getInstance().showDialog(context, captcha -> - libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, captcha, entrance, listener)); + libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, captcha, entrance, sourceEntrance, listener)); return; } else if (exception.code() == 401) { return; } } Utils.toast(context, "发生异常"); + SensorsBridge.trackEvent("GameGiftDrawResult", + "draw_result", "失败", + "gift_type", "普通礼包", + "game_name", libaoEntity.getGame().getName(), + "game_id", libaoEntity.getGame().getId(), + "gift_id", libaoEntity.getId(), + "gift_name", libaoEntity.getName(), + "source_entrance", sourceEntrance + ); } }, captchaCode); } diff --git a/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt b/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt index 3b5aa11503..a8d602efe4 100644 --- a/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt +++ b/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt @@ -922,19 +922,23 @@ object NewFlatLogUtils { } // 存档分享弹窗展示事件 - fun logCloudArchiveShareDialogShow() { + fun logCloudArchiveShareDialogShow(gameId: String, gameName: String) { val json = json { KEY_EVENT to "cloud_save_share_dialog_show" + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName parseAndPutMeta().invoke(this) } log(json) } // 存档分享弹窗点击事件 - fun logCloudArchiveShareDialogClick(buttonType: String) { + fun logCloudArchiveShareDialogClick(buttonType: String, gameId: String, gameName: String) { val json = json { KEY_EVENT to "cloud_save_share_dialog_click" KEY_BUTTON_TYPE to buttonType + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName parseAndPutMeta().invoke(this) } log(json) @@ -970,19 +974,23 @@ object NewFlatLogUtils { } // 上传存档弹窗展示事件 - fun logCloudArchiveUploadDialogShow() { + fun logCloudArchiveUploadDialogShow(gameId: String, gameName: String) { val json = json { KEY_EVENT to "cloud_save_upload_dialog_show" + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName parseAndPutMeta().invoke(this) } log(json) } // 上传存档弹窗点击事件 - fun logCloudArchiveUploadDialogClick(buttonType: String) { + fun logCloudArchiveUploadDialogClick(buttonType: String, gameId: String, gameName: String) { val json = json { KEY_EVENT to "cloud_save_upload_dialog_click" KEY_BUTTON_TYPE to buttonType + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName parseAndPutMeta().invoke(this) } log(json) @@ -1061,11 +1069,13 @@ object NewFlatLogUtils { } // 云存档下载/使用事件 - fun logCloudArchiveDownloadOrApply(archiveName: String, entrance: String) { + fun logCloudArchiveDownloadOrApply(archiveName: String, entrance: String, gameId: String, gameName: String) { val json = json { KEY_EVENT to "cloud_save_download" "cloud_save_name" to archiveName KEY_ENTRANCE to entrance + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName parseAndPutMeta().invoke(this) } log(json) 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 36da379042..8c545434f8 100644 --- a/app/src/main/java/com/gh/common/util/RealNameHelper.kt +++ b/app/src/main/java/com/gh/common/util/RealNameHelper.kt @@ -3,8 +3,10 @@ package com.gh.common.util import com.gh.gamecenter.core.utils.CurrentActivityHolder import com.gh.download.DownloadManager import com.gh.gamecenter.ShellActivity +import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.utils.DialogHelper +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.common.utils.getMetaExtra import com.lightgame.download.DownloadEntity @@ -54,6 +56,15 @@ object RealNameHelper { val isForced = downloadEntity.getMetaExtra("force_real_name") != "false" NewLogUtils.logCertificationTrigger(downloadEntity.gameId, downloadEntity.name) + SensorsBridge.trackEvent( + "VerificationDialogShow", + "game_id", + downloadEntity.gameId, + "game_name", + downloadEntity.name ?: "", + "game_type", + downloadEntity.meta[Constants.GAME_TYPE] ?: "" + ) val contentText = if (downloadEntity.status == DownloadStatus.done) { "为保护未成年身心健康成长\n" + "根据相关政策要求,该游戏不对未成年人开放\n" + "如需完成安装,请前往实名认证" @@ -88,9 +99,11 @@ object RealNameHelper { pendingInstallPkgPath = downloadEntity.path } NewLogUtils.logCertificationHintDialogOptionsClicked("前往实名认证") + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", "前往实名认证") }, cancelClickCallback = { NewLogUtils.logCertificationHintDialogOptionsClicked("取消") + SensorsBridge.trackEvent("VerificationPopupClick", "button_name", "取消") 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 e8a9ef1ad7..5387c35a47 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, gameId: String, callback: EmptyCallback) { + fun reserve(context: Context, gameId: String, gameName: String, callback: EmptyCallback) { val requestMap = hashMapOf() requestMap["game_id"] = gameId RetrofitManager.getInstance().api @@ -78,6 +78,16 @@ object ReservationHelper { .subscribe(object : BiResponse() { override fun onSuccess(data: ResponseBody) { + SensorsBridge.trackEvent( + "AppointmentGameResult", + "game_name", + gameName, + "game_id", + gameId, + "result", + "成功" + ) + ReservationRepository.addReservationToMemoryAndRefresh(gameId) callback.onCallback() val wechatConfig = SPUtils.getString(Constants.SP_WECHAT_CONFIG).toObject() @@ -88,14 +98,22 @@ object ReservationHelper { DialogUtils.showReserveSuccessDialog(context) } else { NewLogUtils.logReserveWechatRemindPopShow(wechatConfig) + SensorsBridge.trackEvent("AppointmenWechatRemindDialogShow") DialogUtils.showReserveSuccess2WechatBindDialog(context, object : ConfirmListener { override fun onConfirm() { NewLogUtils.logReserveWechatRemindPopClick(wechatConfig, "开启微信提醒") + SensorsBridge.trackEvent("AppointmenWechatRemindDialogClick") context.startActivity(WebActivity.getBindWechatIntent(context)) + SensorsBridge.trackEvent( + "AppointmenWechatRemindConfigPageShow", + "source_entrance", + "设置微信提醒弹窗" + ) } }, object : CancelListener { override fun onCancel() { NewLogUtils.logReserveWechatRemindPopClick(wechatConfig, "关闭弹窗") + SensorsBridge.trackEvent("AppointmenWechatRemindDialogClick") } }) } @@ -103,6 +121,15 @@ object ReservationHelper { } override fun onFailure(exception: Exception) { + SensorsBridge.trackEvent( + "AppointmentGameResult", + "game_name", + gameName, + "game_id", + gameId, + "result", + "失败" + ) ToastUtils.showToast(exception.message ?: "") } }) diff --git a/app/src/main/java/com/gh/common/util/SensorsLogUtils.kt b/app/src/main/java/com/gh/common/util/SensorsLogUtils.kt new file mode 100644 index 0000000000..d9e500b165 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/SensorsLogUtils.kt @@ -0,0 +1,29 @@ +package com.gh.common.util + +import android.os.Handler +import android.os.Looper +import android.os.Message +import com.gh.gamecenter.common.utils.SensorsBridge + +object SensorsLogUtils { + private const val KEY_EVENT_NAME = "event_name" + private val mLogHandler = LogHandler() + + fun trackEventDelay(key: Int, eventName: String, delay: Long) { + mLogHandler.sendMessageDelayed(Message().apply { + what = key + data.putString(KEY_EVENT_NAME, eventName) + }, delay) + } + + fun removeTrackEvent(key: Int) { + mLogHandler.removeMessages(key) + } + + class LogHandler : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + SensorsBridge.trackEvent(msg.data.getString(KEY_EVENT_NAME) ?: "") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index fad6172941..93266cffbd 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -15,6 +15,7 @@ import androidx.collection.ArrayMap; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import com.gh.gamecenter.common.base.GlobalActivityManager; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.core.AppExecutor; @@ -327,6 +328,7 @@ public class DownloadManager implements DownloadStatusListener { ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_ICON_SUBSCRIPT, gameEntity.getIconSubscript()); ExtensionsKt.addMetaExtra(downloadEntity, Constants.IS_PLATFORM_RECOMMEND, apkEntity.getRecommend() != null ? "true" : "false"); ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_NAME, gameEntity.getName()); + ExtensionsKt.addMetaExtra(downloadEntity, Constants.GAME_TYPE, gameEntity.getCategory()); ExtensionsKt.addMetaExtra(downloadEntity, Constants.AD_ICON_ACTIVE, String.valueOf(gameEntity.getAdIconActive())); ExtensionsKt.addMetaExtra(downloadEntity, Constants.IS_AD_DATA, String.valueOf(gameEntity.isAdData())); if (gameEntity.getIconFloat() != null) { @@ -375,6 +377,17 @@ public class DownloadManager implements DownloadStatusListener { ExposureUtils.DownloadType downloadType = ExposureUtils.getDownloadType(apkEntity, gameEntity.getId(), gameEntity.isVGame()); gameEntity.setIsPlatformRecommend(apkEntity.getRecommend() != null); ExposureEvent downloadExposureEvent = ExposureUtils.logADownloadExposureEvent(gameEntity, apkEntity.getPlatform(), traceEvent, downloadType); + SensorsBridge.trackEvent("DownloadProcessBegin", + "game_id", gameEntity.getId(), + "game_name", gameEntity.getName(), + "game_type", gameEntity.getCategory(), + "page_name", GlobalActivityManager.getCurrentPageEntity().getPageName(), + "page_id", GlobalActivityManager.getCurrentPageEntity().getPageId(), + "page_business_id", GlobalActivityManager.getCurrentPageEntity().getPageBusinessId(), + "last_page_name", GlobalActivityManager.getLastPageEntity().getPageName(), + "last_page_id", GlobalActivityManager.getLastPageEntity().getPageId(), + "last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId() + ); // 将下载事件放入 downloadEntity 中供下载完成时取出使用 downloadEntity.setExposureTrace(GsonUtils.toJson(downloadExposureEvent)); diff --git a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt index a350f08552..dde426a31f 100644 --- a/app/src/main/java/com/gh/gamecenter/SearchActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/SearchActivity.kt @@ -107,6 +107,8 @@ open class SearchActivity : BaseActivity() { ) { updateDisplayType(DEFAULT) } + + SensorsBridge.trackEvent("SearchPageShow", "source_entrance", mEntrance) } open fun initSearchBar() { @@ -181,6 +183,7 @@ open class SearchActivity : BaseActivity() { searchEt.setSelection(searchEt.text.length) updateDisplayType(GAME_DETAIL) LogUtils.uploadSearchGame("searching", "搜索页", key, "默认搜索") + SensorsBridge.trackEvent("SearchButtonClick", "search_content", key ?: "", "search_type", "默认搜索") // MtaHelper.onEvent("游戏搜索", "默认搜索", key) } @@ -197,6 +200,7 @@ open class SearchActivity : BaseActivity() { searchEt.setSelection(searchEt.text.length) updateDisplayType(GAME_DETAIL) LogUtils.uploadSearchGame("searching", "搜索页", key, "历史搜索") + SensorsBridge.trackEvent("SearchButtonClick", "search_content", key ?: "", "search_type", "历史搜索") // MtaHelper.onEvent("游戏搜索", "历史搜索", key) } @@ -218,6 +222,7 @@ open class SearchActivity : BaseActivity() { } } LogUtils.uploadSearchGame("searching", "搜索页", newSearchKey, "主动搜索") + SensorsBridge.trackEvent("SearchButtonClick", "search_content", newSearchKey, "search_type", "主动搜索") // MtaHelper.onEvent("游戏搜索", "主动搜索", newSearchKey) } @@ -293,11 +298,18 @@ open class SearchActivity : BaseActivity() { private const val HINT_TEXT = "搜索游戏..." @JvmStatic - fun getIntent(context: Context, searchImmediately: Boolean, hint: String, entrance: String): Intent { + fun getIntent( + context: Context, + searchImmediately: Boolean, + hint: String, + entrance: String, + sourceEntrance: String + ): Intent { val intent = Intent(context, SearchActivity::class.java) intent.putExtra(KEY_SEARCH_IMMEDIATELY, searchImmediately) intent.putExtra(EntranceConsts.KEY_HINT, hint) intent.putExtra(EntranceConsts.KEY_ENTRANCE, entrance) + intent.putExtra(EntranceConsts.KEY_SOURCE_ENTRANCE, sourceEntrance) return intent } } diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index aea6ee82b5..f739876eef 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -21,6 +21,7 @@ import androidx.annotation.NonNull; import com.alibaba.android.arouter.facade.annotation.Route; import com.gh.common.constant.Config; +import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.energy.EnergyBridge; import com.gh.common.util.IntegralLogHelper; import com.gh.gamecenter.common.callback.BiCallback; @@ -275,6 +276,12 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { ShareUtils.resourceId, "新浪微博" ); + SensorsBridge.trackEvent( + "GameCollectDetailShareClickSuccess", + "game_collect_title", ShareUtils.shareEntity.getShareTitle(), + "game_collect_id", ShareUtils.resourceId, + "share_type", "新浪微博" + ); } } else { IntegralLogHelper.INSTANCE.logInviteResult("成功", "微博"); diff --git a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java index e1c6243602..55db39073a 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java @@ -245,7 +245,7 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { List userDataLibaoList = mLibaoEntity.getMe().getUserDataLibaoList(); LibaoUtils.initLibaoBtn(mContext, holder.binding.libaodetailCopyBtn, mLibaoEntity, mLibaoDetailEntity.getInstallRequired(), this, false, - StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), null); + StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), "礼包详情", null); if (mLibaoEntity.getUniversal()) { holder.binding.libaodetailDes.setVisibility(View.GONE); } else { @@ -285,7 +285,7 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { if (mLibaoEntity.getStatus() != null && mLibaoDetailEntity != null) { LibaoUtils.initLibaoBtn(mContext, holder.binding.libaodetailCopyBtn, mLibaoEntity, mLibaoDetailEntity.getInstallRequired(), this, false, - StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), null); + StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), "礼包详情", null); } // 判断按钮状态是否为空(礼包详情进入),重新获取 diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java index e0b4e1c426..4cd982c119 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java @@ -12,6 +12,7 @@ import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; import com.airbnb.lottie.LottieAnimationView; +import com.gh.gamecenter.common.base.GlobalActivityManager; import com.gh.common.chain.BrowserInstallHandler; import com.gh.common.chain.CertificationHandler; import com.gh.common.chain.ChainBuilder; @@ -28,6 +29,7 @@ import com.gh.common.chain.VersionNumberHandler; import com.gh.common.constant.Config; import com.gh.common.dialog.DeviceRemindDialog; import com.gh.common.dialog.GameOffServiceDialogFragment; +import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.feature.exposure.ExposureEvent; import com.gh.common.filter.RegionSetting; import com.gh.common.filter.RegionSettingHelper; @@ -157,6 +159,23 @@ public class DetailViewHolder { @Override public void onClick(View v) { + if (mViewHolder.mDownloadPb.getButtonStyle() != DownloadButton.ButtonStyle.RESERVABLE && mViewHolder.mDownloadPb.getButtonStyle() != DownloadButton.ButtonStyle.RESERVED) { + SensorsBridge.trackEvent( + "DownLoadbuttonClick", + "game_id", mGameEntity.getId(), + "game_name", mGameEntity.getName(), + "game_type", mGameEntity.getCategory(), + "download_status", mGameEntity.getDownloadStatusChinese(), + "button_name", mViewHolder.mDownloadPb.getText(), + "page_name", GlobalActivityManager.getCurrentPageEntity().getPageName(), + "page_id", GlobalActivityManager.getCurrentPageEntity().getPageId(), + "page_business_id", GlobalActivityManager.getCurrentPageEntity().getPageBusinessId(), + "last_page_name", GlobalActivityManager.getLastPageEntity().getPageName(), + "last_page_id", GlobalActivityManager.getLastPageEntity().getPageId(), + "last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId() + ); + } + // 这个 switch 纯粹是为了 MTA和上报光能任务 统计用的 switch (mViewHolder.mDownloadPb.getButtonStyle()) { case DOWNLOADING_PLUGIN: @@ -393,8 +412,9 @@ public class DetailViewHolder { break; case RESERVABLE: GamePermissionDialogFragment.show((AppCompatActivity) mViewHolder.context, mGameEntity, mGameEntity.getInfo(), () -> { + SensorsBridge.trackEvent("AppointmentGame", "game_name", mGameEntity.getName(), "game_id", mGameEntity.getId()); CheckLoginUtils.checkLogin(mViewHolder.context, mEntrance, () -> { - ReservationHelper.reserve(mViewHolder.context, mGameEntity.getId(), () -> { + ReservationHelper.reserve(mViewHolder.context, mGameEntity.getId(), mGameEntity.getName(), () -> { LogUtils.logReservation(mGameEntity, mTraceEvent); DetailDownloadUtils.detailInitDownload(mViewHolder, false); }); diff --git a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt index bc1dbe5549..33602c28cc 100644 --- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt +++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2Fragment.kt @@ -206,6 +206,7 @@ class CategoryV2Fragment : LazyFragment() { requireContext(), false, "", + "新分类2.0", "新分类2.0" ) startActivity(intent) 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 d46c55cee8..f3bd776a04 100644 --- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt @@ -27,6 +27,8 @@ import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.feature.game.GameItemViewHolder import com.lightgame.download.DownloadEntity +import org.json.JSONException +import org.json.JSONObject class CategoryV2ListAdapter( context: Context, @@ -168,7 +170,21 @@ class CategoryV2ListAdapter( ), StringUtils.buildString(selectedSubCatalogName, ":", gameEntity.name), event - ) + ) { + val trackEvent = JSONObject() + try { + trackEvent.put("navigation_bar_name", mCategoryViewModel.selectedCategoryName) + trackEvent.put("game_tag", mCategoryViewModel.selectedCategoryList.map { it.name }) + trackEvent.put("game_status", gameEntity.category) + trackEvent.put( + "inclusion_size", + if (gameEntity.getApk().size == 1) gameEntity.getApk()[0].size ?: "" else "" + ) + } catch (e: JSONException) { + e.printStackTrace() + } + SensorsBridge.trackEvent("ClassificationFilterCriteriaSelected", trackEvent) + } DownloadItemUtils.updateItem( mContext, diff --git a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt index 0ec58de3ee..f5967b0371 100644 --- a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerActivity.kt @@ -80,6 +80,12 @@ class CloudArchiveManagerActivity : BaseActivity_TabLayout() { setToolbarMenu(R.menu.menu_cloud_archive_manager) updateStatusBarColor(R.color.background_white, R.color.background_white) NewFlatLogUtils.logCloudArchiveManagePageShow(mGameEntity?.id ?: "", mGameEntity?.name ?: "", mEntrance) + SensorsBridge.trackEvent( + "CloudSaveManagePageShow", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "source_entrance", mEntrance + ) mBinding.run { mGameEntity?.let { @@ -94,7 +100,12 @@ class CloudArchiveManagerActivity : BaseActivity_TabLayout() { mGameEntity?.getUniquePackageName() ?: "", mViewModel.archiveConfigStr ) -> toast("暂未检测到本地的存档数据,请玩会儿游戏再试~") else -> { - NewFlatLogUtils.logCloudArchiveUploadDialogShow() + NewFlatLogUtils.logCloudArchiveUploadDialogShow(mGameEntity?.id ?: "", mGameEntity?.name ?: "") + SensorsBridge.trackEvent( + "CloudSaveUploadDialogShow", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "" + ) showUploadDialog() } } @@ -145,6 +156,15 @@ class CloudArchiveManagerActivity : BaseActivity_TabLayout() { mGameEntity?.name ?: "", if (position == MY_ARCHIVE_INDEX) "我的存档" else if (position == MY_DOWNLOAD_ARCHIVE_INDEX) "我的下载" else "我的分享" ) + SensorsBridge.trackEvent( + "CloudSaveManagePageTabSelected", + "game_id", + mGameEntity?.id ?: "", + "game_name", + mGameEntity?.name ?: "", + "tab_name", + if (position == MY_ARCHIVE_INDEX) "我的存档" else if (position == MY_DOWNLOAD_ARCHIVE_INDEX) "我的下载" else "我的分享" + ) controlUploadGameArchive() } @@ -190,7 +210,13 @@ class CloudArchiveManagerActivity : BaseActivity_TabLayout() { confirmTv.alpha = if (text?.length != 0) 1F else 0.4F } confirmTv.setOnClickListener { - NewFlatLogUtils.logCloudArchiveUploadDialogClick("确定") + NewFlatLogUtils.logCloudArchiveUploadDialogClick("确定", mGameEntity?.id ?: "", mGameEntity?.name ?: "") + SensorsBridge.trackEvent( + "CloudSaveUploadDialogClick", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "button_name", "确定" + ) if (contentEt.text.trim().length in 3..30) { saveAndUploadArchive(contentEt.text.toString().trim()) dialog.dismiss() @@ -199,7 +225,13 @@ class CloudArchiveManagerActivity : BaseActivity_TabLayout() { } } cancelTv.setOnClickListener { - NewFlatLogUtils.logCloudArchiveUploadDialogClick("取消") + NewFlatLogUtils.logCloudArchiveUploadDialogClick("取消", mGameEntity?.id ?: "", mGameEntity?.name ?: "") + SensorsBridge.trackEvent( + "CloudSaveUploadDialogClick", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "button_name", "取消" + ) dialog.dismiss() } } diff --git a/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveAdapter.kt b/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveAdapter.kt index 3cc2afc56c..f567376fa9 100644 --- a/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveAdapter.kt @@ -16,13 +16,14 @@ import com.gh.gamecenter.common.viewholder.FooterViewHolder import com.gh.gamecenter.databinding.ItemMyArchiveBinding import com.gh.gamecenter.databinding.ItemMyShareArchiveBinding import com.gh.gamecenter.entity.ArchiveEntity +import com.gh.gamecenter.feature.entity.GameEntity class MyArchiveAdapter( context: Context, private val mFragment: Fragment, private val mViewModel: CloudArchiveManagerViewModel, private val mType: MyArchiveFragment.Type, - private val mPackageName: String + private val mGameEntity: GameEntity? ) : ListAdapter(context) { override fun getItemViewType(position: Int): Int { @@ -50,16 +51,23 @@ class MyArchiveAdapter( timeTv.text = entity.time.update.formatTime("yyyy-MM-dd HH:mm") versionTv.text = "版本:${entity.gameVersion}" optionsIv.setOnClickListener { - MyArchiveOptionDialogFragment.show(mContext as AppCompatActivity, mViewModel, mType, entity) + MyArchiveOptionDialogFragment.show( + mContext as AppCompatActivity, + mViewModel, + mType, + entity, + mGameEntity + ) } val entrance = if (mType == MyArchiveFragment.Type.MY_ARCHIVE) "云存档-我的存档" else "云存档-我的下载" ArchiveDownloadButtonHelper.bindItem( mContext, entrance, mFragment, - mPackageName, + mGameEntity?.getUniquePackageName() ?: "", entity, - actionTv + actionTv, + mGameEntity ) { if (mContext is CloudArchiveManagerActivity) { (mContext as CloudArchiveManagerActivity).updateMyShareArchive() @@ -77,15 +85,22 @@ class MyArchiveAdapter( versionTv.text = "版本:${entity.gameVersion}" descTv.text = entity.desc optionsIv.setOnClickListener { - MyArchiveOptionDialogFragment.show(mContext as AppCompatActivity, mViewModel, mType, entity) + MyArchiveOptionDialogFragment.show( + mContext as AppCompatActivity, + mViewModel, + mType, + entity, + mGameEntity + ) } ArchiveDownloadButtonHelper.bindItem( mContext, "云存档-我的分享", mFragment, - mPackageName, + mGameEntity?.getUniquePackageName() ?: "", entity, - actionTv + actionTv, + mGameEntity ) { if (mContext is CloudArchiveManagerActivity) { (mContext as CloudArchiveManagerActivity).updateMyArchive() diff --git a/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveFragment.kt b/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveFragment.kt index a276890e65..ca1befb406 100644 --- a/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/cloudarchive/MyArchiveFragment.kt @@ -37,7 +37,7 @@ open class MyArchiveFragment : ListFragment when (mType) { MyArchiveFragment.Type.MY_ARCHIVE -> { @@ -83,6 +95,12 @@ class MyArchiveOptionDialogFragment(private val mViewModel: CloudArchiveManagerV }, cancelClickCallback = { NewFlatLogUtils.logCloudArchiveDeleteDialogClick("取消") + SensorsBridge.trackEvent( + "CloudSaveDeleteDialogClick", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "button_name", "取消" + ) }, uiModificationCallback = { it.confirmTv.setTextColor(R.color.theme_red.toColor(requireContext())) @@ -96,7 +114,12 @@ class MyArchiveOptionDialogFragment(private val mViewModel: CloudArchiveManagerV dismissAllowingStateLoss() } mBinding.shareTv.setOnClickListener { - NewFlatLogUtils.logCloudArchiveShareDialogShow() + NewFlatLogUtils.logCloudArchiveShareDialogShow(mGameEntity?.id ?: "", mGameEntity?.name ?: "") + SensorsBridge.trackEvent( + "CloudSaveShareDialogShow", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "" + ) showShareDialog() dismissAllowingStateLoss() } @@ -171,11 +194,23 @@ class MyArchiveOptionDialogFragment(private val mViewModel: CloudArchiveManagerV mArchiveEntity?.let { entity -> mViewModel.shareArchive(entity, titleEt.text.toString().trim(), descEt.text.toString().trim()) } - NewFlatLogUtils.logCloudArchiveShareDialogClick("分享") + NewFlatLogUtils.logCloudArchiveShareDialogClick("分享", mGameEntity?.id ?: "", mGameEntity?.name ?: "") + SensorsBridge.trackEvent( + "CloudSaveShareDialogClick", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "button_name", "分享" + ) dialog.dismiss() } cancelTv.setOnClickListener { - NewFlatLogUtils.logCloudArchiveShareDialogClick("取消") + NewFlatLogUtils.logCloudArchiveShareDialogClick("取消", mGameEntity?.id ?: "", mGameEntity?.name ?: "") + SensorsBridge.trackEvent( + "CloudSaveShareDialogClick", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "button_name", "取消" + ) dialog.dismiss() } } @@ -228,9 +263,10 @@ class MyArchiveOptionDialogFragment(private val mViewModel: CloudArchiveManagerV activity: AppCompatActivity, mViewModel: CloudArchiveManagerViewModel, archiveType: MyArchiveFragment.Type, - archiveEntity: ArchiveEntity + archiveEntity: ArchiveEntity, + gameEntity: GameEntity? ) { - MyArchiveOptionDialogFragment(mViewModel).apply { + MyArchiveOptionDialogFragment(mViewModel, gameEntity).apply { arguments = bundleOf( KEY_ARCHIVE_TYPE to archiveType.value, KEY_ARCHIVE to archiveEntity 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 1aa7e08d45..f22103e783 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 @@ -23,6 +23,7 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils import androidx.core.os.bundleOf +import androidx.core.os.postDelayed import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment import androidx.lifecycle.Observer @@ -197,6 +198,17 @@ 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 { @@ -690,6 +702,15 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { } mBinding.followTv.setOnClickListener { debounceActionWithInterval(R.id.followTv) { + SensorsBridge.trackEvent( + "FollowForumClick", + "bbs_id", + mBbsId, + "forum_name", + mForumDetail?.name ?: "", + "bbs_type", + mBbsType + ) ifLogin(mEntrance) { val forumEntity = ForumEntity( id = mForumDetail?.id ?: "", @@ -887,7 +908,8 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript ), mForumDetail?.type - ?: "" + ?: "", + "论坛详情页" ), ARTICLE_REQUEST_CODE ) @@ -910,7 +932,7 @@ class ForumDetailFragment : BaseLazyTabFragment(), IScrollable { icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript ), mForumDetail?.type - ?: "" + ?: "", "论坛详情页" ), QUESTION_REQUEST_CODE ) 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 9972a13017..8d7100b600 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 @@ -170,6 +170,7 @@ class CommunityHomeFragment : LazyFragment() { topBg.translationY = 0F changeNavigationBg() NewLogUtils.logCommunityHomeEvent("click_for_you_tab") + SensorsBridge.trackEvent("CommunityTopTabSelected", "tab_type", "推荐") } TAB_FORUM_INDEX -> { root.setBackgroundColor(R.color.background_white.toColor(requireContext())) @@ -178,6 +179,7 @@ class CommunityHomeFragment : LazyFragment() { changeNavigationBg(this) } NewLogUtils.logCommunityHomeEvent("click_forum_tab") + SensorsBridge.trackEvent("CommunityTopTabSelected", "tab_type", "论坛") } TAB_ACTIVITY_INDEX -> { root.setBackgroundColor(R.color.background.toColor(requireContext())) @@ -186,6 +188,7 @@ class CommunityHomeFragment : LazyFragment() { changeNavigationBg(this) } NewLogUtils.logCommunityHomeEvent("click_activity_tab") + SensorsBridge.trackEvent("CommunityTopTabSelected", "tab_type", "活动") } } }, @@ -407,7 +410,7 @@ class CommunityHomeFragment : LazyFragment() { MtaHelper.onEvent("论坛首页", "发布", "发帖子") NewLogUtils.logArticleEditEnter("推荐信息流", "", "") startActivityForResult( - ArticleEditActivity.getIntent(requireContext(), null), + ArticleEditActivity.getIntent(requireContext(), null, entrance = "社区推荐Tab"), ARTICLE_REQUEST_CODE ) dialog.dismiss() @@ -421,7 +424,10 @@ class CommunityHomeFragment : LazyFragment() { showRegulationTestDialogIfNeeded { MtaHelper.onEvent("论坛首页", "发布", "提问") NewLogUtils.logQuestionEditEnter("推荐信息流", "", "") - startActivityForResult(QuestionEditActivity.getIntent(requireContext()), QUESTION_REQUEST_CODE) + startActivityForResult( + QuestionEditActivity.getIntent(requireContext(), entrance = "社区推荐Tab"), + QUESTION_REQUEST_CODE + ) dialog.dismiss() } } 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 59436cec93..0954577d38 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 @@ -209,6 +209,7 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : } binding.concernBtn.setOnClickListener { debounceActionWithInterval(R.id.concernBtn, 1000) { + SensorsBridge.trackEvent("FollowUserClick", "mongold_id", userId) CheckLoginUtils.checkLogin(itemView.context, entrance) { if (entrance == "社区") { NewLogUtils.logRecommendFeedUserClick("click_for_you_follow", userId, contentType) 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 8c976a1b81..1f3c9f4e86 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -42,6 +42,8 @@ import com.google.android.material.appbar.AppBarLayout import com.halo.assistant.fragment.WebFragment import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.json.JSONException +import org.json.JSONObject import kotlin.math.abs class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { @@ -158,6 +160,16 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { mViewModel?.tabs?.value?.run { this.safelyGetInRelease(position).let { LogUtils.logHomeTopTabClick(it?.name, it?.type, it?.text, it?.link, position) + + val trackEvent = JSONObject() + try { + trackEvent.put("position", position) + trackEvent.put("tab_content", it?.name) + } catch (e: JSONException) { + e.printStackTrace() + } + SensorsBridge.trackEvent("HomeTopTabSelect", trackEvent) + if (it?.type == "common_collection") { NewLogUtils.logAccessToCommonCollectionDetail(it.link ?: "", it.text ?: "", "首页顶部Tab栏") } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java index 2b2167e815..c1d2122b2d 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -46,6 +46,7 @@ import com.gh.gamecenter.common.syncpage.SyncPageRepository; import com.gh.gamecenter.common.tracker.TrackerLogger; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.ImageUtils; +import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.core.utils.DisplayUtils; import com.gh.gamecenter.core.utils.GsonUtils; import com.gh.gamecenter.core.utils.SPUtils; @@ -79,6 +80,8 @@ import com.lightgame.view.NoScrollableViewPager; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.json.JSONException; +import org.json.JSONObject; import java.util.ArrayList; import java.util.List; @@ -358,9 +361,36 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem final int toCheck = mCheckableGroup.indexOfChild(view); playTabAnimation(toCheck); changeColor(toCheck); + + JSONObject trackEvent = new JSONObject(); + try { + trackEvent.put("position", toCheck); + trackEvent.put("tab_content", getTabName(toCheck)); + } catch (JSONException e) { + e.printStackTrace(); + } + SensorsBridge.trackEvent("HomeBottomTabSelect", trackEvent); + return super.handleOnClick(view); } + private String getTabName(int index) { + switch (index) { + case 0: + return "首页"; + case 1: + return mBinding.mainTabGameName.getText().toString(); + case 2: + return "社区"; + case 3: + return "视频"; + case 4: + return "我的光环"; + default: + return ""; + } + } + private void changeColor(int toCheck) { if (toCheck == INDEX_VIDEO) { mBinding.viewShadow.setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java index 07582dfb10..6c584eceb4 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java @@ -284,7 +284,7 @@ public class SearchToolbarFragment extends BaseLazyFragment implements View.OnCl MtaHelper.onEvent("首页_点击", "顶栏", "搜索"); DataCollectionUtils.uploadClick(getActivity(), "搜索图标", "主页"); - intent = SearchActivity.getIntent(requireContext(), true, mSearchHintTv.getHint().toString(), "(工具栏)"); + intent = SearchActivity.getIntent(requireContext(), true, mSearchHintTv.getHint().toString(), "(工具栏)", mLocation); startActivity(intent); } else if (id == R.id.actionbar_search_input || id == R.id.actionbar_search_rl || id == R.id.actionbar_search_right) { MtaHelper.onEvent("首页_点击", "顶栏", "搜索"); @@ -293,7 +293,7 @@ public class SearchToolbarFragment extends BaseLazyFragment implements View.OnCl LogUtils.uploadSearchGame("access_to_search", mLocation, "", ""); } - intent = SearchActivity.getIntent(requireContext(), false, mSearchHintTv.getHint().toString(), "(工具栏)"); + intent = SearchActivity.getIntent(requireContext(), false, mSearchHintTv.getHint().toString(), "(工具栏)", mLocation); startActivity(intent); } else if (id == R.id.actionbar_notification) { MtaHelper.onEvent("首页_点击", "顶栏", "消息中心"); 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 e03b3f95d0..49491c192c 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt @@ -12,6 +12,7 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.entity.CommunityEntity import com.gh.gamecenter.common.utils.ImageUtils +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.view.WrapContentDraweeView import com.gh.gamecenter.core.utils.MtaHelper import com.gh.gamecenter.core.utils.TimeElapsedHelper @@ -43,6 +44,7 @@ class WelcomeDialogFragment : BaseDialogFragment() { HaloApp.put(Constants.WELCOME_DIALOG_ID, mWelcomeEntity?.id) HaloApp.put(Constants.WELCOME_DIALOG_LINK_TITLE, mWelcomeEntity?.text) LogUtils.uploadWelcomeDialog("click", mWelcomeEntity?.id, mWelcomeEntity?.text) + SensorsBridge.trackEvent("HomeDialogClick") when (mWelcomeEntity?.type) { EntranceConsts.HOST_ARTICLE -> { @@ -176,6 +178,7 @@ class WelcomeDialogFragment : BaseDialogFragment() { arguments = Bundle() arguments?.putParcelable(TAG, welcomeEntity) LogUtils.uploadWelcomeDialog("show", welcomeEntity?.id, welcomeEntity?.text) + SensorsBridge.trackEvent("HomeDialogShow") } } 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 9cb83833f3..787b61ed26 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 @@ -17,6 +17,7 @@ import androidx.core.view.ViewCompat import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.RecyclerView import com.ethanhua.skeleton.Skeleton +import com.gh.common.util.SensorsLogUtils import com.gh.common.exposure.ExposureListener import com.gh.common.history.HistoryHelper import com.gh.common.util.DialogUtils @@ -141,6 +142,16 @@ class GameCollectionDetailFragment : mListViewModel.getGameCollectionDetail() mListRv.addOnScrollListener(ExposureListener(this, provideListAdapter())) + + mBaseHandler.postDelayed({ + SensorsBridge.trackEvent( + "ViewGameCollectDetail", + "game_collect_title", + mGameCollectionTitle, + "game_collect_id", + mGameCollectionId + ) + }, 3000) } private fun initView() { @@ -782,6 +793,8 @@ class GameCollectionDetailFragment : } }, 2000) } + + SensorsLogUtils.removeTrackEvent(KEY_GAME_COLLECTION_DETAIL) } override fun onPause() { @@ -805,6 +818,8 @@ class GameCollectionDetailFragment : val stayTime = (System.currentTimeMillis() - startPageTime) / 1000 com.gh.common.util.NewFlatLogUtils.logGameCollectStayTime(stayTime, it.id, it.title) } + + SensorsLogUtils.trackEventDelay(KEY_GAME_COLLECTION_DETAIL, "LeaveGameCollectDetail", 3000) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -1011,6 +1026,12 @@ class GameCollectionDetailFragment : } else { logEvent("click_game_collect_detail_favorite") } + SensorsBridge.trackEvent( + "GameCollectDetailFavoriteClick", + "game_collect_title", mGameCollectionTitle, + "game_collect_id", mGameCollectionId, + "result", if (mEntity?.me?.isFavorite == true) "取消收藏" else "收藏" + ) mListViewModel?.postFavoriteGameCollection() } } @@ -1022,6 +1043,12 @@ class GameCollectionDetailFragment : debounceActionWithInterval(v.id) { ifLogin("游戏单详情") { mListViewModel?.postVoteGameCollection() + SensorsBridge.trackEvent( + "GameCollectForYouLikeClick", + "game_collect_title", mGameCollectionTitle, + "game_collect_id", mGameCollectionId, + "result", if (mEntity?.me?.isVoted == true) "取消点赞" else "点赞" + ) } } } @@ -1130,4 +1157,8 @@ class GameCollectionDetailFragment : appbar.setExpanded(true) } } + + companion object { + const val KEY_GAME_COLLECTION_DETAIL = 1001 + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionShareDialog.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionShareDialog.kt index 1daa7c7425..81a42181ce 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionShareDialog.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionShareDialog.kt @@ -10,13 +10,10 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.children import com.gh.gamecenter.common.base.fragment.BaseDraggableDialogFragment import com.gh.gamecenter.R -import com.gh.gamecenter.common.utils.ShareUtils -import com.gh.gamecenter.common.utils.toColor -import com.gh.gamecenter.common.utils.toDrawable import com.gh.gamecenter.databinding.DialogGameCollectionShareBinding import com.gh.gamecenter.common.entity.NormalShareEntity import com.gh.gamecenter.common.eventbus.EBShare -import com.gh.gamecenter.common.utils.NewLogUtils +import com.gh.gamecenter.common.utils.* import org.greenrobot.eventbus.EventBus class GameCollectionShareDialog : BaseDraggableDialogFragment() { @@ -110,6 +107,12 @@ class GameCollectionShareDialog : BaseDraggableDialogFragment() { mShareEntity?.id ?: "", shareType ) + SensorsBridge.trackEvent( + "GameCollectDetailShareClick", + "game_collect_title", mShareEntity?.shareTitle ?: "", + "game_collect_id", mShareEntity?.id ?: "", + "share_type", shareType + ) } override fun getRootView(): View = mBinding.root diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt index 8dbe50b85f..efd5a06a58 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt @@ -14,16 +14,17 @@ import android.view.ViewGroup import android.view.animation.AnimationUtils import android.widget.ImageView import android.widget.RelativeLayout -import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.ethanhua.skeleton.Skeleton +import com.gh.common.util.SensorsLogUtils import com.gh.common.exposure.* import com.gh.common.util.NewLogUtils import com.gh.gamecenter.R +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.baselist.LoadStatus @@ -97,6 +98,19 @@ class GameCollectionSquareFragment : LazyListFragment(R.id.fab)?.visibility = View.VISIBLE } + SensorsLogUtils.removeTrackEvent(KEY_GAME_COLLECTION_SQUARE) } override fun isAutomaticLoad() = false @@ -617,6 +634,7 @@ class GameCollectionSquareFragment : LazyListFragment { LogUtils.uploadSearchGame("access_to_search", "游戏详情", "", "") - val intent = SearchActivity.getIntent(requireContext(), false, "", "游戏详情") + val intent = SearchActivity.getIntent(requireContext(), false, "", "游戏详情", "游戏详情") startActivity(intent) } } @@ -718,6 +720,21 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { DataLogUtils.uploadGameLog(context, mGameEntity!!.id, mGameEntity!!.name, mEntrance) + SensorsBridge.trackEvent( + "GameDetailPageShow", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "download_status", mGameEntity?.downloadStatusChinese ?: "", + "cloud_save_tab_status", if (data.showArchive) "开启" else "关闭", + "game_type", mGameEntity?.category ?: "", + "page_name", getCurrentPageEntity().pageName, + "page_id", getCurrentPageEntity().pageId, + "page_business_id", getCurrentPageEntity().pageBusinessId, + "last_page_name", getLastPageEntity().pageName, + "last_page_id", getLastPageEntity().pageId, + "last_page_business_id", getLastPageEntity().pageBusinessId + ) + mNewGameDetailEntity = data showAlertDialogIfNeeded(data) @@ -1615,7 +1632,12 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { } CheckLoginUtils.checkLogin(requireContext(), "游戏详情") { if (!ReservationRepository.thisGameHasBeenReserved(mGameEntity?.id ?: "")) { - ReservationHelper.reserve(requireContext(), mGameEntity?.id ?: "", getCallback()) + ReservationHelper.reserve( + requireContext(), + mGameEntity?.id ?: "", + mGameEntity?.name ?: "", + getCallback() + ) } else { if ("download" == mGameEntity?.reserveStatus) { ReservationHelper.showDeleteReservationDialog( @@ -1843,6 +1865,17 @@ class GameDetailFragment : ToolbarFragment(), IScrollable { mGameEntity?.id ?: "", mGameEntity?.name ?: "" ) + SensorsBridge.trackEvent( + "CloudSaveTabSelected", + "game_id", mGameEntity?.id ?: "", + "game_name", mGameEntity?.name ?: "", + "page_name", getCurrentPageEntity().pageName, + "page_id", getCurrentPageEntity().pageId, + "page_business_id", getCurrentPageEntity().pageBusinessId, + "last_page_name", getLastPageEntity().pageName, + "last_page_id", getLastPageEntity().pageId, + "last_page_business_id", getLastPageEntity().pageBusinessId + ) } TAB_RATING -> { NewLogUtils.logGameDetailTabClick("view_game_detail_comment_tab", entrance, id, gameType, bbsId) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveFragment.kt index cfa3a627f1..c1e52600ae 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveFragment.kt @@ -83,12 +83,12 @@ class CloudArchiveFragment : LazyFragment() { if (mIsSearch) { mSearchFragment = childFragmentManager.findFragmentByTag("${CloudArchiveListFragment::class.java.name}_search") - as? CloudArchiveListFragment ?: CloudArchiveListFragment() + as? CloudArchiveListFragment ?: CloudArchiveListFragment(mGameEntity) alterFragment(mSearchFragment!!) } else { mNormalFragment = childFragmentManager.findFragmentByTag("${CloudArchiveListFragment::class.java.name}_normal") - as? CloudArchiveListFragment ?: CloudArchiveListFragment() + as? CloudArchiveListFragment ?: CloudArchiveListFragment(mGameEntity) alterFragment(mNormalFragment!!) } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListAdapter.kt index 0e4c7e427b..096a85506c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListAdapter.kt @@ -14,12 +14,14 @@ import com.gh.gamecenter.common.utils.toBinding import com.gh.gamecenter.common.viewholder.FooterViewHolder import com.gh.gamecenter.databinding.CloudArchiveItemBinding import com.gh.gamecenter.entity.ArchiveEntity +import com.gh.gamecenter.feature.entity.GameEntity class CloudArchiveListAdapter( context: Context, private val mPackageName: String, private val mFragment: Fragment, - private val mViewModel: CloudArchiveListViewModel + private val mViewModel: CloudArchiveListViewModel, + private val mGameEntity: GameEntity? ) : ListAdapter(context) { override fun getItemCount() = @@ -57,7 +59,8 @@ class CloudArchiveListAdapter( mFragment, mPackageName, entity, - downloadBtn + downloadBtn, + mGameEntity ) } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListFragment.kt index a0a9661776..d9b48b5682 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/cloudarchive/CloudArchiveListFragment.kt @@ -14,7 +14,8 @@ import com.gh.gamecenter.common.view.CustomDividerItemDecoration import com.gh.gamecenter.entity.ArchiveEntity import com.gh.gamecenter.feature.entity.GameEntity -class CloudArchiveListFragment : LazyListFragment() { +class CloudArchiveListFragment(private val mGameEntity: GameEntity?) : + LazyListFragment() { private var mAdapter: CloudArchiveListAdapter? = null @@ -23,7 +24,8 @@ class CloudArchiveListFragment : LazyListFragment(EntranceConsts.KEY_GAME)?.getUniquePackageName() ?: "", this, - mListViewModel ?: provideListViewModel() + mListViewModel ?: provideListViewModel(), + mGameEntity ).apply { mAdapter = this } override fun provideListViewModel() = diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt index af85e8d0c9..dfab3f2f5c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt @@ -162,7 +162,16 @@ class GameLibaoAdapter( } // LibaoUtils.setLiBaoBtnStatusRound(holder.binding.receiveTv, libaoEntity,true, context) - LibaoUtils.initLibaoBtn(context, holder.binding.receiveTv, libaoEntity, false, null, true, "游戏详情") { + LibaoUtils.initLibaoBtn( + context, + holder.binding.receiveTv, + libaoEntity, + false, + null, + true, + "游戏详情", + "游戏详情" + ) { notifyItemChanged(position) } if (!libaoEntity.packageName.isNullOrEmpty()) { diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeRecommendItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/HomeRecommendItemViewHolder.kt index c517061634..ebf54c8f6a 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeRecommendItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeRecommendItemViewHolder.kt @@ -1,18 +1,21 @@ package com.gh.gamecenter.home -import com.gh.gamecenter.feature.exposure.ExposureEvent -import com.gh.gamecenter.feature.exposure.ExposureSource -import com.gh.gamecenter.common.base.BaseRecyclerViewHolder -import com.gh.gamecenter.common.callback.OnViewClickListener import com.gh.common.util.* import com.gh.gamecenter.R +import com.gh.gamecenter.common.base.BaseRecyclerViewHolder +import com.gh.gamecenter.common.callback.OnViewClickListener +import com.gh.gamecenter.common.utils.ImageUtils +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.goneIf import com.gh.gamecenter.common.utils.toColor -import com.gh.gamecenter.common.utils.ImageUtils import com.gh.gamecenter.core.utils.MtaHelper import com.gh.gamecenter.core.utils.PageSwitchDataHelper import com.gh.gamecenter.databinding.HomeRecommendItemBinding import com.gh.gamecenter.feature.entity.GameEntity +import com.gh.gamecenter.feature.exposure.ExposureEvent +import com.gh.gamecenter.feature.exposure.ExposureSource +import org.json.JSONException +import org.json.JSONObject class HomeRecommendItemViewHolder(val binding: HomeRecommendItemBinding) : BaseRecyclerViewHolder(binding.root) { @@ -34,6 +37,15 @@ class HomeRecommendItemViewHolder(val binding: HomeRecommendItemBinding) : BaseR position ) + val trackEvent = JSONObject() + try { + trackEvent.put("position", position) + trackEvent.put("Recommended_location_name", recommend.name) + } catch (e: JSONException) { + e.printStackTrace() + } + SensorsBridge.trackEvent("RecommendedLocationClick", trackEvent) + if (recommend.linkType == "top_game_comment") { MtaHelper.onEvent("安利墙", "进入", "首页推荐入口") } diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java index b7f4c3a5f8..f59be6e8db 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java @@ -224,7 +224,7 @@ class Libao2FragmentAdapter extends BaseRecyclerAdapter { holder.binding.libaoDes.setText(content); if (libaoEntity.getStatus() != null) { - LibaoUtils.initLibaoBtn(mContext, holder.binding.libaoBtnStatus, libaoEntity, false, null, true, mEntrance + "+(礼包中心:关注)", new LibaoUtils.OnLibaoStatusChangeListener() { + LibaoUtils.initLibaoBtn(mContext, holder.binding.libaoBtnStatus, libaoEntity, false, null, true, mEntrance + "+(礼包中心:关注)", "礼包中心-关注", new LibaoUtils.OnLibaoStatusChangeListener() { @Override public void onLibaoStatusChange() { notifyItemChanged(position); diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoFragment.java b/app/src/main/java/com/gh/gamecenter/libao/LibaoFragment.java index f843c0cb4f..a885350387 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoFragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoFragment.java @@ -20,6 +20,7 @@ import com.gh.gamecenter.ConcernActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.common.base.fragment.BaseFragment_TabLayout; import com.gh.gamecenter.common.utils.ExtensionsKt; +import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.core.utils.MtaHelper; import com.gh.gamecenter.databinding.FragmentLibaoWrapperBinding; import com.gh.gamecenter.common.eventbus.EBReuse; @@ -137,6 +138,7 @@ public class LibaoFragment extends BaseFragment_TabLayout { @Override public void onPageSelected(int position) { MtaHelper.onEvent("我的光环_新", "礼包中心", mTabTitleList.get(position) + "Tab"); + SensorsBridge.trackEvent("GameGiftCenterTabSelected", "tab_name", mTabTitleList.get(position)); EventBus.getDefault().post(new EBUISwitch(EB_LIBAOACTIVITY_TAG, position)); mManageMenu.getActionView().findViewById(R.id.manageTv).setVisibility(position == 1 ? View.VISIBLE : View.GONE); } diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt index efbd4d16b1..dba4bfeb00 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt @@ -217,7 +217,8 @@ class LibaoNewAdapter( if (libaoEntity.status != null) { LibaoUtils.initLibaoBtn( mContext, holder.binding.libaoBtnStatus, libaoEntity, false, null, true, - mEntrance + "+(礼包中心:最新)" + mEntrance + "+(礼包中心:最新)", + "礼包中心-最新" ) { notifyItemChanged(position) } diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt index c40a9b438d..0f017dcfca 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt @@ -239,7 +239,8 @@ class LibaoSearchAdapter( if (libaoEntity.status != null) { LibaoUtils.initLibaoBtn( mContext, holder.binding.libaoBtnStatus, libaoEntity, false, null, false, - "$mEntrance+(礼包中心:最新)" + "$mEntrance+(礼包中心:最新)", + "礼包中心-最新" ) { notifyItemChanged(position) } 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 15929d7881..a1b4cd1a2a 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalBannerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalBannerAdapter.kt @@ -122,6 +122,11 @@ class HaloPersonalBannerAdapter(context: Context) : BaseRecyclerAdapter { if (UserManager.getInstance().isLoggedIn) { mContext.startActivity(WebActivity.getBindWechatIntent(mContext)) + SensorsBridge.trackEvent( + "AppointmenWechatRemindConfigPageShow", + "source_entrance", + "我的光环-微信提醒" + ) } else { CheckLoginUtils.checkLogin(mContext, "我的光环-微信提醒") { } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt index 0477feafdc..eb3f133b64 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt @@ -268,6 +268,7 @@ class HaloPersonalFragment : BaseLazyFragment() { MessageUnreadViewModel.Factory(HaloApp.getInstance().application) ).get(MessageUnreadViewModel::class.java) mHaloPersonalViewModel = ViewModelProvider(this).get(HaloPersonalViewModel::class.java) + mUserHomeViewModel.getUserInfo() observeNoneUIRelatedChanges() } @@ -837,6 +838,11 @@ class HaloPersonalFragment : BaseLazyFragment() { MessageUnreadRepository.loadMessageUnreadTotal(false) } } + mUserHomeViewModel.userInfo.observeNonNull(this) { + if (it.source != null) { + SensorsBridge.profileSet("city", it.source?.region ?: "") + } + } } // 连接上网络事件 diff --git a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFunctionAdapter.kt b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFunctionAdapter.kt index 498db6e0ba..1c4fc8d66e 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFunctionAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFunctionAdapter.kt @@ -122,6 +122,7 @@ class HaloPersonalFunctionAdapter(context: Context) : BaseRecyclerAdapter { if (UserManager.getInstance().isLoggedIn) { mContext.startActivity(WebActivity.getBindWechatIntent(mContext)) + SensorsBridge.trackEvent("AppointmenWechatRemindConfigPageShow", "source_entrance", "我的光环-微信提醒") } else { CheckLoginUtils.checkLogin(mContext, "我的光环-微信提醒") { } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalRecommendAdapter.kt b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalRecommendAdapter.kt index 114555a8be..89a79afd9a 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalRecommendAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalRecommendAdapter.kt @@ -147,6 +147,11 @@ class HaloPersonalRecommendAdapter(val context: Context) : BaseRecyclerAdapter { if (UserManager.getInstance().isLoggedIn) { mContext.startActivity(WebActivity.getBindWechatIntent(mContext)) + SensorsBridge.trackEvent( + "AppointmenWechatRemindConfigPageShow", + "source_entrance", + "我的光环-微信提醒" + ) } else { CheckLoginUtils.checkLogin(mContext, "我的光环-微信提醒") { } } 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 948ac32336..bca1c3ea17 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 @@ -166,6 +166,19 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } observeData() + + val bbsType = if (mViewModel.mSelectCommunityData?.type == "official_bbs") "综合论坛" else "游戏论坛" + SensorsBridge.trackEvent( + "ViewPostArticle", + "source_entrance", + mEntrance, + "article_type", + "帖子", + "bbs_type", + bbsType, + "bbs_id", + mViewModel.mSelectCommunityData?.id ?: "" + ) } override fun provideViewModel(): ArticleEditViewModel { @@ -318,6 +331,7 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb bbsType, mViewModel.selectActivityLabelEntity?.name ?: "", mOriginalCb.isChecked, mViewModel.quoteCountEntity ) + SensorsBridge.trackEvent("ArticleCancelclick") onBackPressed() } mBinding.articleGameName.setOnClickListener { @@ -490,11 +504,16 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb //帖子发布,需判断是否输入了内容,输入了则弹窗提示 if (mViewModel.detailEntity == null && mViewModel.draftEntity == null) { if (mBinding.articleEditTitle.text.toString().isNotEmpty() || mRichEditor.html.isNotEmpty()) { + SensorsBridge.trackEvent("ArticleCancelDialogShow") DialogHelper.showDialog(this, "提示", "是否保存内容再退出?", "保存并退出", "不保存", { + SensorsBridge.trackEvent("ArticleCancelDialogClick", "button_name", "保存并退出") mViewModel.title = mBinding.articleEditTitle.text.toString() mViewModel.content = getReplaceRealContent() mViewModel.postArticleDrafts(SaveDraftType.EXIT) - }, { finish() }, DialogHelper.Config(showCloseIcon = true, centerContent = true, centerTitle = true)) + }, { + SensorsBridge.trackEvent("ArticleCancelDialogClick", "button_name", "不保存") + finish() + }, DialogHelper.Config(showCloseIcon = true, centerContent = true, centerTitle = true)) return true } } @@ -646,6 +665,17 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb if (item?.itemId == R.id.menu_answer_post) { debounceActionWithInterval(R.id.menu_answer_post, 2000L) { ifLogin("社区文章编辑-[发布]") { + val bbsType = if (mViewModel.mSelectCommunityData?.type == "official_bbs") "综合论坛" else "游戏论坛" + SensorsBridge.trackEvent( + "ArticlePostClick", + "bbs_id", + mViewModel.mSelectCommunityData?.id ?: "", + "bbs_type", + bbsType, + "activity_tag", + mViewModel.selectActivityLabelEntity?.name ?: "" + ) + mRichEditor.hideLinkStyle() mRichEditor.postDelayed({ mViewModel.title = mBinding.articleEditTitle.text.toString() @@ -729,10 +759,11 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } @JvmStatic - fun getIntent(context: Context, community: CommunityEntity?, type: String = ""): Intent { + fun getIntent(context: Context, community: CommunityEntity?, type: String = "", entrance: String): Intent { val intent = Intent(context, ArticleEditActivity::class.java) intent.putExtra(BbsType::class.java.simpleName, type) intent.putExtra(CommunityEntity::class.java.simpleName, community) + intent.putExtra(EntranceConsts.KEY_ENTRANCE, entrance) return intent } 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 c96cfa3373..4122e5d985 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 @@ -12,6 +12,7 @@ import com.gh.gamecenter.common.base.fragment.WaitingDialogFragment import com.gh.gamecenter.common.entity.CommunityEntity import com.gh.gamecenter.common.eventbus.EBReuse import com.gh.gamecenter.common.retrofit.Response +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.tryWithDefaultCatch import com.gh.gamecenter.core.utils.HtmlUtils import com.gh.gamecenter.core.utils.ToastUtils @@ -177,6 +178,7 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a EnergyBridge.postEnergyTask("publish_community_article", JSONObject(data).optString("_id")) } } + SensorsBridge.trackEvent("ArticlePostResult", "post_result", "成功") } override fun onFailure(e: HttpException?) { @@ -189,6 +191,7 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a } error.postValue(errorString) // MtaHelper.onEvent("发表文章", "发布失败", CommunityManager.getInstance().community.name) + SensorsBridge.trackEvent("ArticlePostResult", "post_result", "失败") } }) } 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 c7794825b3..7808b99332 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 @@ -309,6 +309,19 @@ class QuestionEditActivity : BaseRichEditorActivity(), } } observeData() + + val bbsType = if (mViewModel.communityEntity?.type == "official_bbs") "综合论坛" else "游戏论坛" + SensorsBridge.trackEvent( + "ViewPostArticle", + "source_entrance", + mEntrance, + "article_type", + "提问帖", + "bbs_type", + bbsType, + "bbs_id", + mViewModel.communityEntity?.id ?: "" + ) } private fun getChooseSelectCallback(): (entity: ActivityLabelEntity?) -> Unit { @@ -530,6 +543,17 @@ class QuestionEditActivity : BaseRichEditorActivity(), override fun onMenuItemClick(menuItem: MenuItem?): Boolean { if (menuItem?.itemId == R.id.menu_question_post) { debounceActionWithInterval(R.id.menu_question_post, 2000L) { + val bbsType = if (mViewModel.communityEntity?.type == "official_bbs") "综合论坛" else "游戏论坛" + SensorsBridge.trackEvent( + "ArticlePostClick", + "bbs_id", + mViewModel.communityEntity?.id ?: "", + "bbs_type", + bbsType, + "activity_tag", + mViewModel.selectActivityLabelEntity?.name ?: "" + ) + mRichEditor.post { if (mRichEditor.hasPlaceholderImage()) { ToastUtils.showToast("图片上传中") @@ -673,14 +697,19 @@ class QuestionEditActivity : BaseRichEditorActivity(), //问题发布 if (mViewModel.questionEntity == null && mViewModel.questionDraftEntity == null) { if (!mBinding.questionseditTitle.text.isNullOrEmpty() || !mBinding.richEditor.html.isNullOrEmpty()) { + SensorsBridge.trackEvent("ArticleCancelDialogShow") DialogHelper.showDialog( this, "提示", "是否保存内容再退出?", cancelText = "不保存", confirmText = "保存并退出", - cancelClickCallback = { finish() }, + cancelClickCallback = { + SensorsBridge.trackEvent("ArticleCancelDialogClick", "button_name", "不保存") + finish() + }, confirmClickCallback = { + SensorsBridge.trackEvent("ArticleCancelDialogClick", "button_name", "保存并退出") mViewModel.title = mBinding.questionseditTitle.text.toString() mViewModel.content = getReplaceRealContent() mViewModel.saveQuestionDraft(SaveDraftType.EXIT) @@ -900,20 +929,23 @@ class QuestionEditActivity : BaseRichEditorActivity(), } // 新增问题 - fun getIntent(context: Context, type: BbsType = BbsType.GAME_BBS): Intent { + fun getIntent(context: Context, type: BbsType = BbsType.GAME_BBS, entrance: String): Intent { val intent = Intent(context, QuestionEditActivity::class.java) intent.putExtra(BbsType::class.java.simpleName, type.value) + intent.putExtra(EntranceConsts.KEY_ENTRANCE, entrance) return intent } fun getIntent( context: Context, communityEntity: CommunityEntity, - type: String = "" + type: String = "", + entrance: String ): Intent { val intent = Intent(context, QuestionEditActivity::class.java) intent.putExtra(CommunityEntity::class.java.simpleName, communityEntity) intent.putExtra(BbsType::class.java.simpleName, type) + intent.putExtra(EntranceConsts.KEY_ENTRANCE, entrance) return intent } 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 e014263f8c..a93e73bc51 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 @@ -202,6 +202,19 @@ class VideoPublishFragment : ToolbarFragment(), KeyboardHeightObserver { setSectionUI(true) mViewModel.selectSection = null } + + val bbsType = if (mViewModel.communityEntity?.type == "official_bbs") "综合论坛" else "游戏论坛" + SensorsBridge.trackEvent( + "ViewPostArticle", + "source_entrance", + mEntrance, + "article_type", + "视频贴", + "bbs_type", + bbsType, + "bbs_id", + mViewModel.communityEntity?.id ?: "" + ) } private fun showSelectGameDialog() { @@ -695,6 +708,18 @@ class VideoPublishFragment : ToolbarFragment(), KeyboardHeightObserver { R.id.menu_answer_post -> { debounceActionWithInterval(R.id.menu_answer_post, 3000L) { logButtonClick("click_video_post_button") + + val bbsType = if (mViewModel.communityEntity?.type == "official_bbs") "综合论坛" else "游戏论坛" + SensorsBridge.trackEvent( + "ArticlePostClick", + "bbs_id", + mViewModel.communityEntity?.id ?: "", + "bbs_type", + bbsType, + "activity_tag", + mViewModel.selectActivityLabelEntity?.name ?: "" + ) + verifyData(false) } } @@ -763,14 +788,21 @@ class VideoPublishFragment : ToolbarFragment(), KeyboardHeightObserver { if (mViewModel.videoPatch == null && mViewModel.videoDraft == null) { if (mBinding.title.text.isNotEmpty() || mBinding.videoDes.text.isNotEmpty()) { + SensorsBridge.trackEvent("ArticleCancelDialogShow") DialogHelper.showDialog( requireContext(), "提示", "是否保存内容再退出?", cancelText = "不保存", confirmText = "保存并退出", - cancelClickCallback = { requireActivity().finish() }, - confirmClickCallback = { verifyData(true) }, + cancelClickCallback = { + SensorsBridge.trackEvent("ArticleCancelDialogClick", "button_name", "不保存") + requireActivity().finish() + }, + confirmClickCallback = { + SensorsBridge.trackEvent("ArticleCancelDialogClick", "button_name", "保存并退出") + verifyData(true) + }, extraConfig = DialogHelper.Config( showCloseIcon = true, centerContent = true, diff --git a/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListActivity.kt b/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListActivity.kt index 748ade9855..376097c61d 100644 --- a/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListActivity.kt @@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.common.base.activity.BaseActivity_TabLayout +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.updateStatusBarColor class GameArchiveListActivity : BaseActivity_TabLayout() { @@ -31,6 +32,7 @@ class GameArchiveListActivity : BaseActivity_TabLayout() { override fun onPageSelected(position: Int) { super.onPageSelected(position) NewFlatLogUtils.logGameArchivePageShow(if (position == 0) "已安装游戏" else "推荐游戏") + SensorsBridge.trackEvent("CloudSaveGameTopicTabSelected", "tab_name", if (position == 0) "已安装游戏" else "推荐游戏") } override fun isAutoResetViewBackgroundEnabled() = true diff --git a/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListInstalledFragment.kt b/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListInstalledFragment.kt index e26a7554af..2a33af7ab9 100644 --- a/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListInstalledFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/savegame/GameArchiveListInstalledFragment.kt @@ -8,6 +8,7 @@ import com.gh.gamecenter.common.HaloApp import com.gh.gamecenter.common.baselist.LazyListFragment import com.gh.gamecenter.common.baselist.ListAdapter import com.gh.gamecenter.common.databinding.FragmentListBaseBinding +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.toColor import com.gh.gamecenter.common.utils.viewModelProvider import com.gh.gamecenter.feature.entity.GameEntity @@ -25,6 +26,7 @@ class GameArchiveListInstalledFragment : LazyListFragment() { @@ -131,6 +133,7 @@ open class SearchDefaultFragment : BaseFragment() { Pair(PageSwitchDataHelper.PAGE_BUSINESS_NAME, tag.name ?: " ") ) ) + SensorsBridge.trackEvent("SearchLabelClick", "label_name", tag.name ?: "", "label_id", tag.id ?: "") DirectUtils.directToLinkPage(requireContext(), tag, "(搜索-${tag.name})", "") // 不需要path }) initHeadView() @@ -192,6 +195,15 @@ open class SearchDefaultFragment : BaseFragment() { postExposureEvent(0) doOnPageSelected { postExposureEvent(it) + + val trackEvent = JSONObject() + try { + trackEvent.put("list_name", mRankList?.safelyGetInRelease(it)?.title) + trackEvent.put("position", it + 1) + } catch (e: JSONException) { + e.printStackTrace() + } + SensorsBridge.trackEvent("GameListPageSelected") } } diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt index 91799ff6db..cad287e399 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultRankAdapter.kt @@ -12,10 +12,12 @@ import com.gh.gamecenter.databinding.SearchDefaultRankItemBinding import com.gh.gamecenter.feature.entity.SettingsEntity import com.lightgame.adapter.BaseRecyclerAdapter import com.lightgame.utils.Util_System_Keyboard +import org.json.JSONException +import org.json.JSONObject class SearchDefaultRankAdapter( context: Context, - private val mRankList: SettingsEntity.Search.RankList, + private val mRankList: SettingsEntity.Search.RankList ) : BaseRecyclerAdapter(context) { override fun getItemCount() = minOf(mRankList.content.size, 10) @@ -63,6 +65,17 @@ class SearchDefaultRankAdapter( ) Util_System_Keyboard.hideSoftKeyboardByIBinder(mContext, it.windowToken) NewFlatLogUtils.logSearchClickRank(rank.name, (position + 1).toString()) + + val trackEvent = JSONObject() + try { + trackEvent.put("game_name", gameEntity?.name) + trackEvent.put("game_id", gameEntity?.id) + trackEvent.put("list_game", mRankList.title) + trackEvent.put("position", position + 1) + } catch (e: JSONException) { + e.printStackTrace() + } + SensorsBridge.trackEvent("SearchListlClick", trackEvent) } } } diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt index 54148e9453..35f5cc9ee5 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt @@ -7,6 +7,7 @@ import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.common.baselist.ListViewModel import com.gh.gamecenter.common.baselist.LoadParams import com.gh.gamecenter.common.baselist.LoadStatus +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.feature.entity.GameEntity import com.gh.gamecenter.entity.SearchSubjectEntity import com.gh.gamecenter.retrofit.RetrofitManager @@ -14,6 +15,8 @@ import com.halo.assistant.HaloApp import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import org.json.JSONException +import org.json.JSONObject import java.net.URLEncoder class SearchGameResultViewModel(application: Application) : ListViewModel(application) { @@ -42,6 +45,14 @@ class SearchGameResultViewModel(application: Application) : ListViewModel { + val subjectData: SubjectData = + intent.getBundleExtra(NORMAL_FRAGMENT_BUNDLE)?.getParcelable(EntranceConsts.KEY_SUBJECT_DATA) + ?: SubjectData("", "", false) + return Pair(subjectData.subjectId ?: "", "") + } override fun provideNormalIntent(): Intent { return getTargetIntent(this, SubjectActivity::class.java, SubjectFragment::class.java) diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index 3d435bc90d..d983143b6f 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -263,8 +263,8 @@ object VHelper { /** * 显示下载畅玩空间弹窗 */ - fun showVspaceDialog(context: Context) { - VSpaceDialogFragment.showDownloadDialog(context, getVSpaceDownloadEntity(false)) + fun showVspaceDialog(context: Context, gameEntity: GameEntity?) { + VSpaceDialogFragment.showDownloadDialog(context, getVSpaceDownloadEntity(false), gameEntity) } /** @@ -349,7 +349,7 @@ object VHelper { fun validateVSpaceBeforeAction(context: Context, gameEntity: GameEntity?, callback: () -> Unit) { // 仅下载类型为畅玩的类型才执行判断 if (gameEntity == null || gameEntity.isVGame()) { - if (showDialogIfVSpaceIsNeeded(context)) { + if (showDialogIfVSpaceIsNeeded(context, gameEntity?.id ?: "", gameEntity?.name ?: "")) { pendingDownloadCallback = callback return } @@ -375,6 +375,7 @@ object VHelper { VSpaceDialogFragment.showDownloadDialog( context, getVSpaceDownloadEntity(true), + gameEntity, autoDownload = true, isUpdate = true ) @@ -448,7 +449,7 @@ object VHelper { ) { Utils.log(LOG_TAG, "尝试安装新应用 ${downloadEntity.path}") - if (showDialogIfVSpaceIsNeeded(context)) return + if (showDialogIfVSpaceIsNeeded(context, downloadEntity.gameId, downloadEntity.name)) return // 服务未能连接时或手动安装时,有条件触发安装完成即启动,但主要还是得看开关 val shouldLaunchGameAfterInstallation = mShouldLaunchGameAfterInstallation && (!mIsServiceConnected || isManualInstall) @@ -755,7 +756,7 @@ object VHelper { * 如果已安装或配置为空返回 true * 未安装的情况下会弹弹窗 */ - fun showDialogIfVSpaceIsNeeded(context: Context): Boolean { + fun showDialogIfVSpaceIsNeeded(context: Context, gameId: String, gameName: String): Boolean { Utils.log(LOG_TAG, "检测是否已安装畅玩空间") val vaConfig = Config.getVSettingEntity()?.va @@ -768,7 +769,12 @@ object VHelper { // TODO 检测 32 位 if (!PackageUtils.isInstalledFromAllPackage(context, vaConfig.arch64?.packageName)) { - VSpaceDialogFragment.showDownloadDialog(context, getVSpaceDownloadEntity(false)) + VSpaceDialogFragment.showDownloadDialog( + context, + getVSpaceDownloadEntity(false), + gameId = gameId, + gameName = gameName + ) Utils.log(LOG_TAG, "显示下载畅玩空间弹窗") return true } diff --git a/app/src/main/java/com/gh/vspace/VSpaceDialogFragment.kt b/app/src/main/java/com/gh/vspace/VSpaceDialogFragment.kt index 25b88af21e..a247b6d815 100644 --- a/app/src/main/java/com/gh/vspace/VSpaceDialogFragment.kt +++ b/app/src/main/java/com/gh/vspace/VSpaceDialogFragment.kt @@ -21,8 +21,10 @@ import com.gh.gamecenter.feature.view.DownloadButton import com.gh.download.DownloadManager import com.gh.download.PackageObserver import com.gh.gamecenter.R +import com.gh.gamecenter.common.base.activity.BaseActivity import com.gh.gamecenter.common.base.fragment.BaseDraggableDialogFragment import com.gh.gamecenter.common.constant.Constants +import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.databinding.DialogVspaceBinding @@ -39,6 +41,8 @@ import com.lightgame.utils.AppManager class VSpaceDialogFragment : BaseDraggableDialogFragment() { private var mAppEntity: AppEntity? = null + private var mGameId: String = "" + private var mGameName: String = "" private val mDownloadUrl by lazy { mAppEntity?.url ?: "" } private val mBinding by lazy { DialogVspaceBinding.inflate(layoutInflater) } private val mDataWatcher = object : DataWatcher() { @@ -60,6 +64,8 @@ class VSpaceDialogFragment : BaseDraggableDialogFragment() { super.onCreate(savedInstanceState) mAppEntity = arguments?.get(KEY_ENTITY) as AppEntity + mGameId = arguments?.getString(EntranceConsts.KEY_GAME_ID) ?: "" + mGameName = arguments?.getString(EntranceConsts.KEY_GAME_NAME) ?: "" } @SuppressLint("ClickableViewAccessibility") @@ -94,8 +100,7 @@ class VSpaceDialogFragment : BaseDraggableDialogFragment() { mBinding.downloadBtn.setOnClickListener { NewFlatLogUtils.logHaloFunEvent("halo_fun_download_dialog_download_click") - - SensorsBridge.trackEvent("HaloFunDownloadDialogDownloadClick") + SensorsBridge.trackEvent("HaloFunDownloadDialogDownloadClick", "game_id", mGameId, "game_name", mGameName) val name = "畅玩助手V" + mAppEntity?.version val downloadId = PackageInstaller.createDownloadId(name) @@ -218,7 +223,9 @@ class VSpaceDialogFragment : BaseDraggableDialogFragment() { context: Context?, appEntity: AppEntity, autoDownload: Boolean = false, - isUpdate: Boolean = false + isUpdate: Boolean = false, + gameId: String = "", + gameName: String = "" ) { val fragmentActivity: FragmentActivity = if (context is FragmentActivity) { context @@ -235,13 +242,22 @@ class VSpaceDialogFragment : BaseDraggableDialogFragment() { if (hasDialogDisplayedInCurrentActivity(fragmentActivity)) return NewFlatLogUtils.logHaloFunEvent("halo_fun_download_dialog_show") - SensorsBridge.trackEvent( - "HaloFunDownloadDialogShow", - "page_name", context!!::class.java.simpleName) + + if (context is BaseActivity) { + SensorsBridge.trackEvent( + "HaloFunDownloadDialogShow", + "last_page_name", context::class.java.simpleName, + "last_page_id", context.getUniqueId(), + "last_page_business_id", context.getBusinessId().first, + ) + } + val downloadDialog = VSpaceDialogFragment().apply { arguments = Bundle().apply { putParcelable(KEY_ENTITY, appEntity) + putString(EntranceConsts.KEY_GAME_ID, gameId) + putString(EntranceConsts.KEY_GAME_NAME, gameName) putBoolean(KEY_AUTO_DOWNLOAD, autoDownload) putBoolean(KEY_IS_UPDATE, isUpdate) } @@ -252,6 +268,17 @@ class VSpaceDialogFragment : BaseDraggableDialogFragment() { ) } + @JvmStatic + fun showDownloadDialog( + context: Context?, + appEntity: AppEntity, + gameEntity: GameEntity?, + autoDownload: Boolean = false, + isUpdate: Boolean = false + ) { + showDownloadDialog(context, appEntity, autoDownload, isUpdate, gameEntity?.id ?: "", gameEntity?.name ?: "") + } + private fun hasDialogDisplayedInCurrentActivity(fragmentActivity: FragmentActivity): Boolean { val fragments: List = fragmentActivity.supportFragmentManager.fragments fragments.forEach { fragment -> 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 21b1d1cc24..6029cb9a25 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 @@ -94,6 +94,12 @@ class RealNameInfoFragment : ToolbarFragment() { } else { initDisplayOnlyView() } + + SensorsBridge.trackEvent( + "VerificationPageShow", + "source_entrance", + if (mGameId.isNotEmpty() || mIsForcedToCertificate) "游戏实名" else "主动进入" + ) } override fun onParentActivityFinish() { 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 c6d86d277f..db1817c7e7 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 @@ -18,6 +18,7 @@ import com.gh.gamecenter.login.entity.IdCardEntity import com.gh.gamecenter.login.entity.UserInfoEntity import com.gh.gamecenter.login.user.UserManager import com.gh.gamecenter.common.retrofit.BiResponse +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.login.retrofit.RetrofitManager import com.gh.gamecenter.login.user.UserRepository import com.halo.assistant.HaloApp @@ -71,10 +72,24 @@ class RealNameInfoViewModel(application: Application) : AndroidViewModel(applica ) { if (it == 400012) { NewLogUtils.logCertificationResult(isForced, 3) + SensorsBridge.trackEvent( + "VerificationComplete", + "source_entrance", + if (gameId.isNotEmpty() || isForced) "游戏实名" else "主动进入", + "result", + "认证中" + ) certificateResultLiveData.postValue(RESULT_PROGRESSING) return@handleErrorWithCustomizedHandler true } else { NewLogUtils.logCertificationResult(isForced, 0) + SensorsBridge.trackEvent( + "VerificationComplete", + "source_entrance", + if (gameId.isNotEmpty() || isForced) "游戏实名" else "主动进入", + "result", + "认证失败" + ) certificateResultLiveData.postValue(RESULT_UNQUALIFIED) return@handleErrorWithCustomizedHandler false } @@ -100,6 +115,13 @@ class RealNameInfoViewModel(application: Application) : AndroidViewModel(applica qualifyInt = 2 } NewLogUtils.logCertificationResult(isForced, qualifyInt) + SensorsBridge.trackEvent( + "VerificationComplete", + "source_entrance", + if (gameId.isNotEmpty() || isForced) "游戏实名" else "主动进入", + "result", + if (qualifyInt == 1) "未成年" else "成年" + ) } DataUtils.getDeviceCertification(HaloApp.getInstance().gid) diff --git a/module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityLifecycleObserver.kt b/module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityLifecycleObserver.kt index 85f1ee2262..2c75d04b12 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityLifecycleObserver.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityLifecycleObserver.kt @@ -3,6 +3,9 @@ package com.gh.gamecenter.common.base import android.app.Activity import android.app.Application import android.os.Bundle +import com.gh.gamecenter.common.base.activity.BaseActivity +import com.gh.gamecenter.common.entity.PageEntity +import com.gh.gamecenter.common.utils.getUniqueId import com.gh.gamecenter.core.utils.CurrentActivityHolder import com.lightgame.utils.AppManager @@ -10,10 +13,21 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { AppManager.getInstance().addActivity(activity) + + if (activity is BaseActivity) { + GlobalActivityManager.pageStack.push( + PageEntity( + pageId = activity.getUniqueId(), + pageName = activity::class.java.simpleName + ) + ) + } } override fun onActivityStarted(activity: Activity) { - + if (activity is BaseActivity && GlobalActivityManager.pageStack.peek().pageId == activity.getUniqueId()) { + GlobalActivityManager.pageStack.peek().pageBusinessId = activity.getBusinessId().first + } } override fun onActivityResumed(activity: Activity) { @@ -37,5 +51,21 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { override fun onActivityDestroyed(activity: Activity) { AppManager.getInstance().removeActivityFromStack(activity) + + if (activity is BaseActivity) { + if (GlobalActivityManager.pageStack.peek().pageId == activity.getUniqueId()) { + GlobalActivityManager.pageStack.pop() + } else { + var position = -1 + GlobalActivityManager.pageStack.forEachIndexed { index, pageEntity -> + if (pageEntity.pageId == activity.getUniqueId()) { + position = index + } + } + if (position != -1) { + GlobalActivityManager.pageStack.removeAt(position) + } + } + } } } \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityManager.kt b/module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityManager.kt new file mode 100644 index 0000000000..e000e87bab --- /dev/null +++ b/module_common/src/main/java/com/gh/gamecenter/common/base/GlobalActivityManager.kt @@ -0,0 +1,32 @@ +package com.gh.gamecenter.common.base + +import android.app.Activity +import com.gh.gamecenter.common.entity.PageEntity +import java.lang.ref.WeakReference +import java.util.* + +object GlobalActivityManager { + private var mCurrentActivityWeakRef: WeakReference? = null + + var currentActivity: Activity? + get() = mCurrentActivityWeakRef?.get() + set(activity) { + mCurrentActivityWeakRef = WeakReference(activity) + } + + val pageStack = Stack() + + @JvmStatic + fun getCurrentPageEntity(): PageEntity = if (pageStack.isNotEmpty()) { + pageStack.peek() + } else { + PageEntity() + } + + @JvmStatic + fun getLastPageEntity(): PageEntity = if (pageStack.size >= 2) { + pageStack[pageStack.size - 2] + } else { + PageEntity() + } +} \ No newline at end of file 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 5af507362d..4f1c804a2d 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 @@ -77,6 +77,7 @@ public class Constants { public static final String SIMULATOR = "simulator"; public static final String SMOOTH_GAME = "smooth_game"; // 畅玩类型的游戏 public static final String GAME_NAME = "game_name"; + public static final String GAME_TYPE = "game_type"; public static final String SIMULATOR_DOWNLOAD_START_TIME = "simulator_download_start_time"; public static final String LAST_GHZS_UPDATE_FILE_SIZE = "last_ghzs_update_file_size"; @@ -466,4 +467,6 @@ public class Constants { 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"; } diff --git a/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java b/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java index 15fdffa657..2b7713be0b 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/constant/EntranceConsts.java @@ -83,6 +83,8 @@ public class EntranceConsts { public static final String KEY_POSITION = "position"; public static final String KEY_SUB_POSITION = "sub_position"; public static final String KEY_ENTRANCE = "entrance"; + + public static final String KEY_SOURCE_ENTRANCE = "source_entrance"; public static final String KEY_ENTRANCE_LINK = "entrance_link"; public static final String KEY_TARGET = "target"; public static final String ENTRANCE_BROWSER = "(浏览器)"; diff --git a/module_common/src/main/java/com/gh/gamecenter/common/entity/PageEntity.kt b/module_common/src/main/java/com/gh/gamecenter/common/entity/PageEntity.kt new file mode 100644 index 0000000000..39154771b6 --- /dev/null +++ b/module_common/src/main/java/com/gh/gamecenter/common/entity/PageEntity.kt @@ -0,0 +1,7 @@ +package com.gh.gamecenter.common.entity + +data class PageEntity( + var pageId: String = "", + var pageName: String = "", + var pageBusinessId: String = "" +) \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/tracker/TrackerLogger.kt b/module_common/src/main/java/com/gh/gamecenter/common/tracker/TrackerLogger.kt index 71b13493b9..4a41e3c989 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/tracker/TrackerLogger.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/tracker/TrackerLogger.kt @@ -2,14 +2,17 @@ package com.gh.gamecenter.common.tracker import android.content.Context 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.meta.MetaUtil import com.gh.gamecenter.common.exposure.meta.MetaUtil.getBase64EncodedAndroidId import com.gh.gamecenter.common.exposure.meta.MetaUtil.getBase64EncodedIMEI import com.gh.gamecenter.common.loghub.LoghubUtils +import com.gh.gamecenter.common.utils.SensorsBridge import com.gh.gamecenter.common.utils.tryCatchInRelease import com.gh.gamecenter.core.provider.IAppProvider import com.gh.gamecenter.core.provider.IPackageUtilsProvider +import com.gh.gamecenter.core.utils.SPUtils import com.lightgame.utils.Utils import org.json.JSONException import org.json.JSONObject @@ -152,6 +155,20 @@ object TrackerLogger { jsonObject.put("meta", getMeta()) } uploadToLoghub(jsonObject, true) + + val trackEvent = JSONObject() + tryCatchInRelease { + trackEvent.run { + put("\$is_first_time", SPUtils.getBoolean(Constants.SP_SENSORS_IS_FIRST_TIME, true)) + put("is_side_loaded", sideLoadInfo?.get("is_side_loaded") ?: "") + put("installer_store", sideLoadInfo?.get("installer_store") ?: "") + put("package_name", context.packageName) + put("signature", signatureHash) + put("app_name", appProvider?.getAppName()) + } + } + SensorsBridge.trackEvent("AppLaunch", trackEvent) + SPUtils.setBoolean(Constants.SP_SENSORS_IS_FIRST_TIME, false) } @JvmStatic @@ -167,6 +184,8 @@ object TrackerLogger { jsonObject.put("meta", getMeta()) } uploadToLoghub(jsonObject, true) + + SensorsBridge.trackEvent("AppLaunchSuccessful") } private fun uploadToLoghub(jsonObject: JSONObject, uploadImmediately: Boolean) { 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 ec2023aa44..2e0efd018c 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 @@ -1488,4 +1488,8 @@ fun List.colorRGBToHSV(): FloatArray { Color.RGBToHSV(this[0], this[1], this[2], colorHSV) } return colorHSV +} + +fun Activity.getUniqueId(): String { + return System.identityHashCode(this).toString() } \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt index 972f02c1dc..1270041e95 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 @@ -4,6 +4,7 @@ import android.app.Application import com.alibaba.android.arouter.launcher.ARouter import com.gh.gamecenter.common.constant.RouteConsts import com.gh.gamecenter.core.provider.ISensorsProvider +import org.json.JSONObject /** * 调用神策相关 API 的桥梁 @@ -40,4 +41,13 @@ object SensorsBridge { mSensor?.trackEvent(eventName, *kv) } + @JvmStatic + fun trackEvent(eventName: String, jsonObject: JSONObject) { + mSensor?.trackEvent(eventName, jsonObject) + } + + @JvmStatic + fun profileSet(key: String, value: String) { + mSensor?.profileSet(key, value) + } } \ 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 8d6e38be11..1ca6294d22 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 @@ -179,6 +179,12 @@ public class ShareUtils { resourceId, shareType ); + SensorsBridge.trackEvent( + "GameCollectDetailShareClickSuccess", + "game_collect_title", shareEntity.getShareTitle(), + "game_collect_id", resourceId, + "share_type", shareType + ); } } diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IErrorHelperProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IErrorHelperProvider.kt index 5d5fb61c09..b2e43219b1 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IErrorHelperProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IErrorHelperProvider.kt @@ -8,6 +8,11 @@ interface IErrorHelperProvider : IProvider { fun handleError(context: Context, errorString: String?, showHighPriorityHint: Boolean = false) - fun handleLoginError(context: Context, httpException: HttpException?) + fun handleLoginError( + context: Context, + httpException: HttpException?, + loginTagChinese: String, + isCertificate: Boolean + ) } \ No newline at end of file diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/ISensorsProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/ISensorsProvider.kt index cc91d22701..48c3bdf8f7 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/ISensorsProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/ISensorsProvider.kt @@ -14,4 +14,8 @@ interface ISensorsProvider : IProvider { fun setGid(gid: String) fun trackEvent(eventName: String, vararg kv: String = arrayOf()) + + fun trackEvent(eventName: String, jsonObject: JSONObject) + + fun profileSet(key: String, value: String) } \ No newline at end of file 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 7dc8c7b810..f72452b9ea 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 @@ -522,6 +522,16 @@ data class GameEntity( val versionNumber: String? get() = if (shouldUseMirrorInfo()) mirrorData?.mVersionNumber else mVersionNumber + @IgnoredOnParcel + val downloadStatusChinese: String + get() = when (downloadStatus) { + "on" -> "开启" + "smooth" -> "畅玩" + "appointment" -> "预约" + "demo" -> "试玩" + else -> "" + } + //是否需要弹出试玩弹窗 fun isShowVersionNumber(): Boolean { return versionNumber == "无版号无内购有弹窗" diff --git a/module_login/src/main/java/com/gh/gamecenter/login/user/UserManager.java b/module_login/src/main/java/com/gh/gamecenter/login/user/UserManager.java index 2dc592a163..3ac93ca0cc 100644 --- a/module_login/src/main/java/com/gh/gamecenter/login/user/UserManager.java +++ b/module_login/src/main/java/com/gh/gamecenter/login/user/UserManager.java @@ -187,7 +187,7 @@ public class UserManager { if (code == 403401 || code == 403404) { UserRepository.getInstance().logout(); IErrorHelperProvider errorHelper = (IErrorHelperProvider) ARouter.getInstance().build(RouteConsts.provider.errorHelper).navigation(); - errorHelper.handleLoginError(HaloApp.getInstance().getApplicationContext(), e); + errorHelper.handleLoginError(HaloApp.getInstance().getApplicationContext(), e, "", false); } } catch (Exception e1) { e1.printStackTrace(); diff --git a/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java b/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java index ca80ddda26..9879a2fc0a 100644 --- a/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java +++ b/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java @@ -461,7 +461,7 @@ public class UserRepository { public void onFailure(@NonNull Exception exception) { mEditObsResponseUserInfo.postValue(null); IErrorHelperProvider errorHelper = (IErrorHelperProvider) ARouter.getInstance().build(RouteConsts.provider.errorHelper).navigation(); - errorHelper.handleLoginError(HaloApp.getInstance(), (HttpException) exception); + errorHelper.handleLoginError(HaloApp.getInstance(), (HttpException) exception, "", true); NewLogUtils.INSTANCE.logCertificationResult(isForcedToCertificate, 0); } }); @@ -548,14 +548,10 @@ public class UserRepository { mLoginObsResponseUserInfo.postValue(e); if (loginTag != null) { IErrorHelperProvider errorHelper = (IErrorHelperProvider) ARouter.getInstance().build(RouteConsts.provider.errorHelper).navigation(); - errorHelper.handleLoginError(mContext, e.getHttpException()); + errorHelper.handleLoginError(mContext, e.getHttpException(), loginTag.toChinese(), false); logout(); } - if (loginTag != null) { - SensorsBridge.trackEvent("LoginResult", "login_type", loginTag.toChinese(), "login_result", "成功"); - } - if (PackageFlavorHelper.IS_TEST_FLAVOR) { try { HttpException httpException = e.getHttpException(); diff --git a/module_login/src/main/java/com/gh/gamecenter/login/view/LoginFragment.java b/module_login/src/main/java/com/gh/gamecenter/login/view/LoginFragment.java index a09709dd30..c7b1fa89d5 100644 --- a/module_login/src/main/java/com/gh/gamecenter/login/view/LoginFragment.java +++ b/module_login/src/main/java/com/gh/gamecenter/login/view/LoginFragment.java @@ -27,6 +27,7 @@ import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; import com.alibaba.android.arouter.launcher.ARouter; +import com.gh.gamecenter.common.base.GlobalActivityManager; import com.gh.gamecenter.common.base.fragment.ToolbarFragment; import com.gh.gamecenter.common.base.fragment.WaitingDialogFragment; import com.gh.gamecenter.common.constant.Constants; @@ -158,7 +159,11 @@ public class LoginFragment initView(); - SensorsBridge.trackEvent("LoginPageShow"); + SensorsBridge.trackEvent("LoginPageShow", + "last_page_name", GlobalActivityManager.getLastPageEntity().getPageName(), + "last_page_id", GlobalActivityManager.getLastPageEntity().getPageId(), + "last_page_business_id", GlobalActivityManager.getLastPageEntity().getPageBusinessId() + ); } private void initView() { 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 5b2da6560b..0f93941df0 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 @@ -7,6 +7,7 @@ import android.text.TextUtils; import android.widget.TextView; import com.alibaba.android.arouter.launcher.ARouter; +import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.login.utils.LoginHelper; import com.gh.gamecenter.common.constant.RouteConsts; import com.gh.gamecenter.common.eventbus.EBShare; @@ -99,6 +100,12 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler, WeC ShareUtils.resourceId, shareType ); + SensorsBridge.trackEvent( + "GameCollectDetailShareClickSuccess", + "game_collect_title", ShareUtils.shareEntity.getShareTitle(), + "game_collect_id", ShareUtils.resourceId, + "share_type", shareType + ); } } else { if (baseResp instanceof SendAuth.Resp) { diff --git a/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/SensorsHelper.kt b/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/SensorsHelper.kt index 98ded15a7e..3da986cbfa 100644 --- a/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/SensorsHelper.kt +++ b/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/SensorsHelper.kt @@ -4,11 +4,13 @@ import android.content.Context import android.text.TextUtils import com.gh.gamecenter.common.exposure.meta.MetaUtil import com.gh.gamecenter.common.json.json +import com.gh.gamecenter.common.tracker.Tracker import com.gh.gamecenter.common.utils.EnvHelper import com.gh.gamecenter.common.utils.PackageFlavorHelper import com.lightgame.utils.Utils import com.sensorsdata.analytics.android.sdk.SAConfigOptions import com.sensorsdata.analytics.android.sdk.SensorsDataAPI +import com.sensorsdata.analytics.android.sdk.SensorsDataDynamicSuperProperties import org.json.JSONException import org.json.JSONObject @@ -31,13 +33,47 @@ object SensorsHelper { }) // 设置静态公共属性 - SensorsDataAPI.sharedInstance().registerSuperProperties(JSONObject().apply { - put("channel", channel) - put("jnfj", MetaUtil.getBase64EncodedIMEI()) - put("mac", MetaUtil.getMeta().mac) + try { + SensorsDataAPI.sharedInstance().registerSuperProperties(JSONObject().apply { + put("channel", channel) + put("dia", MetaUtil.getMeta().dia) + put("launch_id", Tracker.launchId) + }) + } catch (e: Exception) { + e.printStackTrace() + } + + // 设置动态公共属性 + SensorsDataAPI.sharedInstance().registerDynamicSuperProperties(SensorsDataDynamicSuperProperties { + try { + return@SensorsDataDynamicSuperProperties JSONObject().apply { + put("session_id", Tracker.sessionId) + } + } catch (e: Exception) { + e.printStackTrace() + } + null }) } + // 设置用户属性 + @JvmStatic + fun profileSet(key: String, value: String) { + Utils.log(TAG, "profileSet k:$key v:$value") + SensorsDataAPI.sharedInstance().profileSet(key, value) + } + + // 获取预置属性 + @JvmStatic + fun getPresetProperties(key: String): Any? { + try { + return SensorsDataAPI.sharedInstance().presetProperties[key] + } catch (e: Exception) { + e.printStackTrace() + } + return null + } + @JvmStatic fun login(loginId: String) { Utils.log(TAG, "login $loginId") @@ -81,7 +117,8 @@ object SensorsHelper { trackEvent(eventName, json) } - private fun trackEvent(eventName: String, jsonObject: JSONObject) { + @JvmStatic + fun trackEvent(eventName: String, jsonObject: JSONObject) { try { SensorsDataAPI.sharedInstance().track(eventName, jsonObject) } catch (e: JSONException) { diff --git a/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/provider/SensorsProviderImpl.kt b/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/provider/SensorsProviderImpl.kt index 518dc7b937..4606ecd2c5 100644 --- a/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/provider/SensorsProviderImpl.kt +++ b/module_sensors_data/src/main/java/com/gh/gamecenter/sensorsdata/provider/SensorsProviderImpl.kt @@ -33,4 +33,12 @@ class SensorsProviderImpl : ISensorsProvider { override fun trackEvent(eventName: String, vararg kv: String) { SensorsHelper.trackEvent(eventName, *kv) } + + override fun trackEvent(eventName: String, jsonObject: JSONObject) { + SensorsHelper.trackEvent(eventName, jsonObject) + } + + override fun profileSet(key: String, value: String) { + SensorsHelper.profileSet(key, value) + } } \ No newline at end of file diff --git a/module_setting/src/main/java/com/gh/gamecenter/setting/view/SettingsFragment.kt b/module_setting/src/main/java/com/gh/gamecenter/setting/view/SettingsFragment.kt index 768153cea4..6689f80e46 100644 --- a/module_setting/src/main/java/com/gh/gamecenter/setting/view/SettingsFragment.kt +++ b/module_setting/src/main/java/com/gh/gamecenter/setting/view/SettingsFragment.kt @@ -311,6 +311,7 @@ class SettingsFragment : ToolbarFragment() { val webActivity = ARouter.getInstance().build(RouteConsts.provider.webActivity).navigation() as? IWebProvider requireContext().startActivity(webActivity?.getBindWechatIntent(requireContext())) + SensorsBridge.trackEvent("AppointmenWechatRemindConfigPageShow", "source_entrance", "设置-微信提醒") } else { ifLogin("我的光环_设置") {} } diff --git a/module_setting_compose/src/main/java/com/gh/gamecenter/setting/compose/activity/ComposeSettingActivity.kt b/module_setting_compose/src/main/java/com/gh/gamecenter/setting/compose/activity/ComposeSettingActivity.kt index 671485dc6f..589f6084ed 100644 --- a/module_setting_compose/src/main/java/com/gh/gamecenter/setting/compose/activity/ComposeSettingActivity.kt +++ b/module_setting_compose/src/main/java/com/gh/gamecenter/setting/compose/activity/ComposeSettingActivity.kt @@ -225,6 +225,7 @@ class ComposeSettingActivity : ComposeBaseActivity() { val webActivity = ARouter.getInstance().build(RouteConsts.provider.webActivity).navigation() as? IWebProvider startActivity(webActivity?.getBindWechatIntent(this@ComposeSettingActivity)) + SensorsBridge.trackEvent("AppointmenWechatRemindConfigPageShow", "source_entrance", "设置-微信提醒") } else { ifLogin("我的光环_设置") {} }