diff --git a/app/src/main/java/com/gh/common/AppExecutor.kt b/app/src/main/java/com/gh/common/AppExecutor.kt index b00acff35e..96034216ac 100644 --- a/app/src/main/java/com/gh/common/AppExecutor.kt +++ b/app/src/main/java/com/gh/common/AppExecutor.kt @@ -12,7 +12,7 @@ import java.util.concurrent.* * * [ioExecutor] 是一个最大线程数固定的线程池,较为繁重的 IO 任务可以交给它 * [uiExecutor] 是主线程的包裹,需要切换至主线程执行可以用它 - * [lightWeightIoExecutor] 是一个单线程的线程池,轻量级的 IO 任务可以交给它 + * [lightWeightIoExecutor] 是一个单线程的线程池,轻量级且需要保证同一线程的 IO 任务可以交给它 * */ object AppExecutor { diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt new file mode 100644 index 0000000000..ba33a91d13 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -0,0 +1,232 @@ +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.HashMap + +object DownloadObserver { + + private val mApplication = HaloApp.getInstance().application + + @JvmStatic + fun initObserver() { + val dataWatcher = object : DataWatcher() { + override fun onDataChanged(downloadEntity: DownloadEntity) { + 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.getInstance(mApplication).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(downloadEntity.gameId, downloadEntity.name, "")) + }, null) + return + } else if (DownloadStatus.neterror == downloadEntity.status || DownloadStatus.timeout == downloadEntity.status) { + + Utils.toast(mApplication, "网络不稳定,下载任务已暂停") + DataLogUtils.uploadNeterrorLog(mApplication, downloadEntity) + + MtaHelper.onEventWithBasicDeviceInfo("下载自动暂停", + "游戏", downloadEntity.name, + "平台", downloadEntity.platform) + } + if (DownloadStatus.done == downloadEntity.status) { + if (downloadEntity.name.contains(mApplication.getString(R.string.app_name))) { + MtaHelper.onEvent("软件更新", "下载完成") + 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.getInstance(mApplication).cancel(downloadEntity.url) + } else { + if (PackageUtils.isCanLaunchSetup(mApplication, downloadEntity.path)) { + downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" + mApplication.startActivity(PackageUtils.getInstallIntent(mApplication, downloadEntity.path)) + } else { + // 弹出卸载提示框 + EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path)) + } + } + } + } + + // 统计下载完成 + uploadData(downloadEntity.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", "", "", "", "", "")) + } + + DownloadNotificationHelper.addOrUpdateDownloadNotification(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() + 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() + kv2["版本"] = downloadEntity.platform + kv2["状态"] = "下载完成" + kv2["位置"] = downloadEntity.entrance + kv2["游戏分平台"] = downloadEntity.name + "-" + platform + kv2["光环助手版本"] = BuildConfig.VERSION_NAME + DataUtils.onEvent(mApplication, "游戏下载位置", downloadEntity.name, kv2) + + if (downloadEntity.isPluggable) { + val kv3 = HashMap() + kv3["下载"] = "下载完成" + kv3["版本"] = downloadEntity.platform + kv3["位置"] = downloadEntity.entrance + 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(downloadEntity.gameId, downloadEntity.name), + 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() + 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()) + } + +} \ 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 611e6124e2..3e10a8a0dc 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -174,118 +174,6 @@ public class MainActivity extends BaseActivity { private Handler handler = new Handler(); - // todo 全局监听可能不应该放这里, MainActivity 销毁后此处无法工作 - // 黄壮华 添加观察者 修改2015/8/15 - private DataWatcher dataWatcher = new DataWatcher() { - @Override - public void onDataChanged(DownloadEntity downloadEntity) { - if (downloadEntity.getStatus() != DownloadStatus.downloading) { - LogUtils.uploadDownloadEvent(downloadEntity); - } - - if (DownloadStatus.hijack.equals(downloadEntity.getStatus())) { - // 链接被劫持 - processHijack(downloadEntity); - String nameAndPlatform = downloadEntity.getName() + ":" - + PlatformUtils.getInstance(getApplicationContext()).getPlatformName(downloadEntity.getPlatform()); - DataUtils.onMtaEvent(getApplicationContext(), "下载劫持", "游戏名字", nameAndPlatform, "网络状态" + DeviceUtils.getNetwork(getApplication())); - return; - } else if (DownloadStatus.notfound.equals(downloadEntity.getStatus())) { - // 404 Not Found - // 删除任务 - downloadEntity.setStatus(DownloadStatus.cancel); - DownloadManager.getInstance(getApplicationContext()).cancel(downloadEntity.getUrl()); - toast("该链接已失效!请联系管理员。"); - - MtaHelper.onEventWithBasicDeviceInfo("下载失败弹窗", - "游戏", downloadEntity.getName(), - "平台", downloadEntity.getPlatform()); - - DialogUtils.showAlertDialog(AppManager.getInstance().currentActivity() - , "下载失败" - , "下载链接已失效,建议提交反馈" - , "立即反馈", "取消" - , () -> SuggestionActivity.startSuggestionActivity(AppManager.getInstance().currentActivity(), - SuggestType.gameQuestion, "notfound", - StringUtils.buildString(downloadEntity.getName(), ",问题反馈:下载链接失效"), - new SimpleGameEntity(downloadEntity.getGameId(), downloadEntity.getName(), "")), null); - return; - } else if (DownloadStatus.neterror.equals(downloadEntity.getStatus()) - || DownloadStatus.timeout.equals(downloadEntity.getStatus())) { - - toast("网络不稳定,下载任务已暂停"); - DataLogUtils.uploadNeterrorLog(MainActivity.this, downloadEntity); - - MtaHelper.onEventWithBasicDeviceInfo("下载自动暂停", - "游戏", downloadEntity.getName(), - "平台", downloadEntity.getPlatform()); - } - if (DownloadStatus.done.equals(downloadEntity.getStatus())) { - if (downloadEntity.getName().contains(getString(R.string.app_name))) { - DataUtils.onEvent(MainActivity.this, "软件更新", "下载完成"); - startActivity(PackageUtils.getInstallIntent(MainActivity.this, downloadEntity.getPath(), true)); - DataLogUtils.uploadUpgradeLog(MainActivity.this, "install"); //上传更新安装数据 - } else { - statDoneEvent(downloadEntity); - - String platform = PlatformUtils.getInstance(getApplicationContext()) - .getPlatformName(downloadEntity.getPlatform()); - if (platform != null) { - if (downloadEntity.isPluggable()) { - // 弹出插件化提示框 - EventBus.getDefault().post(new EBShowDialog(PLUGGABLE, downloadEntity.getPath())); - } else if (downloadEntity.isPlugin()) { - toast(downloadEntity.getName() + " - " + platform + " - 下载完成"); - } else { - toast(downloadEntity.getName() + " - 下载完成"); - } - } else { - toast(downloadEntity.getName() + " - 下载完成"); - } - if (!downloadEntity.isPluggable()) { - // 是否是自动安装 - if (mSp.getBoolean(SettingsFragment.AUTO_INSTALL_SP_KEY, true)) { - if (FileUtils.isEmptyFile(downloadEntity.getPath())) { - toast(R.string.install_failure_hint); - DownloadManager.getInstance(MainActivity.this).cancel(downloadEntity.getUrl()); - } else { - if (PackageUtils.isCanLaunchSetup(getApplicationContext(), downloadEntity.getPath())) { - downloadEntity.getMeta().put(Constants.MARK_ALREADY_TRIGGERED_INSTALLATION, "YES"); - startActivity(PackageUtils.getInstallIntent(MainActivity.this, downloadEntity.getPath())); - } else { - // 弹出卸载提示框 - EventBus.getDefault().post(new EBShowDialog(PLUGGABLE, downloadEntity.getPath())); - } - } - } - } - - // 统计下载完成 - uploadData(downloadEntity.getGameId(), downloadEntity.getPlatform()); - } - - // 下载过程分析统计 - PackageManager pm = getApplicationContext().getPackageManager(); - PackageInfo packageInfo = pm.getPackageArchiveInfo(downloadEntity.getPath(), PackageManager.GET_ACTIVITIES); - if (packageInfo == null) { - MtaHelper.onEventWithBasicDeviceInfo("解析包错误分析" - , "游戏名字", downloadEntity.getName() + ":" - + PlatformUtils.getInstance(getApplicationContext()).getPlatformName(downloadEntity.getPlatform())); - - MtaHelper.onEventWithBasicDeviceInfo( - "解析包错误_新", - "游戏", downloadEntity.getName() + ":" + PlatformUtils.getInstance(getApplicationContext()).getPlatformName(downloadEntity.getPlatform())); - } - } - - if (downloadEntity.getStatus() == DownloadStatus.done) { - EventBus.getDefault().post(new EBDownloadStatus("done", "", "", "", "", "")); - } - - DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity); - } - }; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -327,9 +215,6 @@ public class MainActivity extends BaseActivity { DataUtils.getGid(); } - // 添加观察者 - DownloadManager.getInstance(this).addObserver(dataWatcher); - mPackageViewModel = ViewModelProviders.of(this, new PackageViewModel.Factory()).get(PackageViewModel.class); final String message = Config.getExceptionMsg(); @@ -445,8 +330,6 @@ public class MainActivity extends BaseActivity { @Override protected void onDestroy() { super.onDestroy(); - // 退出后,同样需要更新通知栏进度 -// DownloadManager.getInstance(this).removeObserver(dataWatcher); handler.removeCallbacksAndMessages(null); } @@ -517,11 +400,6 @@ public class MainActivity extends BaseActivity { private void checkNotificationPermission() { // 仅登录后再启动光环时请求一次权限 - /*if (!SPUtils.getBoolean(Constants.HAS_REQUESTED_NOTIFICATION_PERMISSIONS) - && UserManager.getInstance().isLoggedIn()) { - SPUtils.setBoolean(Constants.HAS_REQUESTED_NOTIFICATION_PERMISSIONS, true); - showNotificationHintDialog(); - }*/ if (UserManager.getInstance().isLoggedIn()) { NotificationHelper.showNotificationHintDialog(NotificationUgc.LOGIN); } @@ -540,73 +418,6 @@ public class MainActivity extends BaseActivity { .subscribe(new Response<>()); } - // 统计下载完成事件 - private void statDoneEvent(DownloadEntity downloadEntity) { - ExposureUtils.DownloadType type; - String platform = PlatformUtils.getInstance(HaloApp.getInstance().getApplication()).getPlatformName(downloadEntity.getPlatform()); - - Map kv1 = new HashMap<>(); - kv1.put("版本", platform); - kv1.put("状态", "下载完成"); - kv1.put("用户机型", Build.MODEL); - kv1.put("设备IMEI", Util_System_Phone_State.getDeviceId(HaloApp.getInstance().getApplication())); - kv1.put("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication())); - kv1.put("光环助手版本", BuildConfig.VERSION_NAME); - if (downloadEntity.isUpdate()) { - type = ExposureUtils.DownloadType.UPDATE; - if (downloadEntity.isPlugin()) { - type = ExposureUtils.DownloadType.PLUGIN_UPDATE; - } - DataUtils.onEvent(MainActivity.this, "游戏更新", downloadEntity.getName(), kv1); - } else { - type = ExposureUtils.DownloadType.DOWNLOAD; - } - - Map kv2 = new HashMap<>(); - kv2.put("版本", downloadEntity.getPlatform()); - kv2.put("状态", "下载完成"); - kv2.put("位置", downloadEntity.getEntrance()); - kv2.put("游戏分平台", downloadEntity.getName() + "-" + platform); - kv2.put("光环助手版本", BuildConfig.VERSION_NAME); - DataUtils.onEvent(MainActivity.this, "游戏下载位置", downloadEntity.getName(), kv2); - - if (downloadEntity.isPluggable()) { - Map kv3 = new HashMap<>(); - kv3.put("下载", "下载完成"); - kv3.put("版本", downloadEntity.getPlatform()); - kv3.put("位置", downloadEntity.getEntrance()); - type = ExposureUtils.DownloadType.PLUGIN_DOWNLOAD; - DataUtils.onEvent(MainActivity.this, "插件化", downloadEntity.getName(), kv3); - - DataUtils.onMtaEvent(this, - "插件化_新", - "位置", downloadEntity.getEntrance(), - "游戏", downloadEntity.getName() + "-" + downloadEntity.getPlatform(), - "操作", "下载完成", - "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication())); - } - - ExposureUtils.logADownloadCompleteExposureEvent( - new GameEntity(downloadEntity.getGameId(), downloadEntity.getName()), - downloadEntity.getPlatform(), - downloadEntity.getExposureTrace(), - type); - - DataCollectionUtils.uploadDownload(this, downloadEntity, "完成"); - } - - private void processHijack(DownloadEntity downloadEntity) { - // 删除任务 - downloadEntity.setStatus(DownloadStatus.cancel); - DownloadManager.getInstance(getApplicationContext()).cancel(downloadEntity.getUrl()); - // 弹出提示框 - EventBus.getDefault().post(new EBShowDialog(DOWNLOAD_HIJACK)); - // 记录链接被劫持 - DataCollectionUtils.uploadHijack(this, downloadEntity); - // 上传劫持log - DataLogUtils.uploadHijack(this, downloadEntity); - } - @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && !mMainWrapperFragment.onHandleBackPressed()) { diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index a8b505fc6f..1aa1c5b741 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -18,6 +18,7 @@ import com.gh.common.loghub.LoghubUtils; import com.gh.common.util.DataUtils; import com.gh.common.util.DeviceUtils; import com.gh.common.util.DownloadNotificationHelper; +import com.gh.common.util.DownloadObserver; import com.gh.common.util.GdtHelper; import com.gh.common.util.HomeBottomBarHelper; import com.gh.common.util.PackageHelper; @@ -159,6 +160,10 @@ public class HaloApp extends TinkerAppLike { // 耗时操作 AppExecutor.getIoExecutor().execute(() -> { + // 初始化全局下载监听 + DownloadObserver.initObserver(); + + // 刷新内存中的用户信息,避免应用进程重建时因没有用户信息数据而显示为掉登录状态 UserRepository.getInstance(getApplication()).getLoginUserInfo(); GdtHelper.INSTANCE.init(getApplication());