Modify merge to new DialogBuilderFactory

This commit is contained in:
2022-10-06 03:21:02 +08:00
parent 97161f8692
commit eb090b11de

View File

@@ -27,8 +27,6 @@ package com.fankes.coloros.notify.utils.factory
import android.app.Dialog import android.app.Dialog
import android.app.TimePickerDialog import android.app.TimePickerDialog
import android.content.Context import android.content.Context
import android.graphics.Color
import android.graphics.drawable.GradientDrawable
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -36,9 +34,10 @@ import android.view.ViewGroup
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AlertDialog
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.annotation.CauseProblemsApi 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
@@ -55,7 +54,7 @@ fun Context.showTimePicker(timeSet: String = "", result: (String) -> Unit) =
* 构造 [VB] 自定义 View 对话框 * 构造 [VB] 自定义 View 对话框
* @param initiate 对话框方法体 * @param initiate 对话框方法体
*/ */
@JvmName(name = "showDialog-VB") @JvmName(name = "showDialog_Generics")
inline fun <reified VB : ViewBinding> Context.showDialog(initiate: DialogBuilder<VB>.() -> Unit) = inline fun <reified VB : ViewBinding> Context.showDialog(initiate: DialogBuilder<VB>.() -> Unit) =
DialogBuilder<VB>(context = this, VB::class.java).apply(initiate).show() DialogBuilder<VB>(context = this, VB::class.java).apply(initiate).show()
@@ -72,11 +71,17 @@ inline fun Context.showDialog(initiate: DialogBuilder<*>.() -> Unit) = DialogBui
*/ */
class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingClass: Class<*>? = null) { class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingClass: Class<*>? = null) {
private var instanceAndroidX: androidx.appcompat.app.AlertDialog.Builder? = null // 实例对象 /** 实例对象 */
private var instanceAndroid: android.app.AlertDialog.Builder? = null // 实例对象 private var instance: AlertDialog.Builder? = null
private var dialogInstance: Dialog? = null // 对话框实例 /** 对话框取消监听 */
private var customLayoutView: View? = null // 自定义布局 private var onCancel: (() -> Unit)? = null
/** 对话框实例 */
private var dialogInstance: Dialog? = null
/** 自定义布局 */
private var customLayoutView: View? = null
/** /**
* 获取 [DialogBuilder] 绑定布局对象 * 获取 [DialogBuilder] 绑定布局对象
@@ -91,41 +96,28 @@ class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingC
} ?: error("This dialog maybe not a custom view dialog") } ?: error("This dialog maybe not a custom view dialog")
} }
/**
* 是否需要使用 AndroidX 风格对话框
* @return [Boolean]
*/
private val isUsingAndroidX get() = runCatching { context is AppCompatActivity }.getOrNull() ?: false
init { init {
if (isUsingAndroidX) if (YukiHookAPI.Status.isXposedEnvironment) error("This dialog is not allowed to created in Xposed environment")
runInSafe { instanceAndroidX = MaterialAlertDialogBuilder(context) } instance = MaterialAlertDialogBuilder(context)
else runInSafe { instanceAndroid = android.app.AlertDialog.Builder(context, android.R.style.Theme_Material_Light_Dialog) }
} }
/** 设置对话框不可关闭 */ /** 设置对话框不可关闭 */
fun noCancelable() { fun noCancelable() {
if (isUsingAndroidX) instance?.setCancelable(false)
runInSafe { instanceAndroidX?.setCancelable(false) }
else runInSafe { instanceAndroid?.setCancelable(false) }
} }
/** 设置对话框标题 */ /** 设置对话框标题 */
var title var title
get() = "" get() = ""
set(value) { set(value) {
if (isUsingAndroidX) instance?.setTitle(value)
runInSafe { instanceAndroidX?.setTitle(value) }
else runInSafe { instanceAndroid?.setTitle(value) }
} }
/** 设置对话框消息内容 */ /** 设置对话框消息内容 */
var msg var msg
get() = "" get() = ""
set(value) { set(value) {
if (isUsingAndroidX) instance?.setMessage(value)
runInSafe { instanceAndroidX?.setMessage(value) }
else runInSafe { instanceAndroid?.setMessage(value) }
} }
/** 设置进度条对话框消息内容 */ /** 设置进度条对话框消息内容 */
@@ -153,9 +145,7 @@ class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingC
* @param callback 点击事件 * @param callback 点击事件
*/ */
fun confirmButton(text: String = "确定", callback: () -> Unit = {}) { fun confirmButton(text: String = "确定", callback: () -> Unit = {}) {
if (isUsingAndroidX) instance?.setPositiveButton(text) { _, _ -> callback() }
runInSafe { instanceAndroidX?.setPositiveButton(text) { _, _ -> callback() } }
else runInSafe { instanceAndroid?.setPositiveButton(text) { _, _ -> callback() } }
} }
/** /**
@@ -164,9 +154,7 @@ class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingC
* @param callback 点击事件 * @param callback 点击事件
*/ */
fun cancelButton(text: String = "取消", callback: () -> Unit = {}) { fun cancelButton(text: String = "取消", callback: () -> Unit = {}) {
if (isUsingAndroidX) instance?.setNegativeButton(text) { _, _ -> callback() }
runInSafe { instanceAndroidX?.setNegativeButton(text) { _, _ -> callback() } }
else runInSafe { instanceAndroid?.setNegativeButton(text) { _, _ -> callback() } }
} }
/** /**
@@ -175,9 +163,15 @@ class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingC
* @param callback 点击事件 * @param callback 点击事件
*/ */
fun neutralButton(text: String = "更多", callback: () -> Unit = {}) { fun neutralButton(text: String = "更多", callback: () -> Unit = {}) {
if (isUsingAndroidX) instance?.setNeutralButton(text) { _, _ -> callback() }
runInSafe { instanceAndroidX?.setNeutralButton(text) { _, _ -> callback() } } }
else runInSafe { instanceAndroid?.setNeutralButton(text) { _, _ -> callback() } }
/**
* 当对话框关闭时
* @param callback 回调
*/
fun onCancel(callback: () -> Unit) {
onCancel = callback
} }
/** 取消对话框 */ /** 取消对话框 */
@@ -185,28 +179,13 @@ class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingC
/** 显示对话框 */ /** 显示对话框 */
@CauseProblemsApi @CauseProblemsApi
fun show() { fun show() = runInSafe {
/** 若当前自定义 View 的对话框没有调用 [binding] 将会对其手动调用一次以确保显示布局 */ /** 若当前自定义 View 的对话框没有调用 [binding] 将会对其手动调用一次以确保显示布局 */
if (bindingClass != null) binding if (bindingClass != null) binding
if (isUsingAndroidX) runInSafe { instance?.create()?.apply {
instanceAndroidX?.create()?.apply { customLayoutView?.let { setView(it) }
customLayoutView?.let { setView(it) } dialogInstance = this
dialogInstance = this setOnCancelListener { onCancel?.invoke() }
}?.show() }?.show()
} else runInSafe {
instanceAndroid?.create()?.apply {
customLayoutView?.let { setView(it) }
window?.setBackgroundDrawable(
GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,
intArrayOf(Color.WHITE, Color.WHITE)
).apply {
shape = GradientDrawable.RECTANGLE
gradientType = GradientDrawable.LINEAR_GRADIENT
cornerRadius = 15.dpFloat(this@DialogBuilder.context)
})
dialogInstance = this
}?.show()
}
} }
} }