Skip to content

Commit 9499727

Browse files
committed
Merge DialogBuilderFactory with new code style
1 parent 0036ba0 commit 9499727

8 files changed

Lines changed: 87 additions & 86 deletions

File tree

app/src/main/java/com/fankes/miui/notify/ui/activity/ConfigureActivity.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ class ConfigureActivity : BaseActivity<ActivityConfigBinding>() {
8181
}
8282
/** 设置过滤按钮点击事件 */
8383
binding.configTitleFilter.setOnClickListener {
84-
showDialog {
84+
showDialog<DiaIconFilterBinding> {
8585
title = "按条件过滤"
86-
val editText = bind<DiaIconFilterBinding>().diaIconFilterInputEdit.apply {
86+
binding.iconFiltersEdit.apply {
8787
requestFocus()
8888
invalidate()
8989
if (filterText.isNotBlank()) {
@@ -92,8 +92,8 @@ class ConfigureActivity : BaseActivity<ActivityConfigBinding>() {
9292
}
9393
}
9494
confirmButton {
95-
if (editText.text.toString().isNotBlank()) {
96-
filterText = editText.text.toString().trim()
95+
if (binding.iconFiltersEdit.text.toString().isNotBlank()) {
96+
filterText = binding.iconFiltersEdit.text.toString().trim()
9797
refreshAdapterResult()
9898
} else {
9999
toast(msg = "条件不能为空")

app/src/main/java/com/fankes/miui/notify/ui/activity/MainActivity.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,22 +262,22 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
262262
binding.warnSCountDisTip.isGone = miuiVersionCode > 12.5
263263
/** 修改状态栏通知图标个数按钮点击事件 */
264264
binding.statusIconCountButton.setOnClickListener {
265-
showDialog {
265+
showDialog<DiaStatusIconCountBinding> {
266266
title = "设置最多显示的图标个数"
267-
val editText = bind<DiaStatusIconCountBinding>().diaStatusIconCountInputEdit.apply {
267+
binding.iconCountEdit.apply {
268268
requestFocus()
269269
invalidate()
270270
setText(statusBarIconCount.toString())
271271
setSelection(statusBarIconCount.toString().length)
272272
}
273273
confirmButton {
274274
when {
275-
(runCatching { editText.text.toString().toInt() }.getOrNull() ?: -1)
275+
(runCatching { binding.iconCountEdit.text.toString().toInt() }.getOrNull() ?: -1)
276276
!in 0..100 -> snake(msg = "请输入有效数值")
277-
editText.text.toString().isNotBlank() -> runCatching {
278-
statusBarIconCount = editText.text.toString().trim().toInt()
277+
binding.iconCountEdit.text.toString().isNotBlank() -> runCatching {
278+
statusBarIconCount = binding.iconCountEdit.text.toString().trim().toInt()
279279
modulePrefs.put(DataConst.HOOK_STATUS_ICON_COUNT, statusBarIconCount)
280-
binding.statusIconCountText.text = statusBarIconCount.toString()
280+
this@MainActivity.binding.statusIconCountText.text = statusBarIconCount.toString()
281281
SystemUITool.showNeedRestartSnake(context)
282282
}.onFailure { snake(msg = "数值格式无效") }
283283
else -> snake(msg = "请输入有效数值")
@@ -299,7 +299,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
299299
"模块无需保持在后台运行,到达同步时间后会自动启动,如果到达时间后模块正在运行则会自动取消本次计划任务。"
300300
confirmButton(text = "保存设置") {
301301
notifyIconAutoSyncTime = it
302-
binding.notifyIconAutoSyncText.text = it
302+
this@MainActivity.binding.notifyIconAutoSyncText.text = it
303303
modulePrefs.put(DataConst.NOTIFY_ICON_FIX_AUTO_TIME, it)
304304
SystemUITool.refreshSystemUI(context, isRefreshCacheOnly = true)
305305
}

app/src/main/java/com/fankes/miui/notify/utils/factory/DialogBuilderFactory.kt

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,6 @@ import com.highcapable.yukihookapi.annotation.CauseProblemsApi
4343
import com.highcapable.yukihookapi.hook.factory.method
4444
import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
4545

46-
/**
47-
* 构造对话框
48-
* @param isUseBlackTheme 是否使用深色主题
49-
* @param initiate 对话框方法体
50-
*/
51-
fun Context.showDialog(isUseBlackTheme: Boolean = false, initiate: DialogBuilder.() -> Unit) =
52-
DialogBuilder(context = this, isUseBlackTheme).apply(initiate).show()
53-
5446
/**
5547
* 显示时间选择对话框
5648
* @param timeSet 当前时间 - 不写将使用当前时间格式:HH:mm
@@ -59,20 +51,45 @@ fun Context.showDialog(isUseBlackTheme: Boolean = false, initiate: DialogBuilder
5951
fun Context.showTimePicker(timeSet: String = "", result: (String) -> Unit) =
6052
TimePickerDialog(this, { _, h, m -> result("${h.autoZero}:${m.autoZero}") }, timeSet.hour, timeSet.minute, true).show()
6153

54+
/**
55+
* 构造 [VB] 自定义 View 对话框
56+
* @param initiate 对话框方法体
57+
*/
58+
@JvmName(name = "showDialog-VB")
59+
inline fun <reified VB : ViewBinding> Context.showDialog(initiate: DialogBuilder<VB>.() -> Unit) =
60+
DialogBuilder<VB>(context = this, VB::class.java).apply(initiate).show()
61+
62+
/**
63+
* 构造对话框
64+
* @param initiate 对话框方法体
65+
*/
66+
inline fun Context.showDialog(initiate: DialogBuilder<*>.() -> Unit) = DialogBuilder<ViewBinding>(context = this).apply(initiate).show()
67+
6268
/**
6369
* 对话框构造器
6470
* @param context 实例
65-
* @param isUseBlackTheme 是否使用深色主题 - 对 AndroidX 风格无效
71+
* @param bindingClass [ViewBinding] 的 [Class] 实例 or null
6672
*/
67-
class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean) {
73+
class DialogBuilder<VB : ViewBinding>(val context: Context, private val bindingClass: Class<*>? = null) {
6874

6975
private var instanceAndroidX: androidx.appcompat.app.AlertDialog.Builder? = null // 实例对象
7076
private var instanceAndroid: android.app.AlertDialog.Builder? = null // 实例对象
7177

7278
private var dialogInstance: Dialog? = null // 对话框实例
79+
private var customLayoutView: View? = null // 自定义布局
7380

74-
@CauseProblemsApi
75-
var customLayoutView: View? = null // 自定义布局
81+
/**
82+
* 获取 [DialogBuilder] 绑定布局对象
83+
* @return [VB]
84+
*/
85+
val binding by lazy {
86+
bindingClass?.method {
87+
name = "inflate"
88+
param(LayoutInflaterClass)
89+
}?.get()?.invoke<VB>(LayoutInflater.from(context))?.apply {
90+
customLayoutView = root
91+
} ?: error("This dialog maybe not a custom view dialog")
92+
}
7693

7794
/**
7895
* 是否需要使用 AndroidX 风格对话框
@@ -83,12 +100,7 @@ class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean)
83100
init {
84101
if (isUsingAndroidX)
85102
runInSafe { instanceAndroidX = MaterialAlertDialogBuilder(context) }
86-
else runInSafe {
87-
instanceAndroid = android.app.AlertDialog.Builder(
88-
context,
89-
if (isUseBlackTheme) android.R.style.Theme_Material_Dialog else android.R.style.Theme_Material_Light_Dialog
90-
)
91-
}
103+
else runInSafe { instanceAndroid = android.app.AlertDialog.Builder(context, android.R.style.Theme_Material_Light_Dialog) }
92104
}
93105

94106
/** 设置对话框不可关闭 */
@@ -135,18 +147,6 @@ class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean)
135147
else customLayoutView?.findViewWithTag<TextView>("progressContent")?.text = value
136148
}
137149

138-
/**
139-
* 设置对话框自定义布局
140-
* @return [ViewBinding]
141-
*/
142-
inline fun <reified T : ViewBinding> bind() =
143-
T::class.java.method {
144-
name = "inflate"
145-
param(LayoutInflaterClass)
146-
}.get().invoke<T>(LayoutInflater.from(context))?.apply {
147-
customLayoutView = root
148-
} ?: error("binding failed")
149-
150150
/**
151151
* 设置对话框确定按钮
152152
* @param text 按钮文本内容
@@ -184,7 +184,10 @@ class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean)
184184
fun cancel() = dialogInstance?.cancel()
185185

186186
/** 显示对话框 */
187-
internal fun show() =
187+
@CauseProblemsApi
188+
fun show() {
189+
/** 若当前自定义 View 的对话框没有调用 [binding] 将会对其手动调用一次以确保显示布局 */
190+
if (bindingClass != null) binding
188191
if (isUsingAndroidX) runInSafe {
189192
instanceAndroidX?.create()?.apply {
190193
customLayoutView?.let { setView(it) }
@@ -196,8 +199,7 @@ class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean)
196199
window?.setBackgroundDrawable(
197200
GradientDrawable(
198201
GradientDrawable.Orientation.TOP_BOTTOM,
199-
if (isUseBlackTheme) intArrayOf(0xFF2D2D2D.toInt(), 0xFF2D2D2D.toInt())
200-
else intArrayOf(Color.WHITE, Color.WHITE)
202+
intArrayOf(Color.WHITE, Color.WHITE)
201203
).apply {
202204
shape = GradientDrawable.RECTANGLE
203205
gradientType = GradientDrawable.LINEAR_GRADIENT
@@ -206,4 +208,5 @@ class DialogBuilder(val context: Context, private val isUseBlackTheme: Boolean)
206208
dialogInstance = this
207209
}?.show()
208210
}
211+
}
209212
}

app/src/main/java/com/fankes/miui/notify/utils/tool/IconRuleManagerTool.kt

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -78,40 +78,38 @@ object IconRuleManagerTool {
7878
* @param callback 成功后回调
7979
*/
8080
fun syncByHand(context: Context, callback: () -> Unit) =
81-
context.showDialog {
81+
context.showDialog<DiaSourceFromBinding> {
8282
title = "同步列表"
8383
var sourceType = context.modulePrefs.get(DataConst.SOURCE_SYNC_WAY)
8484
var customUrl = context.modulePrefs.get(DataConst.SOURCE_SYNC_WAY_CUSTOM_URL)
85-
bind<DiaSourceFromBinding>().apply {
86-
diaSfText.apply {
87-
if (customUrl.isNotBlank()) {
88-
setText(customUrl)
89-
setSelection(customUrl.length)
90-
}
91-
doOnTextChanged { text, _, _, _ -> customUrl = text.toString() }
92-
}
93-
diaSfTextLin.isVisible = sourceType == TYPE_SOURCE_SYNC_WAY_3
94-
diaSfRd1.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_1
95-
diaSfRd2.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_2
96-
diaSfRd3.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_3
97-
diaSfRd1.setOnClickListener {
98-
diaSfRd2.isChecked = false
99-
diaSfRd3.isChecked = false
100-
diaSfTextLin.isVisible = false
101-
sourceType = TYPE_SOURCE_SYNC_WAY_1
102-
}
103-
diaSfRd2.setOnClickListener {
104-
diaSfRd1.isChecked = false
105-
diaSfRd3.isChecked = false
106-
diaSfTextLin.isVisible = false
107-
sourceType = TYPE_SOURCE_SYNC_WAY_2
108-
}
109-
diaSfRd3.setOnClickListener {
110-
diaSfRd1.isChecked = false
111-
diaSfRd2.isChecked = false
112-
diaSfTextLin.isVisible = true
113-
sourceType = TYPE_SOURCE_SYNC_WAY_3
85+
binding.sourceUrlEdit.apply {
86+
if (customUrl.isNotBlank()) {
87+
setText(customUrl)
88+
setSelection(customUrl.length)
11489
}
90+
doOnTextChanged { text, _, _, _ -> customUrl = text.toString() }
91+
}
92+
binding.sourceFromTextLin.isVisible = sourceType == TYPE_SOURCE_SYNC_WAY_3
93+
binding.sourceRadio1.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_1
94+
binding.sourceRadio2.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_2
95+
binding.sourceRadio3.isChecked = sourceType == TYPE_SOURCE_SYNC_WAY_3
96+
binding.sourceRadio1.setOnClickListener {
97+
binding.sourceRadio2.isChecked = false
98+
binding.sourceRadio3.isChecked = false
99+
binding.sourceFromTextLin.isVisible = false
100+
sourceType = TYPE_SOURCE_SYNC_WAY_1
101+
}
102+
binding.sourceRadio2.setOnClickListener {
103+
binding.sourceRadio1.isChecked = false
104+
binding.sourceRadio3.isChecked = false
105+
binding.sourceFromTextLin.isVisible = false
106+
sourceType = TYPE_SOURCE_SYNC_WAY_2
107+
}
108+
binding.sourceRadio3.setOnClickListener {
109+
binding.sourceRadio1.isChecked = false
110+
binding.sourceRadio2.isChecked = false
111+
binding.sourceFromTextLin.isVisible = true
112+
sourceType = TYPE_SOURCE_SYNC_WAY_3
115113
}
116114
confirmButton {
117115
context.modulePrefs.put(DataConst.SOURCE_SYNC_WAY, sourceType)
@@ -120,15 +118,15 @@ object IconRuleManagerTool {
120118
}
121119
cancelButton()
122120
neutralButton(text = "自定义规则") {
123-
context.showDialog {
121+
context.showDialog<DiaSourceFromStringBinding> {
124122
title = "自定义规则(调试)"
125-
val editText = bind<DiaSourceFromStringBinding>().diaSfsInputEdit.apply {
123+
binding.jsonRuleEdit.apply {
126124
requestFocus()
127125
invalidate()
128126
}
129127
IconPackParams(context).also { params ->
130128
confirmButton(text = "合并") {
131-
editText.text.toString().also { jsonString ->
129+
binding.jsonRuleEdit.text.toString().also { jsonString ->
132130
when {
133131
jsonString.isNotBlank() && params.isNotVaildJson(jsonString) -> context.snake(msg = "不是有效的 JSON 数据")
134132
jsonString.isNotBlank() -> {
@@ -146,7 +144,7 @@ object IconRuleManagerTool {
146144
}
147145
}
148146
cancelButton(text = "覆盖") {
149-
editText.text.toString().also { jsonString ->
147+
binding.jsonRuleEdit.text.toString().also { jsonString ->
150148
when {
151149
jsonString.isNotBlank() && params.isNotVaildJson(jsonString) -> context.snake(msg = "不是有效的 JSON 数据")
152150
jsonString.isNotBlank() -> {

app/src/main/res/layout/dia_icon_filter.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
android:layout_height="wrap_content">
1515

1616
<com.google.android.material.textfield.TextInputEditText
17-
android:id="@+id/dia_icon_filter_input_edit"
17+
android:id="@+id/icon_filters_edit"
1818
android:layout_width="match_parent"
1919
android:layout_height="wrap_content"
2020
android:ellipsize="end"

app/src/main/res/layout/dia_source_from.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,31 @@
2020
android:textSize="14sp" />
2121

2222
<com.google.android.material.radiobutton.MaterialRadioButton
23-
android:id="@+id/dia_sf_rd1"
23+
android:id="@+id/source_radio_1"
2424
android:layout_width="wrap_content"
2525
android:layout_height="wrap_content"
2626
android:text="从 FastGit 获取" />
2727

2828
<com.google.android.material.radiobutton.MaterialRadioButton
29-
android:id="@+id/dia_sf_rd2"
29+
android:id="@+id/source_radio_2"
3030
android:layout_width="wrap_content"
3131
android:layout_height="wrap_content"
3232
android:text="从 Github Raw 获取" />
3333

3434
<com.google.android.material.radiobutton.MaterialRadioButton
35-
android:id="@+id/dia_sf_rd3"
35+
android:id="@+id/source_radio_3"
3636
android:layout_width="wrap_content"
3737
android:layout_height="wrap_content"
3838
android:text="从自定义地址获取" />
3939

4040
<com.google.android.material.textfield.TextInputLayout
41-
android:id="@+id/dia_sf_text_lin"
41+
android:id="@+id/source_from_text_lin"
4242
android:layout_width="match_parent"
4343
android:layout_height="wrap_content"
4444
android:visibility="gone">
4545

4646
<com.google.android.material.textfield.TextInputEditText
47-
android:id="@+id/dia_sf_text"
47+
android:id="@+id/source_url_edit"
4848
android:layout_width="match_parent"
4949
android:layout_height="wrap_content"
5050
android:ellipsize="end"

app/src/main/res/layout/dia_source_from_string.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
android:layout_height="wrap_content">
2626

2727
<com.google.android.material.textfield.TextInputEditText
28-
android:id="@+id/dia_sfs_input_edit"
28+
android:id="@+id/json_rule_edit"
2929
android:layout_width="match_parent"
3030
android:layout_height="150dp"
3131
android:ellipsize="end"

app/src/main/res/layout/dia_status_icon_count.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
android:layout_height="wrap_content">
1515

1616
<com.google.android.material.textfield.TextInputEditText
17-
android:id="@+id/dia_status_icon_count_input_edit"
17+
android:id="@+id/icon_count_edit"
1818
android:layout_width="match_parent"
1919
android:layout_height="wrap_content"
2020
android:digits="0123456789"

0 commit comments

Comments
 (0)