354 lines
12 KiB
Kotlin
354 lines
12 KiB
Kotlin
package com.gh.common.util
|
||
|
||
import android.app.Activity
|
||
import android.app.Dialog
|
||
import android.content.Context
|
||
import android.graphics.Color
|
||
import android.graphics.drawable.ColorDrawable
|
||
import android.text.Html
|
||
import android.view.Gravity
|
||
import android.view.LayoutInflater
|
||
import android.view.View
|
||
import android.view.Window
|
||
import com.gh.common.dialog.TrackableDialog
|
||
import com.gh.common.util.DialogUtils.ConfirmListener
|
||
import com.gh.common.util.DialogUtils.checkDialogContext
|
||
import com.gh.gamecenter.AboutActivity
|
||
import com.gh.gamecenter.R
|
||
import com.gh.gamecenter.databinding.DialogAlertDefaultBinding
|
||
import com.gh.gamecenter.databinding.DialogProgressBinding
|
||
import splitties.systemservices.layoutInflater
|
||
|
||
object DialogHelper {
|
||
|
||
/**
|
||
* 光环常规弹窗
|
||
*
|
||
* extraConfig,可选标题居中、内容居中、是否显示关闭按钮以及是否显示正文辅助文本等
|
||
*
|
||
* uiModificationCallback,可用来手动微调样式的回调,可使用 binding 来修改颜色、文字大小等
|
||
*/
|
||
fun showDialog(
|
||
context: Context,
|
||
title: String,
|
||
content: CharSequence,
|
||
confirmText: String,
|
||
cancelText: String,
|
||
confirmClickCallback: (() -> Unit)? = null,
|
||
cancelClickCallback: (() -> Unit)? = null,
|
||
extraConfig: Config? = null,
|
||
uiModificationCallback: ((binding: DialogAlertDefaultBinding) -> Unit)? = null,
|
||
trackMtaEvent: Boolean = false,
|
||
mtaEvent: String = "",
|
||
mtaKey: String = ""): Dialog? {
|
||
val solidContext = checkDialogContext(context)
|
||
|
||
if (solidContext is Activity && solidContext.isFinishing) return null
|
||
|
||
val dialog = if (trackMtaEvent) {
|
||
TrackableDialog(solidContext, R.style.GhAlertDialog, mtaEvent, mtaKey)
|
||
} else {
|
||
Dialog(solidContext, R.style.GhAlertDialog)
|
||
}
|
||
|
||
val binding = DialogAlertDefaultBinding.inflate(LayoutInflater.from(solidContext))
|
||
val contentView = binding.root
|
||
binding.contentTv.text = content
|
||
binding.titleTv.text = title
|
||
|
||
extraConfig?.let {
|
||
if (it.hint.isNotEmpty()) {
|
||
binding.hintTv.visibility = View.VISIBLE
|
||
binding.hintTv.text = it.hint
|
||
}
|
||
|
||
if (it.centerTitle) {
|
||
binding.titleTv.gravity = Gravity.CENTER
|
||
}
|
||
|
||
if (it.centerContent) {
|
||
binding.contentTv.gravity = Gravity.CENTER
|
||
}
|
||
|
||
if (it.showCloseIcon) {
|
||
binding.closeContainer.visibility = View.VISIBLE
|
||
binding.closeContainer.enlargeTouchArea()
|
||
binding.closeContainer.setOnClickListener { dialog.dismiss() }
|
||
}
|
||
}
|
||
|
||
if (cancelText.isEmpty()) {
|
||
binding.cancelTv.visibility = View.GONE
|
||
binding.centerDivider.visibility = View.GONE
|
||
}
|
||
|
||
binding.cancelTv.text = cancelText
|
||
binding.confirmTv.text = confirmText
|
||
|
||
binding.cancelTv.setOnClickListener {
|
||
if (trackMtaEvent) MtaHelper.onEvent(mtaEvent, mtaKey, "点击$cancelText")
|
||
|
||
cancelClickCallback?.invoke()
|
||
dialog.dismiss()
|
||
}
|
||
|
||
binding.confirmTv.setOnClickListener {
|
||
if (trackMtaEvent) MtaHelper.onEvent(mtaEvent, mtaKey, "点击$confirmText")
|
||
|
||
confirmClickCallback?.invoke()
|
||
dialog.dismiss()
|
||
}
|
||
|
||
uiModificationCallback?.invoke(binding)
|
||
|
||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||
dialog.setContentView(contentView)
|
||
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||
dialog.show()
|
||
|
||
return dialog
|
||
}
|
||
|
||
/**
|
||
* For legacy java invocation
|
||
*/
|
||
@JvmStatic
|
||
@Deprecated("Kotlin 中请使用其它方法调用")
|
||
fun showDialog(context: Context,
|
||
title: String,
|
||
content: CharSequence,
|
||
positiveText: String,
|
||
negativeText: String,
|
||
positiveClickCallback: EmptyCallback,
|
||
negativeClickCallback: EmptyCallback,
|
||
trackMtaEvent: Boolean = false,
|
||
mtaEvent: String = "",
|
||
mtaKey: String = "") {
|
||
showDialog(
|
||
context = context,
|
||
title = title,
|
||
content = content,
|
||
confirmText = positiveText,
|
||
cancelText = negativeText,
|
||
confirmClickCallback = { positiveClickCallback.onCallback() },
|
||
cancelClickCallback = { negativeClickCallback.onCallback() },
|
||
extraConfig = Config(centerTitle = true, centerContent = true),
|
||
trackMtaEvent = trackMtaEvent,
|
||
mtaEvent = mtaEvent,
|
||
mtaKey = mtaKey)
|
||
}
|
||
|
||
/**
|
||
* For legacy java invocation
|
||
*/
|
||
@JvmStatic
|
||
@Deprecated("Kotlin 中请使用其它方法调用")
|
||
fun showCenterDialog(
|
||
context: Context,
|
||
title: String,
|
||
content: CharSequence,
|
||
positiveText: String,
|
||
negativeText: String,
|
||
positiveClickCallback: EmptyCallback,
|
||
negativeClickCallback: EmptyCallback
|
||
) {
|
||
showDialog(
|
||
context = context,
|
||
title = title,
|
||
content = content,
|
||
confirmText = positiveText,
|
||
cancelText = negativeText,
|
||
confirmClickCallback = { positiveClickCallback.onCallback() },
|
||
cancelClickCallback = { negativeClickCallback.onCallback() },
|
||
extraConfig = Config(centerTitle = true, centerContent = true)
|
||
)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun getProgressDialog(
|
||
context: Context,
|
||
content: String,
|
||
uiModificationCallback: ((binding: DialogProgressBinding) -> Unit)? = null
|
||
): Dialog {
|
||
val dialog = Dialog(context)
|
||
val binding = DialogProgressBinding.inflate(context.layoutInflater)
|
||
binding.contentTv.text = content
|
||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||
dialog.setContentView(binding.root)
|
||
dialog.setCanceledOnTouchOutside(false)
|
||
dialog.window?.setBackgroundDrawableResource(R.drawable.background_shape_white_radius_8)
|
||
dialog.window?.attributes = dialog.window?.attributes?.apply { width = 160F.dip2px() }
|
||
uiModificationCallback?.invoke(binding)
|
||
dialog.show()
|
||
return dialog
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showSignatureConflictDialog(context: Context,
|
||
confirmClickCallback: (() -> Unit)? = null) {
|
||
showDialog(
|
||
context,
|
||
"温馨提示",
|
||
"检测到安装包与已安装应用的签名不一致,需要卸载后才能安装,是否立即卸载",
|
||
"卸载",
|
||
"取消",
|
||
{ confirmClickCallback?.invoke() },
|
||
null,
|
||
Config(hint = "注意:卸载会让游戏数据丢失,请提前做好备份"),
|
||
{ binding -> binding.hintTv.setTextColor(R.color.theme_font.toColor()) }
|
||
)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showPluginDialog(context: Context,
|
||
confirmClickCallback: (() -> Unit)? = null) {
|
||
MtaHelper.onEvent("插件化", "插件化安装弹窗", "出现弹窗提示")
|
||
showDialog(
|
||
context,
|
||
"插件化安装",
|
||
"您将进行插件化安装以实现插件功能,此过程将卸载当前使用的版本并安装插件版本",
|
||
"确认,开始插件化",
|
||
"取消",
|
||
{
|
||
confirmClickCallback?.invoke()
|
||
MtaHelper.onEvent("插件化", "插件化安装弹窗", "确认并开始")
|
||
},
|
||
{ MtaHelper.onEvent("插件化", "插件化安装弹窗", "取消") },
|
||
Config(hint = "注意:卸载前请妥善保存游戏账号与密码"),
|
||
{ binding -> binding.hintTv.setTextColor(R.color.text_FF0000.toColor()) }
|
||
)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showUpgradeDialog(context: Context) {
|
||
showDialog(
|
||
context,
|
||
"提示",
|
||
"当前版本暂不支持该功能,\n建议您升级到最新版本体验哦",
|
||
"检查升级",
|
||
"取消",
|
||
confirmClickCallback = { context.startActivity(AboutActivity.getIntent(context, true)); },
|
||
uiModificationCallback = {
|
||
it.titleTv.gravity = Gravity.CENTER
|
||
it.contentTv.gravity = Gravity.CENTER
|
||
}
|
||
)
|
||
}
|
||
|
||
|
||
@JvmStatic
|
||
fun showDowngradeHintDialog(context: Context,
|
||
confirmClickCallback: (() -> Unit)? = null) {
|
||
showDialog(
|
||
context,
|
||
"温馨提示",
|
||
"您已安装较高版本,若要安装历史版本需先卸载再安装\n",
|
||
"我知道了",
|
||
"",
|
||
{ confirmClickCallback?.invoke() })
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showCenterWarningDialog(
|
||
context: Context,
|
||
title: String,
|
||
msg: CharSequence,
|
||
confirmClickCallback: EmptyCallback
|
||
) {
|
||
showCenterWarningDialog(
|
||
context,
|
||
title,
|
||
msg,
|
||
confirmClickCallback = { confirmClickCallback.onCallback() }
|
||
)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showWarningDialog(
|
||
context: Context,
|
||
title: String,
|
||
msg: CharSequence,
|
||
cancelText: String = "取消",
|
||
confirmText: String = "确定",
|
||
confirmClickCallback: (() -> Unit)? = null,
|
||
cancelClickCallback: (() -> Unit)? = null
|
||
) {
|
||
showDialog(
|
||
context,
|
||
title,
|
||
msg,
|
||
confirmText,
|
||
cancelText,
|
||
confirmClickCallback,
|
||
cancelClickCallback
|
||
)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showCenterWarningDialog(
|
||
context: Context,
|
||
title: String,
|
||
msg: CharSequence,
|
||
cancelText: String = "取消",
|
||
confirmText: String = "确定",
|
||
confirmClickCallback: (() -> Unit)? = null,
|
||
cancelClickCallback: (() -> Unit)? = null
|
||
) {
|
||
showDialog(
|
||
context,
|
||
title,
|
||
msg,
|
||
confirmText,
|
||
cancelText,
|
||
confirmClickCallback,
|
||
cancelClickCallback,
|
||
extraConfig = Config(centerContent = true, centerTitle = true)
|
||
)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showDownloadDialog(context: Context, listener: ConfirmListener) {
|
||
showCenterWarningDialog(
|
||
context,
|
||
"下载提示",
|
||
"您当前使用的网络为2G/3G/4G,开始下载将会消耗移动流量,确定下载?",
|
||
confirmClickCallback = { listener.onConfirm() }
|
||
)
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showCancelDialog(context: Context, confirmClickCallback: (() -> Unit)? = null, cancelClickCallback: (() -> Unit)? = null) {
|
||
val content = Html.fromHtml(context.getString(R.string.cancel_concern_dialog))
|
||
showDialog(context, "取消关注", content, "确定取消", "暂不取消", confirmClickCallback, cancelClickCallback, extraConfig = Config(centerTitle = true, centerContent = true))
|
||
}
|
||
|
||
@JvmStatic
|
||
fun showDialogWithHtmlContent(
|
||
context: Context,
|
||
title: String,
|
||
content: String,
|
||
confirmText: String,
|
||
cancelText: String,
|
||
confirmClickCallback: (() -> Unit)? = null,
|
||
cancelClickCallback: (() -> Unit)? = null
|
||
) {
|
||
val webContent = Html.fromHtml(content)
|
||
showDialog(
|
||
context,
|
||
title,
|
||
webContent,
|
||
confirmText,
|
||
cancelText,
|
||
confirmClickCallback,
|
||
cancelClickCallback
|
||
)
|
||
}
|
||
|
||
data class Config(
|
||
val hint: String = "",
|
||
val showCloseIcon: Boolean = false,
|
||
val centerTitle: Boolean = false,
|
||
val centerContent: Boolean = false
|
||
)
|
||
|
||
} |