diff --git a/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt index e871b21eca..eaedb5f487 100644 --- a/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/InstallPermissionDialogFragment.kt @@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentTransaction import com.airbnb.lottie.LottieAnimationView import com.gh.common.constant.Config +import com.gh.common.util.NewFlatLogUtils import com.gh.common.xapk.XapkInstaller import com.gh.gamecenter.R import com.gh.gamecenter.common.base.fragment.BaseDialogFragment @@ -31,6 +32,8 @@ class InstallPermissionDialogFragment : BaseDialogFragment() { lateinit var mView: View var isXapk = false var url: String = "" + var gameId: String = "" + var gameName: String = "" var mCallBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)? = null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -50,6 +53,8 @@ class InstallPermissionDialogFragment : BaseDialogFragment() { switchLottie.setAnimation("lottie/install_permission_switch.json") switchLottie.playAnimation() + if (isXapk) NewFlatLogUtils.logXApkInstallPermissionDialogShowed(gameId, gameName) + val randomNumber = if (isXapk) 1 else Random.nextInt(2) closeTv.goneIf(randomNumber == 0) closeIv.goneIf(randomNumber != 0) @@ -60,14 +65,17 @@ class InstallPermissionDialogFragment : BaseDialogFragment() { closeTv.setOnClickListener { if (isXapk) { + NewFlatLogUtils.logXApkInstallPermissionDialogClick("尝试解压", false, gameId, gameName) mCallBack?.invoke(false) } dismiss() } closeIv.setOnClickListener { + if (isXapk) NewFlatLogUtils.logXApkInstallPermissionDialogClick("关闭", false, gameId, gameName) dismiss() } activateTv.setOnClickListener { + NewFlatLogUtils.logXApkInstallPermissionDialogClick("立即开启", false, gameId, gameName) PermissionHelper.toInstallPermissionSetting(requireActivity()) if (isXapk) { SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, requireActivity().javaClass.name) @@ -79,6 +87,8 @@ class InstallPermissionDialogFragment : BaseDialogFragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISSION_CODE) { + NewFlatLogUtils.logXApkInstallPermissionDialogClick("立即开启", true, gameId, gameName) + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "") SPUtils.setString(Constants.SP_XAPK_URL, "") @@ -124,6 +134,8 @@ class InstallPermissionDialogFragment : BaseDialogFragment() { installPermissionDialogFragment.mCallBack = callBack installPermissionDialogFragment.isXapk = isXapk installPermissionDialogFragment.url = downloadEntity.url + installPermissionDialogFragment.gameId = downloadEntity.gameId + installPermissionDialogFragment.gameName = downloadEntity.name val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction() transaction.show(installPermissionDialogFragment) transaction.commit() @@ -132,6 +144,8 @@ class InstallPermissionDialogFragment : BaseDialogFragment() { this.mCallBack = callBack this.isXapk = isXapk this.url = downloadEntity.url + this.gameId = downloadEntity.gameId + this.gameName = downloadEntity.name } installPermissionDialogFragment.show( activity.supportFragmentManager, diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index e0416d888e..c0e4915322 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -964,7 +964,7 @@ public class DialogUtils { } public static void showUnzipFailureDialog(Context context, DownloadEntity downloadEntity) { - XapkDialogHelper.INSTANCE.showUnzipFailureDialog(context, downloadEntity); + XapkDialogHelper.INSTANCE.showUnzipFailureDialog(context, downloadEntity, false); } public static void showNoticeDialog(Context context, String title, String content, @NonNull ConfirmListener listener) { diff --git a/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt b/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt index b0f59f3d1d..972a6d6369 100644 --- a/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt +++ b/app/src/main/java/com/gh/common/util/NewFlatLogUtils.kt @@ -1679,6 +1679,55 @@ object NewFlatLogUtils { log(json, "event", false) } + // 出现 XAPK 安装权限引导弹窗 + fun logXApkInstallPermissionDialogShowed(gameId: String, gameName: String) { + val json = json { + KEY_EVENT to "xapk_install_permission_dialog_show" + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName + parseAndPutMeta().invoke(this) + } + log(json, "event", false) + } + + // 点击引导设置“安装权限”弹窗 时上报 + fun logXApkInstallPermissionDialogClick(button: String, isOn: Boolean, gameId: String, gameName: String) { + val json = json { + KEY_EVENT to "xapk_install_permission_dialog_click" + "button" to button + "is_on" to isOn + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName + parseAndPutMeta().invoke(this) + } + log(json, "event", false) + } + + // 出现xapk解压失败弹窗时上报 + fun logXApkUnzipFailedDialogShowed(trigger: String, gameId: String, gameName: String) { + val json = json { + KEY_EVENT to "xapk_decompression_failed_dialog_show" + "trigger" to trigger + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName + parseAndPutMeta().invoke(this) + } + log(json, "event", false) + } + + // 点击解压失败弹窗 时上报 + fun logXApkUnzipFailedDialogClick(button: String, isOn: Boolean, gameId: String, gameName: String) { + val json = json { + KEY_EVENT to "xapk_decompression_failed_dialog_click" + "button" to button + "is_on" to isOn + KEY_GAME_ID to gameId + KEY_GAME_NAME to gameName + parseAndPutMeta().invoke(this) + } + log(json, "event", false) + } + // vpn 弹窗显示 fun logVpnHintDialogShow(gameId: String, gameName: String) { val json = json { diff --git a/app/src/main/java/com/gh/common/xapk/XapkDialogHelper.kt b/app/src/main/java/com/gh/common/xapk/XapkDialogHelper.kt index 013aa7a900..a03312c735 100644 --- a/app/src/main/java/com/gh/common/xapk/XapkDialogHelper.kt +++ b/app/src/main/java/com/gh/common/xapk/XapkDialogHelper.kt @@ -7,6 +7,7 @@ import android.graphics.Color import android.os.Build import android.view.View import androidx.appcompat.app.AppCompatActivity +import com.gh.common.util.NewFlatLogUtils import com.gh.gamecenter.R import com.gh.gamecenter.common.activityresult.ActResultRequest import com.gh.gamecenter.common.constant.Constants @@ -22,7 +23,9 @@ import com.lightgame.utils.Utils object XapkDialogHelper { - fun showUnzipFailureDialog(context: Context, downloadEntity: DownloadEntity) { + fun showUnzipFailureDialog(context: Context, downloadEntity: DownloadEntity, isManualAction: Boolean) { + val trigger = if (isManualAction) "手动触发" else "自动触发" + NewFlatLogUtils.logXApkUnzipFailedDialogShowed(trigger, downloadEntity.gameId, downloadEntity.name) DialogHelper.showGuideDialog( context = context, title = "", @@ -33,12 +36,26 @@ object XapkDialogHelper { if (context is AppCompatActivity) { val intent = PermissionHelper.getToInstallPermissionSettingIntent(context) + NewFlatLogUtils.logXApkUnzipFailedDialogClick( + "开启权限", + false, + downloadEntity.gameId, + downloadEntity.name + ) + // 记录应用重启前需要重解压的信息 SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, context.javaClass.name) SPUtils.setString(Constants.SP_XAPK_URL, downloadEntity.url) ActResultRequest(context).startForResult(intent) { resultCode, _ -> if (resultCode == Activity.RESULT_OK) { + NewFlatLogUtils.logXApkUnzipFailedDialogClick( + "开启权限", + true, + downloadEntity.gameId, + downloadEntity.name + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { val pm = context.packageManager val restartIntent = pm.getLaunchIntentForPackage(context.packageName) @@ -65,13 +82,28 @@ object XapkDialogHelper { hint, SimpleGameEntity(downloadEntity.gameId, downloadEntity.name, downloadEntity.icon) ) + NewFlatLogUtils.logXApkUnzipFailedDialogClick( + "提交反馈", + false, + downloadEntity.gameId, + downloadEntity.name + ) }, - uiModificationCallback = { binding, _ -> + uiModificationCallback = { binding, dialog -> binding.headIv.setBackgroundResource(R.drawable.dialog_unzip_failure_head_background) binding.titleTv.visibility = View.GONE // VectorDrawable 的动态颜色设置只在支持 Vector 的系统版本上生效,为了能方便复用资源不支持的就用默认颜色,又不是不能用! binding.closeIv.setColorFilter(Color.WHITE) binding.contentTv.setLineSpacing(5.0F.dip2px().toFloat(), 1.0F) + binding.closeContainer.setOnClickListener { + NewFlatLogUtils.logXApkUnzipFailedDialogClick( + "关闭", + false, + downloadEntity.gameId, + downloadEntity.name + ) + dialog.dismiss() + } }, extraConfig = DialogHelper.Config(showCloseIcon = true) ) 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 cf4a7a4c70..2e23eee85c 100644 --- a/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt +++ b/app/src/main/java/com/gh/common/xapk/XapkInstaller.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import com.gh.gamecenter.core.AppExecutor import com.gh.common.util.* +import com.gh.download.DownloadDataHelper import com.gh.download.DownloadManager import com.gh.gamecenter.common.utils.debugOnly import com.gh.gamecenter.common.utils.getExtension @@ -63,6 +64,7 @@ object XapkInstaller : IXapkUnzipListener { private fun unzipXapkFile(downloadEntity: DownloadEntity) { if (mXapkUnzipThreadMap[downloadEntity.path] == null) { + DownloadDataHelper.uploadDownloadStatusEvent(downloadEntity, "xapk解压开始") val xapkUnzipThread = XapkUnzipThread(downloadEntity, this) xapkUnzipThread.start() mXapkUnzipThreadMap[downloadEntity.path] = xapkUnzipThread @@ -136,6 +138,8 @@ object XapkInstaller : IXapkUnzipListener { ) } + DownloadDataHelper.uploadDownloadStatusEvent(downloadEntity, "xapk解压失败") + debugOnly { Utils.log("unzip", "onFailure->$exception") } @@ -161,6 +165,8 @@ object XapkInstaller : IXapkUnzipListener { DownloadManager.getInstance().updateDownloadEntity(downloadEntity) } + DownloadDataHelper.uploadDownloadStatusEvent(downloadEntity, "xapk解压成功") + debugOnly { Utils.log("unzip", "onSuccess->${downloadEntity.path}") } diff --git a/app/src/main/java/com/gh/download/DownloadDataHelper.kt b/app/src/main/java/com/gh/download/DownloadDataHelper.kt index f59615c795..e87b0a9080 100644 --- a/app/src/main/java/com/gh/download/DownloadDataHelper.kt +++ b/app/src/main/java/com/gh/download/DownloadDataHelper.kt @@ -8,10 +8,7 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.exposure.meta.MetaUtil import com.gh.gamecenter.common.exposure.meta.MetaUtil.getMeta import com.gh.gamecenter.common.loghub.LoghubUtils -import com.gh.gamecenter.common.utils.DeviceUtils -import com.gh.gamecenter.common.utils.getExtension -import com.gh.gamecenter.common.utils.getMetaExtra -import com.gh.gamecenter.common.utils.isSimulatorGame +import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.core.utils.SentryHelper import com.halo.assistant.HaloApp import com.lightgame.download.DataChanger @@ -220,11 +217,11 @@ object DownloadDataHelper { LoghubUtils.log(jsonObject, "download_debug", false) } - private fun uploadDownloadStatusEvent(downloadEntity: DownloadEntity) { + fun uploadDownloadStatusEvent(downloadEntity: DownloadEntity, extraStatus: String? = null) { val jsonObject = JSONObject() try { - val statusAlias = getDownloadStatusAlias(downloadEntity) + val statusAlias = extraStatus ?: getDownloadStatusAlias(downloadEntity) jsonObject.put("event", statusAlias) jsonObject.put("msg", downloadEntity.error) jsonObject.put("status", downloadEntity.status.status) 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 ea9b774f00..e68a6385ba 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -200,7 +200,7 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi } if (location != null && XapkUnzipStatus.FAILURE.name().equals(downloadEntity.getMeta().get(XapkInstaller.XAPK_UNZIP_STATUS))) { - XapkDialogHelper.INSTANCE.showUnzipFailureDialog(requireContext(), downloadEntity); + XapkDialogHelper.INSTANCE.showUnzipFailureDialog(requireContext(), downloadEntity, false); } } }; diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java index 3d7cfdbaf7..ea03a5b795 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragmentAdapter.java @@ -203,7 +203,7 @@ class GameDownloadFragmentAdapter extends BaseRecyclerAdapter { viewHolder.binding.dmItemTvSpeed.setTextColor(ContextCompat.getColor(mContext, R.color.theme_red)); viewHolder.binding.dmItemTvSpeed.setText("解压失败"); viewHolder.binding.dmItemTvSpeed.setOnClickListener(v -> { - XapkDialogHelper.INSTANCE.showUnzipFailureDialog(mContext, downloadEntity); + XapkDialogHelper.INSTANCE.showUnzipFailureDialog(mContext, downloadEntity, true); }); ExtensionsKt.enlargeTouchArea(viewHolder.binding.dmItemTvSpeed, 50); ExtensionsKt.setDrawableStart(viewHolder.binding.dmItemTvSpeed, R.drawable.unzip_failure_hint, null, null);