Skip to content

Commit 3978cdb

Browse files
committed
feat: custom template actionToast (#1222)
1 parent 47b308b commit 3978cdb

File tree

5 files changed

+46
-16
lines changed

5 files changed

+46
-16
lines changed

app/src/main/kotlin/li/songe/gkd/a11y/A11yRuleEngine.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ class A11yRuleEngine(val service: A11yCommonImpl) {
391391
startQueryJob()
392392
}
393393
if (actionResult.action != ActionPerformer.None.action) {
394-
showActionToast()
394+
showActionToast(rule)
395395
}
396396
addActionLog(rule, topActivity, target, actionResult)
397397
}

app/src/main/kotlin/li/songe/gkd/a11y/A11yState.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import android.util.LruCache
77
import android.view.accessibility.AccessibilityNodeInfo
88
import kotlinx.coroutines.Dispatchers
99
import kotlinx.coroutines.flow.MutableStateFlow
10-
import kotlinx.coroutines.flow.updateAndGet
1110
import kotlinx.coroutines.sync.Mutex
1211
import kotlinx.coroutines.sync.withLock
1312
import li.songe.gkd.META
@@ -134,7 +133,7 @@ val activityRuleFlow = MutableStateFlow(ActivityRule())
134133

135134
private var lastAppId = ""
136135

137-
sealed class ActivityScene() {
136+
sealed class ActivityScene {
138137
data object ScreenOn : ActivityScene()
139138
data object A11y : ActivityScene()
140139
data object TaskStack : ActivityScene()
@@ -291,7 +290,6 @@ fun addActionLog(
291290
) = appScope.launchTry(Dispatchers.IO) {
292291
val ctime = System.currentTimeMillis()
293292
actionLogMutex.withLock {
294-
val actionCount = actionCountFlow.updateAndGet { it + 1 }
295293
val actionLog = ActionLog(
296294
appId = topActivity.appId,
297295
activityId = topActivity.activityId,
@@ -304,7 +302,7 @@ fun addActionLog(
304302
ctime = ctime,
305303
)
306304
DbSet.actionLogDao.insert(actionLog)
307-
if (actionCount % 100 == 0L) {
305+
if (actionCountFlow.value % 100 == 0L) {
308306
DbSet.actionLogDao.deleteKeepLatest()
309307
}
310308
}

app/src/main/kotlin/li/songe/gkd/data/ResolvedRule.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import android.view.accessibility.AccessibilityNodeInfo
44
import kotlinx.atomicfu.atomic
55
import kotlinx.atomicfu.update
66
import kotlinx.coroutines.Job
7+
import kotlinx.coroutines.flow.updateAndGet
78
import li.songe.gkd.a11y.appChangeTime
89
import li.songe.gkd.a11y.lastTriggerRule
910
import li.songe.gkd.a11y.lastTriggerTime
11+
import li.songe.gkd.store.actionCountFlow
1012
import li.songe.selector.MatchOption
1113
import li.songe.selector.Selector
1214

@@ -79,9 +81,9 @@ sealed class ResolvedRule(
7981
val selfGroupRules = field[group] ?: emptyList()
8082
val othersGroupRules =
8183
(group.scopeKeys ?: emptyList()).distinct().filter { k -> k != group.key }
82-
.map { k ->
84+
.flatMap { k ->
8385
field.entries.find { e -> e.key.key == k }?.value ?: emptyList()
84-
}.flatten()
86+
}
8587
val groupRules = selfGroupRules + othersGroupRules
8688

8789
// 共享次数
@@ -131,6 +133,7 @@ sealed class ResolvedRule(
131133
actionCount.incrementAndGet()
132134
lastTriggerTime = t
133135
lastTriggerRule = this
136+
actionCountFlow.updateAndGet { it + 1 }
134137
}
135138

136139
private var actionCount = atomic(0)
@@ -234,7 +237,7 @@ fun getFixActivityIds(
234237
appId: String,
235238
activityIds: List<String>?,
236239
): List<String> {
237-
if (activityIds == null || activityIds.isEmpty()) return emptyList()
240+
if (activityIds.isNullOrEmpty()) return emptyList()
238241
return activityIds.map { activityId ->
239242
if (activityId.startsWith('.')) { // .a.b.c -> com.x.y.x.a.b.c
240243
appId + activityId

app/src/main/kotlin/li/songe/gkd/ui/home/SettingsPage.kt

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,36 @@ fun useSettingsPage(): ScaffoldExt {
108108
var value by remember {
109109
mutableStateOf(store.actionToast)
110110
}
111-
val maxCharLen = 32
111+
val maxCharLen = 64
112112
AlertDialog(
113113
properties = DialogProperties(dismissOnClickOutside = false),
114-
title = { Text(text = "触发提示") },
114+
title = {
115+
Row(
116+
verticalAlignment = Alignment.CenterVertically,
117+
horizontalArrangement = Arrangement.SpaceBetween,
118+
modifier = Modifier.fillMaxWidth(),
119+
) {
120+
Text(text = "触发提示")
121+
PerfIconButton(
122+
imageVector = PerfIcon.HelpOutline,
123+
contentDescription = "文案规则",
124+
onClickLabel = "打开文案规则弹窗",
125+
onClick = throttle {
126+
showToastInputDlg = false
127+
val confirmAction = {
128+
mainVm.dialogFlow.value = null
129+
showToastInputDlg = true
130+
}
131+
mainVm.dialogFlow.updateDialogOptions(
132+
title = "文案规则",
133+
text = $$"触发文案支持变量替换,规则如下\n${1} 子规则名称\n${2} 规则组名称\n${3} 触发次数\n\n示例模板\n${1}/${2}/${3}\n\n替换结果\n子规则a/规则组A/3",
134+
confirmAction = confirmAction,
135+
onDismissRequest = confirmAction,
136+
)
137+
},
138+
)
139+
}
140+
},
115141
text = {
116142
OutlinedTextField(
117143
value = value,
@@ -121,7 +147,6 @@ fun useSettingsPage(): ScaffoldExt {
121147
onValueChange = {
122148
value = it.take(maxCharLen)
123149
},
124-
singleLine = true,
125150
supportingText = {
126151
Text(
127152
text = "${value.length} / $maxCharLen",

app/src/main/kotlin/li/songe/gkd/util/Toast.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ import androidx.core.graphics.toColorInt
2222
import com.hjq.toast.Toaster
2323
import com.hjq.toast.style.WhiteToastStyle
2424
import li.songe.gkd.app
25+
import li.songe.gkd.data.ResolvedRule
2526
import li.songe.gkd.isActivityVisible
2627
import li.songe.gkd.permission.canDrawOverlaysState
2728
import li.songe.gkd.service.A11yService
2829
import li.songe.gkd.service.OverlayWindowService
30+
import li.songe.gkd.store.actionCountFlow
2931
import li.songe.gkd.store.storeFlow
3032
import li.songe.loc.Loc
3133

@@ -118,18 +120,20 @@ private fun setReactiveToastStyle() {
118120

119121
private var triggerTime = 0L
120122
private const val triggerInterval = 2000L
121-
fun showActionToast() {
123+
fun showActionToast(rule: ResolvedRule) {
122124
if (!storeFlow.value.toastWhenClick) return
123125
runMainPost {
124126
val t = System.currentTimeMillis()
125127
if (t - triggerTime > triggerInterval + 100) { // 100ms 保证二次显示的时候上一次已经完全消失
126128
triggerTime = t
129+
val text = storeFlow.value.actionToast
130+
.replace($$"${1}", rule.rule.name.toString())
131+
.replace($$"${2}", rule.g.group.name)
132+
.replace($$"${3}", actionCountFlow.value.toString())
127133
if (storeFlow.value.useSystemToast) {
128-
showSystemToast(storeFlow.value.actionToast)
134+
showSystemToast(text)
129135
} else {
130-
showA11yToast(
131-
storeFlow.value.actionToast
132-
)
136+
showA11yToast(text)
133137
}
134138
}
135139
}

0 commit comments

Comments
 (0)