Skip to content

Commit ddc6fcb

Browse files
committed
feat: Add accessibility actions and improve string resources
- Adds accessibility actions for groups and items, such as edit, sort, delete, copy, and export. - Improves string resources for multiple languages, including English, Japanese, Simplified Chinese, Traditional Chinese (Hong Kong), Traditional Chinese (Taiwan), and Farsi. - Adds new string resources: `quick_edit` and `switch_tag`. - Update string resources of `group_part_enabled`, `group_all_enabled`, `group_all_disabled`, `edit_desc`, `config_enabled_desc`, `config_disabled_desc`, `plugin_enabled_desc`, `plugin_disabled_desc`, `rule_enabled_desc`, `rule_disabled_desc`, `paste`, `tag_data` and so on.
1 parent 465cd43 commit ddc6fcb

File tree

12 files changed

+162
-57
lines changed

12 files changed

+162
-57
lines changed

app/src/main/java/com/github/jing332/tts_server_android/compose/systts/GroupItem.kt

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import androidx.compose.material3.MaterialTheme
2121
import androidx.compose.material3.Text
2222
import androidx.compose.material3.TriStateCheckbox
2323
import androidx.compose.runtime.Composable
24-
import androidx.compose.runtime.LaunchedEffect
2524
import androidx.compose.runtime.getValue
2625
import androidx.compose.runtime.mutableStateOf
2726
import androidx.compose.runtime.remember
@@ -33,8 +32,12 @@ import androidx.compose.ui.graphics.graphicsLayer
3332
import androidx.compose.ui.platform.LocalContext
3433
import androidx.compose.ui.platform.LocalView
3534
import androidx.compose.ui.res.stringResource
36-
import androidx.compose.ui.semantics.contentDescription
35+
import androidx.compose.ui.semantics.CustomAccessibilityAction
36+
import androidx.compose.ui.semantics.collapse
37+
import androidx.compose.ui.semantics.customActions
38+
import androidx.compose.ui.semantics.expand
3739
import androidx.compose.ui.semantics.semantics
40+
import androidx.compose.ui.semantics.stateDescription
3841
import androidx.compose.ui.state.ToggleableState
3942
import androidx.compose.ui.unit.dp
4043
import com.github.jing332.tts_server_android.R
@@ -60,32 +63,6 @@ fun GroupItem(
6063
val view = LocalView.current
6164
val context = LocalContext.current
6265

63-
var expandedFirst by remember { mutableStateOf(true) }
64-
LaunchedEffect(isExpanded) {
65-
if (expandedFirst) expandedFirst = false
66-
else {
67-
val msg =
68-
if (isExpanded) context.getString(
69-
R.string.group_expanded,
70-
name
71-
) else context.getString(R.string.group_collapsed, name)
72-
view.announceForAccessibility(msg)
73-
}
74-
}
75-
76-
var checkFirst by remember { mutableStateOf(true) }
77-
LaunchedEffect(toggleableState) {
78-
if (checkFirst) checkFirst = false
79-
else {
80-
val msg = when (toggleableState) {
81-
ToggleableState.On -> context.getString(R.string.group_all_enabled, name)
82-
ToggleableState.Off -> context.getString(R.string.group_all_disabled, name)
83-
else -> context.getString(R.string.group_part_enabled, name)
84-
}
85-
view.announceForAccessibility(msg)
86-
}
87-
}
88-
8966
var showDeleteDialog by remember { mutableStateOf(false) }
9067
if (showDeleteDialog)
9168
ConfigDeleteDialog(
@@ -97,10 +74,35 @@ fun GroupItem(
9774
.fillMaxWidth()
9875
.background(MaterialTheme.colorScheme.surface)
9976
.semantics(true) {
100-
contentDescription = context.getString(
101-
if (isExpanded) R.string.group_expanded
102-
else R.string.group_collapsed, " "
103-
)
77+
stateDescription = when (toggleableState) {
78+
ToggleableState.On -> context.getString(R.string.group_all_enabled, "")
79+
ToggleableState.Off -> context.getString(R.string.group_all_disabled, "")
80+
else -> context.getString(R.string.group_part_enabled, "")
81+
}
82+
83+
customActions =
84+
listOf(
85+
CustomAccessibilityAction(
86+
label = context.getString(R.string.delete), action = { onDelete();true }
87+
),
88+
89+
CustomAccessibilityAction(
90+
label = context.getString(R.string.export_config), action = { onExport();true }
91+
)
92+
)
93+
94+
95+
if (isExpanded) {
96+
collapse(context.getString(R.string.desc_collapse_group, name)) {
97+
onClick()
98+
true
99+
}
100+
} else
101+
expand(context.getString(R.string.desc_expand_group, name)) {
102+
onClick()
103+
true
104+
}
105+
104106
}
105107
.clickable { onClick() }
106108
.padding(vertical = 4.dp),
@@ -132,7 +134,7 @@ fun GroupItem(
132134
onToggleableStateChange(toggleableState != ToggleableState.On)
133135
},
134136
modifier = Modifier.semantics {
135-
contentDescription = context.getString(
137+
stateDescription = context.getString(
136138
when (toggleableState) {
137139
ToggleableState.On -> R.string.group_all_enabled
138140
ToggleableState.Off -> R.string.group_all_disabled

app/src/main/java/com/github/jing332/tts_server_android/compose/systts/list/Group.kt

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ import androidx.compose.runtime.mutableStateOf
1414
import androidx.compose.runtime.remember
1515
import androidx.compose.runtime.setValue
1616
import androidx.compose.ui.Modifier
17+
import androidx.compose.ui.platform.LocalContext
1718
import androidx.compose.ui.res.stringResource
19+
import androidx.compose.ui.semantics.CustomAccessibilityAction
20+
import androidx.compose.ui.semantics.customActions
21+
import androidx.compose.ui.semantics.semantics
1822
import androidx.compose.ui.state.ToggleableState
1923
import com.github.jing332.compose.widgets.TextFieldDialog
2024
import com.github.jing332.tts_server_android.R
@@ -62,8 +66,30 @@ fun Group(
6266
}
6367
}
6468

69+
val context = LocalContext.current
6570
GroupItem(
66-
modifier = modifier,
71+
modifier = modifier.semantics {
72+
customActions = listOf(
73+
CustomAccessibilityAction(context.getString(R.string.rename)) {
74+
showRenameDialog = true;true
75+
},
76+
CustomAccessibilityAction(context.getString(R.string.copy)) {
77+
showCopyDialog = true;true
78+
},
79+
CustomAccessibilityAction(context.getString(R.string.audio_params)) {
80+
onEditAudioParams();true
81+
},
82+
CustomAccessibilityAction(context.getString(R.string.sort)) {
83+
onSort();true
84+
},
85+
CustomAccessibilityAction(context.getString(R.string.delete)) {
86+
onDelete();true
87+
},
88+
CustomAccessibilityAction(context.getString(R.string.export_config)) {
89+
onExport();true
90+
}
91+
)
92+
},
6793
isExpanded = isExpanded,
6894
name = name,
6995
toggleableState = toggleableState,

app/src/main/java/com/github/jing332/tts_server_android/compose/systts/list/Item.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ import androidx.compose.ui.Modifier
3535
import androidx.compose.ui.platform.LocalContext
3636
import androidx.compose.ui.platform.LocalView
3737
import androidx.compose.ui.res.stringResource
38+
import androidx.compose.ui.semantics.CustomAccessibilityAction
3839
import androidx.compose.ui.semantics.Role
3940
import androidx.compose.ui.semantics.contentDescription
41+
import androidx.compose.ui.semantics.customActions
4042
import androidx.compose.ui.semantics.role
4143
import androidx.compose.ui.semantics.semantics
4244
import androidx.compose.ui.semantics.stateDescription
@@ -46,12 +48,12 @@ import androidx.compose.ui.text.style.TextOverflow
4648
import androidx.compose.ui.unit.dp
4749
import androidx.constraintlayout.compose.ConstraintLayout
4850
import androidx.constraintlayout.compose.Dimension
51+
import com.github.jing332.common.utils.StringUtils.limitLength
4952
import com.github.jing332.common.utils.performLongPress
5053
import com.github.jing332.compose.widgets.LongClickIconButton
5154
import com.github.jing332.compose.widgets.htmlcompose.HtmlText
5255
import com.github.jing332.tts_server_android.R
5356
import com.github.jing332.tts_server_android.conf.AppConfig
54-
import com.github.jing332.common.utils.StringUtils.limitLength
5557
import org.burnoutcrew.reorderable.ReorderableLazyListState
5658
import org.burnoutcrew.reorderable.detectReorder
5759

@@ -87,26 +89,41 @@ internal fun Item(
8789
if (limitNameLen == 0) name else name.limitLength(limitNameLen)
8890
}
8991

90-
ElevatedCard(modifier) {
92+
ElevatedCard(
93+
modifier = modifier
94+
) {
9195
ConstraintLayout(
9296
Modifier
9397
.fillMaxWidth()
9498
.wrapContentHeight()
9599
.combinedClickable(
100+
onClickLabel = stringResource(R.string.quick_edit),
96101
onClick = onClick,
102+
onLongClickLabel = stringResource(R.string.switch_tag),
97103
onLongClick = {
98104
view.performLongPress()
99105
onLongClick()
100106
}
101107
)
108+
.semantics {
109+
customActions = listOf(
110+
CustomAccessibilityAction(context.getString(R.string.edit)) { onEdit(); true },
111+
CustomAccessibilityAction(context.getString(R.string.delete)) { onDelete(); true },
112+
CustomAccessibilityAction(context.getString(R.string.copy)) { onCopy(); true },
113+
CustomAccessibilityAction(context.getString(R.string.audition)) { onAudition(); true },
114+
CustomAccessibilityAction(context.getString(R.string.export_config)) { onExport(); true }
115+
)
116+
}
102117
.padding(vertical = 4.dp)
103118
) {
104-
val (checkRef,
119+
val (
120+
checkRef,
105121
nameRef,
106122
contentRef,
107123
targetRef,
108124
typeRef,
109-
buttonsRef) = createRefs()
125+
buttonsRef,
126+
) = createRefs()
110127
Row(
111128
Modifier
112129
.constrainAs(checkRef) {

app/src/main/java/com/github/jing332/tts_server_android/compose/systts/plugin/PluginManagerScreen.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ import androidx.compose.ui.Modifier
4747
import androidx.compose.ui.input.nestedscroll.nestedScroll
4848
import androidx.compose.ui.platform.LocalContext
4949
import androidx.compose.ui.res.stringResource
50+
import androidx.compose.ui.semantics.CustomAccessibilityAction
5051
import androidx.compose.ui.semantics.Role
5152
import androidx.compose.ui.semantics.contentDescription
53+
import androidx.compose.ui.semantics.customActions
5254
import androidx.compose.ui.semantics.role
5355
import androidx.compose.ui.semantics.semantics
5456
import androidx.compose.ui.semantics.stateDescription
@@ -277,7 +279,27 @@ private fun Item(
277279
onDelete: () -> Unit,
278280
) {
279281
val context = LocalContext.current
280-
ElevatedCard(modifier = modifier, onClick = {
282+
ElevatedCard(modifier = modifier.semantics {
283+
customActions =
284+
listOf(
285+
CustomAccessibilityAction(
286+
context.getString(R.string.edit_desc, name)
287+
) { onEdit();true },
288+
CustomAccessibilityAction(
289+
context.getString(R.string.plugin_set_vars, name)
290+
) { onSetVars();true },
291+
CustomAccessibilityAction(
292+
context.getString(R.string.export_config)
293+
) { onExport();true },
294+
295+
CustomAccessibilityAction(
296+
context.getString(R.string.clear_cache, name)
297+
) { onClear();true },
298+
CustomAccessibilityAction(
299+
context.getString(R.string.delete, name)
300+
) { onDelete();true },
301+
)
302+
}, onClick = {
281303
if (hasDefVars) onSetVars()
282304
}) {
283305
Box(modifier = Modifier.padding(4.dp)) {

app/src/main/java/com/github/jing332/tts_server_android/compose/systts/replace/Group.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ import androidx.compose.material3.MaterialTheme
99
import androidx.compose.material3.Text
1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.platform.LocalContext
1213
import androidx.compose.ui.res.stringResource
14+
import androidx.compose.ui.semantics.CustomAccessibilityAction
15+
import androidx.compose.ui.semantics.customActions
16+
import androidx.compose.ui.semantics.semantics
1317
import androidx.compose.ui.state.ToggleableState
1418
import com.github.jing332.tts_server_android.R
1519
import com.github.jing332.tts_server_android.compose.systts.GroupItem
@@ -27,8 +31,28 @@ internal fun Group(
2731
onExport: () -> Unit,
2832
onSort:()->Unit,
2933
) {
34+
val context = LocalContext.current
3035
GroupItem(
31-
modifier = modifier,
36+
modifier = modifier.semantics{
37+
customActions = listOf(
38+
CustomAccessibilityAction(
39+
label = context.getString(R.string.edit_desc, name),
40+
action = { onEdit();true }
41+
),
42+
CustomAccessibilityAction(
43+
label = context.getString(R.string.sort),
44+
action = { onSort();true }
45+
),
46+
CustomAccessibilityAction(
47+
label = context.getString(R.string.delete),
48+
action = { onDelete();true }
49+
),
50+
CustomAccessibilityAction(
51+
label = context.getString(R.string.export_config),
52+
action = { onExport();true }
53+
),
54+
)
55+
},
3256
isExpanded = isExpanded,
3357
name = name,
3458
toggleableState = toggleableState,

app/src/main/res/values-en/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,4 +471,6 @@
471471
<string name="forwarder">转发器</string>
472472
<string name="divider_preference_desc">以下为子设置</string>
473473
<string name="open_ra_tag_options">打开标签数据选项</string>
474+
<string name="quick_edit">快捷编辑</string>
475+
<string name="switch_tag">切换标签</string>
474476
</resources>

app/src/main/res/values-fa/strings.xml

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -418,23 +418,23 @@
418418
<string name="descending">1</string>
419419
<string name="sort">1</string>
420420
<string name="created_time_id">1</string>
421-
<string name="sorting_complete_msg">1</string>
422-
<string name="tag_data_clear_warn">1</string>
423-
<string name="keyboard_toolbar_settings">1</string>
424-
<string name="keyboard_toolbar_settings_tips">1</string>
425-
<string name="more_options_desc">1</string>
426-
<string name="group_part_enabled">1</string>
427-
<string name="group_all_enabled">1</string>
428-
<string name="group_all_disabled">1</string>
429-
<string name="edit_desc">1</string>
430-
<string name="config_enabled_desc">پیکربندی فعال شد: %1$s</string>
431-
<string name="config_disabled_desc">پیکربندی غیرفعال شده: %1$s</string>
432-
<string name="plugin_enabled_desc">1</string>
433-
<string name="plugin_disabled_desc">1</string>
434-
<string name="rule_enabled_desc">1</string>
435-
<string name="rule_disabled_desc">1</string>
436-
<string name="paste">1</string>
437-
<string name="tag_data">1</string>
421+
<string name="sorting_complete_msg">Sorting complete, taking %1$sms</string>
422+
<string name="tag_data_clear_warn">Do you want to continue with the current Tag data?</string>
423+
<string name="keyboard_toolbar_settings">Keyboard toolbar</string>
424+
<string name="keyboard_toolbar_settings_tips">Insert Value = Display Name \n⚠️Note there should be a space on both sides of the equal sign.</string>
425+
<string name="more_options_desc">More options: %1$s</string>
426+
<string name="group_part_enabled">Part enabled: %1$s</string>
427+
<string name="group_all_enabled">All enabled: %1$s</string>
428+
<string name="group_all_disabled">Not enabled:%1$s</string>
429+
<string name="edit_desc">Edit:%1$s</string>
430+
<string name="config_enabled_desc">Enabled:%1$s</string>
431+
<string name="config_disabled_desc">Enabled:%1$s</string>
432+
<string name="plugin_enabled_desc">Plugin enabled:%1$s</string>
433+
<string name="plugin_disabled_desc">Plugin disabled:%1$s</string>
434+
<string name="rule_enabled_desc">Rule enabled:%1$s</string>
435+
<string name="rule_disabled_desc">Rule disabled:%1$s</string>
436+
<string name="paste">Paste</string>
437+
<string name="tag_data">Tag data</string>
438438
<string name="grant_permission_audio_file">اعطا [مجوز خواندن فایل صوتی]</string>
439439
<string name="grant_permission_storage_file">اعطا [مجوز خواندن فایل ذخیره‌سازی]</string>
440440
<string name="write_plugin_log_to_file">لاگ افزونه را در فایل بنویسید</string>
@@ -475,4 +475,6 @@
475475
<string name="forwarder">转发器</string>
476476
<string name="divider_preference_desc">以下为子设置</string>
477477
<string name="open_ra_tag_options">打开标签数据选项</string>
478+
<string name="quick_edit">快捷编辑</string>
479+
<string name="switch_tag">切换标签</string>
478480
</resources>

app/src/main/res/values-ja/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,4 +468,6 @@
468468
<string name="forwarder">转发器</string>
469469
<string name="divider_preference_desc">以下为子设置</string>
470470
<string name="open_ra_tag_options">打开标签数据选项</string>
471+
<string name="quick_edit">快捷编辑</string>
472+
<string name="switch_tag">切换标签</string>
471473
</resources>

app/src/main/res/values-zh-rHK/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,4 +468,6 @@
468468
<string name="forwarder">转发器</string>
469469
<string name="divider_preference_desc">以下为子设置</string>
470470
<string name="open_ra_tag_options">打开标签数据选项</string>
471+
<string name="quick_edit">快捷编辑</string>
472+
<string name="switch_tag">切换标签</string>
471473
</resources>

app/src/main/res/values-zh-rTW/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,4 +460,6 @@
460460
<string name="forwarder">转发器</string>
461461
<string name="divider_preference_desc">以下为子设置</string>
462462
<string name="open_ra_tag_options">打开标签数据选项</string>
463+
<string name="quick_edit">快捷编辑</string>
464+
<string name="switch_tag">切换标签</string>
463465
</resources>

app/src/main/res/values-zh/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,4 +466,6 @@
466466
<string name="forwarder">转发器</string>
467467
<string name="divider_preference_desc">以下为子设置</string>
468468
<string name="open_ra_tag_options">打开标签数据选项</string>
469+
<string name="quick_edit">快捷编辑</string>
470+
<string name="switch_tag">切换标签</string>
469471
</resources>

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,4 +501,6 @@
501501
<string name="forwarder">转发器</string>
502502
<string name="divider_preference_desc">以下为子设置</string>
503503
<string name="open_ra_tag_options">打开标签数据选项</string>
504+
<string name="quick_edit">快捷编辑</string>
505+
<string name="switch_tag">切换标签</string>
504506
</resources>

0 commit comments

Comments
 (0)