260 lines
13 KiB
Kotlin
260 lines
13 KiB
Kotlin
package com.gh.common.util
|
||
|
||
import android.content.pm.PackageManager
|
||
import android.os.Build
|
||
import android.preference.PreferenceManager
|
||
import com.gh.base.BaseActivity
|
||
import com.gh.common.constant.Constants
|
||
import com.gh.common.exposure.ExposureUtils
|
||
import com.gh.download.DownloadManager
|
||
import com.gh.gamecenter.BuildConfig
|
||
import com.gh.gamecenter.R
|
||
import com.gh.gamecenter.SuggestionActivity
|
||
import com.gh.gamecenter.entity.GameEntity
|
||
import com.gh.gamecenter.entity.SimpleGameEntity
|
||
import com.gh.gamecenter.eventbus.EBDownloadStatus
|
||
import com.gh.gamecenter.eventbus.EBShowDialog
|
||
import com.gh.gamecenter.retrofit.Response
|
||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||
import com.gh.gamecenter.suggest.SuggestType
|
||
import com.halo.assistant.HaloApp
|
||
import com.halo.assistant.fragment.SettingsFragment
|
||
import com.lightgame.download.DataWatcher
|
||
import com.lightgame.download.DownloadEntity
|
||
import com.lightgame.download.DownloadStatus
|
||
import com.lightgame.download.FileUtils
|
||
import com.lightgame.utils.AppManager
|
||
import com.lightgame.utils.Util_System_Phone_State
|
||
import com.lightgame.utils.Utils
|
||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||
import io.reactivex.schedulers.Schedulers
|
||
import okhttp3.MediaType
|
||
import okhttp3.RequestBody
|
||
import org.greenrobot.eventbus.EventBus
|
||
import org.json.JSONObject
|
||
import java.util.*
|
||
|
||
object DownloadObserver {
|
||
|
||
private val mApplication = HaloApp.getInstance().application
|
||
|
||
// 如果在WIFI状态下,下载自动暂停,则再重试一遍
|
||
@JvmStatic
|
||
fun initObserver() {
|
||
val dataWatcher = object : DataWatcher() {
|
||
override fun onDataChanged(downloadEntity: DownloadEntity) {
|
||
val gameId = downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER)
|
||
val downloadManager = DownloadManager.getInstance(HaloApp.getInstance().application)
|
||
|
||
if (downloadEntity.status != DownloadStatus.downloading) {
|
||
LogUtils.uploadDownloadEvent(downloadEntity)
|
||
}
|
||
|
||
if (DownloadStatus.hijack == downloadEntity.status) {
|
||
// 链接被劫持
|
||
processHijack(downloadEntity)
|
||
val nameAndPlatform = (downloadEntity.name + ":"
|
||
+ PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
|
||
MtaHelper.onEvent("下载劫持",
|
||
"游戏名字", nameAndPlatform,
|
||
"网络状态", DeviceUtils.getNetwork(mApplication))
|
||
return
|
||
} else if (DownloadStatus.notfound == downloadEntity.status) {
|
||
// 404 Not Found
|
||
// 删除任务
|
||
downloadEntity.status = DownloadStatus.cancel
|
||
downloadManager.cancel(downloadEntity.url)
|
||
Utils.toast(mApplication, "该链接已失效!请联系管理员。")
|
||
|
||
MtaHelper.onEventWithBasicDeviceInfo("下载失败弹窗",
|
||
"游戏", downloadEntity.name,
|
||
"平台", downloadEntity.platform)
|
||
|
||
DialogUtils.showAlertDialog(AppManager.getInstance().currentActivity(), "下载失败", "下载链接已失效,建议提交反馈", "立即反馈", "取消", {
|
||
SuggestionActivity.startSuggestionActivity(AppManager.getInstance().currentActivity(),
|
||
SuggestType.gameQuestion, "notfound",
|
||
StringUtils.buildString(downloadEntity.name, ",问题反馈:下载链接失效"),
|
||
SimpleGameEntity(gameId, downloadEntity.name, ""))
|
||
}, null)
|
||
return
|
||
} else if (DownloadStatus.neterror == downloadEntity.status || DownloadStatus.timeout == downloadEntity.status) {
|
||
if (downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD].isNullOrEmpty()
|
||
&& NetworkUtils.isWifiConnected(HaloApp.getInstance().application)) {
|
||
downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD] = downloadEntity.progress.toString()
|
||
downloadManager.updateDownloadEntity(downloadEntity)
|
||
downloadManager.startDownload(downloadEntity.url)
|
||
debugOnly {
|
||
Utils.log("DownloadObserver", "下载重试->" + downloadEntity.toJson())
|
||
}
|
||
} else {
|
||
Utils.toast(mApplication, "网络不稳定,下载任务已暂停")
|
||
DataLogUtils.uploadNeterrorLog(mApplication, downloadEntity)
|
||
|
||
MtaHelper.onEventWithBasicDeviceInfo("下载自动暂停",
|
||
"游戏", downloadEntity.name,
|
||
"平台", downloadEntity.platform)
|
||
debugOnly {
|
||
Utils.log("DownloadObserver", "下载自动暂停->" + downloadEntity.toJson())
|
||
}
|
||
}
|
||
}
|
||
if (DownloadStatus.done == downloadEntity.status) {
|
||
if (downloadEntity.name.contains(mApplication.getString(R.string.app_name))) {
|
||
MtaHelper.onEvent("软件更新", "下载完成")
|
||
tryWithDefaultCatch {
|
||
// 会有 ActivityNotFoundException 异常,catch 掉不管了
|
||
mApplication.startActivity(PackageUtils.getInstallIntent(mApplication, downloadEntity.path, true))
|
||
}
|
||
DataLogUtils.uploadUpgradeLog(mApplication, "install") //上传更新安装数据
|
||
} else {
|
||
statDoneEvent(downloadEntity)
|
||
|
||
val platform = PlatformUtils.getInstance(mApplication)
|
||
.getPlatformName(downloadEntity.platform)
|
||
if (platform != null) {
|
||
when {
|
||
downloadEntity.isPluggable -> // 弹出插件化提示框
|
||
EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path))
|
||
downloadEntity.isPlugin -> Utils.toast(mApplication, downloadEntity.name + " - " + platform + " - 下载完成")
|
||
else -> Utils.toast(mApplication, downloadEntity.name + " - 下载完成")
|
||
}
|
||
} else {
|
||
Utils.toast(mApplication, downloadEntity.name + " - 下载完成")
|
||
}
|
||
if (!downloadEntity.isPluggable) {
|
||
// 是否是自动安装
|
||
if (PreferenceManager.getDefaultSharedPreferences(mApplication).getBoolean(SettingsFragment.AUTO_INSTALL_SP_KEY, true)) {
|
||
if (FileUtils.isEmptyFile(downloadEntity.path)) {
|
||
Utils.toast(mApplication, R.string.install_failure_hint)
|
||
downloadManager.cancel(downloadEntity.url)
|
||
} else {
|
||
if (PackageUtils.isCanLaunchSetup(mApplication, downloadEntity.path)) {
|
||
downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES"
|
||
tryWithDefaultCatch {
|
||
mApplication.startActivity(PackageUtils.getInstallIntent(mApplication, downloadEntity.path))
|
||
}
|
||
} else {
|
||
// 弹出卸载提示框
|
||
EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 统计下载完成
|
||
uploadData(gameId, downloadEntity.platform)
|
||
}
|
||
|
||
// 下载过程分析统计
|
||
val pm = mApplication.packageManager
|
||
val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, PackageManager.GET_ACTIVITIES)
|
||
if (packageInfo == null) {
|
||
MtaHelper.onEventWithBasicDeviceInfo("解析包错误分析",
|
||
"游戏名字", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
|
||
|
||
MtaHelper.onEventWithBasicDeviceInfo("解析包错误_新",
|
||
"游戏", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform))
|
||
}
|
||
}
|
||
|
||
if (downloadEntity.status == DownloadStatus.done) {
|
||
EventBus.getDefault().post(EBDownloadStatus("done", "", "", "", downloadEntity.packageName, ""))
|
||
}
|
||
|
||
DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity)
|
||
|
||
// 如果已下载大小发生变化,表示成功恢复下载,则重置重试标记
|
||
if (downloadEntity.status == DownloadStatus.downloading &&
|
||
downloadEntity.progress.toString() != downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD]) {
|
||
downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD] = ""
|
||
downloadManager.updateDownloadEntity(downloadEntity)
|
||
}
|
||
}
|
||
}
|
||
|
||
// 添加观察者
|
||
DownloadManager.getInstance(mApplication).addObserver(dataWatcher)
|
||
|
||
}
|
||
|
||
// 统计下载完成事件
|
||
private fun statDoneEvent(downloadEntity: DownloadEntity) {
|
||
var type: ExposureUtils.DownloadType
|
||
val platform = PlatformUtils.getInstance(HaloApp.getInstance().application).getPlatformName(downloadEntity.platform)
|
||
|
||
val kv1 = HashMap<String, Any>()
|
||
kv1["版本"] = platform
|
||
kv1["状态"] = "下载完成"
|
||
kv1["用户机型"] = Build.MODEL
|
||
kv1["设备IMEI"] = Util_System_Phone_State.getDeviceId(HaloApp.getInstance().application)
|
||
kv1["网络状态"] = DeviceUtils.getNetwork(HaloApp.getInstance().application)
|
||
kv1["光环助手版本"] = BuildConfig.VERSION_NAME
|
||
if (downloadEntity.isUpdate) {
|
||
type = ExposureUtils.DownloadType.UPDATE
|
||
if (downloadEntity.isPlugin) {
|
||
type = ExposureUtils.DownloadType.PLUGIN_UPDATE
|
||
}
|
||
DataUtils.onEvent(mApplication, "游戏更新", downloadEntity.name, kv1)
|
||
} else {
|
||
type = ExposureUtils.DownloadType.DOWNLOAD
|
||
}
|
||
|
||
val kv2 = HashMap<String, Any>()
|
||
kv2["版本"] = downloadEntity.platform
|
||
kv2["状态"] = "下载完成"
|
||
kv2["位置"] = downloadEntity.entrance ?: "null"
|
||
kv2["游戏分平台"] = downloadEntity.name + "-" + platform
|
||
kv2["光环助手版本"] = BuildConfig.VERSION_NAME
|
||
DataUtils.onEvent(mApplication, "游戏下载位置", downloadEntity.name, kv2)
|
||
|
||
if (downloadEntity.isPluggable) {
|
||
val kv3 = HashMap<String, Any>()
|
||
kv3["下载"] = "下载完成"
|
||
kv3["版本"] = downloadEntity.platform
|
||
kv3["位置"] = downloadEntity.entrance ?: "null"
|
||
type = ExposureUtils.DownloadType.PLUGIN_DOWNLOAD
|
||
DataUtils.onEvent(mApplication, "插件化", downloadEntity.name, kv3)
|
||
|
||
MtaHelper.onEvent(
|
||
"插件化_新",
|
||
"位置", downloadEntity.entrance,
|
||
"游戏", downloadEntity.name + "-" + downloadEntity.platform,
|
||
"操作", "下载完成",
|
||
"网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().application))
|
||
}
|
||
|
||
ExposureUtils.logADownloadCompleteExposureEvent(
|
||
GameEntity(id = downloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER), mName = downloadEntity.name.removeSuffix(Constants.GAME_NAME_DECORATOR)),
|
||
downloadEntity.platform,
|
||
downloadEntity.exposureTrace,
|
||
type)
|
||
|
||
DataCollectionUtils.uploadDownload(mApplication, downloadEntity, "完成")
|
||
}
|
||
|
||
private fun processHijack(downloadEntity: DownloadEntity) {
|
||
// 删除任务
|
||
downloadEntity.status = DownloadStatus.cancel
|
||
DownloadManager.getInstance(mApplication).cancel(downloadEntity.url)
|
||
// 弹出提示框
|
||
EventBus.getDefault().post(EBShowDialog(BaseActivity.DOWNLOAD_HIJACK))
|
||
// 记录链接被劫持
|
||
DataCollectionUtils.uploadHijack(mApplication, downloadEntity)
|
||
// 上传劫持log
|
||
DataLogUtils.uploadHijack(mApplication, downloadEntity)
|
||
}
|
||
|
||
// 统计下载
|
||
private fun uploadData(id: String, platform: String?) {
|
||
val params = HashMap<String, String>()
|
||
params["game"] = id
|
||
params["platform"] = platform ?: ""
|
||
val body = RequestBody.create(MediaType.parse("application/json"),
|
||
JSONObject(params).toString())
|
||
RetrofitManager.getInstance(mApplication).api.postDownload(body)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(Response())
|
||
}
|
||
|
||
} |