From a5ef80ba3304ff9177e10cc23ba54ff2e143d004 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 7 Dec 2020 11:59:43 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=89=8D=E5=8F=B0=E6=9C=8D=E5=8A=A1=E9=80=A0?= =?UTF-8?q?=E6=88=90=E7=9A=84=E9=97=AA=E9=80=80=20https://git.ghzs.com/hal?= =?UTF-8?q?o/assistant-android/-/issues/7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/LGLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/LGLibrary b/libraries/LGLibrary index c16fa1f534..7b35e95492 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit c16fa1f5345fd58d53fbebc18a23884a16d0c65e +Subproject commit 7b35e9549210330fbc9f80cff11f35792a3a8e23 From 9873ae8946fa06aa02d34c63100c09945333dfd4 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 7 Dec 2020 14:47:51 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E8=BF=98=E5=8E=9F=20MTA=20https://git.gh?= =?UTF-8?q?zs.com/pm/halo-app-issues/-/issues/1092?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../java/com/gh/common/util/DataUtils.java | 131 +++++++++-------- .../main/java/com/gh/common/util/MtaHelper.kt | 133 ++++++++++-------- settings.gradle | 2 +- 4 files changed, 142 insertions(+), 126 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 676517d308..30387f9df4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -352,7 +352,7 @@ dependencies { implementation "com.github.PhilJay:MPAndroidChart:${chart}" implementation project(':libraries:LGLibrary') -// implementation project(':libraries:MTA') + implementation project(':libraries:MTA') implementation project(':libraries:QQShare') // implementation project(':libraries:TalkingData') // implementation project(':libraries:UmengPush') diff --git a/app/src/main/java/com/gh/common/util/DataUtils.java b/app/src/main/java/com/gh/common/util/DataUtils.java index 919c2d155a..7178e6014e 100644 --- a/app/src/main/java/com/gh/common/util/DataUtils.java +++ b/app/src/main/java/com/gh/common/util/DataUtils.java @@ -7,6 +7,7 @@ import android.os.Build; import android.preference.PreferenceManager; import android.text.TextUtils; +import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.exposure.meta.MetaUtil; import com.gh.gamecenter.BuildConfig; @@ -15,9 +16,15 @@ import com.gh.gid.GidHelper; import com.halo.assistant.HaloApp; import com.lightgame.config.CommonDebug; import com.lightgame.utils.Utils; +import com.tencent.stat.MtaSDkException; +import com.tencent.stat.StatConfig; +import com.tencent.stat.StatCrashReporter; +import com.tencent.stat.StatReportStrategy; +import com.tencent.stat.StatService; import java.util.HashMap; import java.util.Map; +import java.util.Properties; import io.sentry.android.core.SentryAndroid; import io.sentry.core.Sentry; @@ -83,42 +90,42 @@ public class DataUtils { // } //MTA -// try { -// /** -// * -// * 不要启用!!!!全部由{@link com.gh.base.AppUncaughtHandler}处理 -// */ -// StatConfig.setAutoExceptionCaught(false); -// -// StatCrashReporter crashReporter = StatCrashReporter.getStatCrashReporter(context); -// crashReporter.setJavaCrashHandlerStatus(false); -//// crashReporter.setEnableInstantReporting(true); -// -// StatConfig.setDebugEnable(false); -// -// // 设置数据上报策略 -// // 测试渠道的时候即时上传,方便查看日志 -// if (Config.DEFAULT_CHANNEL.equals(HaloApp.getInstance().getChannel())) { -// StatConfig.setStatSendStrategy(StatReportStrategy.INSTANT); -// } else { -// StatConfig.setStatSendStrategy(StatReportStrategy.PERIOD); -// StatConfig.setSendPeriodMinutes(5); -// } -// -// // 设置启用Tlink -// StatConfig.setTLinkStatus(true); -// -// StatConfig.init(context); -// StatConfig.setInstallChannel(channel); -// StatConfig.setAntoActivityLifecycleStat(true); -// StatConfig.setAppVersion(PackageUtils.getVersionName()); -// -// // 开启收集服务 -// StatService.startStatService(context, Config.MTA_APPKEY, com.tencent.stat.common.StatConstants.VERSION); -// StatService.registerActivityLifecycleCallbacks(context); -// } catch (MtaSDkException e) { -// e.printStackTrace(); -// } + try { + /** + * + * 不要启用!!!!全部由{@link com.gh.base.AppUncaughtHandler}处理 + */ + StatConfig.setAutoExceptionCaught(false); + + StatCrashReporter crashReporter = StatCrashReporter.getStatCrashReporter(context); + crashReporter.setJavaCrashHandlerStatus(false); +// crashReporter.setEnableInstantReporting(true); + + StatConfig.setDebugEnable(false); + + // 设置数据上报策略 + // 测试渠道的时候即时上传,方便查看日志 + if (Config.DEFAULT_CHANNEL.equals(HaloApp.getInstance().getChannel())) { + StatConfig.setStatSendStrategy(StatReportStrategy.INSTANT); + } else { + StatConfig.setStatSendStrategy(StatReportStrategy.PERIOD); + StatConfig.setSendPeriodMinutes(5); + } + + // 设置启用Tlink + StatConfig.setTLinkStatus(true); + + StatConfig.init(context); + StatConfig.setInstallChannel(channel); + StatConfig.setAntoActivityLifecycleStat(true); + StatConfig.setAppVersion(PackageUtils.getVersionName()); + + // 开启收集服务 + StatService.startStatService(context, Config.MTA_APPKEY, com.tencent.stat.common.StatConstants.VERSION); + StatService.registerActivityLifecycleCallbacks(context); + } catch (MtaSDkException e) { + e.printStackTrace(); + } // init bugly // try { @@ -173,17 +180,17 @@ public class DataUtils { } public static void onEvent(Context var0, String var1, String var2) { -// Properties prop = new Properties(); -// prop.setProperty(var1, var2); -// StatService.trackCustomKVEvent(var0, var1, prop); + Properties prop = new Properties(); + prop.setProperty(var1, var2); + StatService.trackCustomKVEvent(var0, var1, prop); } public static void onPause(Activity var0) { -// StatService.onPause(var0); + StatService.onPause(var0); } public static void onResume(Activity var0) { -// StatService.onResume(var0); + StatService.onResume(var0); } // 游戏启动 @@ -195,30 +202,30 @@ public class DataUtils { } public static void onEvent(Context var0, String var1, String var2, Map var3) { -// Properties prop = new Properties(); -// prop.setProperty("label", var2); -// for (String key : var3.keySet()) { -// prop.setProperty(key, var3.get(key) + ""); -// } -// StatService.trackCustomKVEvent(var0, var1, prop); + Properties prop = new Properties(); + prop.setProperty("label", var2); + for (String key : var3.keySet()) { + prop.setProperty(key, var3.get(key) + ""); + } + StatService.trackCustomKVEvent(var0, var1, prop); } public static void trackTimeEvent(Context context, String eventId, int costTime, String... kv) { -// -// Properties prop = new Properties(); -// for (int i = 0; i < kv.length; i++) { -// if (i % 2 != 0 || i != 0) { -// String key = kv[i - 1]; -// String value = kv[i]; -// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { -// prop.setProperty(key, value); -// } -// } -// } -// -// if (prop.size() == 0) return; -// -// StatService.trackCustomKVTimeIntervalEvent(context, costTime, eventId, prop); + + Properties prop = new Properties(); + for (int i = 0; i < kv.length; i++) { + if (i % 2 != 0 || i != 0) { + String key = kv[i - 1]; + String value = kv[i]; + if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { + prop.setProperty(key, value); + } + } + } + + if (prop.size() == 0) return; + + StatService.trackCustomKVTimeIntervalEvent(context, costTime, eventId, prop); } // 游戏下载 diff --git a/app/src/main/java/com/gh/common/util/MtaHelper.kt b/app/src/main/java/com/gh/common/util/MtaHelper.kt index dc1a2533aa..2bd37b063c 100644 --- a/app/src/main/java/com/gh/common/util/MtaHelper.kt +++ b/app/src/main/java/com/gh/common/util/MtaHelper.kt @@ -1,52 +1,61 @@ package com.gh.common.util +import android.os.Build +import android.text.TextUtils +import com.gh.common.exposure.meta.MetaUtil +import com.gh.gamecenter.BuildConfig +import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils +import com.tencent.stat.StatService +import java.util.* + object MtaHelper { @JvmStatic fun onEvent(eventId: String, vararg kv: String?) { -// val prop = Properties() -// -// if (kv.size == 1) { -// prop.setProperty(kv[0], kv[0]) -// StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) -// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") -// return -// } -// -// for (i in kv.indices) { -// if (i % 2 != 0) { -// val key = kv[i - 1] -// val value = kv[i] -// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { -// prop.setProperty(key, value) -// } -// } -// } -// -// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") -// StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) + val prop = Properties() + + if (kv.size == 1) { + prop.setProperty(kv[0], kv[0]) + StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) + Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") + return + } + + for (i in kv.indices) { + if (i % 2 != 0) { + val key = kv[i - 1] + val value = kv[i] + if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { + prop.setProperty(key, value) + } + } + } + + Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") + StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) } @JvmStatic fun onEventWithTime(eventId: String, time: Int, vararg kv: String?) { -// val prop = Properties() -// for (i in kv.indices) { -// if (i % 2 != 0 || i != 0) { -// val key = kv[i - 1] -// val value = kv[i] -// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { -// prop.setProperty(key, value) -// } -// } -// } -// -// if (prop.size == 0 && kv.size == 1) { -// prop.setProperty(kv[0], kv[0]) -// } -// -// if (prop.size == 0) return -// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}] + last $time seconds") -// StatService.trackCustomKVTimeIntervalEvent(HaloApp.getInstance().application, time, eventId, prop) + val prop = Properties() + for (i in kv.indices) { + if (i % 2 != 0 || i != 0) { + val key = kv[i - 1] + val value = kv[i] + if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { + prop.setProperty(key, value) + } + } + } + + if (prop.size == 0 && kv.size == 1) { + prop.setProperty(kv[0], kv[0]) + } + + if (prop.size == 0) return + Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}] + last $time seconds") + StatService.trackCustomKVTimeIntervalEvent(HaloApp.getInstance().application, time, eventId, prop) } /** @@ -54,29 +63,29 @@ object MtaHelper { */ @JvmStatic fun onEventWithBasicDeviceInfo(eventId: String, vararg kv: String) { -// val prop = Properties() -// for (i in kv.indices) { -// if (i % 2 != 0) { -// val key = kv[i - 1] -// val value = kv[i] -// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { -// prop.setProperty(key, value) -// } -// } -// } -// -// prop.setProperty("光环版本", BuildConfig.VERSION_NAME) -// prop.setProperty("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().application)) -// prop.setProperty("IMEI", MetaUtil.getIMEI()) -// prop.setProperty("机型", Build.MODEL) -// prop.setProperty("厂商", Build.MANUFACTURER) -// prop.setProperty("Android版本", Build.VERSION.RELEASE) -// if (!TextUtils.isEmpty(HaloApp.getInstance().gid)) { -// prop.setProperty("GID", HaloApp.getInstance().gid) -// } -// -// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") -// StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) + val prop = Properties() + for (i in kv.indices) { + if (i % 2 != 0) { + val key = kv[i - 1] + val value = kv[i] + if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { + prop.setProperty(key, value) + } + } + } + + prop.setProperty("光环版本", BuildConfig.VERSION_NAME) + prop.setProperty("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().application)) + prop.setProperty("IMEI", MetaUtil.getIMEI()) + prop.setProperty("机型", Build.MODEL) + prop.setProperty("厂商", Build.MANUFACTURER) + prop.setProperty("Android版本", Build.VERSION.RELEASE) + if (!TextUtils.isEmpty(HaloApp.getInstance().gid)) { + prop.setProperty("GID", HaloApp.getInstance().gid) + } + + Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") + StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) } } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 1b339eb9e9..25b9bf0710 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ include ':app' //include ':libraries:im' include ':libraries:LGLibrary' -//include ':libraries:MTA' +include ':libraries:MTA' include ':libraries:QQShare' //include ':libraries:TalkingData' //include ':libraries:UmengPush' From 7507a027dadacf1165c8ce8d994db2e67c404f13 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Thu, 10 Dec 2020 10:50:42 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=89=80=E6=9C=89=E9=A1=B5=E9=9D=A2=E5=90=8E=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9B=9E=E8=B0=83=E8=A7=A6=E5=8F=91=E9=97=AA?= =?UTF-8?q?=E9=80=80=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/dialog/CertificationDialog.kt | 8 ++++++-- app/src/main/java/com/gh/common/util/DownloadObserver.kt | 9 ++++++--- app/src/main/java/com/gh/common/util/PackageInstaller.kt | 5 ++++- libraries/LGLibrary | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt b/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt index a6294551dc..a2f4e07d51 100644 --- a/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt +++ b/app/src/main/java/com/gh/common/dialog/CertificationDialog.kt @@ -118,7 +118,9 @@ class CertificationDialog(context: Context, private val authDialogEntity: AuthDi //跳转登录页面 private fun gotoLoginPage() { - CheckLoginUtils.checkLogin(AppManager.getInstance().currentActivity() as AppCompatActivity, + val currentActivity = AppManager.getInstance().currentActivity() ?: return + + CheckLoginUtils.checkLogin(currentActivity as AppCompatActivity, null, true, "实名认证弹窗") { if (UserManager.getInstance().isAuth) { listener.onConfirm() @@ -129,7 +131,9 @@ class CertificationDialog(context: Context, private val authDialogEntity: AuthDi //跳转实名认证页面 private fun gotoAuthPage() { - AvoidOnResultManager.getInstance(AppManager.getInstance().currentActivity() as AppCompatActivity) + val currentActivity = AppManager.getInstance().currentActivity() ?: return + + AvoidOnResultManager.getInstance(currentActivity as AppCompatActivity) .startForResult(UserInfoEditActivity.getIntent(context, UserViewModel.TYPE_ID_CARD), object : Callback { override fun onActivityResult(resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK && data != null) { diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index cfcd418c46..d9e1f3586b 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -76,9 +76,10 @@ object DownloadObserver { // MtaHelper.onEventWithBasicDeviceInfo("下载失败弹窗", // "游戏", downloadEntity.name, // "平台", downloadEntity.platform) + val currentActivity = AppManager.getInstance().currentActivity() ?: return - DialogUtils.showAlertDialog(AppManager.getInstance().currentActivity(), "下载失败", "下载链接已失效,建议提交反馈", "立即反馈", "取消", { - SuggestionActivity.startSuggestionActivity(AppManager.getInstance().currentActivity(), + DialogUtils.showAlertDialog(currentActivity, "下载失败", "下载链接已失效,建议提交反馈", "立即反馈", "取消", { + SuggestionActivity.startSuggestionActivity(currentActivity, SuggestType.gameQuestion, "notfound", StringUtils.buildString(downloadEntity.name, ",问题反馈:下载链接失效"), SimpleGameEntity(gameId, downloadEntity.name, "")) @@ -141,7 +142,9 @@ object DownloadObserver { if (gameEntity?.simulator != null) { val isInstalled = PackageUtils.isInstalledFromAllPackage(HaloApp.getInstance().application, gameEntity.simulator!!.apk!!.packageName) if (!isInstalled) { - SimulatorDownloadManager.getInstance().showDownloadDialog(AppManager.getInstance().currentActivity(), gameEntity.simulator, + val currentActivity = AppManager.getInstance().currentActivity() ?: return + + SimulatorDownloadManager.getInstance().showDownloadDialog(currentActivity, gameEntity.simulator, SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.id, gameEntity.name ?: "", null) } diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index e59488d77c..5db42fc727 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -41,7 +41,10 @@ object PackageInstaller { fun install(context: Context, downloadEntity: DownloadEntity, showUnzipToast: Boolean) { val pkgPath = downloadEntity.path val isXapk = XapkInstaller.XAPK_EXTENSION_NAME == pkgPath.getExtension() - InstallPermissionDialogFragment.show(AppManager.getInstance().currentActivity() as AppCompatActivity, downloadEntity) { + + val currentActivity = AppManager.getInstance().currentActivity() ?: return + + InstallPermissionDialogFragment.show(currentActivity as AppCompatActivity, downloadEntity) { // 取消状态栏下载完成的通知,若存在 downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity) diff --git a/libraries/LGLibrary b/libraries/LGLibrary index 7b35e95492..93049eb802 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit 7b35e9549210330fbc9f80cff11f35792a3a8e23 +Subproject commit 93049eb8029d00dfb05f4fa7c48ebb9e2d07c6b1 From 2797135db4e797c279b1be5d0e12a2ea750b2020 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 10 Dec 2020 16:15:41 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=AE=8C=E6=88=90=E5=BA=94=E7=94=A8=E5=90=8E?= =?UTF-8?q?=E7=9A=84=20ANR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../packagehelper/PackageRepository.kt | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt index ae1fce55c8..f71e43a1f5 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -61,7 +61,7 @@ object PackageRepository { val gameUpdateLiveData = MutableLiveData>() val gameInstalledLiveData = MutableLiveData>() - val gameInstalled = ArrayList() + val gameInstalled = Collections.synchronizedList(ArrayList()) val gameUpdate = ArrayList() init { @@ -190,7 +190,7 @@ object PackageRepository { * * @param list 已安装的游戏包名集合 */ - private fun loadInstalledGameDigestAndNotifyData(list: ArrayList) { + private fun loadInstalledGameDigestAndNotifyData(list: ArrayList, onWorkerThreadOnly: Boolean = false) { var isNotifyUpdate = false val latch = ObservableUtil.latch(list.size, { if (isNotifyUpdate || gameUpdateLiveData.value == null) notifyGameUpdateData() @@ -199,33 +199,39 @@ object PackageRepository { for (pkgName in list) { val filterQuery = UrlFilterUtils.getFilterQuery("package", pkgName) - mSensitiveApi.loadGameDataByPackageName(filterQuery) + + var observable = mSensitiveApi.loadGameDataByPackageName(filterQuery) .map(RegionSettingHelper.filterGame) .map(ApkActiveUtils.filterMapperList) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response>() { - override fun onResponse(response: List?) { - if (response != null) { - val gh_id = PackageUtils.getMetaData(HaloApp.getInstance().application, pkgName, "gh_id") - for (game in response) { - if (gh_id == null || gh_id == game.id) { - gameInstalled.add(GameInstall.transformGameInstall(game, pkgName)) - val isCanPluggable = checkGamePlugin(game, pkgName) - val isCanUpdate = checkGameUpdate(game) - if (!isNotifyUpdate && isCanUpdate || isCanPluggable) { - isNotifyUpdate = true - } - } + + if (!onWorkerThreadOnly) { + // 这里面的代码(根据包名获取签名?)或许是造成安装完成后的 ANR 和 startForegroundService did not then call startForeground 的原因 + // 为了避免影响其它地方,这里只处理安装完成后的调用 + observable = observable.observeOn(AndroidSchedulers.mainThread()) + } + observable.subscribe(object : Response>() { + override fun onResponse(response: List?) { + if (response != null) { + val gh_id = PackageUtils.getMetaData(HaloApp.getInstance().application, pkgName, "gh_id") + for (game in response) { + if (gh_id == null || gh_id == game.id) { + gameInstalled.add(GameInstall.transformGameInstall(game, pkgName)) + val isCanPluggable = checkGamePlugin(game, pkgName) + val isCanUpdate = checkGameUpdate(game) + if (!isNotifyUpdate && isCanUpdate || isCanPluggable) { + isNotifyUpdate = true } } - latch.countDown() } + } + latch.countDown() + } - override fun onFailure(e: HttpException?) { - latch.countDown() - } - }) + override fun onFailure(e: HttpException?) { + latch.countDown() + } + }) } } @@ -303,7 +309,7 @@ object PackageRepository { val list = ArrayList() list.add(pkgName) - loadInstalledGameDigestAndNotifyData(list) + loadInstalledGameDigestAndNotifyData(list, true) } /** From 6b533c8d09f5e2f357c7ed8e3d8ff07a4f892c98 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 10 Dec 2020 16:54:27 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E5=B1=8F=E8=94=BD=20MT?= =?UTF-8?q?A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../java/com/gh/common/util/DataUtils.java | 131 ++++++++--------- .../main/java/com/gh/common/util/MtaHelper.kt | 133 ++++++++---------- settings.gradle | 2 +- 4 files changed, 126 insertions(+), 142 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 30387f9df4..676517d308 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -352,7 +352,7 @@ dependencies { implementation "com.github.PhilJay:MPAndroidChart:${chart}" implementation project(':libraries:LGLibrary') - implementation project(':libraries:MTA') +// implementation project(':libraries:MTA') implementation project(':libraries:QQShare') // implementation project(':libraries:TalkingData') // implementation project(':libraries:UmengPush') diff --git a/app/src/main/java/com/gh/common/util/DataUtils.java b/app/src/main/java/com/gh/common/util/DataUtils.java index 7178e6014e..919c2d155a 100644 --- a/app/src/main/java/com/gh/common/util/DataUtils.java +++ b/app/src/main/java/com/gh/common/util/DataUtils.java @@ -7,7 +7,6 @@ import android.os.Build; import android.preference.PreferenceManager; import android.text.TextUtils; -import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.exposure.meta.MetaUtil; import com.gh.gamecenter.BuildConfig; @@ -16,15 +15,9 @@ import com.gh.gid.GidHelper; import com.halo.assistant.HaloApp; import com.lightgame.config.CommonDebug; import com.lightgame.utils.Utils; -import com.tencent.stat.MtaSDkException; -import com.tencent.stat.StatConfig; -import com.tencent.stat.StatCrashReporter; -import com.tencent.stat.StatReportStrategy; -import com.tencent.stat.StatService; import java.util.HashMap; import java.util.Map; -import java.util.Properties; import io.sentry.android.core.SentryAndroid; import io.sentry.core.Sentry; @@ -90,42 +83,42 @@ public class DataUtils { // } //MTA - try { - /** - * - * 不要启用!!!!全部由{@link com.gh.base.AppUncaughtHandler}处理 - */ - StatConfig.setAutoExceptionCaught(false); - - StatCrashReporter crashReporter = StatCrashReporter.getStatCrashReporter(context); - crashReporter.setJavaCrashHandlerStatus(false); -// crashReporter.setEnableInstantReporting(true); - - StatConfig.setDebugEnable(false); - - // 设置数据上报策略 - // 测试渠道的时候即时上传,方便查看日志 - if (Config.DEFAULT_CHANNEL.equals(HaloApp.getInstance().getChannel())) { - StatConfig.setStatSendStrategy(StatReportStrategy.INSTANT); - } else { - StatConfig.setStatSendStrategy(StatReportStrategy.PERIOD); - StatConfig.setSendPeriodMinutes(5); - } - - // 设置启用Tlink - StatConfig.setTLinkStatus(true); - - StatConfig.init(context); - StatConfig.setInstallChannel(channel); - StatConfig.setAntoActivityLifecycleStat(true); - StatConfig.setAppVersion(PackageUtils.getVersionName()); - - // 开启收集服务 - StatService.startStatService(context, Config.MTA_APPKEY, com.tencent.stat.common.StatConstants.VERSION); - StatService.registerActivityLifecycleCallbacks(context); - } catch (MtaSDkException e) { - e.printStackTrace(); - } +// try { +// /** +// * +// * 不要启用!!!!全部由{@link com.gh.base.AppUncaughtHandler}处理 +// */ +// StatConfig.setAutoExceptionCaught(false); +// +// StatCrashReporter crashReporter = StatCrashReporter.getStatCrashReporter(context); +// crashReporter.setJavaCrashHandlerStatus(false); +//// crashReporter.setEnableInstantReporting(true); +// +// StatConfig.setDebugEnable(false); +// +// // 设置数据上报策略 +// // 测试渠道的时候即时上传,方便查看日志 +// if (Config.DEFAULT_CHANNEL.equals(HaloApp.getInstance().getChannel())) { +// StatConfig.setStatSendStrategy(StatReportStrategy.INSTANT); +// } else { +// StatConfig.setStatSendStrategy(StatReportStrategy.PERIOD); +// StatConfig.setSendPeriodMinutes(5); +// } +// +// // 设置启用Tlink +// StatConfig.setTLinkStatus(true); +// +// StatConfig.init(context); +// StatConfig.setInstallChannel(channel); +// StatConfig.setAntoActivityLifecycleStat(true); +// StatConfig.setAppVersion(PackageUtils.getVersionName()); +// +// // 开启收集服务 +// StatService.startStatService(context, Config.MTA_APPKEY, com.tencent.stat.common.StatConstants.VERSION); +// StatService.registerActivityLifecycleCallbacks(context); +// } catch (MtaSDkException e) { +// e.printStackTrace(); +// } // init bugly // try { @@ -180,17 +173,17 @@ public class DataUtils { } public static void onEvent(Context var0, String var1, String var2) { - Properties prop = new Properties(); - prop.setProperty(var1, var2); - StatService.trackCustomKVEvent(var0, var1, prop); +// Properties prop = new Properties(); +// prop.setProperty(var1, var2); +// StatService.trackCustomKVEvent(var0, var1, prop); } public static void onPause(Activity var0) { - StatService.onPause(var0); +// StatService.onPause(var0); } public static void onResume(Activity var0) { - StatService.onResume(var0); +// StatService.onResume(var0); } // 游戏启动 @@ -202,30 +195,30 @@ public class DataUtils { } public static void onEvent(Context var0, String var1, String var2, Map var3) { - Properties prop = new Properties(); - prop.setProperty("label", var2); - for (String key : var3.keySet()) { - prop.setProperty(key, var3.get(key) + ""); - } - StatService.trackCustomKVEvent(var0, var1, prop); +// Properties prop = new Properties(); +// prop.setProperty("label", var2); +// for (String key : var3.keySet()) { +// prop.setProperty(key, var3.get(key) + ""); +// } +// StatService.trackCustomKVEvent(var0, var1, prop); } public static void trackTimeEvent(Context context, String eventId, int costTime, String... kv) { - - Properties prop = new Properties(); - for (int i = 0; i < kv.length; i++) { - if (i % 2 != 0 || i != 0) { - String key = kv[i - 1]; - String value = kv[i]; - if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { - prop.setProperty(key, value); - } - } - } - - if (prop.size() == 0) return; - - StatService.trackCustomKVTimeIntervalEvent(context, costTime, eventId, prop); +// +// Properties prop = new Properties(); +// for (int i = 0; i < kv.length; i++) { +// if (i % 2 != 0 || i != 0) { +// String key = kv[i - 1]; +// String value = kv[i]; +// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { +// prop.setProperty(key, value); +// } +// } +// } +// +// if (prop.size() == 0) return; +// +// StatService.trackCustomKVTimeIntervalEvent(context, costTime, eventId, prop); } // 游戏下载 diff --git a/app/src/main/java/com/gh/common/util/MtaHelper.kt b/app/src/main/java/com/gh/common/util/MtaHelper.kt index 2bd37b063c..dc1a2533aa 100644 --- a/app/src/main/java/com/gh/common/util/MtaHelper.kt +++ b/app/src/main/java/com/gh/common/util/MtaHelper.kt @@ -1,61 +1,52 @@ package com.gh.common.util -import android.os.Build -import android.text.TextUtils -import com.gh.common.exposure.meta.MetaUtil -import com.gh.gamecenter.BuildConfig -import com.halo.assistant.HaloApp -import com.lightgame.utils.Utils -import com.tencent.stat.StatService -import java.util.* - object MtaHelper { @JvmStatic fun onEvent(eventId: String, vararg kv: String?) { - val prop = Properties() - - if (kv.size == 1) { - prop.setProperty(kv[0], kv[0]) - StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) - Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") - return - } - - for (i in kv.indices) { - if (i % 2 != 0) { - val key = kv[i - 1] - val value = kv[i] - if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { - prop.setProperty(key, value) - } - } - } - - Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") - StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) +// val prop = Properties() +// +// if (kv.size == 1) { +// prop.setProperty(kv[0], kv[0]) +// StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) +// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") +// return +// } +// +// for (i in kv.indices) { +// if (i % 2 != 0) { +// val key = kv[i - 1] +// val value = kv[i] +// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { +// prop.setProperty(key, value) +// } +// } +// } +// +// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") +// StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) } @JvmStatic fun onEventWithTime(eventId: String, time: Int, vararg kv: String?) { - val prop = Properties() - for (i in kv.indices) { - if (i % 2 != 0 || i != 0) { - val key = kv[i - 1] - val value = kv[i] - if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { - prop.setProperty(key, value) - } - } - } - - if (prop.size == 0 && kv.size == 1) { - prop.setProperty(kv[0], kv[0]) - } - - if (prop.size == 0) return - Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}] + last $time seconds") - StatService.trackCustomKVTimeIntervalEvent(HaloApp.getInstance().application, time, eventId, prop) +// val prop = Properties() +// for (i in kv.indices) { +// if (i % 2 != 0 || i != 0) { +// val key = kv[i - 1] +// val value = kv[i] +// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { +// prop.setProperty(key, value) +// } +// } +// } +// +// if (prop.size == 0 && kv.size == 1) { +// prop.setProperty(kv[0], kv[0]) +// } +// +// if (prop.size == 0) return +// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}] + last $time seconds") +// StatService.trackCustomKVTimeIntervalEvent(HaloApp.getInstance().application, time, eventId, prop) } /** @@ -63,29 +54,29 @@ object MtaHelper { */ @JvmStatic fun onEventWithBasicDeviceInfo(eventId: String, vararg kv: String) { - val prop = Properties() - for (i in kv.indices) { - if (i % 2 != 0) { - val key = kv[i - 1] - val value = kv[i] - if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { - prop.setProperty(key, value) - } - } - } - - prop.setProperty("光环版本", BuildConfig.VERSION_NAME) - prop.setProperty("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().application)) - prop.setProperty("IMEI", MetaUtil.getIMEI()) - prop.setProperty("机型", Build.MODEL) - prop.setProperty("厂商", Build.MANUFACTURER) - prop.setProperty("Android版本", Build.VERSION.RELEASE) - if (!TextUtils.isEmpty(HaloApp.getInstance().gid)) { - prop.setProperty("GID", HaloApp.getInstance().gid) - } - - Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") - StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) +// val prop = Properties() +// for (i in kv.indices) { +// if (i % 2 != 0) { +// val key = kv[i - 1] +// val value = kv[i] +// if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) { +// prop.setProperty(key, value) +// } +// } +// } +// +// prop.setProperty("光环版本", BuildConfig.VERSION_NAME) +// prop.setProperty("网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().application)) +// prop.setProperty("IMEI", MetaUtil.getIMEI()) +// prop.setProperty("机型", Build.MODEL) +// prop.setProperty("厂商", Build.MANUFACTURER) +// prop.setProperty("Android版本", Build.VERSION.RELEASE) +// if (!TextUtils.isEmpty(HaloApp.getInstance().gid)) { +// prop.setProperty("GID", HaloApp.getInstance().gid) +// } +// +// Utils.log("MTA", "$eventId + [${kv.joinToString(" , ")}]") +// StatService.trackCustomKVEvent(HaloApp.getInstance().application, eventId, prop) } } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 25b9bf0710..1b339eb9e9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ include ':app' //include ':libraries:im' include ':libraries:LGLibrary' -include ':libraries:MTA' +//include ':libraries:MTA' include ':libraries:QQShare' //include ':libraries:TalkingData' //include ':libraries:UmengPush' From 5246d6e743fec941f4987e4632b8c2cf7854d218 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 10 Dec 2020 17:02:46 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=204.5.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index c42493a39d..4c0ad10966 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 26 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 250 - versionName = "4.5.0" + versionCode = 251 + versionName = "4.5.1" applicationId = "com.gh.gamecenter" // AndroidX From 69d9854b446fafbc34dd82b30c18848809551c75 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Mon, 14 Dec 2020 14:32:19 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E5=BE=AE=E8=B0=83=E6=96=B0=E5=88=86?= =?UTF-8?q?=E7=B1=BB-=E7=B2=BE=E9=80=89UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/catalog_subject_game_item.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/layout/catalog_subject_game_item.xml b/app/src/main/res/layout/catalog_subject_game_item.xml index f40e40942e..fe12c9a580 100644 --- a/app/src/main/res/layout/catalog_subject_game_item.xml +++ b/app/src/main/res/layout/catalog_subject_game_item.xml @@ -28,6 +28,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" + android:layout_marginLeft="4dp" + android:layout_marginRight="4dp" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" From 3fbcd33f984e96a40b38eed4ce8d6bbe09d0e07e Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 14 Dec 2020 17:10:55 +0800 Subject: [PATCH 08/19] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=AE=8C=E6=88=90=E8=A7=A6=E5=8F=91=E7=9A=84?= =?UTF-8?q?=20ANR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/PackageUtils.java | 5 +++++ app/src/main/java/com/gh/download/PackageObserver.kt | 4 +++- .../receiver/InstallAndUninstallReceiver.java | 10 +++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index 791c8b2eb5..3ec4f507c8 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -185,6 +185,11 @@ public class PackageUtils { public static boolean compareSignatureBetweenInstalledAppWithApk(Context context, String packageName, String apkFilePath) { try { + // 统计签名比较使用的频率 (大文件会触发 ANR) + SentryHelper.INSTANCE.onEvent( + "SIGNATURE_COMPARE", + "packageName", packageName); + Signature sig = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0]; // Fuck HUAWEI, 华为系统调用 getPackageArchiveInfo 获取魔羯 apk 的签名时会耗时超过5秒造成 ANR,没有找到解决方法 diff --git a/app/src/main/java/com/gh/download/PackageObserver.kt b/app/src/main/java/com/gh/download/PackageObserver.kt index 1ef2fedc79..0538ba56ab 100644 --- a/app/src/main/java/com/gh/download/PackageObserver.kt +++ b/app/src/main/java/com/gh/download/PackageObserver.kt @@ -7,6 +7,7 @@ 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 @@ -106,7 +107,8 @@ object PackageObserver { } }) } - postNewlyInstalledApp(gameId, packageName) + + runOnIoThread { postNewlyInstalledApp(gameId, packageName) } } if ("卸载" == busFour.type) { 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 1682ff06fd..d44b15daf1 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import com.gh.common.AppExecutor; import com.gh.common.util.DataUtils; import com.gh.common.util.ExtensionsKt; import com.gh.common.util.InstallUtils; @@ -38,7 +39,14 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { String versionName = PackageUtils.getVersionByPackage(packageName); EBPackage installEb = new EBPackage("安装", packageName, versionName); EventBus.getDefault().post(installEb); - PackageObserver.onPackageChanged(installEb); + if (PackageUtils.isAppOnForeground(context)) { + PackageObserver.onPackageChanged(installEb); + } else { + // 处于后台运行的时候尝试延迟 1 秒再触发 onPackageChanged (猜测是引起 ANR 的原因) + AppExecutor.getUiExecutor().executeWithDelay(() -> { + PackageObserver.onPackageChanged(installEb); + }, 1000); + } } // 接收卸载广播 From 02a6ec9f7df5e73d783cfbd6a8fb9a9de3d6f4be Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 14 Dec 2020 17:15:20 +0800 Subject: [PATCH 09/19] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=87=B3=204.5.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 4c0ad10966..473112eb49 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 26 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 251 - versionName = "4.5.1" + versionCode = 252 + versionName = "4.5.2" applicationId = "com.gh.gamecenter" // AndroidX From 3a9132ff8c44594c050e6e13705e0ff394a1e050 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 15 Dec 2020 18:05:35 +0800 Subject: [PATCH 10/19] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=96=B0=E5=88=86=E7=B1=BB-=E7=B2=BE=E9=80=89UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt | 6 ++++++ app/src/main/res/layout/catalog_subject_game_item.xml | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt index 385cc629e3..4f0c8050bb 100644 --- a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt @@ -14,6 +14,7 @@ import com.gh.common.exposure.ExposureEvent import com.gh.common.exposure.ExposureSource import com.gh.common.exposure.IExposable import com.gh.common.util.DirectUtils +import com.gh.common.util.dip2px import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter @@ -100,6 +101,11 @@ class SpecialCatalogAdapter(context: Context, private val mCatalogViewModel: Cat is CatalogImageItemHolder -> { val imageEntity = mEntityList[position].bigImage!! holder.binding.run { + image.layoutParams = image.layoutParams.apply { + val imageWidth = mContext.resources.displayMetrics.widthPixels - (80F + 16F + 16F).dip2px() + height = imageWidth * 9 / 16 + } + entity = imageEntity.image var exposureEvent: ExposureEvent? = null diff --git a/app/src/main/res/layout/catalog_subject_game_item.xml b/app/src/main/res/layout/catalog_subject_game_item.xml index fe12c9a580..2b6ec63019 100644 --- a/app/src/main/res/layout/catalog_subject_game_item.xml +++ b/app/src/main/res/layout/catalog_subject_game_item.xml @@ -28,10 +28,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:layout_marginLeft="4dp" - android:layout_marginRight="4dp" - android:singleLine="true" - android:ellipsize="marquee" + android:layout_marginLeft="8dp" + android:layout_marginRight="8dp" + android:maxLines="2" + android:ellipsize="end" android:marqueeRepeatLimit="marquee_forever" android:gravity="center" android:includeFontPadding="false" From e7c4886219986ff5d4bd617bb95f72838d7bc4c1 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 21 Dec 2020 10:15:20 +0800 Subject: [PATCH 11/19] =?UTF-8?q?=E7=BC=A9=E7=AA=84=20Sentry=20ANR=20?= =?UTF-8?q?=E7=9A=84=E4=B8=8A=E6=8A=A5=E6=9D=A1=E4=BB=B6=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BD=B0=E7=82=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/DataUtils.java | 9 +++++++++ app/src/main/java/com/gh/common/util/PackageUtils.java | 9 +++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/DataUtils.java b/app/src/main/java/com/gh/common/util/DataUtils.java index 919c2d155a..dd3edff11b 100644 --- a/app/src/main/java/com/gh/common/util/DataUtils.java +++ b/app/src/main/java/com/gh/common/util/DataUtils.java @@ -42,6 +42,15 @@ public class DataUtils { } SentryAndroid.init(context, options -> { + // Sentry 疯狂报 ANR (很大一部分还是莫名奇妙的 ANR)严重影响到其它闪退日志的收集 + // 这里将它局限到只有官网渠道的包才统计 ANR + if ("GH_206".equals(channel)) { + options.setAnrEnabled(true); + options.setAnrTimeoutIntervalMillis(6000); + } else { + options.setAnrEnabled(false); + } + options.setDebug(BuildConfig.DEBUG); options.setEnableSessionTracking(true); options.setEnvironment(BuildConfig.FLAVOR); diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index 3ec4f507c8..9b18c5d367 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -183,16 +183,13 @@ public class PackageUtils { return null; } + // TODO 找一个更好的办法来比较签名并且不触发 ANR public static boolean compareSignatureBetweenInstalledAppWithApk(Context context, String packageName, String apkFilePath) { try { - // 统计签名比较使用的频率 (大文件会触发 ANR) - SentryHelper.INSTANCE.onEvent( - "SIGNATURE_COMPARE", - "packageName", packageName); - + // 据 Sentry 统计,刚上架一个周末的包里对这个方法有 700+ 次调用,然后其中一部分会造成 ANR Signature sig = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0]; - // Fuck HUAWEI, 华为系统调用 getPackageArchiveInfo 获取魔羯 apk 的签名时会耗时超过5秒造成 ANR,没有找到解决方法 + // 调用 getPackageArchiveInfo 获取较大的 apk 的签名时会耗时超过5秒造成 ANR,没有找到解决方法 // 如果可以的话尽量避免调用 getPackageArchiveInfo 方法 Signature releaseSig = context.getPackageManager().getPackageArchiveInfo(apkFilePath, PackageManager.GET_SIGNATURES).signatures[0]; return sig.hashCode() == releaseSig.hashCode(); From e406c900277471a6c65df278f5f071b916ca5036 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 21 Dec 2020 11:17:34 +0800 Subject: [PATCH 12/19] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88=E5=92=8C=E6=95=B0=E7=BB=84=E8=B6=8A?= =?UTF-8?q?=E7=95=8C=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/observer/VolumeObserver.kt | 7 +++++- .../gh/gamecenter/SplashScreenActivity.java | 22 +++++++++---------- .../gh/gamecenter/baselist/ListAdapter.java | 1 + .../download/GameDownloadFragment.java | 3 +++ .../gamedetail/GameDetailFragment.kt | 6 ++--- .../gamedetail/fuli/FuLiFragment.kt | 4 ++-- .../gamedetail/video/TopVideoView.kt | 2 +- .../border/AvatarBorderFragment.kt | 9 +++++--- .../gamecenter/security/BindPhoneFragment.kt | 4 ++-- .../detail/VideoDetailContainerViewModel.kt | 5 +++-- 10 files changed, 38 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/gh/common/observer/VolumeObserver.kt b/app/src/main/java/com/gh/common/observer/VolumeObserver.kt index 434c10a623..89f2a4204e 100644 --- a/app/src/main/java/com/gh/common/observer/VolumeObserver.kt +++ b/app/src/main/java/com/gh/common/observer/VolumeObserver.kt @@ -20,7 +20,12 @@ class VolumeObserver(var context: Context, handler: Handler, var callback: MuteC super.onChange(selfChange) val audio = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager - val currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC) + var currentVolume = 0 + + tryCatchInRelease { + // 部分设备(Meizu 7.1.2 M6 Note)的 audioManager getStreamVolume 内部会触发空指针 :( + currentVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC) + } val delta = previousVolume - currentVolume diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index 6ddb9be05c..380cebd9bd 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -300,7 +300,7 @@ public class SplashScreenActivity extends BaseActivity { finish(); } - private void uploadTeaAndGdtData(){ + private void uploadTeaAndGdtData() { // 在可能获取了相关权限后才初始化SDK/发送激活数据 // TeaHelper.init(getApplication(), HaloApp.getInstance().getChannel()); try { @@ -422,25 +422,25 @@ public class SplashScreenActivity extends BaseActivity { // 检查下载文件夹下是否有旧版本的光环助手的包,有则删除 @SuppressWarnings("ResultOfMethodCallIgnored") private void deleteOutdatedUpdatePackage() { - File folder = new File(FileUtils.getDownloadDir(this) + File.separator); - if (folder.isDirectory()) { - for (File file : folder.listFiles()) { - if (!file.isDirectory() && file.getName().startsWith("光环助手V")) { - String name = file.getName(); - int index = name.indexOf("_"); - if (index != -1) { - try { + try { + File folder = new File(FileUtils.getDownloadDir(this) + File.separator); + if (folder.isDirectory()) { + for (File file : folder.listFiles()) { + if (!file.isDirectory() && file.getName().startsWith("光环助手V")) { + String name = file.getName(); + int index = name.indexOf("_"); + if (index != -1) { String versionString = name.substring(name.indexOf("V") + 1, index); Version currentVersion = new Version(PackageUtils.getVersionName()); if (currentVersion.isHigherThan(versionString) || currentVersion.isEqual(versionString)) { file.delete(); } - } catch (Exception exception) { - exception.printStackTrace(); } } } } + } catch (Exception e) { + e.printStackTrace(); } } diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java b/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java index 23705689d5..4dc9a36498 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java @@ -20,6 +20,7 @@ public abstract class ListAdapter extends BaseRecyclerAdapter { public static final int FOOTER_ITEM_COUNT = 1; public static final int TOP_ITEM_COUNT = 1; + // TODO mEntityList 适配多线程读写 protected List mEntityList = new ArrayList<>(); protected boolean mIsOver; diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java index aed802de92..09775a2d6b 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -79,6 +79,9 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi @Nullable Integer location = adapter.getLocation(downloadEntity.getUrl()); String xapkStatus = downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS); if (location != null && XapkUnzipStatus.UNZIPPING.name().equals(xapkStatus)) { + + if (location > adapter.getDoneList().size()) return; + adapter.getDoneList().set(location, downloadEntity); adapter.notifyItemChanged(location + 1); return; diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index c80cc165a3..213f8d9ea7 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -199,7 +199,7 @@ class GameDetailFragment : NormalFragment() { if (mGameEntity != null && mGameEntity!!.getApk().size == 1) { val url = mGameEntity!!.getApk()[0].url if (downloadEntity.url == url) { - if ("pause" != DownloadManager.getInstance(context).getStatus(downloadEntity.url).status) { + if ("pause" != DownloadManager.getInstance(context).getStatus(downloadEntity.url)?.status) { mDownloadEntity = downloadEntity DetailDownloadUtils.detailInvalidate(detailViewHolder) } @@ -282,8 +282,8 @@ class GameDetailFragment : NormalFragment() { mMaxWidth = resources.displayMetrics.widthPixels - DisplayUtils.dip2px(40f) - val args = arguments - mAutoDownload = args!!.getBoolean(EntranceUtils.KEY_AUTO_DOWNLOAD) + val args = arguments ?: Bundle() + mAutoDownload = args.getBoolean(EntranceUtils.KEY_AUTO_DOWNLOAD) mTraceEvent = args.getParcelable(EntranceUtils.KEY_TRACE_EVENT) mSkipGameComment = args.getBoolean(EntranceUtils.KEY_SKIP_GAME_COMMENT) mDestinationTab = args.getInt(EntranceUtils.KEY_TARGET, -1) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiFragment.kt index 644f8e9c74..791c5dcfa2 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/FuLiFragment.kt @@ -84,8 +84,8 @@ class FuLiFragment : BaseFragment(), IScrollable { mAdapter?.itemList = it.data mAdapter?.notifyDataSetChanged() } else { - containerRl.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.white)) - noDataImg.visibility = View.VISIBLE + containerRl?.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.white)) + noDataImg?.visibility = View.VISIBLE } }) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt index 17a732c418..3e55400dca 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt @@ -84,7 +84,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS clearFullscreenLayout() } - errorBtn.setOnClickListener { + errorBtn?.setOnClickListener { debounceActionWithInterval(errorBtn.id, 1000) { if (!com.shuyu.gsyvideoplayer.utils.NetworkUtils.isAvailable(mContext)) { Utils.toast(context, "网络异常,请检查手机网络状态") diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt index 4fb048114e..99a5d0d096 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt @@ -10,7 +10,10 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import com.gh.base.fragment.BaseFragment_TabLayout import com.gh.base.fragment.WaitingDialogFragment -import com.gh.common.util.* +import com.gh.common.util.DisplayUtils +import com.gh.common.util.ImageUtils +import com.gh.common.util.observeNonNull +import com.gh.common.util.viewModelProvider import com.gh.gamecenter.ImageViewerActivity import com.gh.gamecenter.R import com.gh.gamecenter.SelectUserIconActivity @@ -48,14 +51,14 @@ class AvatarBorderFragment : BaseFragment_TabLayout() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mUserViewModel = viewModelProvider(UserViewModel.Factory(HaloApp.getInstance().application)) - mUserViewModel.loginObsUserinfo.observe(this, Observer { + mUserViewModel.loginObsUserinfo.observeNonNull(this) { if (it.data.background?.url.isNullOrEmpty()) { ImageUtils.display(mBinding.forumBackground, R.drawable.bg_avatar_border) } else { ImageUtils.display(mBinding.forumBackground, it.data.background?.url) } mBinding.userAvatar.display(it.data.iconBorder?.url, it.data.icon ?: "") - }) + } mUserViewModel.editObsUserinfo.observe(this, Observer { mBinding.userAvatar.displayAvatar(it.data.icon ?: "") }) diff --git a/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt b/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt index ffaf58198b..5dea499109 100644 --- a/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/security/BindPhoneFragment.kt @@ -117,7 +117,7 @@ class BindPhoneFragment : NormalFragment() { // 如果当前登录方式是手机号登录,也要更新loginType UserManager.getInstance().loginTokenEntity?.apply { - if (loginType.length == 11) loginType = phoneNum + if (loginType?.length == 11) loginType = phoneNum } requireActivity().finish() @@ -183,7 +183,7 @@ class BindPhoneFragment : NormalFragment() { } @OnClick(R.id.bind_phone_skip, R.id.bind_phone_captcha, R.id.bind_phone_btn) - override fun onClick(v : View) { + override fun onClick(v: View) { // 防止快速点击 if (ClickUtils.isFastDoubleClick()) return diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt index 16ef0ad21b..f612c8e2ed 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerViewModel.kt @@ -11,7 +11,6 @@ import com.gh.common.runOnIoThread import com.gh.common.util.UrlFilterUtils import com.gh.common.util.createRequestBodyAny import com.gh.common.util.tryCatchInRelease -import com.gh.common.util.tryWithDefaultCatch import com.gh.download.DownloadManager import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.MyVideoEntity @@ -455,8 +454,10 @@ class VideoDetailContainerViewModel(application: Application) : AndroidViewModel } fun shareVideoStatistics(videoEntity: VideoEntity?) { + if (videoEntity == null) return + RetrofitManager.getInstance(getApplication()) - .api.shareVideoStatistics(videoEntity!!.id) + .api.shareVideoStatistics(videoEntity.id) .subscribeOn(Schedulers.io()) .subscribe(object : BiResponse() { override fun onSuccess(data: JsonObject) { From a39a8c2cce1576f38d00a3a68afd6f8ac06264d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8E=89=E4=B9=85?= <1484288157@qq.com> Date: Mon, 21 Dec 2020 16:02:00 +0800 Subject: [PATCH 13/19] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=B5=81=E6=BB=91=E5=8A=A8=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= =?UTF-8?q?=202.=E4=BF=AE=E5=A4=8DWebView=E9=97=AA=E9=80=80=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/view/dsbridge/DWebView.java | 17 ++++++++++++++++- .../detail/VideoDetailContainerFragment.kt | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java b/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java index ebf1d7107e..ab81607c0f 100644 --- a/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java +++ b/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java @@ -414,7 +414,7 @@ public class DWebView extends WebView { e.printStackTrace(); try { super.loadUrl("javascript:" + script); - } catch (Exception ignored){ + } catch (Exception ignored) { } } @@ -1023,4 +1023,19 @@ public class DWebView extends WebView { mainHandler.post(runnable); } + @Override + public void setOverScrollMode(int mode) { + try { + super.setOverScrollMode(mode); + } catch (Throwable e) { + String trace = Log.getStackTraceString(e); + if (trace.contains("android.content.pm.PackageManager$NameNotFoundException") + || trace.contains("java.lang.RuntimeException: Cannot load WebView") + || trace.contains("android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installed")) { + e.printStackTrace(); + } else { + throw e; + } + } + } } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt index 02f3abd295..a222679c11 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt @@ -218,6 +218,7 @@ class VideoDetailContainerFragment : BaseLazyFragment(), OnBackPressedListener { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) val (itemHeight, distance) = getDistance() + if (itemHeight <= 0) return val offsetY = distance % itemHeight val alpha = 1 - offsetY.toFloat() / itemHeight val homeVideoFragment = this@VideoDetailContainerFragment.parentFragment as? HomeVideoFragment From a944a7f730bdab42e59e77fc611e4c5dc08580f6 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 23 Dec 2020 10:55:37 +0800 Subject: [PATCH 14/19] =?UTF-8?q?=E5=A4=84=E7=90=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E8=B6=8A=E7=95=8C=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/simulator/SimulatorGameManager.kt | 4 ++-- app/src/main/java/com/gh/common/util/DataUtils.java | 4 ---- app/src/main/java/com/gh/download/DownloadManager.java | 4 ++-- .../com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt | 2 +- .../gamecenter/video/detail/VideoDetailContainerFragment.kt | 2 +- 5 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt index fdccf4757b..d32ebc25c2 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt @@ -33,7 +33,7 @@ object SimulatorGameManager { @JvmStatic fun deleteLocalGames(names: List) { - val downloadEntityList = DownloadDao.getInstance(HaloApp.getInstance().application).all + val downloadEntityList = DownloadManager.getInstance(HaloApp.getInstance().application).allDownloadEntity names.forEach { name -> val downloadEntity = downloadEntityList.find { it.name == name } if (downloadEntity != null) { @@ -48,7 +48,7 @@ object SimulatorGameManager { @JvmStatic fun deleteLocalGame(name: String) { - val downloadEntityList = DownloadDao.getInstance(HaloApp.getInstance().application).all + val downloadEntityList = DownloadManager.getInstance(HaloApp.getInstance().application).allDownloadEntity val downloadEntity = downloadEntityList.find { it.name == name } if (downloadEntity != null) { val file = File(downloadEntity.path) diff --git a/app/src/main/java/com/gh/common/util/DataUtils.java b/app/src/main/java/com/gh/common/util/DataUtils.java index 919c2d155a..25c3632b9b 100644 --- a/app/src/main/java/com/gh/common/util/DataUtils.java +++ b/app/src/main/java/com/gh/common/util/DataUtils.java @@ -57,10 +57,6 @@ public class DataUtils { }); Sentry.configureScope(scope -> { - User user = new User(); - user.setId(HaloApp.getInstance().getGid()); - scope.setUser(user); - if (BuildConfig.BUILD_TIME != 0L) { scope.setTag("alias", "内测版" + BuildConfig.VERSION_NAME + "_" + BuildConfig.BUILD_TIME); } else { diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 9ed07f5a5a..ba7d0d624b 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -543,7 +543,7 @@ public class DownloadManager implements DownloadStatusListener { } public List getAllSimulatorDownloadEntity() { - List downloadEntityList = mDownloadDao.getAll(); + List downloadEntityList = getAllDownloadEntity(); ArrayList filteredDownloadEntityList = new ArrayList<>(); for (DownloadEntity downloadEntity : downloadEntityList) { if (ExtensionsKt.isSimulatorGame(downloadEntity) && downloadEntity.getStatus() == DownloadStatus.done) { @@ -560,7 +560,7 @@ public class DownloadManager implements DownloadStatusListener { if (CommonDebug.IS_DEBUG) { CommonDebug.logMethodName(this); } - List all = mDownloadDao.getAll(); + List all = getAllDownloadEntity(); return filterSilentDownloadTask(all); } diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt index 6498e74956..cf6fc07687 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameFragment.kt @@ -122,7 +122,7 @@ class SimulatorGameFragment : NormalFragment() { MtaHelper.onEvent("我的光环_新", "模拟器游戏", "点击${mTypeAliasList[it]}") if (mCurrentPage != it) { - (mFragmentsList[mCurrentPage] as SimulatorGameListFragment).resetPage() + (mFragmentsList.safelyGetInRelease(mCurrentPage) as? SimulatorGameListFragment)?.resetPage() mCurrentPage = it } } diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt index 02f3abd295..8a19973479 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt @@ -242,7 +242,7 @@ class VideoDetailContainerFragment : BaseLazyFragment(), OnBackPressedListener { } override fun onPageRelease(isNext: Boolean, position: Int) { - val video = mViewModel.videoList.value?.get(position) + val video = mViewModel.videoList.value?.safelyGetInRelease(position) video?.let { ExoCacheManager.cancel(video.url) From aa41fd98e85208a4b85448c8dc2932523a33af60 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 24 Dec 2020 10:49:49 +0800 Subject: [PATCH 15/19] =?UTF-8?q?=E9=87=8D=E7=BD=AE=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E7=9A=84=E6=96=87=E5=AD=97=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=BC=98=E5=85=88=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/GameUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java index c729270bdd..472c667924 100644 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ b/app/src/main/java/com/gh/common/util/GameUtils.java @@ -129,14 +129,14 @@ public class GameUtils { } } } - if (installCount != 0) { - return context.getString(R.string.launch); + if (doneCount != 0) { + return context.getString(R.string.install); } else if (pluginCount != 0 && !SimulatorGameManager.isSimulatorGame(gameEntity)) { return context.getString(R.string.pluggable); } else if (updateCount != 0 && !SimulatorGameManager.isSimulatorGame(gameEntity)) { return context.getString(R.string.update); - } else if (doneCount != 0) { - return context.getString(R.string.install); + } else if (installCount != 0) { + return context.getString(R.string.launch); } else if (gameEntity.getVersionNumber().contains("无版号") && Config.isGameDomeSwitchOpen() && !SimulatorGameManager.isSimulatorGame(gameEntity)) { return context.getString(R.string.attempt); } else { From c8b81ab56aa6713e7d3e2215f79e9d0a69704aaa Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 24 Dec 2020 11:08:34 +0800 Subject: [PATCH 16/19] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=A8=A1=E6=8B=9F?= =?UTF-8?q?=E5=99=A8=E6=B8=B8=E6=88=8F=E5=9C=A8=E4=B8=8B=E8=BD=BD=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E4=B8=AD=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/GameUtils.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java index 472c667924..73b8dffb6c 100644 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ b/app/src/main/java/com/gh/common/util/GameUtils.java @@ -78,6 +78,9 @@ public class GameUtils { int pluginCount = 0; // 可插件化数量 int updateCount = 0; // 可更新数量 int installCount = 0; // 已安装数量 + + boolean isRelatedEmulatorInstalled = false; // 若该游戏是模拟器游戏时其对应的模拟器是否已经安装 + DownloadEntity downloadEntity; Object gh_id; apkFor: @@ -123,12 +126,18 @@ public class GameUtils { boolean isInstalled = PackageUtils.isInstalledFromAllPackage(context, gameEntity.getSimulator().getApk().getPackageName()); if (isInstalled) { installCount++; + isRelatedEmulatorInstalled = true; } else { doneCount++; } } } } + + if (isRelatedEmulatorInstalled && doneCount != 0) { + return context.getString(R.string.launch); + } + if (doneCount != 0) { return context.getString(R.string.install); } else if (pluginCount != 0 && !SimulatorGameManager.isSimulatorGame(gameEntity)) { From 69e248b389a017b5fcc377f7678b8732f078dd05 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 24 Dec 2020 11:12:37 +0800 Subject: [PATCH 17/19] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=204.5.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 473112eb49..ea4c6dfe99 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 26 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 252 - versionName = "4.5.2" + versionCode = 253 + versionName = "4.5.3" applicationId = "com.gh.gamecenter" // AndroidX From 8d21a4f774c56e27158ffa21d9804779ff572d5b Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 25 Dec 2020 15:53:02 +0800 Subject: [PATCH 18/19] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=89=E8=83=BD?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E8=8B=A5=E5=B9=B2bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/energy/CommodityAdapter.kt | 5 ++- .../gh/gamecenter/energy/CommodityFragment.kt | 21 +++++++-- .../gamecenter/energy/EnergyCenterFragment.kt | 16 ++++--- .../gamecenter/energy/EnergyHouseFragment.kt | 44 ++++++++++++++----- .../res/layout/fragment_commodity_list.xml | 4 +- .../res/layout/fragment_energy_center.xml | 14 +++--- .../main/res/layout/fragment_energy_house.xml | 4 +- 7 files changed, 77 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/energy/CommodityAdapter.kt b/app/src/main/java/com/gh/gamecenter/energy/CommodityAdapter.kt index 2a54498422..f0fe4dd70e 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/CommodityAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/CommodityAdapter.kt @@ -58,7 +58,10 @@ class CommodityAdapter(context: Context): ListAdapter(context) executePendingBindings() commodity.tag?.run { - if (id.isNotBlank()) tagContainer.addView(getTagView(this)) + if (id.isNotBlank()) { + tagContainer.removeAllViews() + tagContainer.addView(getTagView(this)) + } } originEnergy.paint.flags = Paint.STRIKE_THRU_TEXT_FLAG diff --git a/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt b/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt index 84ef6b44a8..032bf57425 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt @@ -100,13 +100,17 @@ class CommodityFragment : ListFragment() { } fun refreshPage(size: SubjectSettingEntity.Size) { - mListViewModel.sortSize = size - onRefresh() + if (size != mListViewModel.sortSize) { + mListViewModel.sortSize = size + onRefresh() + } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mListRefresh?.isNestedScrollingEnabled = false + if (mEntrance == "光能中心") { + mListRefresh?.isNestedScrollingEnabled = false + } } override fun onLoadDone() { @@ -114,6 +118,17 @@ class CommodityFragment : ListFragment() { mListRefresh?.isEnabled = false } + override fun onLoadEmpty() { + super.onLoadEmpty() + // RecyclerView 被隐藏的话会导致不能 AppBar 不能滑动 + mListRv.visibility = View.VISIBLE + } + + override fun onLoadError() { + super.onLoadError() + mListRv.visibility = View.VISIBLE + } + fun setNestedScrollingEnabled(enable: Boolean) { mListRv.isNestedScrollingEnabled = enable } diff --git a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt index 26976ef61b..2b24190ade 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt @@ -1,6 +1,8 @@ package com.gh.gamecenter.energy +import android.os.Build import android.os.Bundle +import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View import android.widget.CheckedTextView @@ -88,7 +90,12 @@ class EnergyCenterFragment : BaseLazyFragment() { } mBinding.run { - val screenHeight = resources.displayMetrics.heightPixels + val screenHeight = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) + resources.displayMetrics.heightPixels + else + DisplayMetrics() + .apply { requireActivity().windowManager.defaultDisplay.getRealMetrics(this) } + .heightPixels val behavior = BottomSheetBehavior.from(bottomSheet) val toolbarHeight = screenHeight - DisplayUtils.getStatusBarHeight(resources) - 48F.dip2px() behavior.peekHeight = screenHeight - 312F.dip2px() @@ -105,8 +112,7 @@ class EnergyCenterFragment : BaseLazyFragment() { } } - override fun onSlide(bottomSheet: View, slideOffset: Float) { - } + override fun onSlide(bottomSheet: View, slideOffset: Float) {} }) } } @@ -182,13 +188,13 @@ class EnergyCenterFragment : BaseLazyFragment() { } } - @OnClick(R.id.backIv, R.id.EnergyRecord, R.id.lotteryCenter, R.id.signSwitch, R.id.signBubble, + @OnClick(R.id.backIv, R.id.energyRecord, R.id.lotteryCenter, R.id.signSwitch, R.id.signBubble, R.id.oneDay, R.id.twoDay, R.id.threeDay, R.id.fourDay, R.id.fiveDay, R.id.sixDay, R.id.sevenDay) fun onViewClicked(v: View) { when (v.id) { R.id.backIv -> requireActivity().finish() - R.id.EnergyRecord -> { + R.id.energyRecord -> { ifLogin("光能中心-光能记录") { DirectUtils.directToEnergyRecord(requireContext()) } diff --git a/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt b/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt index 99b24e8813..ef8b6e4a3f 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt @@ -19,6 +19,7 @@ import com.gh.gamecenter.databinding.FragmentEnergyHouseBinding import com.gh.gamecenter.entity.CommodityCategoryEntity import com.gh.gamecenter.entity.SubjectSettingEntity import com.gh.gamecenter.entity.TaskEntity +import com.gh.gamecenter.entity.UserInfoEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.personalhome.UserHomeViewModel import com.gh.gamecenter.user.UserViewModel @@ -34,12 +35,14 @@ class EnergyHouseFragment: BaseLazyFragment() { private lateinit var mUserHomeViewModel: UserHomeViewModel private lateinit var mEnergyHouseViewModel: EnergyHouseViewModel private lateinit var mCommodityCategories: List + private var mUserInfo: UserInfoEntity? = null private val mTitleList = ArrayList() private val mFragments = ArrayList() - private val mTasks = ArrayList() + private var mTasks = ArrayList() private val mRollUserNames = ArrayList() private val mRollCommodityNames = ArrayList() - private var currentSizeIndex = 0 + private var mCurrentSizeIndex = 0 + private var mCurrentSize = SubjectSettingEntity.Size() override fun getLayoutId() = 0 @@ -70,9 +73,9 @@ class EnergyHouseFragment: BaseLazyFragment() { mUserViewModel.loginObsUserinfo.observeNonNull(viewLifecycleOwner) { if (it.data != null) { mBinding.run { - val userInfo = it.data - userIcon.display(userInfo.iconBorder?.url, userInfo.icon ?: "") - userName.text = userInfo.name + mUserInfo = it.data + userIcon.display(mUserInfo?.iconBorder?.url, mUserInfo?.icon ?: "") + userName.text = mUserInfo?.name } mUserHomeViewModel.userId = UserManager.getInstance().userId mUserHomeViewModel.getUserEnergy() @@ -101,12 +104,20 @@ class EnergyHouseFragment: BaseLazyFragment() { mEnergyHouseViewModel.noviceTasks.observeNonNull(viewLifecycleOwner) { mTasks.clear() - mTasks.addAll(it) - mEnergyHouseViewModel.getDailyTasks() + if (it.size > 4) { + mTasks.addAll(it.subList(0, 5)) + initTaskView() + } else { + mTasks.addAll(it) + mEnergyHouseViewModel.getDailyTasks() + } } mEnergyHouseViewModel.dailyTasks.observeNonNull(viewLifecycleOwner) { mTasks.addAll(it) + if (mTasks.size > 4) { + mTasks = ArrayList(mTasks.subList(0, 5)) + } initTaskView() } @@ -203,6 +214,10 @@ class EnergyHouseFragment: BaseLazyFragment() { updateTabStyle(tab, true) } }) + + viewpager.doOnPageSelected { + (mFragments[it] as CommodityFragment).refreshPage(mCurrentSize) + } } initSize() @@ -244,10 +259,11 @@ class EnergyHouseFragment: BaseLazyFragment() { val tv = item.findViewById(R.id.size_tv) tv.text = size.text item.setOnClickListener { - if (currentSizeIndex != index) { + if (mCurrentSizeIndex != index) { changeSizeBg(index) (mFragments[mBinding.viewpager.currentItem] as CommodityFragment).refreshPage(size) - currentSizeIndex = index + mCurrentSizeIndex = index + mCurrentSize = size } } } @@ -269,12 +285,18 @@ class EnergyHouseFragment: BaseLazyFragment() { } - @OnClick(R.id.backIv, R.id.EnergyRecord, R.id.energyOrder) + @OnClick(R.id.backIv, R.id.userEnergy, R.id.energyRecord, R.id.energyOrder) fun onViewClicked(v: View) { when (v.id) { R.id.backIv -> requireActivity().finish() - R.id.EnergyRecord -> { + R.id.userEnergy -> { + mUserInfo?.run { + DialogUtils.showEnergyDialog(requireContext(), name, mBinding.userEnergy.text.toString()) + } + } + + R.id.energyRecord -> { ifLogin("光能屋-光能记录") { DirectUtils.directToEnergyRecord(requireContext(), 1) } diff --git a/app/src/main/res/layout/fragment_commodity_list.xml b/app/src/main/res/layout/fragment_commodity_list.xml index 855ca2a04e..f279bc102e 100644 --- a/app/src/main/res/layout/fragment_commodity_list.xml +++ b/app/src/main/res/layout/fragment_commodity_list.xml @@ -11,7 +11,7 @@ + android:layout_height="match_parent" /> diff --git a/app/src/main/res/layout/fragment_energy_center.xml b/app/src/main/res/layout/fragment_energy_center.xml index d24454d1b5..dd6fb3b737 100644 --- a/app/src/main/res/layout/fragment_energy_center.xml +++ b/app/src/main/res/layout/fragment_energy_center.xml @@ -71,7 +71,7 @@ + android:src="@drawable/ic_energy_center_sign_normal" /> + android:src="@drawable/ic_energy_center_sign_normal" /> + app:layout_constraintTop_toBottomOf="@+id/energyRecord" /> Date: Fri, 25 Dec 2020 15:54:52 +0800 Subject: [PATCH 19/19] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/personalhome/border/AvatarBorderFragment.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt index 08e75ceab8..925703445e 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/border/AvatarBorderFragment.kt @@ -10,10 +10,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import com.gh.base.fragment.BaseFragment_TabLayout import com.gh.base.fragment.WaitingDialogFragment -import com.gh.common.util.DisplayUtils -import com.gh.common.util.ImageUtils -import com.gh.common.util.observeNonNull -import com.gh.common.util.viewModelProvider +import com.gh.common.util.* import com.gh.gamecenter.ImageViewerActivity import com.gh.gamecenter.R import com.gh.gamecenter.SelectUserIconActivity