diff --git a/app/src/main/java/com/gh/download/PackageObserver.kt b/app/src/main/java/com/gh/download/PackageObserver.kt new file mode 100644 index 0000000000..1ef2fedc79 --- /dev/null +++ b/app/src/main/java/com/gh/download/PackageObserver.kt @@ -0,0 +1,201 @@ +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.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 = 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?>() { + override fun onResponse(response: List?) { + 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) + } + } + } + } + }) + } + postNewlyInstalledApp(gameId, packageName) + } + + if ("卸载" == busFour.type) { + mPackageViewModel.addUninstalledGame(packageName) + if (mDownloadEntity != null && mDownloadEntity.isPluggable) { + val kv6: MutableMap = 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) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index d413a90e4f..4f2d0ebbb5 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -745,184 +745,6 @@ public class MainActivity extends BaseActivity { } } - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBPackage busFour) { - final String packageName = busFour.getPackageName(); - final String versionName = busFour.getVersionName(); - String gameId = ""; - - DownloadEntity mDownloadEntity = null; - for (DownloadEntity downloadEntity : DownloadManager.getInstance(getApplicationContext()).getAllDownloadEntity()) { - if (packageName.equals(downloadEntity.getPackageName())) { - mDownloadEntity = downloadEntity; - gameId = mDownloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER); - if (TextUtils.isEmpty(busFour.getVersionName())) { - // 没有版本号的事件直接选用第一个找到的 downloadEntity - break; - } else { - // 有版本号的事件直接尽量找到版本一致的 downloadEntity - if (versionName.equals(downloadEntity.getVersionName())) { - break; - } - } - } - } - - if ("安装".equals(busFour.getType())) { - mPackageViewModel.addInstalledGame(packageName); - - // 删除下载完成 弹窗 - NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nManager.cancel(packageName.hashCode()); - - if (mDownloadEntity != null) { - if (mDownloadEntity.isPluggable()) { - Map kv6 = new HashMap<>(); - kv6.put("安装或卸载", "安装完成"); - DataUtils.onEvent(this, "插件化", mDownloadEntity.getName(), kv6); - -// DataUtils.onMtaEvent(this, -// "插件化_新", -// "位置", mDownloadEntity.getEntrance(), -// "游戏", mDownloadEntity.getName() + "-" + mDownloadEntity.getPlatform(), -// "操作", "安装完成", -// "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication())); - } - - // 没有光环 ID 的都记录一下游戏 ID,供'我的游戏'区分同包名不同插件用 - Object gh_id = PackageUtils.getMetaData(this, mDownloadEntity.getPackageName(), "gh_id"); - if (gh_id == null) { - ThirdPartyPackageHelper.saveGameId(mDownloadEntity.getPackageName(), mDownloadEntity.getGameId()); - } - DownloadManager.getInstance(getApplicationContext()).cancel( - mDownloadEntity.getUrl(), false, true); // 默认不删除安装包 mSp.getBoolean("autodelete", true) - } - - - if (mSp.getBoolean(SettingsFragment.CONCERN_GAME_SP_KEY, true)) { //设置页面控制是否安装后自动关注 - // 安装后关注游戏 - DownloadEntity finalDownloadEntity = mDownloadEntity; - RetrofitManager.getInstance(this).getSensitiveApi().getGameDigestByPackageName(UrlFilterUtils.getFilterQuery("package", packageName)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response>() { - @Override - public void onResponse(List response) { - for (GameDigestEntity gameDigestEntity : response) { - if (!TextUtils.isEmpty(gameDigestEntity.getId())) { // 关注游戏 - if (finalDownloadEntity != null && gameDigestEntity.getId().equals(finalDownloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER))) { - ConcernUtils.INSTANCE.postConcernGameId(MainActivity.this, gameDigestEntity.getId(), null, false); - } - } - } - } - }); - } - - postNewlyInstalledApp(gameId, packageName); - } - if ("卸载".equals(busFour.getType())) { - mPackageViewModel.addUninstalledGame(packageName); - - if (mDownloadEntity != null && mDownloadEntity.isPluggable()) { - Map kv6 = new HashMap<>(); - kv6.put("安装或卸载", "卸载完成"); - DataUtils.onEvent(this, "插件化", mDownloadEntity.getName(), kv6); - -// DataUtils.onMtaEvent(this, -// "插件化_新", -// "位置", mDownloadEntity.getEntrance(), -// "游戏", mDownloadEntity.getName() + "-" + mDownloadEntity.getPlatform(), -// "操作", "卸载完成", -// "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication())); - - PackageInstaller.install(this, mDownloadEntity); - } - - // 更新已安装游戏 - deleteInstalledPackage(packageName); - } - - DataCollectionUtils.uploadInorunstall(this, busFour.getType(), busFour.getPackageName()); - } - - @SuppressWarnings("ResultOfMethodCallIgnored") - @SuppressLint("CheckResult") - private void postNewlyInstalledApp(String gameId, String packageName) { - - // 发送应用变更前都检查一下是否需要把所有应用都上传 - PackageRepository.checkAndUploadAppList(); - - // 更新已安装游戏 - JSONObject packageObject = PackageUtils.getAppBasicInfoByPackageName(packageName); - JSONObject dataObject = new JSONObject(); - JSONObject wrapperObject = new JSONObject(); - try { - dataObject.put("type", "POST"); - dataObject.put("device_id", HaloApp.getInstance().getGid()); - dataObject.put("app", packageObject); - dataObject.put("time", Utils.getTime(getApplicationContext())); - wrapperObject.put("content", dataObject.toString()); - } catch (JSONException e) { - e.printStackTrace(); - } - LoghubUtils.log(wrapperObject, "halo-api-device-installed", true); - - RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), - packageObject.toString()); - // 更新已安装游戏 - RetrofitManager.getInstance(MainActivity.this).getApi() - .postNewlyInstalledApp(HaloApp.getInstance().getGid(), requestBody) - .subscribeOn(Schedulers.io()) - .observeOn(Schedulers.io()) - .subscribe(new EmptyResponse<>()); - - if (!TextUtils.isEmpty(gameId) && UserManager.getInstance().isLoggedIn()) { - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("game_id", gameId); - jsonObject.put("package", packageName); - RequestBody rBody = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()); - - RetrofitManager.getInstance(MainActivity.this).getApi() - .postPlayedGame(UserManager.getInstance().getUserId(), rBody) - .subscribeOn(Schedulers.io()) - .observeOn(Schedulers.io()) - .subscribe(new EmptyResponse<>()); - } catch (JSONException e) { - e.printStackTrace(); - } - } - } - - @SuppressLint("CheckResult") - private void deleteInstalledPackage(String packageName) { - - // 发送应用变更前都检查一下是否需要把所有应用都上传 - PackageRepository.checkAndUploadAppList(); - - // 删除已安装游戏 - JSONObject dataObject = new JSONObject(); - JSONObject wrapperObject = new JSONObject(); - try { - dataObject.put("type", "DELETE"); - dataObject.put("device_id", HaloApp.getInstance().getGid()); - dataObject.put("package", packageName); - dataObject.put("time", Utils.getTime(getApplicationContext())); - wrapperObject.put("content", dataObject.toString()); - } catch (JSONException e) { - e.printStackTrace(); - } - LoghubUtils.log(wrapperObject, "halo-api-device-installed", true); - - // 删除已安装游戏 - RetrofitManager.getInstance(MainActivity.this).getApi() - .deleteInstalledApp(HaloApp.getInstance().getGid(), packageName) - .subscribeOn(Schedulers.io()) - .observeOn(Schedulers.io()) - .subscribe(new EmptyResponse<>()); - } - // 接收登录和登出更新事件统计的 Meta @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBReuse reuse) { diff --git a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java index 336c1462d8..1682ff06fd 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java @@ -9,6 +9,7 @@ import com.gh.common.util.ExtensionsKt; import com.gh.common.util.InstallUtils; import com.gh.common.util.PackageHelper; import com.gh.common.util.PackageUtils; +import com.gh.download.PackageObserver; import com.gh.gamecenter.eventbus.EBPackage; import com.lightgame.utils.Utils; @@ -35,7 +36,9 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { PackageHelper.refreshLocalPackageList(); String versionName = PackageUtils.getVersionByPackage(packageName); - EventBus.getDefault().post(new EBPackage("安装", packageName, versionName)); + EBPackage installEb = new EBPackage("安装", packageName, versionName); + EventBus.getDefault().post(installEb); + PackageObserver.onPackageChanged(installEb); } // 接收卸载广播 @@ -45,7 +48,10 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { Utils.log("卸载了:" + packageName + "包名的程序"); InstallUtils.getInstance(context).removeUninstall(packageName); PackageHelper.refreshLocalPackageList(); - EventBus.getDefault().post(new EBPackage("卸载", packageName, "")); + + EBPackage uninstallEb = new EBPackage("卸载", packageName, ""); + EventBus.getDefault().post(uninstallEb); + PackageObserver.onPackageChanged(uninstallEb); } // 接收替换广播 @@ -57,7 +63,10 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { DataUtils.onEvent(context, "软件更新", "更新完成"); } String versionName = PackageUtils.getVersionByPackage(packageName); + + EBPackage updateEb = new EBPackage("替换", packageName, versionName); EventBus.getDefault().post(new EBPackage("替换", packageName, versionName)); + PackageObserver.onPackageChanged(updateEb); } }); } diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index 3acf559809..e215645e3b 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -33,6 +33,7 @@ import com.gh.common.videolog.VideoRecordUtils; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.Injection; import com.gh.gamecenter.entity.SubjectRecommendEntity; +import com.gh.gamecenter.packagehelper.PackageRepository; import com.gh.gamecenter.receiver.ActivitySkipReceiver; import com.gh.gamecenter.receiver.DownloadReceiver; import com.gh.gamecenter.receiver.InstallAndUninstallReceiver; @@ -63,6 +64,8 @@ public class HaloApp extends Application { private String mUA; private String mOAID = ""; + private boolean mIsPostInitialized = false; // 是否已经延迟初始化过相关组件,避免重复初始化 + public long deviceRamSize = 0; public boolean isBrandNewInstall = false; // 当前用户是否是安装光环后第一次打开 public boolean isRunningForeground = false; // 标记当前 APP 是否处于前台运行中 @@ -145,17 +148,25 @@ public class HaloApp extends Application { if (isUserAcceptPrivacyPolicy(this)) { initPushSdk(); + postInit(); } registerActivityLifecycleCallbacks(new GHActivityLifecycleCallbacksImpl()); } + /** + * 需要延迟初始化的东西,以下代码调用都放置到用户同意了隐私政策之后 + */ public void postInit() { + if (mIsPostInitialized) return; + initDataHelper(); initThirdPartySdk(); FixedRateJobHelper.begin(); + PackageRepository.initData(); + // 刷新内存中的用户信息,避免应用进程重建时因没有用户信息数据而显示为掉登录状态 UserRepository.getInstance(this).getLoginUserInfo(); @@ -177,6 +188,8 @@ public class HaloApp extends Application { } }); } + + mIsPostInitialized = true; } /**