Skip to content

Commit a6d6274

Browse files
committed
Update
1 parent 4d53cdf commit a6d6274

3 files changed

Lines changed: 57 additions & 1 deletion

File tree

app/src/main/java/com/omarea/krscript/config/PageConfigReader.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,12 @@ class PageConfigReader {
436436
"mime" -> {
437437
option.mime = parser.getAttributeValue(i).lowercase(getDefault())
438438
}
439+
"checked-sh", "checkbox-sh", "check-sh" -> {
440+
// Chỉ dùng khi type="checkbox": lệnh shell sẽ được chạy lại mỗi lần
441+
// mở menu để xác định có hiện dấu tích hay không (KHÔNG dùng để ẩn/hiện
442+
// item như "visible"/"support" - đó là 2 cơ chế độc lập).
443+
option.checkedSh = parser.getAttributeValue(i)
444+
}
439445
}
440446
}
441447
option.title = resolveStringRes(parser.nextText())

app/src/main/java/com/omarea/krscript/model/PageMenuOption.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,13 @@ class PageMenuOption(currentConfigXml: String) : RunnableNode(currentConfigXml)
1111
var mime: String = ""
1212
// 文件后缀(仅限type=file有效)
1313
var suffix: String = ""
14+
15+
// Lệnh shell dùng để xác định trạng thái tích (checked) khi type = "checkbox".
16+
// Được chạy lại mỗi lần menu chuẩn bị hiển thị (không chỉ 1 lần lúc load trang).
17+
// Kết quả trả về "1" hoặc "true" => hiện dấu tích, ngược lại => bỏ tích.
18+
var checkedSh: String = ""
19+
20+
// Trạng thái tích hiện tại - được cập nhật ở background thread (IO), chỉ đọc khi vẽ menu (Main thread).
21+
@Volatile
22+
var checked: Boolean = false
1423
}

app/src/main/java/com/tool/tree/ActionPage.kt

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ class ActionPage : AppCompatActivity() {
154154
private val ACTION_FILE_PATH_CHOOSER_INNER = 65300
155155

156156
private var menuOptions: ArrayList<PageMenuOption>? = null
157+
private var menuCheckboxRefreshing = false
157158

158159
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
159160
val config = currentPageConfig ?: return false
@@ -165,12 +166,52 @@ class ActionPage : AppCompatActivity() {
165166
if (option.isFab) {
166167
addFab(option)
167168
} else {
168-
menu?.add(-1, index, index, option.title)
169+
val menuItem = menu?.add(-1, index, index, option.title)
170+
if (option.type == "checkbox") {
171+
menuItem?.isCheckable = true
172+
menuItem?.isChecked = option.checked
173+
}
169174
}
170175
}
171176
return true
172177
}
173178

179+
// Được Android gọi MỖI LẦN menu chuẩn bị hiển thị (khác onCreateOptionsMenu chỉ chạy 1 lần),
180+
// nên đây mới là chỗ đúng để refresh trạng thái tích mỗi khi người dùng mở menu.
181+
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
182+
refreshCheckboxMenuStates()
183+
return super.onPrepareOptionsMenu(menu)
184+
}
185+
186+
// Chạy các lệnh checked-sh ở nền (IO thread) để không làm treo UI mỗi lần mở menu.
187+
// Chỉ rebuild lại menu (invalidateOptionsMenu) khi có ít nhất 1 trạng thái thực sự thay đổi,
188+
// để tránh vòng lặp refresh vô tận (onPrepareOptionsMenu sẽ được gọi lại sau khi rebuild).
189+
private fun refreshCheckboxMenuStates() {
190+
val config = currentPageConfig ?: return
191+
val checkboxOptions = menuOptions?.filter { it.type == "checkbox" && it.checkedSh.isNotEmpty() }
192+
if (checkboxOptions.isNullOrEmpty() || menuCheckboxRefreshing) return
193+
menuCheckboxRefreshing = true
194+
195+
lifecycleScope.launch(Dispatchers.IO) {
196+
val results = checkboxOptions.map { option ->
197+
option to ScriptEnvironmen.executeResultRoot(this@ActionPage, option.checkedSh, config)?.trim()
198+
}
199+
200+
withContext(Dispatchers.Main) {
201+
menuCheckboxRefreshing = false
202+
var changed = false
203+
results.forEach { (option, result) ->
204+
val newChecked = result == "1" || result?.lowercase() == "true"
205+
if (option.checked != newChecked) changed = true
206+
option.checked = newChecked
207+
}
208+
if (changed && !isFinishing) {
209+
invalidateOptionsMenu()
210+
}
211+
}
212+
}
213+
}
214+
174215
private fun addFab(menuOption: PageMenuOption) {
175216
binding.actionPageFab.apply {
176217
visibility = View.VISIBLE

0 commit comments

Comments
 (0)