Files
assistant-android/app/src/main/java/com/gh/common/util/PureModeHelper.kt

342 lines
12 KiB
Kotlin

package com.gh.common.util
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.provider.Settings
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.gh.common.constant.Config
import com.gh.gamecenter.common.utils.DialogHelper
import com.gh.gamecenter.entity.NewApiSettingsEntity
import com.lightgame.utils.Utils
import com.gh.gamecenter.R
import com.gh.gamecenter.common.utils.SensorsBridge
import com.gh.gamecenter.common.utils.enlargeTouchArea
import com.gh.gamecenter.common.utils.setDrawableEnd
import com.gh.gamecenter.core.utils.SPUtils
/**
* 处理厂商纯净/安全模式的辅助类
*/
object PureModeHelper {
private const val TAG = "PureModeHelper"
private const val HW = "HUAWEI"
private const val HW_PURE_MODE_STATE = "pure_mode_state"
private const val HW_PURE_ENHANCED_MODE_STATE = "pure_enhanced_mode_state"
private const val HW_PURE_MODE = "harmony_os_pure_mode"
private const val HW_PURE_ENHANCED_MODE = "harmony_os_pure_enhanced_mode"
private const val SP_USER_IGNORE_GUIDE = "user_ignore_guide"
private const val SWITCH_EXIST = 1
private const val SWITCH_ON = 0
private const val SWITCH_OFF = -1
private var isThisDeviceUsingEnhancedMode = false // 当前设备是否是增强纯净模式
fun handlePureModeIfNeeded(
context: Context,
gameId: String,
gameName: String,
gameType: String,
callback: () -> Unit
) {
// 用户忽略提醒,不再走下面的逻辑
if (SPUtils.getBoolean(SP_USER_IGNORE_GUIDE, false)) {
callback()
return
}
// 仅适用于华为手机
val manufacturer = android.os.Build.MANUFACTURER
if (manufacturer != HW) {
callback.invoke()
return
}
val solidContext = DialogHelper.checkDialogContext(context)
if (solidContext == null) {
callback.invoke()
return
}
if (readState(solidContext, HW_PURE_ENHANCED_MODE_STATE) == SWITCH_ON) {
Utils.log(TAG, "增强纯净模式开启!")
isThisDeviceUsingEnhancedMode = true
val pureModeGuide =
Config.getNewApiSettingsEntity()?.install?.guides?.firstOrNull { it.type == HW_PURE_ENHANCED_MODE }
if (pureModeGuide != null) {
showHWHintDialog(solidContext, pureModeGuide, gameId, gameName, gameType, true, callback)
} else {
callback.invoke()
}
} else if (readState(solidContext, HW_PURE_ENHANCED_MODE_STATE) != SWITCH_EXIST
&& readState(solidContext, HW_PURE_MODE_STATE) == SWITCH_ON
) {
Utils.log(TAG, "纯净模式开启!")
isThisDeviceUsingEnhancedMode = false
val pureModeGuide =
Config.getNewApiSettingsEntity()?.install?.guides?.firstOrNull { it.type == HW_PURE_MODE }
if (pureModeGuide != null) {
showHWHintDialog(solidContext, pureModeGuide, gameId, gameName, gameType, false, callback)
} else {
callback.invoke()
}
} else {
callback()
}
}
private fun showHWHintDialog(
context: Context,
guide: NewApiSettingsEntity.Guide,
gameId: String,
gameName: String,
gameType: String,
isEnhancedMode: Boolean,
callback: () -> Unit
) {
var isIgnored = false
if (context is Activity) {
if (context.isFinishing) {
callback.invoke()
return
}
}
trackDialogShow(isEnhancedMode, gameId, gameName, gameType)
DialogHelper.showGuideDialog(
context = context,
title = guide.title,
content = guide.content,
confirmText = guide.buttonTextSettingJump,
cancelText = guide.buttonTextClose,
uiModificationCallback = { binding ->
binding.hintTv.buildSpannableString {
addText(guide.linkTextPrefix)
addText(guide.linkText) {
setColor(ColorResId(R.color.text_theme))
onClick(false) {
binding.extraHintIv.performClick()
}
}
}
binding.extraHintIv.setImageResource(R.drawable.ic_home_head_arrow)
binding.extraHintIv.setOnClickListener {
directToLink(
context,
guide,
gameId,
gameName,
gameType,
isEnhancedMode,
isIgnored
)
}
binding.extraHintIv.enlargeTouchArea()
binding.extraHintIv.visibility = View.VISIBLE
binding.hintTv.visibility = View.VISIBLE
binding.selectorContainer.visibility = if (guide.dialogFrequency == "once") View.VISIBLE else View.GONE
binding.selectorContainer.setOnClickListener {
binding.selectorContainer.isChecked = !binding.selectorContainer.isChecked
isIgnored = binding.selectorContainer.isChecked
}
binding.confirmTv.setOnClickListener {
toHWPureModeSetting(context)
trackDialogClicked(
isEnhancedMode = isEnhancedMode,
gameId = gameId,
gameName = gameName,
gameType = gameType,
buttonName = guide.buttonTextSettingJump,
isIgnored = isIgnored
)
}
// 监听是否已授权,授权后自动调起安装并 dismiss dialog
if (context is AppCompatActivity) {
val lifecycle = context.lifecycle
lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
val granted = (isThisDeviceUsingEnhancedMode && readState(context, HW_PURE_ENHANCED_MODE_STATE) != SWITCH_ON)
|| (!isThisDeviceUsingEnhancedMode && readState(context, HW_PURE_MODE_STATE) != SWITCH_ON)
if (granted) {
binding.dialog.dismiss()
callback.invoke()
lifecycle.removeObserver(this)
}
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
lifecycle.removeObserver(this)
}
})
}
},
confirmClickCallback = {
// do nothing, 上面 setOnClickListener 处理了
},
cancelClickCallback = {
if (guide.dialogFrequency == "once" && isIgnored) {
SPUtils.setBoolean(SP_USER_IGNORE_GUIDE, true)
}
trackDialogClicked(
isEnhancedMode = isEnhancedMode,
gameId = gameId,
gameName = gameName,
gameType = gameType,
buttonName = guide.buttonTextClose,
isIgnored = isIgnored
)
callback()
},
touchOutsideCallback = {
if (guide.dialogFrequency == "once" && isIgnored) {
SPUtils.setBoolean(SP_USER_IGNORE_GUIDE, true)
}
trackDialogClicked(
isEnhancedMode = isEnhancedMode,
gameId = gameId,
gameName = gameName,
gameType = gameType,
buttonName = "关闭弹窗",
isIgnored = isIgnored
)
callback()
},
extraConfig = DialogHelper.Config(centerTitle = true)
)
}
private fun directToLink(
context: Context,
guide: NewApiSettingsEntity.Guide,
gameId: String,
gameName: String,
gameType: String,
isEnhancedMode: Boolean,
isIgnored: Boolean
) {
DirectUtils.directToLinkPage(context, guide.link, "纯净模式弹窗", "")
trackDialogClicked(
isEnhancedMode,
gameId,
gameName,
gameType,
"跳转链接",
isIgnored,
guide.link.link ?: "",
guide.link.type ?: "",
guide.link.text ?: ""
)
}
private fun trackDialogShow(
isEnhancedMode: Boolean,
gameId: String,
gameName: String,
gameType: String
) {
if (isEnhancedMode) {
SensorsBridge.trackAddedProtectionDialogShow(
gameId = gameId,
gameName = gameName,
gameType = gameType
)
} else {
SensorsBridge.trackPureModeDialogShow(
gameId = gameId,
gameName = gameName,
gameType = gameType
)
}
}
private fun trackDialogClicked(
isEnhancedMode: Boolean,
gameId: String,
gameName: String,
gameType: String,
buttonName: String,
isIgnored: Boolean,
linkId: String? = null,
linkType: String? = null,
linkText: String? = null
) {
if (isEnhancedMode) {
SensorsBridge.trackAddedProtectionDialogClick(
gameId = gameId,
gameName = gameName,
gameType = gameType,
buttonName = buttonName,
isIgnored = isIgnored,
linkId = linkId ?: "",
linkType = linkType ?: "",
linkText = linkText ?: ""
)
} else {
SensorsBridge.trackPureModeDialogClick(
gameId = gameId,
gameName = gameName,
gameType = gameType,
buttonName = buttonName,
isIgnored = isIgnored,
linkId = linkId ?: "",
linkType = linkType ?: "",
linkText = linkText ?: ""
)
}
}
private fun toHWPureModeSetting(context: Context) {
try {
val intent = Intent()
intent.setPackage("com.huawei.security.privacycenter")
intent.setAction("com.huawei.securitycenter.PURE_MODE_ACTIVITY")
intent.putExtra("intent_from_settings", true)
context.startActivity(intent)
} catch (_: Exception) {
toSystemSettings(context)
}
}
private fun toSystemSettings(context: Context) {
try {
val intent = Intent(Settings.ACTION_SETTINGS)
context.startActivity(intent)
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun readState(context: Context, key: String): Int {
try {
val result = Settings.Secure.getInt(context.getContentResolver(), key, SWITCH_OFF)
Utils.log(TAG, "readState $key state >>> $result")
return result
} catch (e: Exception) {
e.printStackTrace()
}
return SWITCH_OFF
}
}