Files
assistant-android/app/src/main/java/com/gh/download/PackageObserver.kt
2020-12-14 17:10:55 +08:00

203 lines
9.5 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}