Merge DialogBuilderFactory with new code style

This commit is contained in:
2022-06-07 16:57:40 +08:00
parent 7024a8c521
commit 3be12ef72c
2 changed files with 60 additions and 52 deletions

View File

@@ -59,44 +59,42 @@ class AppErrorsDisplayActivity : BaseActivity<ActivityAppErrorsDisplayBinding>()
val appErrorsDisplay = runCatching { intent?.getSerializableExtra(EXTRA_APP_ERRORS_DISPLAY) as? AppErrorsDisplayBean }.getOrNull() val appErrorsDisplay = runCatching { intent?.getSerializableExtra(EXTRA_APP_ERRORS_DISPLAY) as? AppErrorsDisplayBean }.getOrNull()
?: return toastAndFinish(name = "AppErrorsDisplay") ?: return toastAndFinish(name = "AppErrorsDisplay")
/** 显示对话框 */ /** 显示对话框 */
showDialog { showDialog<DiaAppErrorsDisplayBinding> {
title = appErrorsDisplay.title title = appErrorsDisplay.title
bind<DiaAppErrorsDisplayBinding>().apply { binding.processNameText.isVisible = appErrorsDisplay.packageName != appErrorsDisplay.processName
processNameText.isVisible = appErrorsDisplay.packageName != appErrorsDisplay.processName binding.appInfoItem.isVisible = appErrorsDisplay.isShowAppInfoButton
appInfoItem.isVisible = appErrorsDisplay.isShowAppInfoButton binding.closeAppItem.isVisible = appErrorsDisplay.isShowReopenButton.not() && appErrorsDisplay.isShowCloseAppButton
closeAppItem.isVisible = appErrorsDisplay.isShowReopenButton.not() && appErrorsDisplay.isShowCloseAppButton binding.reopenAppItem.isVisible = appErrorsDisplay.isShowReopenButton
reopenAppItem.isVisible = appErrorsDisplay.isShowReopenButton binding.processNameText.text = LocaleString.crashProcess(appErrorsDisplay.processName)
processNameText.text = LocaleString.crashProcess(appErrorsDisplay.processName) binding.appInfoItem.setOnClickListener {
appInfoItem.setOnClickListener { cancel()
cancel() openSelfSetting(appErrorsDisplay.packageName)
openSelfSetting(appErrorsDisplay.packageName) }
binding.closeAppItem.setOnClickListener { cancel() }
binding.reopenAppItem.setOnClickListener {
FrameworkTool.openAppUsedFramework(context, appErrorsDisplay.packageName)
cancel()
}
binding.errorDetailItem.setOnClickListener {
FrameworkTool.fetchAppErrorsInfoData(context) { appErrorsInfos ->
appErrorsInfos.takeIf { it.isNotEmpty() }
?.filter { it.packageName == appErrorsDisplay.packageName }
?.takeIf { it.isNotEmpty() }?.get(0)?.let {
AppErrorsDetailActivity.start(context, it)
cancel()
} ?: toast(msg = "No errors founded")
} }
closeAppItem.setOnClickListener { cancel() } }
reopenAppItem.setOnClickListener { binding.ignoreIfUnlockItem.setOnClickListener {
FrameworkTool.openAppUsedFramework(context, appErrorsDisplay.packageName) FrameworkTool.mutedErrorsIfUnlock(context, appErrorsDisplay.packageName) {
toast(LocaleString.muteIfUnlockTip(appErrorsDisplay.appName))
cancel() cancel()
} }
errorDetailItem.setOnClickListener { }
FrameworkTool.fetchAppErrorsInfoData(context) { appErrorsInfos -> binding.ignoreIfRestartItem.setOnClickListener {
appErrorsInfos.takeIf { it.isNotEmpty() } FrameworkTool.mutedErrorsIfRestart(context, appErrorsDisplay.packageName) {
?.filter { it.packageName == appErrorsDisplay.packageName } toast(LocaleString.muteIfRestartTip(appErrorsDisplay.appName))
?.takeIf { it.isNotEmpty() }?.get(0)?.let { cancel()
AppErrorsDetailActivity.start(context, it)
cancel()
} ?: toast(msg = "No errors founded")
}
}
ignoreIfUnlockItem.setOnClickListener {
FrameworkTool.mutedErrorsIfUnlock(context, appErrorsDisplay.packageName) {
toast(LocaleString.muteIfUnlockTip(appErrorsDisplay.appName))
cancel()
}
}
ignoreIfRestartItem.setOnClickListener {
FrameworkTool.mutedErrorsIfRestart(context, appErrorsDisplay.packageName) {
toast(LocaleString.muteIfRestartTip(appErrorsDisplay.appName))
cancel()
}
} }
} }
onCancel { finish() } onCancel { finish() }

View File

@@ -44,27 +44,46 @@ import com.highcapable.yukihookapi.annotation.CauseProblemsApi
import com.highcapable.yukihookapi.hook.factory.method import com.highcapable.yukihookapi.hook.factory.method
import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
/**
* 构造 [VB] 自定义 View 对话框
* @param initiate 对话框方法体
*/
@JvmName(name = "showDialog-VB")
inline fun <reified VB : ViewBinding> Context.showDialog(initiate: DialogBuilder<VB>.() -> Unit) =
DialogBuilder<VB>(context = this, VB::class.java).apply(initiate).show()
/** /**
* 构造对话框 * 构造对话框
* @param initiate 对话框方法体 * @param initiate 对话框方法体
*/ */
fun Context.showDialog(initiate: DialogBuilder.() -> Unit) = DialogBuilder(context = this).apply(initiate).show() inline fun Context.showDialog(initiate: DialogBuilder<*>.() -> Unit) = DialogBuilder<ViewBinding>(context = this).apply(initiate).show()
/** /**
* 对话框构造器 * 对话框构造器
* @param context 实例 * @param context 实例
* @param bindingClass [ViewBinding] 的 [Class] 实例 or null
*/ */
class DialogBuilder(val context: Context) { class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingClass: Class<*>? = null) {
private var instanceAndroidX: androidx.appcompat.app.AlertDialog.Builder? = null // 实例对象 private var instanceAndroidX: androidx.appcompat.app.AlertDialog.Builder? = null // 实例对象
private var instanceAndroid: android.app.AlertDialog.Builder? = null // 实例对象 private var instanceAndroid: android.app.AlertDialog.Builder? = null // 实例对象
private var onCancel: (() -> Unit)? = null // 对话框取消监听 private var onCancel: (() -> Unit)? = null // 对话框取消监听
private var dialogInstance: Dialog? = null // 对话框实例 private var dialogInstance: Dialog? = null // 对话框实例
private var customLayoutView: View? = null // 自定义布局
@CauseProblemsApi /**
var customLayoutView: View? = null // 自定义布局 * 获取 [DialogBuilder] 绑定布局对象
* @return [VB]
*/
val binding by lazy {
bindingClass?.method {
name = "inflate"
param(LayoutInflaterClass)
}?.get()?.invoke<VB>(LayoutInflater.from(context))?.apply {
customLayoutView = root
} ?: error("This dialog maybe not a custom view dialog")
}
/** /**
* 是否需要使用 AndroidX 风格对话框 * 是否需要使用 AndroidX 风格对话框
@@ -129,18 +148,6 @@ class DialogBuilder(val context: Context) {
else customLayoutView?.findViewWithTag<TextView>("progressContent")?.text = value else customLayoutView?.findViewWithTag<TextView>("progressContent")?.text = value
} }
/**
* 设置对话框自定义布局
* @return [ViewBinding]
*/
inline fun <reified T : ViewBinding> bind() =
T::class.java.method {
name = "inflate"
param(LayoutInflaterClass)
}.get().invoke<T>(LayoutInflater.from(context))?.apply {
customLayoutView = root
} ?: error("binding failed")
/** /**
* 设置对话框确定按钮 * 设置对话框确定按钮
* @param text 按钮文本内容 * @param text 按钮文本内容
@@ -186,7 +193,10 @@ class DialogBuilder(val context: Context) {
fun cancel() = dialogInstance?.cancel() fun cancel() = dialogInstance?.cancel()
/** 显示对话框 */ /** 显示对话框 */
internal fun show() { @CauseProblemsApi
fun show() {
/** 若当前自定义 View 的对话框没有调用 [binding] 将会对其手动调用一次以确保显示布局 */
if (bindingClass != null) binding
if (isUsingAndroidX) runCatching { if (isUsingAndroidX) runCatching {
instanceAndroidX?.create()?.apply { instanceAndroidX?.create()?.apply {
customLayoutView?.let { setView(it) } customLayoutView?.let { setView(it) }