diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 99ba512fb0..dfd816a4c9 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -13,11 +13,14 @@ import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.view.View; +import android.view.ViewParent; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; import com.gh.common.chain.BrowserInstallHandler; import com.gh.common.chain.CheckDownloadHandler; @@ -531,19 +534,14 @@ public class BindingAdapters { binding.tvSellingPoints.setVisibility(View.GONE); } - Context context = layout.getContext(); - binding.gtcvTags.removeAllViews(); ArrayList tagStyle = gameEntity.getTagStyle(); + StringBuilder tagText = new StringBuilder(); for (int i = 0; i < tagStyle.size(); i++) { if (i < 3) { - TextView textView = new TextView(layout.getContext()); - textView.setTextColor(ExtensionsKt.toColor(com.gh.gamecenter.common.R.color.text_tertiary, context)); - textView.setTextSize(10); - textView.setText((i == 0 ? "" : "·") + tagStyle.get(i).getName()); - binding.gtcvTags.addView(textView); + tagText.append(i == 0 ? "" : "·").append(tagStyle.get(i).getName()); } } - + binding.gtcvTags.setText(tagText); } else { layout.setVisibility(View.VISIBLE); binding.getRoot().setVisibility(View.GONE); @@ -570,6 +568,20 @@ public class BindingAdapters { break; } } + + ViewParent parent = binding.getRoot().getParent(); + if (parent instanceof ConstraintLayout) { + ConstraintLayout constraintLayout = (ConstraintLayout) parent; + ConstraintSet constraintSet = new ConstraintSet(); + constraintSet.clone(constraintLayout); + constraintSet.clear(R.id.gameDesSpace, ConstraintSet.BOTTOM); + if (subjectTag.equals(SUBJECT_TAG_SELLING_POINT)) { + constraintSet.connect(R.id.gameDesSpace, ConstraintSet.BOTTOM, R.id.layout_selling_points, ConstraintSet.TOP); + } else { + constraintSet.connect(R.id.gameDesSpace, ConstraintSet.BOTTOM, R.id.label_list, ConstraintSet.TOP); + } + constraintSet.applyTo(constraintLayout); + } } public static void setVideoDetailGameTags(LinearLayout layout, GameEntity gameEntity) { diff --git a/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt b/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt index 5f97615f0e..c53aaa010a 100644 --- a/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt +++ b/app/src/main/java/com/gh/common/provider/IAcceleratorDataHolderProviderImpl.kt @@ -1,5 +1,6 @@ package com.gh.common.provider +import com.gh.common.util.PackageUtils import com.gh.gamecenter.core.provider.IAcceleratorDataHolderProvider import com.gh.gamecenter.feature.entity.VipEntity import com.halo.assistant.accelerator.repository.AcceleratorDataHolder @@ -12,12 +13,8 @@ class IAcceleratorDataHolderProviderImpl : IAcceleratorDataHolderProvider { } } - override fun addInitFunResult(result: String) { - AcceleratorDataHolder.instance.addInitFunResult(result) - } - - override fun getInitFunResults(): List { - return AcceleratorDataHolder.instance.initResults + override fun getGhVersionName(): String { + return PackageUtils.getGhVersionName() } override fun clear() { diff --git a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt index ac8838feff..3bcfef17df 100644 --- a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt +++ b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt @@ -306,21 +306,14 @@ object XapkInstaller : XApkUnZipCallback, XApkUnZipOutputFactory { DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity) NDataChanger.notifyDataChanged(downloadEntity) DownloadManager.getInstance().updateDownloadEntity(downloadEntity) - // 仅官网渠道上报 XAPK 异常信息 - if (HaloApp.getInstance().channel == "GH_206") { - SentryHelper.onEvent( - "XAPK_UNZIP_ERROR", - "gameName", downloadEntity.name, - "errorDigest", exception.localizedMessage - ) - } DownloadDataHelper.uploadDownloadStatusEvent(downloadEntity, "xapk解压失败") SensorsBridge.trackGameDecompressionFailed( downloadEntity.gameId, downloadEntity.name, - downloadEntity.categoryChinese + downloadEntity.categoryChinese, + exception.localizedMessage ?: "unknown error" ) } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt index 011c5536b5..fbfa9f0bc9 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailWrapperFragment.kt @@ -45,6 +45,7 @@ import com.gh.gamecenter.common.base.fragment.BaseLazyFragment import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.entity.LinkEntity +import com.gh.gamecenter.common.eventbus.EBReuse import com.gh.gamecenter.common.exposure.ExposureSource import com.gh.gamecenter.common.json.json import com.gh.gamecenter.common.mvvm.Status @@ -1111,6 +1112,13 @@ class GameDetailWrapperFragment : BaseLazyFragment(), IScrollable { return true } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(reuse: EBReuse) { + if ("download" == reuse.type) { + downloadBinding.detailProgressbar.performClick() + } + } + @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(status: EBDownloadStatus) { updateDownloadCountHint(packageViewModel.filterSameUpdateLiveData.value) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt index df20247058..227ccd252c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/StartingAcceleratorViewModel.kt @@ -21,13 +21,14 @@ class StartingAcceleratorViewModel : ViewModel() { val useCase = AccelerationUseCase() - private val _restartingAcceleratorAction = MutableLiveData>() - val restartingAcceleratorAction: LiveData> = _restartingAcceleratorAction + private val _restartingAcceleratorAction = MutableLiveData>() + val restartingAcceleratorAction: LiveData> = _restartingAcceleratorAction fun loadAcceleratorToken() { val userId = UserManager.getInstance().userId if (userId.isNotBlank()) { UserRepository.getInstance().setAcceleratorToken(userId) { - _restartingAcceleratorAction.value = Event(it) + // 这里就算setToken失败,也要调用启动加速,失败会走正常的日志上报 + _restartingAcceleratorAction.value = Event(Unit) } } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt index 913e805fdc..91ad234f20 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt @@ -311,7 +311,7 @@ class GameDetailFragment : LazyFragment(), IScrollable { private fun initDetailRv() { binding.detailRv.run { - (itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false + itemAnimator = null layoutManager = detailLayoutManager adapter = detailListAdapter addOnScrollListener(object : OnScrollListener() { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt index 2ebfa0b7de..df9de3ce31 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailBriefItemViewHolder.kt @@ -46,7 +46,7 @@ class GameDetailBriefItemViewHolder( highlightedTextClickListener = TextHelper.CopyToClipboardHighlightedTextClick() ) briefTv.post { - expandTv.isVisible = briefTv.lineCount == 3 && briefTv.layout.getEllipsisCount(2) > 0 + expandTv.isVisible = briefTv.lineCount == 3 && (briefTv.layout?.getEllipsisCount(2) ?: 0) > 0 } expandTv.setOnClickListener { SensorsBridge.trackGameDetailModuleClick( diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt index 5de1a6c4e6..0e317a24b9 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailComprehensivePanelItemViewHolder.kt @@ -194,6 +194,8 @@ class GameDetailComprehensivePanelItemViewHolder( maxLines = if (parentViewHolder.showPart && !parentViewHolder.isExpand) 1 else Int.MAX_VALUE text = data.text post { + if (layout == null) return@post + val hasEllipsize = layout.getEllipsisCount(0) > 0 if (parentViewHolder.showPart && hasEllipsize && !parentViewHolder.binding.expandTv.isVisible) { parentViewHolder.binding.expandTv.isVisible = true diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt index d2e7f3d719..1359a90fce 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailDeveloperWordItemViewHolder.kt @@ -27,7 +27,7 @@ class GameDetailDeveloperWordItemViewHolder( .fromHtmlCompat(PicassoImageGetter(contentTv), ExtraTagHandler()) ) contentTv.post { - expandTv.isVisible = (contentTv.lineCount == 3 && contentTv.layout.getEllipsisCount(2) > 0) || contentTv.lineCount > 3 + expandTv.isVisible = (contentTv.lineCount == 3 && (contentTv.layout?.getEllipsisCount(2) ?: 0) > 0) || contentTv.lineCount > 3 } expandTv.background = R.drawable.bg_ui_surface_expand_gradient.toDrawable(context) expandTv.setTextColor(com.gh.gamecenter.common.R.color.text_theme.toColor(context)) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt index 687e31b0d4..3296a0cbde 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/viewholder/GameDetailUpdateItemViewHolder.kt @@ -36,7 +36,7 @@ class GameDetailUpdateItemViewHolder( } contentTv.text = entity.updateDes contentTv.post { - expandTv.isVisible = contentTv.lineCount == 3 && contentTv.layout.getEllipsisCount(2) > 0 + expandTv.isVisible = contentTv.lineCount == 3 && (contentTv.layout?.getEllipsisCount(2) ?: 0) > 0 } expandTv.background = R.drawable.bg_ui_surface_expand_gradient.toDrawable(context) expandTv.setTextColor(com.gh.gamecenter.common.R.color.text_theme.toColor(context)) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt index f67ba7d92d..32a5f3ce16 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt @@ -63,7 +63,7 @@ class HistoryApkListAdapter( holder.binding.expandTv.setTextColor(com.gh.gamecenter.common.R.color.text_theme.toColor(mContext)) holder.binding.updateDescTv.text = apkEntity.updateDesc holder.binding.updateDescTv.post { - holder.binding.expandTv.isVisible = holder.binding.updateDescTv.lineCount == 3 && holder.binding.updateDescTv.layout.getEllipsisCount(2) > 0 + holder.binding.expandTv.isVisible = holder.binding.updateDescTv.lineCount == 3 && (holder.binding.updateDescTv.layout?.getEllipsisCount(2) ?: 0) > 0 } holder.binding.versionTv.text = "版本${apkEntity.version}" holder.binding.releaseDateTv.text = TimeUtils.getFormatTime(apkEntity.updateTime) diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt b/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt index 54ff09e4f7..ea7e62569b 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/UploadThread.kt @@ -52,7 +52,7 @@ class UploadThread( .setCancelHook(true) .setCheckpointFile(recordDirectory) .setPartSize(10 * 1024 * 1024) - .setTaskNum(2) + .setTaskNum(1) .setDataTransferListener { Utils.log( "OssUpload", @@ -74,9 +74,9 @@ class UploadThread( mUploadInput = this } val config = TransportConfig.builder() - .readTimeoutMills(15 * 1000) - .writeTimeoutMills(15 * 1000) - .connectTimeoutMills(15 * 1000) + .readTimeoutMills(5 * 1000) + .writeTimeoutMills(5 * 1000) + .connectTimeoutMills(5 * 1000) .maxRetryCount(2) .build() diff --git a/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt b/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt index 801db55f85..94f26380ab 100644 --- a/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt +++ b/app/src/main/java/com/gh/ndownload/NDownloadBridge.kt @@ -26,6 +26,7 @@ import org.json.JSONException import org.json.JSONObject import java.io.File import java.io.IOException +import java.net.MalformedURLException import java.net.URL import java.net.URLConnection import java.text.DecimalFormat @@ -341,6 +342,9 @@ object NDownloadBridge : InnerDownloadListener, IErrorRetryHandler { // 由于这里的异常不会影响正常下载,所以直接打印异常,不做处理 // 具体可见 https://sentry.shanqu.cc/organizations/lightgame/issues/371082/ e.printStackTrace() + } catch (e: MalformedURLException) { + // 由于重定向的 url 可能是一个不合法的 url,这里捕获异常 + e.printStackTrace() } NDataChanger.notifyDataChanged(downloadEntity) diff --git a/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt b/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt index ea774b829d..f2b2f3acda 100644 --- a/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt +++ b/app/src/main/java/com/halo/assistant/accelerator/repository/AcceleratorDataHolder.kt @@ -20,14 +20,6 @@ class AcceleratorDataHolder { private val listeners = mutableSetOf() - private val _initResults = arrayListOf() - val initResults: List - get() = _initResults - - fun addInitFunResult(result: String) { - _initResults.add(result) - } - private var _hasAcctGameInfoInLocal = false val hasAcctGameInfoInLocal: Boolean get() = _hasAcctGameInfoInLocal diff --git a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt index 68f0c71bd7..5918e35b5c 100644 --- a/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/user/RealNameInfoFragment.kt @@ -106,7 +106,8 @@ class RealNameInfoFragment : ToolbarFragment() { } private fun initEditingView() { - val bodyString = getText(R.string.realname_body_tv) + val bodyString = + "为响应《国家新闻出版署关于防止未成年沉迷网络游戏的通知》,请认真填写您的身份信息。您提供的证件信息将受到严格保护,仅用于用户实名制认证,不会用作其他用途,请放心填写。前往了解更多信息>>" mBinding.bodyTv.text = SpanBuilder(bodyString) .click( @@ -124,13 +125,13 @@ class RealNameInfoFragment : ToolbarFragment() { .build() mBinding.bodyTv.movementMethod = CustomLinkMovementMethod.getInstance() - val hintString = getText(R.string.realname_hint_tv) + val hintString = "特别说明:由于部分用户之前的实名信息不正确或认证失败,可能需要重新认证,请提交真实的信息进行认证即可。部分游戏仅对成年用户进行开放" mBinding.hintTv.text = SpanBuilder(hintString) .bold(0, 5) .build() - val manualHintString = getText(R.string.realname_manual_hint_tv) + val manualHintString = "若您提交的真实身份信息未通过认证或者您持有的为港澳台\\国外身份证件,可转交人工审核" mBinding.manualHintTv.text = SpanBuilder(manualHintString) .click( @@ -160,9 +161,6 @@ class RealNameInfoFragment : ToolbarFragment() { mBinding.nameEt.doOnTextChanged { _, _, _, _ -> updateSubmitBtn() } - mBinding.textDotIndicator.setOnClickListener { - mBinding.nameEt.text.insert(mBinding.nameEt.selectionStart, "\u00B7") - } mBinding.idCardEt.doOnTextChanged { _, _, _, _ -> updateSubmitBtn() } diff --git a/app/src/main/res/drawable/bg_stroke_fa_radius_2.xml b/app/src/main/res/drawable/bg_stroke_fa_radius_2.xml deleted file mode 100644 index 83ec08737e..0000000000 --- a/app/src/main/res/drawable/bg_stroke_fa_radius_2.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_real_name.xml b/app/src/main/res/layout/fragment_real_name.xml index 2ddb13dab6..efe76997f6 100644 --- a/app/src/main/res/layout/fragment_real_name.xml +++ b/app/src/main/res/layout/fragment_real_name.xml @@ -34,7 +34,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:text="@string/realname_body_tv" /> + tools:text="为响应《国家新闻出版署关于防止未成年沉迷网络游戏的通知》,请认真填写您的身份信息。您提供的证件信息将受到严格保护,仅用于用户实名制认证,不会用作其他用途,请放心填写。前往了解更多信息>>" /> + tools:text="特别说明:由于部分用户之前的实名信息不正确或认证失败,可能需要重新认证,请提交真实的信息进行认证即可。部分游戏仅对成年用户进行开放" /> - - + tools:text="若您提交的真实身份信息未通过认证或者您持有的为港澳台\国外身份证件,可转交人工审核" /> 當前認証狀態:未成年 實名信息認証中... 認証期間不影響您正常的遊戲體驗 - 爲響應《國家新聞出版署關於防止未成年沉迷網絡遊戲的通知》,請認真填冩您的身份信息。您提供的証件信息將受到嚴格保護,僅用於用戶實名製認証,不會用作其他用途,請放心填冩。前往了解更多信息>> - 特別説明:由於部分用戶之前的實名信息不正確或認証失敗,可能需要重新認証,請提交真實的信息進行認証即可。部分遊戲僅對成年用戶進行開放。(特殊字符“·”可通過快捷鍵進行添加) - 若您提交的真實身份信息未通過認証或者您持有的爲港澳颱\國外身份証件,可轉交人工審核 設置偏好]]> ,讓推薦更懂你的心~ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d865bb9d9..ea0149f2f2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -412,10 +412,7 @@ 当前认证状态:未成年 实名信息认证中... 部分游戏在认证期间无法进行下载 - 为响应《国家新闻出版署关于防止未成年沉迷网络游戏的通知》,请认真填写您的身份信息。您提供的证件信息将受到严格保护,仅用于用户实名制认证,不会用作其他用途,请放心填写。前往了解更多信息>> - 特别说明:由于部分用户之前的实名信息不正确或认证失败,可能需要重新认证,请提交真实的信息进行认证即可。部分游戏仅对成年用户进行开放。(特殊字符“·”可通过快捷键进行添加) - 若您提交的真实身份信息未通过认证或者您持有的为港澳台\国外身份证件,可转交人工审核 - + 设置偏好]]> ,让推荐更懂你的心~ diff --git a/dependencies.gradle b/dependencies.gradle index 6da08de9af..d39c94b78a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 30 // 升级targetSdkVersion到 34 时需要根据官方文档补全前台服务的权限类型。比如 NDownloadService,KeepAliveService // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 1150 - versionName = "5.40.0" + versionCode = 1152 + versionName = "5.40.2" applicationId = "com.gh.gamecenter" applicationIdGat = "com.gh.gamecenter.intl" @@ -100,7 +100,7 @@ ext { skeleton = "1.1.5" mta = "6.8.0" romChecker = "1.0.3" - oss = "2.6.0" + oss = "2.8.8" desugarJdkLibs = "1.1.5" toolargetool = "0.3.0" chart = "3.1.0" @@ -150,7 +150,7 @@ ext { xcrashVersion = "3.1.0" aliPayVersion = "15.8.17" - acceleratorVersion = "1.0.1" + acceleratorVersion = "2.0.2" } apply from: 'dependencies_vasdk.gradle' diff --git a/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt b/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt index 09dda99664..e790bdb42e 100644 --- a/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt +++ b/feature/accelerator/src/main/java/com/gh/gamecenter/accelerator/provider/AcceleratorProviderImpl.kt @@ -1,11 +1,14 @@ package com.gh.gamecenter.accelerator.provider import android.app.Application +import com.gh.gamecenter.common.utils.EnvHelper +import com.gh.gamecenter.core.HaloApp import com.gh.gamecenter.core.callback.AccelerateState import com.gh.gamecenter.core.callback.OnAccelerateListener import com.gh.gamecenter.core.provider.IAcceleratorDataHolderProvider import com.gh.gamecenter.core.provider.IAcceleratorProvider import com.gh.gamecenter.feature.entity.AcctGameInfo +import com.gh.gamecenter.feature.utils.NewFlatLogUtils import com.gh.gamecenter.feature.utils.SentryHelper import com.lightgame.utils.Utils import com.qeeyou.qyvpn.QyAccelerator @@ -23,6 +26,8 @@ import java.io.File class AcceleratorProviderImpl : IAcceleratorProvider { private var _token = "" + private val initResults = arrayListOf() + // 根据包名回调 private val listeners = hashMapOf() @@ -91,8 +96,7 @@ class AcceleratorProviderImpl : IAcceleratorProvider { override fun onExecLifecycleInitFun(isEnter: Boolean) { super.onExecLifecycleInitFun(isEnter) Utils.log(LOG_TAG, "onExecLifecycleInitFun:$isEnter") - TheRouter.get(IAcceleratorDataHolderProvider::class.java) - ?.addInitFunResult("onExecLifecycleInitFun:$isEnter") + initResults.add("onExecLifecycleInitFun:$isEnter") } }) QyAccelerator.getInstance().bindQyAccRelatedListener(qyListener) @@ -105,16 +109,29 @@ class AcceleratorProviderImpl : IAcceleratorProvider { // 避免外部多次设置相同的token return } - QyAccelerator.getInstance().setQyUserToken(token, setResultCallback = { isSuccess, errMsg -> - Utils.log(LOG_TAG, "setQyUserToken:$token --isSuccess:$isSuccess --errMsg:$errMsg") - if (isSuccess) { - _token = token - } else { - // 将setToken错误事件上报的sentry,便于后期分析原因 - SentryHelper.onEventInAllChannel(SENTRY_EVENT_ID, KEY_SET_TOKEN_ERROR_MESSAGE, errMsg) - } - callback?.invoke(isSuccess) - }) + fun setToken() { + QyAccelerator.getInstance().setQyUserToken(token, setResultCallback = { isSuccess, errMsg -> + Utils.log(LOG_TAG, "setQyUserToken:$token --isSuccess:$isSuccess --errMsg:$errMsg") + if (isSuccess) { + _token = token + } else { + // 将setToken错误事件上报的火山云,便于后期分析原因 + NewFlatLogUtils.logAcceleratorSetTokenError(initResults, errMsg ?: "") + } + callback?.invoke(isSuccess) + }) + + } + if (QyAccelerator.getInstance().checkApplicationContextIsInit()) { + setToken() + } else { + // 初始化失败,再次初始化之后在setToken + val ghVersionName = TheRouter.get(IAcceleratorDataHolderProvider::class.java)?.getGhVersionName() ?: "" + init(EnvHelper.isDevEnv, HaloApp.getInstance(), ghVersionName) + // 不管初始化成功还是失败,都需要再次setToken,如果失败,正常上报失败日志 + setToken() + } + } override fun deleteQyUserToken(): Boolean { @@ -127,6 +144,7 @@ class AcceleratorProviderImpl : IAcceleratorProvider { _token = "" listeners.clear() allListener.clear() + initResults.clear() return isDeleted } @@ -171,10 +189,6 @@ class AcceleratorProviderImpl : IAcceleratorProvider { companion object { private const val LOG_TAG = "AcceleratorProviderImpl" - private const val SENTRY_EVENT_ID = "ACCELERATOR_SET_TOKEN_ERROR" - private const val KEY_SET_TOKEN_ERROR_MESSAGE = "set_token_error" - private const val KEY_ACC_FAILURE_ERROR = "key_acc_failure_error" - } } \ No newline at end of file diff --git a/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt b/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt index 6419d473af..d0e764b85e 100644 --- a/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt +++ b/feature/sentry/src/main/java/com/lg/SentryProviderImpl.kt @@ -3,7 +3,7 @@ package com.lg import android.content.Context import android.text.TextUtils import com.gh.gamecenter.common.base.activity.BaseActivity -import com.gh.gamecenter.common.utils.toJson +import com.gh.gamecenter.common.exposure.meta.MetaUtil import com.gh.gamecenter.core.HaloApp import com.gh.gamecenter.core.provider.IAcceleratorDataHolderProvider import com.gh.gamecenter.core.provider.IAppProvider @@ -16,6 +16,7 @@ import io.sentry.* import io.sentry.android.core.SentryAndroid import io.sentry.android.fragment.FragmentLifecycleIntegration import io.sentry.protocol.Message +import io.sentry.protocol.User @com.therouter.inject.ServiceProvider class SentryProviderImpl : ISentryProvider { @@ -31,6 +32,14 @@ class SentryProviderImpl : ISentryProvider { options.setAnrEnabled(false) } + val androidId = MetaUtil.getBase64EncodedAndroidId() + + if (androidId.isNotEmpty()) { + val user = User() + user.id = androidId + Sentry.setUser(user) + } + options.setDebug(BuildConfig.DEBUG) options.setEnableAutoSessionTracking(true) options.setEnvironment(flavor) @@ -131,23 +140,7 @@ class SentryProviderImpl : ISentryProvider { } Utils.log("Sentry", "$eventId + [${kv.joinToString(" , ")}]") - Sentry.captureEvent(sentryEvent) { - // 添加Breadcrumb - it.addBreadcrumb(Breadcrumb().apply { - type = "initSdk" - category = "Init" - this.message = "init qiyou sdk" - level = SentryLevel.INFO - - val iAcceleratorDataHolderProvider = TheRouter.get(IAcceleratorDataHolderProvider::class.java) - if (iAcceleratorDataHolderProvider != null) { - val initFunResults = iAcceleratorDataHolderProvider.getInitFunResults() - initFunResults.forEachIndexed { index, result -> - setData("init_sdk_fun_$index", result) - } - } - }) - } + Sentry.captureEvent(sentryEvent) } override fun captureException(e: Throwable) { diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt index 7a4c934a13..767c9368d2 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/EnvHelper.kt @@ -44,7 +44,7 @@ object EnvHelper { fun getHost(): String { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) return if (!PackageFlavorHelper.IS_TEST_FLAVOR) { - buildConfig?.getApiHost() ?: "" + buildConfig?.getApiHost() ?: "https://and-api.ghzs6.com/v5d5d0/" } else { if (isDevEnv) { buildConfig?.getDevApiHost() ?: "" @@ -58,7 +58,7 @@ object EnvHelper { fun getVHost(): String { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) return if (!PackageFlavorHelper.IS_TEST_FLAVOR) { - buildConfig?.getVDevApiHost() ?: "" + buildConfig?.getVApiHost() ?: "https://app-api.796697.com" } else { if (isDevEnv) { buildConfig?.getVDevApiHost() ?: "" @@ -72,7 +72,7 @@ object EnvHelper { fun getNewHost(): String { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) return if (!PackageFlavorHelper.IS_TEST_FLAVOR) { - buildConfig?.getNewApiHost() ?: "" + buildConfig?.getNewApiHost() ?: "https://app-api.ghzs6.com/" } else { if (isDevEnv) { buildConfig?.getNewDevApiHost() ?: "" diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt index 94b15a5361..1356373384 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/Extensions.kt @@ -1179,10 +1179,15 @@ fun DownloadEntity.putGameCategory(gameCategory: String) { inline fun doOnMainProcessOnly(f: () -> Unit) { val buildConfig = TheRouter.get(IBuildConfigProvider::class.java) - val packageUtilsConfig = TheRouter.get(IPackageUtilsProvider::class.java) - val processName = packageUtilsConfig?.obtainProcessName() + val processName = ProcessUtil.getCurrentProcessName() + var applicationId = buildConfig?.getApplicationId() - if (processName == null || buildConfig?.getApplicationId() == processName) { + // buildConfig 为空的兜底方案,至于你说为什么会为空,我也不知道 + if (applicationId.isNullOrEmpty()) { + applicationId = HaloApp.getInstance().packageName ?: "com.gh.gamecenter" + } + + if (processName == null || applicationId == processName) { f.invoke() } else { tryWithDefaultCatch { diff --git a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt index de2d92c6bd..06f6b1eed9 100644 --- a/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt +++ b/module_common/src/main/java/com/gh/gamecenter/common/utils/SensorsBridge.kt @@ -1292,18 +1292,21 @@ object SensorsBridge { * @param gameId 游戏ID * @param gameName 游戏名称 * @param gameType 游戏类型 + * @param exceptionDigest 异常摘要 * @see EVENT_GAME_DEPRESSION_FAILED */ @JvmStatic fun trackGameDecompressionFailed( gameId: String, gameName: String, - gameType: String + gameType: String, + exceptionDigest: String, ) { val json = json { KEY_GAME_ID to gameId KEY_GAME_NAME to gameName KEY_GAME_TYPE to gameType + "exception_digest" to exceptionDigest } trackEvent(EVENT_GAME_DEPRESSION_FAILED, json) diff --git a/module_common/src/main/res/layout/layout_game_item_selling_point.xml b/module_common/src/main/res/layout/layout_game_item_selling_point.xml index 5ed31d9c59..ebf00dcbee 100644 --- a/module_common/src/main/res/layout/layout_game_item_selling_point.xml +++ b/module_common/src/main/res/layout/layout_game_item_selling_point.xml @@ -1,6 +1,7 @@ @@ -18,9 +19,12 @@ android:textSize="10sp" tools:text="送100连抽" /> - + android:includeFontPadding="false" + android:singleLine="true" + android:textColor="@color/text_tertiary" + android:textSize="@dimen/tag_text_size" /> \ No newline at end of file diff --git a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt index 8af5b1b0e0..2ba0a5b757 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/provider/IAcceleratorDataHolderProvider.kt @@ -4,9 +4,7 @@ interface IAcceleratorDataHolderProvider { fun setVipEntity(vip: Any) - fun addInitFunResult(result: String) - - fun getInitFunResults(): List + fun getGhVersionName(): String fun clear() } \ No newline at end of file diff --git a/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt b/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt index 1b17a6193b..f6c7e8b79b 100644 --- a/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt +++ b/module_core_feature/src/main/java/com/gh/gamecenter/feature/utils/NewFlatLogUtils.kt @@ -13,6 +13,8 @@ object NewFlatLogUtils { private const val KEY_GAME_ID = "game_id" private const val KEY_GAME_NAME = "game_name" private const val KEY_TEXT = "text" + private const val KEY_ERROR = "error" + private const val KEY_INIT_SDK_FUN = "init_sdk_fun" private fun log(jsonObject: JSONObject, logStore: String = "event", uploadImmediately: Boolean = false) { Utils.log("NewFlatLogUtils", jsonObject.toString(4)) @@ -52,4 +54,14 @@ object NewFlatLogUtils { } log(json) } + + @JvmStatic + fun logAcceleratorSetTokenError(initResults: List, error: String) { + json { + KEY_EVENT to "accelerator_set_token_error" + KEY_ERROR to error + KEY_INIT_SDK_FUN to initResults.toString() + parseAndPutMeta().invoke(this) + }.let(::log) + } } \ No newline at end of file