From 3af4dd54946f855ee8fb4d0fad5be3b91d98d5d7 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 24 Feb 2021 11:49:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=A1=B5=E9=9D=A2/=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=8F=AF=E8=A7=81=E4=B8=8A=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1115?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/base/BaseActivity.java | 10 +- .../tracker/ActivityLifecycleWatcher.kt | 24 +++ .../gh/common/tracker/AppLifecycleWatcher.kt | 72 +++++++ .../java/com/gh/common/tracker/IBusiness.kt | 8 + .../main/java/com/gh/common/tracker/ITrack.kt | 14 ++ .../java/com/gh/common/tracker/Tracker.kt | 70 +++++++ .../com/gh/common/tracker/TrackerLogger.kt | 178 ++++++++++++++++++ .../java/com/gh/gamecenter/BlockActivity.kt | 5 +- .../com/gh/gamecenter/GameDetailActivity.java | 16 ++ .../com/gh/gamecenter/NormalActivity.java | 4 + .../gh/gamecenter/SplashScreenActivity.java | 6 + .../forum/detail/ForumDetailActivity.kt | 5 +- .../fragment/MainWrapperFragment.java | 24 ++- .../personalhome/UserHomeActivity.kt | 4 + .../article/detail/ArticleDetailActivity.kt | 6 + .../gh/gamecenter/subject/SubjectActivity.kt | 7 +- .../main/java/com/halo/assistant/HaloApp.java | 5 +- 17 files changed, 446 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/gh/common/tracker/ActivityLifecycleWatcher.kt create mode 100644 app/src/main/java/com/gh/common/tracker/AppLifecycleWatcher.kt create mode 100644 app/src/main/java/com/gh/common/tracker/IBusiness.kt create mode 100644 app/src/main/java/com/gh/common/tracker/ITrack.kt create mode 100644 app/src/main/java/com/gh/common/tracker/Tracker.kt create mode 100644 app/src/main/java/com/gh/common/tracker/TrackerLogger.kt diff --git a/app/src/main/java/com/gh/base/BaseActivity.java b/app/src/main/java/com/gh/base/BaseActivity.java index 624f1aec99..d2d2ff513b 100644 --- a/app/src/main/java/com/gh/base/BaseActivity.java +++ b/app/src/main/java/com/gh/base/BaseActivity.java @@ -27,6 +27,7 @@ import androidx.lifecycle.Lifecycle; import com.gh.base.fragment.BaseFragment; import com.gh.common.constant.Constants; +import com.gh.common.tracker.IBusiness; import com.gh.common.util.DialogUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; @@ -43,7 +44,6 @@ import com.gh.gamecenter.LoginActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.SplashScreenActivity; import com.gh.gamecenter.eventbus.EBShowDialog; -import com.halo.assistant.HaloApp; import com.lightgame.BaseAppCompatActivity; import com.lightgame.download.DownloadEntity; import com.lightgame.download.FileUtils; @@ -59,6 +59,7 @@ import java.lang.ref.WeakReference; import java.util.List; import butterknife.ButterKnife; +import kotlin.Pair; import pub.devrel.easypermissions.EasyPermissions; import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE; @@ -69,7 +70,7 @@ import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE; * 需要工具栏的页面请继承{@link ToolBarActivity} */ -public abstract class BaseActivity extends BaseAppCompatActivity implements EasyPermissions.PermissionCallbacks { +public abstract class BaseActivity extends BaseAppCompatActivity implements EasyPermissions.PermissionCallbacks, IBusiness { // global dialog key public final static String DOWNLOAD_HIJACK = "hijack"; @@ -392,4 +393,9 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy } return dataSize; } + + @Override + public Pair getBusinessId() { + return null; + } } diff --git a/app/src/main/java/com/gh/common/tracker/ActivityLifecycleWatcher.kt b/app/src/main/java/com/gh/common/tracker/ActivityLifecycleWatcher.kt new file mode 100644 index 0000000000..2fbab7fba4 --- /dev/null +++ b/app/src/main/java/com/gh/common/tracker/ActivityLifecycleWatcher.kt @@ -0,0 +1,24 @@ +package com.gh.common.tracker + +import android.app.Activity +import android.app.Application +import android.os.Bundle + +// TODO SplashActivity 没有回调 onStart 和 onStop +class ActivityLifecycleWatcher(private val mTrack: ITrack) : Application.ActivityLifecycleCallbacks { + + override fun onActivityStarted(activity: Activity) { + mTrack.onActivityStarted(activity) + } + + override fun onActivityStopped(activity: Activity) { + mTrack.onActivityStopped(activity) + } + + override fun onActivityDestroyed(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityPaused(activity: Activity) {} + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + override fun onActivityResumed(activity: Activity) {} + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/tracker/AppLifecycleWatcher.kt b/app/src/main/java/com/gh/common/tracker/AppLifecycleWatcher.kt new file mode 100644 index 0000000000..5e927591e2 --- /dev/null +++ b/app/src/main/java/com/gh/common/tracker/AppLifecycleWatcher.kt @@ -0,0 +1,72 @@ +package com.gh.common.tracker + +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import java.util.* +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicLong +import kotlin.concurrent.fixedRateTimer + +/** + * 应用声明周期观察者 + */ +class AppLifecycleWatcher(private val mTrack: ITrack) : DefaultLifecycleObserver { + + private var mWatchVisibleCount = 0 // 检查是否满足上传可见的次数 + + private val mLastVisibleTime by lazy { AtomicLong(0L) } // 最后可见时间 + private val mIsVisible by lazy { AtomicBoolean(false) } // 当前是否可见 + private val mWatchInterval by lazy { AtomicLong(MIN_WATCH_VISIBLE_INTERVAL) } // 与上次上报可见的间隔时间 + + init { + fixedRateTimer(FIXED_RATE_TIMER_NAME, initialDelay = MIN_WATCH_VISIBLE_INTERVAL, period = MIN_WATCH_VISIBLE_INTERVAL) { + if (mIsVisible.get()) { + // 单位间隔发送 + val meetLogVisibleInterval = (mWatchVisibleCount++) * MIN_WATCH_VISIBLE_INTERVAL == mWatchInterval.get() + + val equalToMinVisibleInterval = mWatchInterval.get() == MIN_WATCH_VISIBLE_INTERVAL + val equalToMaxVisibleInterval = mWatchInterval.get() == MAX_WATCH_VISIBLE_INTERVAL + + if (meetLogVisibleInterval || equalToMinVisibleInterval) { + // 上报完重置计数 + mWatchVisibleCount = 0 + mTrack.onAppVisible(mWatchInterval.get() / 1000) + if (!equalToMaxVisibleInterval) { + mWatchInterval.set(mWatchInterval.get() * 2) // 间隔递增两倍 + } + } + } + } + } + + override fun onStart(owner: LifecycleOwner) { + super.onStart(owner) + + if (mLastVisibleTime.get() == 0L + || (mLastVisibleTime.get() + SESSION_ALIVE_INTERVAL) < System.currentTimeMillis() / 1000) { + mTrack.onSessionChanged(UUID.randomUUID().toString()) + } + mIsVisible.set(true) + + mTrack.onAppStarted() + } + + override fun onStop(owner: LifecycleOwner) { + super.onStop(owner) + + mIsVisible.set(false) + mLastVisibleTime.set(System.currentTimeMillis() / 1000) + mWatchInterval.set(MIN_WATCH_VISIBLE_INTERVAL) + + mTrack.onAppStopped() + } + + companion object { + private const val FIXED_RATE_TIMER_NAME = "APP_TRACKER_TIMER" + + private const val SESSION_ALIVE_INTERVAL = 30L // 30s + private const val MIN_WATCH_VISIBLE_INTERVAL = 5000L // 5s + private const val MAX_WATCH_VISIBLE_INTERVAL = 320000L // 320s + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/tracker/IBusiness.kt b/app/src/main/java/com/gh/common/tracker/IBusiness.kt new file mode 100644 index 0000000000..90606d224f --- /dev/null +++ b/app/src/main/java/com/gh/common/tracker/IBusiness.kt @@ -0,0 +1,8 @@ +package com.gh.common.tracker + +import androidx.annotation.Nullable + +interface IBusiness { + @Nullable + fun getBusinessId(): Pair +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/tracker/ITrack.kt b/app/src/main/java/com/gh/common/tracker/ITrack.kt new file mode 100644 index 0000000000..6336bed2ca --- /dev/null +++ b/app/src/main/java/com/gh/common/tracker/ITrack.kt @@ -0,0 +1,14 @@ +package com.gh.common.tracker + +import android.app.Activity + +interface ITrack { + fun onActivityStarted(activity: Activity) + fun onActivityStopped(activity: Activity) + + fun onAppStarted() + fun onAppVisible(interval: Long) + fun onAppStopped() + + fun onSessionChanged(sessionId: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/tracker/Tracker.kt b/app/src/main/java/com/gh/common/tracker/Tracker.kt new file mode 100644 index 0000000000..4e1990bfcd --- /dev/null +++ b/app/src/main/java/com/gh/common/tracker/Tracker.kt @@ -0,0 +1,70 @@ +package com.gh.common.tracker + +import android.app.Activity +import android.app.Application +import androidx.lifecycle.ProcessLifecycleOwner +import java.util.* + +object Tracker : ITrack { + + private var mSessionId: String = "" + private val mLaunchId by lazy { UUID.randomUUID().toString() } + + val sessionId: String + get() = mSessionId + + val launchId: String + get() = mLaunchId + + private var mIsInitialized = false + + @JvmStatic + fun init(application: Application) { + if (mIsInitialized) { + return + } + + ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleWatcher(this)) + application.registerActivityLifecycleCallbacks(ActivityLifecycleWatcher(this)) + mIsInitialized = true + } + + override fun onActivityStarted(activity: Activity) { + val businessId = if (activity is IBusiness) activity.getBusinessId() else null + + TrackerLogger.logActivityStart( + mLaunchId, + mSessionId, + System.identityHashCode(activity).toString(), + activity::class.java.simpleName, + businessId) + } + + override fun onActivityStopped(activity: Activity) { + val businessId = if (activity is IBusiness) activity.getBusinessId() else null + + TrackerLogger.logActivityStop( + mLaunchId, + mSessionId, + System.identityHashCode(activity).toString(), + activity::class.java.simpleName, + businessId) + } + + override fun onAppStarted() { + TrackerLogger.logAppStart(mLaunchId, mSessionId) + } + + override fun onAppVisible(interval: Long) { + TrackerLogger.logAppVisible(mLaunchId, mSessionId, interval) + } + + override fun onAppStopped() { + TrackerLogger.logAppStop(mLaunchId, mSessionId) + } + + override fun onSessionChanged(sessionId: String) { + mSessionId = sessionId + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/tracker/TrackerLogger.kt b/app/src/main/java/com/gh/common/tracker/TrackerLogger.kt new file mode 100644 index 0000000000..acc344d122 --- /dev/null +++ b/app/src/main/java/com/gh/common/tracker/TrackerLogger.kt @@ -0,0 +1,178 @@ +package com.gh.common.tracker + +import com.gh.common.exposure.meta.MetaUtil +import com.gh.common.exposure.meta.MetaUtil.getBase64EncodedAndroidId +import com.gh.common.exposure.meta.MetaUtil.getBase64EncodedIMEI +import com.gh.common.loghub.LoghubUtils +import com.gh.common.util.tryCatchInRelease +import com.lightgame.utils.Utils +import org.json.JSONException +import org.json.JSONObject + +object TrackerLogger { + + private const val LOG_STORE = "event" + + fun logAppStart(launchId: String, sessionId: String) { + logAppVisible(launchId, sessionId, 0) + } + + fun logAppVisible(launchId: String, sessionId: String, interval: Long) { + val jsonObject = JSONObject() + val payloadObject = JSONObject() + tryCatchInRelease { + payloadObject.put("launch_id", launchId) + payloadObject.put("session_id", sessionId) + payloadObject.put("interval", interval) + + jsonObject.put("event", "app_visible") + jsonObject.put("payload", payloadObject) + jsonObject.put("meta", getMeta()) + } + uploadToLoghub(jsonObject, true) + } + + fun logAppStop(launchId: String, sessionId: String) { + val jsonObject = JSONObject() + val payloadObject = JSONObject() + tryCatchInRelease { + payloadObject.put("launch_id", launchId) + payloadObject.put("session_id", sessionId) + + jsonObject.put("event", "app_invisible") + jsonObject.put("payload", payloadObject) + jsonObject.put("meta", getMeta()) + } + uploadToLoghub(jsonObject, true) + } + + fun logActivityStart(launchId: String, + sessionId: String, + activityId: String, + activityName: String, + activityBusinessId: Pair? = null) { + val jsonObject = JSONObject() + val payloadObject = JSONObject() + tryCatchInRelease { + payloadObject.put("launch_id", launchId) + payloadObject.put("session_id", sessionId) + payloadObject.put("activity_id", activityId) + payloadObject.put("activity_name", activityName) + if (activityBusinessId != null) { + payloadObject.put("activity_primary_business_id", activityBusinessId.first) + if (activityBusinessId.second.isNotEmpty()) { + payloadObject.put("activity_secondary_business_id", activityBusinessId.second) + } + } + + jsonObject.put("event", "activity_visible") + jsonObject.put("payload", payloadObject) + jsonObject.put("meta", getMeta()) + } + uploadToLoghub(jsonObject, false) + } + + fun logActivityStop(launchId: String, + sessionId: String, + activityId: String, + activityName: String, + activityBusinessId: Pair? = null) { + val jsonObject = JSONObject() + val payloadObject = JSONObject() + tryCatchInRelease { + payloadObject.put("launch_id", launchId) + payloadObject.put("session_id", sessionId) + payloadObject.put("activity_id", activityId) + payloadObject.put("activity_name", activityName) + if (activityBusinessId != null) { + payloadObject.put("activity_primary_business_id", activityBusinessId.first) + if (activityBusinessId.second.isNotEmpty()) { + payloadObject.put("activity_secondary_business_id", activityBusinessId.second) + } + } + + jsonObject.put("event", "activity_invisible") + jsonObject.put("payload", payloadObject) + jsonObject.put("meta", getMeta()) + } + uploadToLoghub(jsonObject, false) + } + + @JvmStatic + fun logHomeTabSelected(launchId: String, + sessionId: String, + tabPosition: Int, + tabContent: String) { + val jsonObject = JSONObject() + val payloadObject = JSONObject() + tryCatchInRelease { + payloadObject.put("launch_id", launchId) + payloadObject.put("session_id", sessionId) + payloadObject.put("tab_position", tabPosition) + payloadObject.put("tab_content", tabContent) + + jsonObject.put("event", "home_tab_select") + jsonObject.put("payload", payloadObject) + jsonObject.put("meta", getMeta()) + } + uploadToLoghub(jsonObject, false) + } + + @JvmStatic + fun logAppLaunch(launchId: String, sessionId: String) { + val jsonObject = JSONObject() + val payloadObject = JSONObject() + tryCatchInRelease { + payloadObject.put("launch_id", launchId) + payloadObject.put("session_id", sessionId) + + jsonObject.put("event", "app_launch") + jsonObject.put("payload", payloadObject) + jsonObject.put("meta", getMeta()) + } + uploadToLoghub(jsonObject, true) + } + + @JvmStatic + fun logAppLaunchSuccessful(launchId: String, sessionId: String) { + val jsonObject = JSONObject() + val payloadObject = JSONObject() + tryCatchInRelease { + payloadObject.put("launch_id", launchId) + payloadObject.put("session_id", sessionId) + + jsonObject.put("event", "app_launch_successful") + jsonObject.put("payload", payloadObject) + jsonObject.put("meta", getMeta()) + } + uploadToLoghub(jsonObject, true) + } + + private fun uploadToLoghub(jsonObject: JSONObject, uploadImmediately: Boolean) { + jsonObject.put("timestamp", System.currentTimeMillis() / 1000) + + Utils.log("Tracker -> $jsonObject") + LoghubUtils.log(jsonObject, LOG_STORE, uploadImmediately) + } + + private fun getMeta(): JSONObject { + val (_, _, model, manufacturer, _, _, android_version, network, _, gid, _, channel, appVersion, userId) = MetaUtil.getMeta() + val metaObject = JSONObject() + try { + metaObject.put("dia", getBase64EncodedAndroidId()) + metaObject.put("android_version", android_version) + metaObject.put("app_version", appVersion) + metaObject.put("channel", channel) + metaObject.put("gid", gid) + metaObject.put("jnfj", getBase64EncodedIMEI()) + metaObject.put("manufacturer", manufacturer) + metaObject.put("model", model) + metaObject.put("network", network) + metaObject.put("user_id", userId) + } catch (e: JSONException) { + e.printStackTrace() + } + return metaObject + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/BlockActivity.kt b/app/src/main/java/com/gh/gamecenter/BlockActivity.kt index 590d2a5077..9126220cea 100644 --- a/app/src/main/java/com/gh/gamecenter/BlockActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/BlockActivity.kt @@ -4,7 +4,6 @@ import android.content.Context import android.content.Intent import android.os.Bundle import com.gh.common.util.EntranceUtils -import com.gh.download.DownloadManager import com.gh.gamecenter.entity.SubjectRecommendEntity import com.gh.gamecenter.game.GameFragment @@ -36,4 +35,8 @@ class BlockActivity : NormalActivity() { return "板块" } + override fun getBusinessId(): Pair { + return Pair(targetFragment?.arguments?.getParcelable(EntranceUtils.KEY_BLOCK_DATA)?.link ?: "", "") + } + } diff --git a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java index baf9f24912..ea46ce077a 100644 --- a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java @@ -16,6 +16,8 @@ import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.gamedetail.GameDetailFragment; import com.halo.assistant.HaloApp; +import kotlin.Pair; + import static com.gh.common.constant.Constants.GAME_DETAIL_COME_IN; /** @@ -48,6 +50,7 @@ public class GameDetailActivity extends NormalActivity { public static void startGameDetailActivity(Context context, GameEntity gameEntity, String entrance) { DataUtils.onMtaEvent(context, "详情页面", "游戏详情", gameEntity != null ? gameEntity.getName() : ""); Bundle bundle = new Bundle(); + bundle.putString(EntranceUtils.KEY_GAMEID, gameEntity.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance); bundle.putParcelable(GameEntity.TAG, gameEntity); context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle)); @@ -117,6 +120,7 @@ public class GameDetailActivity extends NormalActivity { bundle.putInt(EntranceUtils.KEY_TARGET, defaultTab); } + bundle.putString(EntranceUtils.KEY_GAMEID, gameEntity.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance); bundle.putParcelable(GameEntity.TAG, gameEntity); context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle)); @@ -187,6 +191,7 @@ public class GameDetailActivity extends NormalActivity { public static void startGameDetailCommentActivity(Context context, GameEntity game, String entrance) { Bundle bundle = new Bundle(); bundle.putParcelable(GameEntity.TAG, game); + bundle.putString(EntranceUtils.KEY_GAMEID, game.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance); bundle.putBoolean(EntranceUtils.KEY_SKIP_GAME_COMMENT, true); context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle)); @@ -198,6 +203,7 @@ public class GameDetailActivity extends NormalActivity { public static void startGameDetailByShortcut(Context context, GameEntity game, int tab, String entrance) { Bundle bundle = new Bundle(); bundle.putParcelable(GameEntity.TAG, game); + bundle.putString(EntranceUtils.KEY_GAMEID, game.getId()); bundle.putString(EntranceUtils.KEY_ENTRANCE, entrance); bundle.putInt(EntranceUtils.KEY_TARGET, tab); context.startActivity(getTargetIntent(context, GameDetailActivity.class, GameDetailFragment.class, bundle)); @@ -255,6 +261,16 @@ public class GameDetailActivity extends NormalActivity { return "游戏详情"; } + @Override + public Pair getBusinessId() { + GameDetailFragment fragment = (GameDetailFragment) getTargetFragment(); + if (fragment.getArguments() != null) { + return new Pair<>(fragment.getArguments().getString(EntranceUtils.KEY_GAMEID), ""); + } else { + return null; + } + } + @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(new ContextWrapper(newBase) { diff --git a/app/src/main/java/com/gh/gamecenter/NormalActivity.java b/app/src/main/java/com/gh/gamecenter/NormalActivity.java index 0975886c6b..490774afbc 100644 --- a/app/src/main/java/com/gh/gamecenter/NormalActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NormalActivity.java @@ -126,6 +126,10 @@ public abstract class NormalActivity extends ToolBarActivity { return super.dispatchTouchEvent(ev); } + public Fragment getTargetFragment() { + return mTargetFragment; + } + public int getFragmentPlaceholderId() { return R.id.normal_content; } diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index 2386f8aa98..e033196bb8 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -27,6 +27,8 @@ import com.gh.common.AppExecutor; import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.dialog.PrivacyDialogFragment; +import com.gh.common.tracker.Tracker; +import com.gh.common.tracker.TrackerLogger; import com.gh.common.util.AdHelper; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceTokenUtils; @@ -104,6 +106,8 @@ public class SplashScreenActivity extends BaseActivity { super.onCreate(savedInstanceState); + TrackerLogger.logAppLaunch(Tracker.INSTANCE.getLaunchId(), Tracker.INSTANCE.getSessionId()); + // 处理助手已经在后台运行导致的再次启动助手 if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { finish(); @@ -287,6 +291,8 @@ public class SplashScreenActivity extends BaseActivity { private void launchMainActivity() { HaloApp.getInstance().postInit(true); + TrackerLogger.logAppLaunchSuccessful(Tracker.INSTANCE.getLaunchId(), Tracker.INSTANCE.getSessionId()); + getAd(); prefetchData(); diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt index 5c168aa7b6..5d2d551c9e 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt @@ -4,7 +4,6 @@ import android.content.Context import android.content.Intent import android.os.Bundle import com.gh.base.BaseActivity -import com.gh.base.ToolBarActivity import com.gh.common.util.DisplayUtils import com.gh.common.util.EntranceUtils import com.gh.gamecenter.R @@ -25,6 +24,10 @@ class ForumDetailActivity : BaseActivity() { supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, ForumDetailFragment::class.java.simpleName).commitAllowingStateLoss() } + override fun getBusinessId(): Pair { + return Pair(intent.getStringExtra(EntranceUtils.KEY_BBS_ID) ?: "", "") + } + companion object { @JvmStatic fun getIntent(context: Context, bbsId: String, entrance: String): Intent { 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 bb75e3bc67..8c6f1a51ba 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -29,6 +29,8 @@ import com.gh.base.OnDoubleTapListener; import com.gh.base.fragment.BaseFragment_ViewPager_Checkable; import com.gh.common.constant.Config; import com.gh.common.syncpage.SyncPageRepository; +import com.gh.common.tracker.Tracker; +import com.gh.common.tracker.TrackerLogger; import com.gh.common.util.BiCallback; import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; @@ -259,6 +261,9 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem ((NoScrollableViewPager) mViewPager).setScrollable(false); } + // 启动时即当选中第一个 tab + onPageChanged(INDEX_HOME); + for (int i = 0; i < mCheckableGroup.getChildCount(); i++) { View child = mCheckableGroup.getChildAt(i); int finalI = i; @@ -452,26 +457,35 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem protected void onPageChanged(int index) { super.onPageChanged(index); + String tabText = ""; + switch (index) { case INDEX_HOME: - DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "首页"); + tabText = "首页"; break; case INDEX_GAME: - DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "游戏库"); + tabText = "游戏库"; break; case INDEX_ASK: - DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "论坛"); + tabText = "论坛"; LogUtils.uploadAccessBbsTab(); break; case INDEX_VIDEO: + tabText = "视频"; DisplayUtils.setLightStatusBar(requireActivity(), false); - DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "视频"); break; case INDEX_PERSONAL: - DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", "我的光环"); + tabText = "我的光环"; break; } + DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", tabText); + TrackerLogger.logHomeTabSelected( + Tracker.INSTANCE.getLaunchId(), + Tracker.INSTANCE.getSessionId(), + index, + tabText); + SubjectRecommendEntity navBarEntity = mViewModel.getNavBar().getValue(); if (navBarEntity != null) { if (index == INDEX_GAME) { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeActivity.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeActivity.kt index 7759c83f88..fea13b9fe4 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeActivity.kt @@ -31,4 +31,8 @@ class UserHomeActivity : NormalActivity() { return getTargetIntent(context, UserHomeActivity::class.java, UserHomeFragment::class.java, bundle) } } + + override fun getBusinessId(): Pair { + return Pair(targetFragment.arguments?.getString(EntranceUtils.KEY_USER_ID) ?: "", "") + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt index 46794da09e..1108429cb6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt @@ -28,6 +28,12 @@ class ArticleDetailActivity : NormalActivity() { return getTargetIntent(this, ArticleDetailActivity::class.java, ArticleDetailFragment::class.java) } + override fun getBusinessId(): Pair { + return Pair( + targetFragment.arguments?.getString(EntranceUtils.KEY_COMMUNITY_ARTICLE_ID) ?: "", + targetFragment.arguments?.getParcelable(EntranceUtils.KEY_COMMUNITY_DATA)?.id ?: "") + } + companion object { const val ARTICLE_PATCH_REQUEST = 123 diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt b/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt index d5c48d8dc8..7137b716c5 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectActivity.kt @@ -10,7 +10,6 @@ import androidx.lifecycle.ViewModelProviders import com.gh.base.ToolBarActivity import com.gh.common.util.EntranceUtils import com.gh.common.util.MtaHelper -import com.gh.download.DownloadManager import com.gh.gamecenter.R import com.gh.gamecenter.entity.SubjectData import com.gh.gamecenter.entity.SubjectSettingEntity @@ -63,7 +62,7 @@ class SubjectActivity : ToolBarActivity() { private fun initContentView(entity: SubjectSettingEntity) { val transaction = supportFragmentManager.beginTransaction() - var tag: String + val tag: String val fragment: Fragment = when { "tile" == entity.typeEntity.layout -> { tag = SubjectTileFragment::class.java.simpleName @@ -97,6 +96,10 @@ class SubjectActivity : ToolBarActivity() { return "专题详情" } + override fun getBusinessId(): Pair { + return Pair(mViewModel?.subjectData?.subjectId ?: "", "") + } + companion object { /** * 启动专题页面 diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index 36533f4ae1..bb52ac5c14 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -21,6 +21,7 @@ import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.exposure.ExposureManager; import com.gh.common.loghub.LoghubUtils; +import com.gh.common.tracker.Tracker; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceUtils; import com.gh.common.util.DownloadNotificationHelper; @@ -137,6 +138,9 @@ public class HaloApp extends MultiDexApplication { TimestampUtils.initMap(); AppExecutor.getIoExecutor().execute(() -> { + initDataHelper(); + Tracker.init(this); + //初始化Fresco(BigImageViewer 已包含Fresco) BigImageViewer.initialize(FrescoImageLoader.with(this)); @@ -178,7 +182,6 @@ public class HaloApp extends MultiDexApplication { } AppExecutor.getUiExecutor().executeWithDelay(() -> { - initDataHelper(); initThirdPartySdk(); DataUtils.getGid();