Files
assistant-android/app/src/main/java/com/gh/common/util/DialogHelper.kt
2022-02-28 18:07:34 +08:00

354 lines
12 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
)
}