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