diff --git a/app/src/main/java/com/gh/common/util/DeviceUtils.java b/app/src/main/java/com/gh/common/util/DeviceUtils.java index 302803e73e..2822eee40b 100644 --- a/app/src/main/java/com/gh/common/util/DeviceUtils.java +++ b/app/src/main/java/com/gh/common/util/DeviceUtils.java @@ -11,6 +11,8 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.Nullable; + import com.halo.assistant.HaloApp; import com.lightgame.utils.Util_System_Phone_State; import com.tencent.stat.StatConfig; @@ -222,8 +224,7 @@ public class DeviceUtils { // get sim public static String getSim(Context context) { - TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - String imsi = tm.getSubscriberId(); + String imsi = getTelephonySubscriberId(context); if (imsi == null) { return ""; } @@ -239,6 +240,12 @@ public class DeviceUtils { return ""; } + @Nullable + public static String getTelephonySubscriberId(Context context) { + TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + return tm.getSubscriberId(); + } + // ping domain public static String ping(String domain) { try { 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 16f0d68575..90bfec6c09 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -7,6 +7,7 @@ import com.gh.base.BaseActivity import com.gh.common.constant.Constants import com.gh.common.exposure.ExposureUtils import com.gh.common.xapk.XapkInstaller +import com.gh.download.DownloadDataHelper import com.gh.download.DownloadManager import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.R @@ -51,8 +52,8 @@ object DownloadObserver { val gameId = downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER) val downloadManager = DownloadManager.getInstance(HaloApp.getInstance().application) - if (downloadEntity.status != DownloadStatus.downloading) { - LogUtils.uploadDownloadEvent(downloadEntity) + tryCatchInRelease { + DownloadDataHelper.uploadDownloadEvent(downloadEntity) } if (DownloadStatus.hijack == downloadEntity.status) { diff --git a/app/src/main/java/com/gh/common/util/LogUtils.java b/app/src/main/java/com/gh/common/util/LogUtils.java index 35245f9002..34de64c744 100644 --- a/app/src/main/java/com/gh/common/util/LogUtils.java +++ b/app/src/main/java/com/gh/common/util/LogUtils.java @@ -16,7 +16,6 @@ import com.gh.common.exposure.meta.Meta; import com.gh.common.exposure.meta.MetaUtil; import com.gh.common.loghub.LoghubUtils; import com.gh.common.loghub.SimpleLogContainerEntity; -import com.gh.download.DownloadDataHelper; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.entity.CommunityEntity; import com.gh.gamecenter.entity.GameEntity; @@ -24,7 +23,6 @@ import com.gh.gamecenter.entity.SpecialColumn; import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.qa.entity.Questions; import com.halo.assistant.HaloApp; -import com.lightgame.download.DownloadEntity; import com.lightgame.utils.Util_System_Phone_State; import com.lightgame.utils.Utils; @@ -56,55 +54,6 @@ public class LogUtils { uploadVideoStreaming(object); } - public static void uploadDownloadEvent(DownloadEntity downloadEntity) { - Context context = HaloApp.getInstance().getApplication(); - Meta meta = MetaUtil.INSTANCE.getMeta(); - JSONObject object = new JSONObject(); - - try { - object.put("event", DownloadDataHelper.getDownloadStatusAlias(downloadEntity)); - object.put("msg", downloadEntity.getError()); - object.put("status", downloadEntity.getStatus().getStatus()); - - // payload - JSONObject payloadObject = new JSONObject(); - payloadObject.put("game_id", downloadEntity.getGameId()); - payloadObject.put("gameName", downloadEntity.getName()); - payloadObject.put("platform", downloadEntity.getPlatform()); - payloadObject.put("package", downloadEntity.getPackageName()); - payloadObject.put("filename", downloadEntity.getPath().substring(downloadEntity.getPath().lastIndexOf("/") + 1)); - payloadObject.put("total_size", (downloadEntity.getSize() / 1024 / 1024)); - payloadObject.put("completed_size", (downloadEntity.getProgress() / 1024 / 1024)); - - object.put("payload", payloadObject); - - // meta - JSONObject metaObject = new JSONObject(); - metaObject.put("android_id", meta.getAndroid_id()); - metaObject.put("android_sdk", meta.getAndroid_sdk()); - metaObject.put("android_version", meta.getAndroid_version()); - metaObject.put("appVersion", meta.getAppVersion()); - metaObject.put("channel", meta.getChannel()); - metaObject.put("gid", meta.getGid()); - metaObject.put("imei", meta.getImei()); - metaObject.put("mac", meta.getMac()); - metaObject.put("manufacturer", meta.getManufacturer()); - metaObject.put("model", meta.getModel()); - metaObject.put("network", DeviceUtils.getNetwork(context)); - metaObject.put("os", meta.getOs()); - metaObject.put("userId", meta.getUserId()); - - object.put("meta", metaObject); - object.put("timestamp", System.currentTimeMillis() / 1000); - } catch (Exception e) { - e.printStackTrace(); - } - if (BuildConfig.DEBUG) { - Utils.log("LogUtils->" + object.toString()); - } - LoghubUtils.log(object, "download_debug", false); - } - public static void uploadCommunityArticle(String tracers, String articleId, String articleTitle, int readTime, CommunityEntity community, SpecialColumn specialColumn) { JSONObject object = new JSONObject(); try { diff --git a/app/src/main/java/com/gh/download/DownloadDataHelper.kt b/app/src/main/java/com/gh/download/DownloadDataHelper.kt index 622ce9c9a2..cdce8f277c 100644 --- a/app/src/main/java/com/gh/download/DownloadDataHelper.kt +++ b/app/src/main/java/com/gh/download/DownloadDataHelper.kt @@ -1,11 +1,21 @@ package com.gh.download import android.content.pm.PackageManager +import com.gh.common.exposure.meta.MetaUtil.getMeta +import com.gh.common.loghub.LoghubUtils +import com.gh.common.util.DeviceUtils +import com.gh.gamecenter.BuildConfig import com.halo.assistant.HaloApp import com.lightgame.download.DownloadEntity import com.lightgame.download.DownloadStatus +import com.lightgame.utils.Utils +import org.json.JSONArray +import org.json.JSONObject object DownloadDataHelper { + private const val DOWNLOAD_SPEED_TIME = "download_speed_time" + private const val DOWNLOAD_SPEED_SIZE = "download_speed_size" + const val DOWNLOAD_RESUME_WAY = "download_resume_way" const val DOWNLOAD_RESUME_MANUAL = "manual" const val DOWNLOAD_RESUME_AUTO = "auto" @@ -14,9 +24,13 @@ object DownloadDataHelper { const val DOWNLOAD_CANCEL_MANUAL = "manual" const val DOWNLOAD_CANCEL_AUTO = "auto" + const val DOWNLOAD_FIRST_START = "download_first_start" + + private val mDownloadSpeedMap = HashMap>() + @JvmStatic - fun getDownloadStatusAlias(downloadEntity: DownloadEntity): String { - val status = downloadEntity.status + fun getDownloadStatusAlias(downloadEntity: DownloadEntity, downloadStatus: DownloadStatus? = null): String { + val status = downloadStatus ?: downloadEntity.status return if (status == DownloadStatus.add) { "开始下载" } else if (status == DownloadStatus.pause) { @@ -53,4 +67,179 @@ object DownloadDataHelper { "未知状态" } } + + @JvmStatic + fun uploadDownloadEvent(downloadEntity: DownloadEntity) { + if (downloadEntity.status != DownloadStatus.downloading) { + uploadDownloadStatusEvent(downloadEntity) + } + + if (downloadEntity.status == DownloadStatus.downloading) { + val startupTime = downloadEntity.meta[DownloadEntity.DOWNLOAD_STARTUP_TIME_KEY] + if (startupTime != null) { + uploadDownloadStartupTimeEvent(downloadEntity, startupTime.toInt()) + downloadEntity.meta.remove(DownloadEntity.DOWNLOAD_STARTUP_TIME_KEY) + DownloadManager.getInstance(HaloApp.getInstance().application).updateDownloadEntity(downloadEntity) + } + } + + if (downloadEntity.status == DownloadStatus.downloading || downloadEntity.status == DownloadStatus.done) { + val time = downloadEntity.meta[DOWNLOAD_SPEED_TIME] + val size = downloadEntity.meta[DOWNLOAD_SPEED_SIZE] + if (downloadEntity.speed == 0L || time == null || size == null) { + downloadEntity.meta[DOWNLOAD_SPEED_TIME] = System.currentTimeMillis().toString() + downloadEntity.meta[DOWNLOAD_SPEED_SIZE] = downloadEntity.progress.toString() + DownloadManager.getInstance(HaloApp.getInstance().application).updateDownloadEntity(downloadEntity) + } else { + val offset = System.currentTimeMillis() - time.toLong() + if (offset > 5000) { + //记录并重置 + val downloadedSize = downloadEntity.progress - size.toInt() + val averageSpeed = (downloadedSize / offset).toInt() + val speedList = mDownloadSpeedMap[downloadEntity.url] + if (speedList == null) { + mDownloadSpeedMap[downloadEntity.url] = arrayListOf(averageSpeed) + } else { + speedList.add(averageSpeed) + if (speedList.size >= 6 || downloadEntity.status == DownloadStatus.done) { + uploadDownloadAverageSpeed(downloadEntity, speedList) + if (downloadEntity.status == DownloadStatus.done) { + mDownloadSpeedMap.remove(downloadEntity.url) + } else { + speedList.clear() + } + } + } + downloadEntity.meta[DOWNLOAD_SPEED_TIME] = System.currentTimeMillis().toString() + downloadEntity.meta[DOWNLOAD_SPEED_SIZE] = downloadEntity.progress.toString() + DownloadManager.getInstance(HaloApp.getInstance().application).updateDownloadEntity(downloadEntity) + } + } + } + } + + private fun uploadDownloadStartupTimeEvent(downloadEntity: DownloadEntity, startupTime: Int) { + val jsonObject = JSONObject() + + try { + jsonObject.put("event", "下载线程启动") + val startupStatus = downloadEntity.meta[DownloadEntity.DOWNLOAD_STARTUP_STATUS_KEY] + if (startupStatus != null) { + jsonObject.put("msg", getDownloadStatusAlias(downloadEntity, DownloadStatus.valueOf(startupStatus))) + } + + jsonObject.put("meta", getMetaJson()) + jsonObject.put("timestamp", System.currentTimeMillis() / 1000) + + // payload + val payloadObject = JSONObject() + payloadObject.put("game_id", downloadEntity.gameId) + payloadObject.put("gameName", downloadEntity.name) + payloadObject.put("platform", downloadEntity.platform) + payloadObject.put("package", downloadEntity.packageName) + payloadObject.put("filename", downloadEntity.path.substring(downloadEntity.path.lastIndexOf("/") + 1)) + payloadObject.put("launch_ms", startupTime) + jsonObject.put("payload", payloadObject) + } catch (e: Exception) { + e.printStackTrace() + } + if (BuildConfig.DEBUG) { + Utils.log("LogUtils->$jsonObject") + } + LoghubUtils.log(jsonObject, "download_debug", false) + } + + private fun uploadDownloadStatusEvent(downloadEntity: DownloadEntity) { + val jsonObject = JSONObject() + + try { + jsonObject.put("event", getDownloadStatusAlias(downloadEntity)) + jsonObject.put("msg", downloadEntity.error) + jsonObject.put("status", downloadEntity.status.status) + + jsonObject.put("meta", getMetaJson()) + jsonObject.put("timestamp", System.currentTimeMillis() / 1000) + + // payload + val payloadObject = JSONObject() + payloadObject.put("game_id", downloadEntity.gameId) + payloadObject.put("gameName", downloadEntity.name) + payloadObject.put("platform", downloadEntity.platform) + payloadObject.put("package", downloadEntity.packageName) + payloadObject.put("filename", downloadEntity.path.substring(downloadEntity.path.lastIndexOf("/") + 1)) + payloadObject.put("total_size", downloadEntity.size / 1024 / 1024) + payloadObject.put("completed_size", downloadEntity.progress / 1024 / 1024) + if (downloadEntity.status == DownloadStatus.resume) { + if (downloadEntity.meta[DOWNLOAD_FIRST_START] == "YES") { + payloadObject.put("is_first_start", true) + } else { + payloadObject.put("is_first_start", false) + } + } + + if (downloadEntity.status == DownloadStatus.resume || downloadEntity.status == DownloadStatus.add) { + downloadEntity.meta[DOWNLOAD_FIRST_START] = "NO" + DownloadManager.getInstance(HaloApp.getInstance().application).updateDownloadEntity(downloadEntity) + } + jsonObject.put("payload", payloadObject) + } catch (e: Exception) { + e.printStackTrace() + } + if (BuildConfig.DEBUG) { + Utils.log("LogUtils->$jsonObject") + } + LoghubUtils.log(jsonObject, "download_debug", false) + } + + + private fun uploadDownloadAverageSpeed(downloadEntity: DownloadEntity, averageSpeedList: List) { + val jsonObject = JSONObject() + + try { + jsonObject.put("event", "下载进度") + jsonObject.put("msg", "") + + jsonObject.put("meta", getMetaJson()) + jsonObject.put("timestamp", System.currentTimeMillis() / 1000) + + // payload + val payloadObject = JSONObject() + payloadObject.put("game_id", downloadEntity.gameId) + payloadObject.put("gameName", downloadEntity.name) + payloadObject.put("platform", downloadEntity.platform) + payloadObject.put("package", downloadEntity.packageName) + payloadObject.put("filename", downloadEntity.path.substring(downloadEntity.path.lastIndexOf("/") + 1)) + payloadObject.put("speed_progress", JSONArray(averageSpeedList)) + payloadObject.put("is_finished", downloadEntity.status == DownloadStatus.done) + jsonObject.put("payload", payloadObject) + } catch (e: Exception) { + e.printStackTrace() + } + if (BuildConfig.DEBUG) { + Utils.log("LogUtils->$jsonObject") + } + LoghubUtils.log(jsonObject, "download_debug", false) + } + + private fun getMetaJson(): JSONObject { + val context = HaloApp.getInstance().application + val meta = getMeta() + // meta + val metaObject = JSONObject() + metaObject.put("android_id", meta.android_id) + metaObject.put("android_sdk", meta.android_sdk) + metaObject.put("android_version", meta.android_version) + metaObject.put("appVersion", meta.appVersion) + metaObject.put("channel", meta.channel) + metaObject.put("gid", meta.gid) + metaObject.put("imei", meta.imei) + metaObject.put("mac", meta.mac) + metaObject.put("manufacturer", meta.manufacturer) + metaObject.put("model", meta.model) + metaObject.put("network", DeviceUtils.getNetwork(context)) + metaObject.put("os", meta.os) + metaObject.put("MNC", DeviceUtils.getTelephonySubscriberId(context) ?: "") + metaObject.put("userId", meta.userId) + return metaObject + } } \ 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 9160db3db1..6f19594f9c 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -670,6 +670,12 @@ public class DownloadManager implements DownloadStatusListener { downloadEntity.getMeta().put(DownloadEntity.NETWORK_STATUS_KEY, network); } + if (status == DownloadStatus.add || status == DownloadStatus.subscribe) { + if (downloadEntity.getMeta().get(DownloadDataHelper.DOWNLOAD_FIRST_START) == null) { + downloadEntity.getMeta().put(DownloadDataHelper.DOWNLOAD_FIRST_START, "YES"); + } + } + Intent serviceIntent = getIntent(downloadEntity, status); // 当满足系统版本大于 8.0 并且应用在后台运行时以前台服务开启 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O diff --git a/libraries/LGLibrary b/libraries/LGLibrary index 54cd456fae..a73254c92c 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit 54cd456fae46b90d818420297e7532ebd951ee8f +Subproject commit a73254c92c6083c5468f07831e1dda62ecc09c28