203 lines
9.5 KiB
Kotlin
203 lines
9.5 KiB
Kotlin
package com.gh.download
|
||
|
||
import android.annotation.SuppressLint
|
||
import android.app.NotificationManager
|
||
import android.content.Context
|
||
import android.preference.PreferenceManager
|
||
import android.text.TextUtils
|
||
import com.gh.common.constant.Constants
|
||
import com.gh.common.loghub.LoghubUtils
|
||
import com.gh.common.runOnIoThread
|
||
import com.gh.common.util.*
|
||
import com.gh.gamecenter.entity.GameDigestEntity
|
||
import com.gh.gamecenter.eventbus.EBPackage
|
||
import com.gh.gamecenter.manager.UserManager
|
||
import com.gh.gamecenter.packagehelper.PackageRepository
|
||
import com.gh.gamecenter.packagehelper.PackageViewModel
|
||
import com.gh.gamecenter.retrofit.EmptyResponse
|
||
import com.gh.gamecenter.retrofit.Response
|
||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||
import com.halo.assistant.HaloApp
|
||
import com.halo.assistant.fragment.SettingsFragment
|
||
import com.lightgame.download.DownloadEntity
|
||
import com.lightgame.utils.Utils
|
||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||
import io.reactivex.schedulers.Schedulers
|
||
import okhttp3.MediaType
|
||
import okhttp3.RequestBody
|
||
import org.json.JSONException
|
||
import org.json.JSONObject
|
||
import java.util.*
|
||
|
||
object PackageObserver {
|
||
|
||
private val mPackageViewModel: PackageViewModel
|
||
by lazy { PackageViewModel(HaloApp.getInstance().application, PackageRepository) }
|
||
|
||
@JvmStatic
|
||
fun onPackageChanged(busFour: EBPackage) {
|
||
val application = HaloApp.getInstance().application
|
||
val packageName = busFour.packageName
|
||
val versionName = busFour.versionName
|
||
var gameId = ""
|
||
var mDownloadEntity: DownloadEntity? = null
|
||
val sp = PreferenceManager.getDefaultSharedPreferences(application)
|
||
|
||
for (downloadEntity in DownloadManager.getInstance(application).allDownloadEntity) {
|
||
if (packageName == downloadEntity.packageName) {
|
||
mDownloadEntity = downloadEntity
|
||
gameId = mDownloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER)
|
||
if (TextUtils.isEmpty(busFour.versionName)) {
|
||
// 没有版本号的事件直接选用第一个找到的 downloadEntity
|
||
break
|
||
} else {
|
||
// 有版本号的事件直接尽量找到版本一致的 downloadEntity
|
||
if (versionName == downloadEntity.versionName) {
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if ("安装" == busFour.type) {
|
||
mPackageViewModel.addInstalledGame(packageName)
|
||
|
||
// TODO 这个取消通知栏看起来没什么用,没在其它地方看到它,暂且保留一个版本
|
||
// 删除下载完成 弹窗
|
||
val nManager = application.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||
nManager.cancel(packageName.hashCode())
|
||
|
||
if (mDownloadEntity != null) {
|
||
if (mDownloadEntity.isPluggable) {
|
||
val kv6: MutableMap<String, Any> = HashMap()
|
||
kv6["安装或卸载"] = "安装完成"
|
||
DataUtils.onEvent(application, "插件化", mDownloadEntity.name, kv6)
|
||
|
||
// DataUtils.onMtaEvent(this,
|
||
// "插件化_新",
|
||
// "位置", mDownloadEntity.getEntrance(),
|
||
// "游戏", mDownloadEntity.getName() + "-" + mDownloadEntity.getPlatform(),
|
||
// "操作", "安装完成",
|
||
// "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication()));
|
||
}
|
||
|
||
// 没有光环 ID 的都记录一下游戏 ID,供'我的游戏'区分同包名不同插件用
|
||
val gh_id = PackageUtils.getMetaData(application, mDownloadEntity.packageName, "gh_id")
|
||
if (gh_id == null) {
|
||
ThirdPartyPackageHelper.saveGameId(mDownloadEntity.packageName, mDownloadEntity.gameId)
|
||
}
|
||
DownloadManager.getInstance(application).cancel(
|
||
mDownloadEntity.url, false, true) // 默认不删除安装包 mSp.getBoolean("autodelete", true)
|
||
}
|
||
if (sp.getBoolean(SettingsFragment.CONCERN_GAME_SP_KEY, true)) { //设置页面控制是否安装后自动关注
|
||
// 安装后关注游戏
|
||
val finalDownloadEntity = mDownloadEntity
|
||
RetrofitManager.getInstance(application).sensitiveApi
|
||
.getGameDigestByPackageName(UrlFilterUtils.getFilterQuery("package", packageName))
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(object : Response<List<GameDigestEntity?>?>() {
|
||
override fun onResponse(response: List<GameDigestEntity?>?) {
|
||
for (gameDigestEntity in response!!) {
|
||
if (!TextUtils.isEmpty(gameDigestEntity?.id)) { // 关注游戏
|
||
if (finalDownloadEntity != null && gameDigestEntity?.id == finalDownloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER)) {
|
||
ConcernUtils.postConcernGameId(application, gameDigestEntity?.id ?: "", null, false)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
runOnIoThread { postNewlyInstalledApp(gameId, packageName) }
|
||
}
|
||
|
||
if ("卸载" == busFour.type) {
|
||
mPackageViewModel.addUninstalledGame(packageName)
|
||
if (mDownloadEntity != null && mDownloadEntity.isPluggable) {
|
||
val kv6: MutableMap<String, Any> = HashMap()
|
||
kv6["安装或卸载"] = "卸载完成"
|
||
DataUtils.onEvent(application, "插件化", mDownloadEntity.name, kv6)
|
||
|
||
// DataUtils.onMtaEvent(this,
|
||
// "插件化_新",
|
||
// "位置", mDownloadEntity.getEntrance(),
|
||
// "游戏", mDownloadEntity.getName() + "-" + mDownloadEntity.getPlatform(),
|
||
// "操作", "卸载完成",
|
||
// "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication()));
|
||
PackageInstaller.install(application, mDownloadEntity)
|
||
}
|
||
|
||
// 更新已安装游戏
|
||
deleteInstalledPackage(packageName)
|
||
}
|
||
DataCollectionUtils.uploadInorunstall(application, busFour.type, busFour.packageName)
|
||
}
|
||
|
||
@SuppressLint("CheckResult")
|
||
private fun postNewlyInstalledApp(gameId: String, packageName: String) {
|
||
|
||
// 发送应用变更前都检查一下是否需要把所有应用都上传
|
||
PackageRepository.checkAndUploadAppList()
|
||
|
||
// 更新已安装游戏
|
||
val packageObject = PackageUtils.getAppBasicInfoByPackageName(packageName)
|
||
val dataObject = JSONObject()
|
||
val wrapperObject = JSONObject()
|
||
try {
|
||
dataObject.put("type", "POST")
|
||
dataObject.put("device_id", HaloApp.getInstance().gid)
|
||
dataObject.put("app", packageObject)
|
||
dataObject.put("time", Utils.getTime(HaloApp.getInstance().application))
|
||
wrapperObject.put("content", dataObject.toString())
|
||
} catch (e: JSONException) {
|
||
e.printStackTrace()
|
||
}
|
||
LoghubUtils.log(wrapperObject, "halo-api-device-installed", true)
|
||
val requestBody = RequestBody.create(MediaType.parse("application/json"),
|
||
packageObject.toString())
|
||
// 更新已安装游戏
|
||
RetrofitManager.getInstance(HaloApp.getInstance().application).api
|
||
.postNewlyInstalledApp(HaloApp.getInstance().gid, requestBody)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(Schedulers.io())
|
||
.subscribe(EmptyResponse())
|
||
if (!TextUtils.isEmpty(gameId) && UserManager.getInstance().isLoggedIn) {
|
||
val jsonObject = JSONObject()
|
||
try {
|
||
jsonObject.put("game_id", gameId)
|
||
jsonObject.put("package", packageName)
|
||
val rBody = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString())
|
||
RetrofitManager.getInstance(HaloApp.getInstance().application).api
|
||
.postPlayedGame(UserManager.getInstance().userId, rBody)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(Schedulers.io())
|
||
.subscribe(EmptyResponse())
|
||
} catch (e: JSONException) {
|
||
e.printStackTrace()
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
@SuppressLint("CheckResult")
|
||
private fun deleteInstalledPackage(packageName: String) {
|
||
|
||
// 发送应用变更前都检查一下是否需要把所有应用都上传
|
||
PackageRepository.checkAndUploadAppList()
|
||
|
||
// 删除已安装游戏
|
||
val dataObject = JSONObject()
|
||
val wrapperObject = JSONObject()
|
||
try {
|
||
dataObject.put("type", "DELETE")
|
||
dataObject.put("device_id", HaloApp.getInstance().gid)
|
||
dataObject.put("package", packageName)
|
||
dataObject.put("time", Utils.getTime(HaloApp.getInstance().application))
|
||
wrapperObject.put("content", dataObject.toString())
|
||
} catch (e: JSONException) {
|
||
e.printStackTrace()
|
||
}
|
||
LoghubUtils.log(wrapperObject, "halo-api-device-installed", true)
|
||
|
||
}
|
||
} |