diff --git a/app/src/main/java/com/gh/ad/SplashAdVideoView.kt b/app/src/main/java/com/gh/ad/SplashAdVideoView.kt index 4c95627aeb..990c0ed865 100644 --- a/app/src/main/java/com/gh/ad/SplashAdVideoView.kt +++ b/app/src/main/java/com/gh/ad/SplashAdVideoView.kt @@ -20,11 +20,11 @@ class SplashAdVideoView @JvmOverloads constructor( fun startPlay(cover: String, url: String) { - Debuger.enable() GSYVideoType.setShowType(SCREEN_TYPE_FULL) + GSYVideoType.setRenderType(GSYVideoType.SUFRACE) CustomManager.getCustomManager(getKey()).isNeedMute = true - setUp(url, false, "") + setUp(url, true, "") val ivCover = findViewById(R.id.thumbImage) ImageUtils.display(ivCover, cover) @@ -51,6 +51,7 @@ class SplashAdVideoView @JvmOverloads constructor( fun clearAll() { GSYVideoType.setShowType(GSYVideoType.SCREEN_TYPE_DEFAULT) + GSYVideoType.setRenderType(GSYVideoType.TEXTURE) release() CustomManager.removeManager(getKey()) } diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index 11451803f0..3c93f17df4 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -20,6 +20,7 @@ import com.gh.gamecenter.common.retrofit.BiResponse; import com.gh.gamecenter.common.retrofit.Response; import com.gh.gamecenter.common.utils.DarkModeUtils; import com.gh.gamecenter.common.utils.EnvHelper; +import com.gh.gamecenter.core.AppExecutor; import com.gh.gamecenter.core.utils.GsonUtils; import com.gh.gamecenter.core.utils.SPUtils; import com.gh.gamecenter.core.utils.UrlFilterUtils; @@ -47,7 +48,6 @@ import java.util.Locale; import io.reactivex.Single; import io.reactivex.SingleSource; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.BehaviorSubject; @@ -225,7 +225,6 @@ public class Config { RetrofitManager.getInstance() .getVApi().getSettings(BuildConfig.VERSION_NAME, Build.VERSION.SDK_INT) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { @Override public void onSuccess(VSetting data) { @@ -258,7 +257,6 @@ public class Config { } }) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { @Override public void onSuccess(AppEntity data) { @@ -290,7 +288,6 @@ public class Config { RetrofitManager.getInstance() .getApi().getSettings(PackageUtils.getGhVersionName(), channel) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response() { @Override public void onResponse(SettingsEntity response) { @@ -303,7 +300,7 @@ public class Config { edit.apply(); if (!SPUtils.getBoolean(Constants.SP_TEENAGER_MODE)) { - EventBus.getDefault().post(new EBReuse("Refresh")); + AppExecutor.getUiExecutor().execute(() -> EventBus.getDefault().post(new EBReuse("Refresh"))); } } }); @@ -311,7 +308,6 @@ public class Config { RetrofitManager.getInstance() .getApi().getNewSettings(Build.MANUFACTURER, Build.MODEL, channel, Build.VERSION.SDK_INT, BuildConfig.VERSION_NAME) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { @Override public void onSuccess(NewSettingsEntity data) { @@ -326,7 +322,6 @@ public class Config { RetrofitManager.getInstance() .getApi().getGameGuidePopup(Build.MANUFACTURER, Build.VERSION.RELEASE, Build.MODEL, channel, BuildConfig.VERSION_NAME) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { @Override public void onSuccess(GameGuidePopupEntity data) { @@ -338,7 +333,6 @@ public class Config { if (manufacturer.equals("OPPO") || manufacturer.equals("VIVO")) { RetrofitManager.getInstance().getNewApi().getBrowserHintUrl(manufacturer) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { @Override public void onSuccess(ResponseBody data) { @@ -369,7 +363,6 @@ public class Config { RetrofitManager.getInstance() .getNewApi().getNewSettings(PackageUtils.getGhVersionName(), channel, filterString) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { @Override public void onSuccess(NewApiSettingsEntity data) { @@ -378,7 +371,7 @@ public class Config { mNewSimulatorEntity = data.getSimulator(); if (HaloApp.getInstance().isNewForThisVersion && mNightModeSetting != null && mNightModeSetting.getInstall()) { DarkModeUtils.INSTANCE.updateFollowSystemDarkModeToSp(true); - DarkModeUtils.INSTANCE.initDarkMode(); + AppExecutor.getUiExecutor().execute(DarkModeUtils.INSTANCE::initDarkMode); } SPUtils.setString(Constants.SP_NEW_API_SETTINGS, GsonUtils.toJson(data)); @@ -396,7 +389,7 @@ public class Config { // 更新包名监听是否开启 if (mNewApiSettingsEntity.isPackageObserveEnable()) { - observePackageChange(mNewApiSettingsEntity.getPackageObserveActions()); + AppExecutor.getUiExecutor().execute(() -> observePackageChange(mNewApiSettingsEntity.getPackageObserveActions())); } } }); diff --git a/app/src/main/java/com/gh/common/provider/AppProviderImpl.kt b/app/src/main/java/com/gh/common/provider/AppProviderImpl.kt index 1d5db4b28d..c0a483340a 100644 --- a/app/src/main/java/com/gh/common/provider/AppProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/AppProviderImpl.kt @@ -89,4 +89,8 @@ class AppProviderImpl : IAppProvider { } override fun getPluginVersion(): String = VCore.getInstance().getPluginVersion() + + override fun initImageLoaderIfNeeded() { + HaloApp.getInstance().initFresco() + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/SignatureRepository.kt b/app/src/main/java/com/gh/common/util/SignatureRepository.kt index 618afc0264..20c9e0d549 100644 --- a/app/src/main/java/com/gh/common/util/SignatureRepository.kt +++ b/app/src/main/java/com/gh/common/util/SignatureRepository.kt @@ -3,12 +3,12 @@ package com.gh.common.util import android.annotation.SuppressLint import com.gh.gamecenter.common.entity.SignatureEntity import com.gh.gamecenter.common.retrofit.BiResponse -import com.gh.gamecenter.common.utils.singleToMain import com.gh.gamecenter.common.utils.toJson import com.gh.gamecenter.common.utils.toObject import com.gh.gamecenter.core.utils.MD5Utils import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.schedulers.Schedulers /** * 存储光环网游使用的签名 @@ -24,7 +24,7 @@ object SignatureRepository { RetrofitManager.getInstance() .newApi .ghSignature - .compose(singleToMain()) + .subscribeOn(Schedulers.io()) .subscribe(object : BiResponse>() { override fun onSuccess(data: ArrayList) { signDigestList = ArrayList() diff --git a/app/src/main/java/com/gh/gamecenter/entity/BottomTab.kt b/app/src/main/java/com/gh/gamecenter/entity/BottomTab.kt index 16ae14d2da..304ec886d7 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/BottomTab.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/BottomTab.kt @@ -19,7 +19,7 @@ data class BottomTab( @DrawableRes val iconSelector: Int = 0, // 本地字段 @SerializedName("js_code") - val jsCode: String = "", // js代码 + var jsCode: String = "", // js代码 val link: LinkEntity? = null, // 通用链接 @SerializedName("search_style") val searchStyle: SearchStyle = SearchStyle(), // 搜索样式 diff --git a/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt index 62fd62c15c..c0b327667f 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/StartupAdEntity.kt @@ -39,6 +39,6 @@ class StartupAdEntity( class TimeEntity(val start: Long = 0, val end: Long = 0) companion object { - private const val AD_TYPE_IMG = "displayInterval" + private const val AD_TYPE_IMG = "img" } } \ No newline at end of file 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 5aa475eef6..52155e6a09 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -209,7 +209,6 @@ object PackageRepository { @SuppressLint("CheckResult") private fun loadInstalledGameDigestAndNotifyData( filteredList: ArrayList, - onWorkerThreadOnly: Boolean = false, isVGame: Boolean = false, updateInstallStatus: Boolean = false ) { @@ -226,12 +225,6 @@ object PackageRepository { var observable = mNewApi.getPackageGames(PackageFilterManager.packageKey, page, PAGE_SIZE) .subscribeOn(Schedulers.io()) - if (!onWorkerThreadOnly) { - // 这里面的代码(根据包名获取签名?)或许是造成安装完成后的 ANR 和 startForegroundService did not then call startForeground 的原因 - // 为了避免影响其它地方,这里只处理安装完成后的调用 - observable = observable.observeOn(AndroidSchedulers.mainThread()) - } - observable.subscribe(object : BiResponse>() { override fun onSuccess(data: List) { if (!data.isNullOrEmpty()) { @@ -446,7 +439,6 @@ object PackageRepository { updateFilterPackage(list) { loadInstalledGameDigestAndNotifyData( filteredList = list, - onWorkerThreadOnly = true, updateInstallStatus = false ) } @@ -476,7 +468,6 @@ object PackageRepository { updateFilterPackage(pkgNameList) { loadInstalledGameDigestAndNotifyData( filteredList = pkgNameList, - onWorkerThreadOnly = true, isVGame = isVGame, updateInstallStatus = updateInstallStatus ) diff --git a/app/src/main/java/com/gh/gamecenter/wrapper/BaseBottomTabFragment.kt b/app/src/main/java/com/gh/gamecenter/wrapper/BaseBottomTabFragment.kt index abae374c27..f81cde843b 100644 --- a/app/src/main/java/com/gh/gamecenter/wrapper/BaseBottomTabFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/wrapper/BaseBottomTabFragment.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.wrapper import android.net.Uri import android.os.Bundle +import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.widget.Checkable @@ -13,7 +14,6 @@ import com.gh.gamecenter.R import com.gh.gamecenter.common.base.fragment.ToolbarFragment import com.gh.gamecenter.common.utils.ImageUtils import com.gh.gamecenter.common.utils.dip2px -import com.gh.gamecenter.core.utils.GsonUtils import com.gh.gamecenter.databinding.PieceBottomTabBinding import com.gh.gamecenter.entity.BottomTab @@ -60,7 +60,7 @@ abstract class BaseBottomTabFragment: ToolbarFragment() { PieceBottomTabBinding.bind(LayoutInflater.from(requireContext()).inflate(R.layout.piece_bottom_tab, null)) .apply { tabTv.text = bottomTab.name - if (GsonUtils.isJSONValid(bottomTab.jsCode)) { + if (!TextUtils.isEmpty(bottomTab.jsCode)) { tabLottie.setAnimationFromJson(bottomTab.jsCode, bottomTab.id + bottomTab.name) } if (bottomTab.iconSelector != 0) { diff --git a/app/src/main/java/com/gh/gamecenter/wrapper/MainWrapperRepository.kt b/app/src/main/java/com/gh/gamecenter/wrapper/MainWrapperRepository.kt index b5916f60e2..a4afcefcd3 100644 --- a/app/src/main/java/com/gh/gamecenter/wrapper/MainWrapperRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/wrapper/MainWrapperRepository.kt @@ -7,12 +7,14 @@ import com.gh.common.util.ViewPagerFragmentHelper import com.gh.gamecenter.common.entity.LaunchRedirect import com.gh.gamecenter.common.retrofit.BiResponse import com.gh.gamecenter.common.utils.singleToMain +import com.gh.gamecenter.core.utils.GsonUtils import com.gh.gamecenter.core.utils.SingletonHolder import com.gh.gamecenter.entity.BottomTab import com.gh.gamecenter.entity.DataUnionEntity import com.gh.gamecenter.entity.MultiTabNav import com.gh.gamecenter.home.custom.model.CustomPageData import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.flow.MutableSharedFlow @@ -134,7 +136,7 @@ class MainWrapperRepository { fun getDataUnion() { processBottomTabData(emptyList()) mNewApi.dataUnion - .compose(singleToMain()) + .subscribeOn(Schedulers.io()) .subscribe(object : BiResponse() { override fun onSuccess(data: DataUnionEntity) { processBottomTabData(data.bottomTab) @@ -186,17 +188,23 @@ class MainWrapperRepository { if (bottomTab.default) { defaultBottomTabIndex = index } + + // 如果 jsCode 不是合法的 json,则将 jsCode 置空 + if (!GsonUtils.isJSONValid(bottomTab.jsCode)) { + bottomTab.jsCode = "" + } + if (bottomTab.link?.type == ViewPagerFragmentHelper.TYPE_VIDEO_STREAM) { bottomTab.isTransparentStyle = true } } - bottomTabListLiveData.value = bottomTabList + bottomTabListLiveData.postValue(bottomTabList) defaultNavId = bottomTabList.find { it.link?.type == ViewPagerFragmentHelper.TYPE_MULTI_TAB_NAV && it.default }?.link?.link ?: "" defaultCustomPageId = bottomTabList.find { it.link?.type == ViewPagerFragmentHelper.TYPE_CUSTOM_PAGE && it.default }?.link?.link ?: "" } else { HomeBottomBarHelper.getDefaultHomeBottomTabData().run { - bottomTabListLiveData.value = this + bottomTabListLiveData.postValue(this) defaultNavId = find { it.link?.type == ViewPagerFragmentHelper.TYPE_MULTI_TAB_NAV && it.default }?.link?.link ?: "" defaultCustomPageId = find { it.link?.type == ViewPagerFragmentHelper.TYPE_CUSTOM_PAGE && it.default }?.link?.link ?: "" } @@ -221,7 +229,7 @@ class MainWrapperRepository { defaultCustomPageId = multiTabNav?.linkMultiTabNav?.find { it.link?.type == ViewPagerFragmentHelper.TYPE_CUSTOM_PAGE && it.default }?.link?.link ?: "" - multiTabNavLiveData.value = multiTabNav + multiTabNavLiveData.postValue(multiTabNav) } companion object : SingletonHolder({ MainWrapperRepository() }) diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index 5efb2837e9..36cdbb2c9b 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -63,7 +63,6 @@ import com.gh.gamecenter.core.iinterface.IApplication; import com.gh.gamecenter.core.provider.IFlavorProvider; import com.gh.gamecenter.core.provider.IPushProvider; import com.gh.gamecenter.core.provider.IQGameProvider; -import com.gh.gamecenter.core.utils.DisplayUtils; import com.gh.gamecenter.core.utils.GsonUtils; import com.gh.gamecenter.core.utils.SPUtils; import com.gh.gamecenter.login.user.UserManager; @@ -92,7 +91,6 @@ import java.util.List; import java.util.ServiceLoader; import io.reactivex.Single; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.plugins.RxJavaPlugins; import io.reactivex.schedulers.Schedulers; import tv.danmaku.ijk.media.exo2.Exo2PlayerManager; @@ -212,13 +210,6 @@ public class HaloApp extends MultiDexApplication { super.onCreate(); initArouter(); - mInstance = this; - for (IApplication application : mApplicationList) { - application.onCreate(mInstance); - } - - fixDebugIssueInAndroid14(); - // 每个进程都用自己的进程名作为后缀的文件夹来存 WebView cache // https://sentry.shanqu.cc/organizations/lightgame/issues/285063/?project=22&query=is%3Aunresolved // https://stackoverflow.com/a/61748345/4812571 这个无效 @@ -232,6 +223,13 @@ public class HaloApp extends MultiDexApplication { } } + mInstance = this; + for (IApplication application : mApplicationList) { + application.onCreate(mInstance); + } + + fixDebugIssueInAndroid14(); + ExtensionsKt.doOnMainProcessOnly(() -> { // 似乎只是 load SO 不涉及方法调用,所以可以在隐私政策前调用吧? OAIDHelper.INSTANCE.doSystemLoad(); @@ -239,14 +237,16 @@ public class HaloApp extends MultiDexApplication { PlayerFactory.setPlayManager(Exo2PlayerManager.class); CacheFactory.setCacheManager(ExoPlayerCacheManager.class); - initFresco(); - isNewForThisVersion = PreferenceManager.getDefaultSharedPreferences(this).getBoolean(Constants.SP_NEW_FIRST_LAUNCH_VERSION + PackageUtils.getGhVersionName(), true); + Tracker.init(this); + AppExecutor.getIoExecutor().execute(() -> { + // fresco 初始化约耗费 300ms,所以放到工作线程初始化更合理一些 + initFresco(); + initDataHelper(); - Tracker.init(this); DownloadCore.init(this); deviceRamSize = DeviceUtils.getTotalRamSizeOfDevice(this); @@ -311,10 +311,10 @@ public class HaloApp extends MultiDexApplication { } private void postInit(long delay) { - // 初始化 一键登录 - QuickLoginHelper.init(this); // 初始化 sentry DataUtils.init(this, getChannel()); + // 初始化 一键登录 + QuickLoginHelper.init(this); // 初始化广告 SDK AdDelegateHelper.INSTANCE.initAdSdk(this); @@ -388,8 +388,6 @@ public class HaloApp extends MultiDexApplication { AppExecutor.getUiExecutor().executeWithDelay(() -> { FixedRateJobHelper.begin(); - RegionSettingHelper.getRegionSetting(); - if (PackageHelper.INSTANCE.isGetInstalledPackagesAgreed()) { PackageHelper.INSTANCE.initPackageRelatedData(); } @@ -400,17 +398,12 @@ public class HaloApp extends MultiDexApplication { initTimeConsumingAction(); - getWebviewAbiList(); - // 注册回调以用于做各种统计 ProcessLifecycleOwner.get().getLifecycle().addObserver(new ProcessorLifeCycleOwner()); // 初始化畅玩相关数据 retrieveVGameInfoIfNeeded(); - // 移除已安装但还在本地数据库中的包(避免因为没有监听到安装结果导致安装包没有删除的问题) - removeInstalledButRemainedPackages(); - // 开发环境不要强制捕获相关异常,这些异常通常是需要处理的 if (!BuildConfig.DEBUG) { RxJavaPlugins.setErrorHandler(throwable -> { @@ -444,14 +437,12 @@ public class HaloApp extends MultiDexApplication { e.printStackTrace(); } } - AppExecutor.getIoExecutor().execute(() -> { - final String webviewPath = PackageUtils.getWebviewPath(this); - if (webviewPath == null) return; - final List abiList = PackageUtils.getApkAbiList(webviewPath); - webViewAbiList = abiList; - SPUtils.setString(Constants.SP_WEBVIEW_ABI_LIST, GsonUtils.toJson(abiList)); - SPUtils.setInt(Constants.SP_WEBVIEW_VERSION_CODE, webviewVersionCode); - }); + final String webviewPath = PackageUtils.getWebviewPath(this); + if (webviewPath == null) return; + final List abiList = PackageUtils.getApkAbiList(webviewPath); + webViewAbiList = abiList; + SPUtils.setString(Constants.SP_WEBVIEW_ABI_LIST, GsonUtils.toJson(abiList)); + SPUtils.setInt(Constants.SP_WEBVIEW_VERSION_CODE, webviewVersionCode); } private void initDataHelper() { @@ -532,7 +523,6 @@ public class HaloApp extends MultiDexApplication { return single; }) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe( s -> Utils.log("IPushProvider->init push succeed, response: " + s + ",channel: " + getChannel()), e -> Utils.log("IPushProvider->init push failed, error: " + e + ", channel: " + getChannel()) @@ -553,23 +543,29 @@ public class HaloApp extends MultiDexApplication { private void initTimeConsumingAction() { AppExecutor.getIoExecutor().execute(() -> { + // 初始化地区设置 + RegionSettingHelper.getRegionSetting(); + // 初始化全局下载监听 DownloadObserver.initObserver(); - if ("miui".equals(Build.MANUFACTURER) && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - DisplayUtils.sShouldUseLegacyMiuiStatusBarMethod = true; - } + // 移除已安装但还在本地数据库中的包(避免因为没有监听到安装结果导致安装包没有删除的问题) + removeInstalledButRemainedPackages(); // 避免在华为设备上出现 `Register too many Broadcast Receivers` 异常,可见 https://github.com/llew2011/HuaWeiVerifier LoadedApkHuaWei.hookHuaWeiVerifier(this); DownloadMessageHandler.INSTANCE.init(SimpleDownloadDatabase.getInstance().downloadDao()); VHelper.INSTANCE.preparePluginUpdate(); + + // 初始化 WebView ABI 列表 + getWebviewAbiList(); }); } - public void initFresco() { + if (ImageUtils.isFrescoInitialized()) return; + // 系统版本低于 6.0 以及设备内存小于 2500M 的设备禁用动图 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (deviceRamSize != 0 && deviceRamSize < 2500)) { @@ -618,26 +614,24 @@ public class HaloApp extends MultiDexApplication { * 移除已安装但还在本地数据库中的包 */ private void removeInstalledButRemainedPackages() { - AppExecutor.getIoExecutor().execute(() -> { - for (DownloadEntity downloadEntity : DownloadManager.getInstance().getAllDownloadEntity()) { - if (downloadEntity.getStatus() != DownloadStatus.done) { - continue; - } - - try { - String versionName = downloadEntity.getVersionName(); - String packageName = downloadEntity.getPackageName(); - // 这里暴力删除会影响畅玩游戏快速安装功能,但先不管了 - if (versionName != null - && packageName != null - && versionName.equals(PackageUtils.getVersionNameByPackageName(packageName))) { - DownloadManager.getInstance().cancel(downloadEntity.getUrl()); - } - } catch (Exception ignored) { - // 不在乎删除的结果,尝试即可 - } + for (DownloadEntity downloadEntity : DownloadManager.getInstance().getAllDownloadEntity()) { + if (downloadEntity.getStatus() != DownloadStatus.done) { + continue; } - }); + + try { + String versionName = downloadEntity.getVersionName(); + String packageName = downloadEntity.getPackageName(); + // 这里暴力删除会影响畅玩游戏快速安装功能,但先不管了 + if (versionName != null + && packageName != null + && versionName.equals(PackageUtils.getVersionNameByPackageName(packageName))) { + DownloadManager.getInstance().cancel(downloadEntity.getUrl()); + } + } catch (Exception ignored) { + // 不在乎删除的结果,尝试即可 + } + } } public boolean isReinstallTheSameVersion() { diff --git a/feature/floating-window/src/demo/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt b/feature/floating-window/src/demo/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt index e0112c2728..caf72948f0 100644 --- a/feature/floating-window/src/demo/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt +++ b/feature/floating-window/src/demo/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt @@ -104,4 +104,8 @@ class AppProviderImpl : IAppProvider { override fun setSkippingThirdParty(isSkippingThirdParty: Boolean) { // do nothing } + + override fun initImageLoaderIfNeeded() { + // do nothing + } } \ No newline at end of file diff --git a/feature/new_feedback/src/feedback/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt b/feature/new_feedback/src/feedback/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt index 99028c0884..1068bc006a 100644 --- a/feature/new_feedback/src/feedback/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt +++ b/feature/new_feedback/src/feedback/java/com/gh/gamecenter/feedback/provider/AppProviderImpl.kt @@ -104,4 +104,8 @@ class AppProviderImpl : IAppProvider { override fun setSkippingThirdParty(isSkippingThirdParty: Boolean) { // do nothing } + + override fun initImageLoaderIfNeeded() { + // do nothing + } } \ No newline at end of file diff --git a/feature/pkg/src/pkg/java/com/gh/gamecenter/pkg/provider/AppProviderImpl.kt b/feature/pkg/src/pkg/java/com/gh/gamecenter/pkg/provider/AppProviderImpl.kt index 0b1049a32c..e11f133c27 100644 --- a/feature/pkg/src/pkg/java/com/gh/gamecenter/pkg/provider/AppProviderImpl.kt +++ b/feature/pkg/src/pkg/java/com/gh/gamecenter/pkg/provider/AppProviderImpl.kt @@ -104,4 +104,8 @@ class AppProviderImpl : IAppProvider { override fun setSkippingThirdParty(isSkippingThirdParty: Boolean) { // do nothing } + + override fun initImageLoaderIfNeeded() { + // do nothing + } } \ No newline at end of file diff --git a/module_common/src/main/java/com/gh/gamecenter/common/base/activity/BaseActivity.java b/module_common/src/main/java/com/gh/gamecenter/common/base/activity/BaseActivity.java index cff1c942c7..e064c5f5e4 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/base/activity/BaseActivity.java +++ b/module_common/src/main/java/com/gh/gamecenter/common/base/activity/BaseActivity.java @@ -61,6 +61,7 @@ import com.gh.gamecenter.common.utils.NewFlatLogUtils; import com.gh.gamecenter.common.utils.PackageFlavorHelper; import com.gh.gamecenter.common.utils.SensorsBridge; import com.gh.gamecenter.common.utils.ShareUtils; +import com.gh.gamecenter.core.provider.IAppProvider; import com.gh.gamecenter.core.provider.IDownloadManagerProvider; import com.gh.gamecenter.core.provider.IEntranceUtilsProvider; import com.gh.gamecenter.core.provider.IPackageInstallerProvider; @@ -159,6 +160,10 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements IBus } } + // 图片加载库 Fresco 在 Application 以异步的形式初始化 + // 但当应用重建时,可能出现异步初始化尚未完成就调用 SimpleDraweeView 方法的情况,所以在这里同步卡一下初始化 + initImageLoaderIfNeeded(); + fixBadParcelableExceptionIfNeeded(savedInstanceState); super.onCreate(savedInstanceState); @@ -814,4 +819,14 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements IBus super.attachBaseContext(newBase); } } + + /** + * 初始化图片加载器 + */ + private void initImageLoaderIfNeeded() { + IAppProvider appProvider = (IAppProvider) ARouter.getInstance().build(RouteConsts.provider.app).navigation(); + if (appProvider != null) { + appProvider.initImageLoaderIfNeeded(); + } + } } diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/ImageUtils.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/ImageUtils.kt index 16dccc8ad8..f67a5e8e64 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/ImageUtils.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/ImageUtils.kt @@ -688,4 +688,21 @@ object ImageUtils { } } + /** + * 这里反射获取 sDraweecontrollerbuildersupplier 根据是否有值确定是否被初始化了 + */ + @JvmStatic + fun isFrescoInitialized(): Boolean { + val clazz = SimpleDraweeView::class.java + return try { + val field = + clazz.getDeclaredField("sDraweecontrollerbuildersupplier") + field.isAccessible = true + val obj = field[SimpleDraweeView::class.java] + obj != null + } catch (ignore: java.lang.Exception) { + false + } + } + } diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAppProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAppProvider.kt index d72c870685..64f1e252c4 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAppProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAppProvider.kt @@ -41,4 +41,6 @@ interface IAppProvider : IProvider { fun setDisableSplashAdTemporarily(isDisable: Boolean) fun getPluginVersion(): String + + fun initImageLoaderIfNeeded() } \ No newline at end of file diff --git a/module_core/src/main/java/com/gh/gamecenter/core/utils/DisplayUtils.java b/module_core/src/main/java/com/gh/gamecenter/core/utils/DisplayUtils.java index 43ddac06b3..5c4d421955 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/utils/DisplayUtils.java +++ b/module_core/src/main/java/com/gh/gamecenter/core/utils/DisplayUtils.java @@ -30,8 +30,6 @@ import java.lang.reflect.Method; public class DisplayUtils { - public static boolean sShouldUseLegacyMiuiStatusBarMethod = true; - private static int sGlobalScreenWidth = 0; private static int sGlobalScreenHeight = 0; @@ -187,7 +185,7 @@ public class DisplayUtils { decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } - if (isKeepLowVersionMiui && sShouldUseLegacyMiuiStatusBarMethod) { + if (isKeepLowVersionMiui) { Class clazz = window.getClass(); try { int darkModeFlag = 0; diff --git a/module_message/src/message/java/com/gh/gamecenter/message/provider/AppProviderImpl.kt b/module_message/src/message/java/com/gh/gamecenter/message/provider/AppProviderImpl.kt index 79a4e3c3cb..864eeb4cb9 100644 --- a/module_message/src/message/java/com/gh/gamecenter/message/provider/AppProviderImpl.kt +++ b/module_message/src/message/java/com/gh/gamecenter/message/provider/AppProviderImpl.kt @@ -104,4 +104,9 @@ class AppProviderImpl : IAppProvider { override fun setSkippingThirdParty(isSkippingThirdParty: Boolean) { // do nothing } + + override fun initImageLoaderIfNeeded() { + // do nothing + } + } \ No newline at end of file diff --git a/module_setting/src/setting/java/com/gh/gamecenter/setting/provider/AppProviderImpl.kt b/module_setting/src/setting/java/com/gh/gamecenter/setting/provider/AppProviderImpl.kt index d482254cb8..b97412be14 100644 --- a/module_setting/src/setting/java/com/gh/gamecenter/setting/provider/AppProviderImpl.kt +++ b/module_setting/src/setting/java/com/gh/gamecenter/setting/provider/AppProviderImpl.kt @@ -105,4 +105,8 @@ class AppProviderImpl : IAppProvider { override fun setSkippingThirdParty(isSkippingThirdParty: Boolean) { // do nothing } + + override fun initImageLoaderIfNeeded() { + // do nothing + } } \ No newline at end of file diff --git a/module_setting_compose/src/setting/java/com/gh/gamecenter/setting/compose/provider/AppProviderImpl.kt b/module_setting_compose/src/setting/java/com/gh/gamecenter/setting/compose/provider/AppProviderImpl.kt index 826b57d9b7..91f036a9f2 100644 --- a/module_setting_compose/src/setting/java/com/gh/gamecenter/setting/compose/provider/AppProviderImpl.kt +++ b/module_setting_compose/src/setting/java/com/gh/gamecenter/setting/compose/provider/AppProviderImpl.kt @@ -99,4 +99,8 @@ class AppProviderImpl : IAppProvider { override fun setSkippingThirdParty(isSkippingThirdParty: Boolean) { // do nothing } + + override fun initImageLoaderIfNeeded() { + // do nothing + } } \ No newline at end of file diff --git a/scripts/jenkins_build.sh b/scripts/jenkins_build.sh index efba809e71..cd4d4c2876 100755 --- a/scripts/jenkins_build.sh +++ b/scripts/jenkins_build.sh @@ -12,8 +12,6 @@ post_init_script=init.internal.gradle git checkout module_common/build.gradle git checkout gradle.properties -sed -i '1 a android.enableResourceOptimizations = false' gradle.properties - ./gradlew --stop ./gradlew clean