Skip to content

Commit 2caec48

Browse files
committed
[chore] #62 접근성을 고려해 onClickLabel, role 파라미터 추가
1 parent 5944726 commit 2caec48

1 file changed

Lines changed: 30 additions & 1 deletion

File tree

  • core/designsystem/src/main/java/com/neki/android/core/designsystem/modifier

core/designsystem/src/main/java/com/neki/android/core/designsystem/modifier/Clickable.kt

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ import androidx.compose.ui.node.DelegatableNode
1919
import androidx.compose.ui.node.DelegatingNode
2020
import androidx.compose.ui.node.ModifierNodeElement
2121
import androidx.compose.ui.node.PointerInputModifierNode
22+
import androidx.compose.ui.node.SemanticsModifierNode
2223
import androidx.compose.ui.platform.debugInspectorInfo
2324
import androidx.compose.ui.semantics.Role
25+
import androidx.compose.ui.semantics.SemanticsPropertyReceiver
26+
import androidx.compose.ui.semantics.onClick
27+
import androidx.compose.ui.semantics.role
2428
import androidx.compose.ui.unit.IntSize
2529
import kotlinx.coroutines.coroutineScope
2630
import kotlinx.coroutines.launch
@@ -59,10 +63,14 @@ fun Modifier.noRippleClickable(onClick: () -> Unit): Modifier = this.clickable(
5963
*/
6064
fun Modifier.noRippleClickableSingle(
6165
enabled: Boolean = true,
66+
onClickLabel: String? = null,
67+
role: Role? = null,
6268
onClick: () -> Unit,
6369
): Modifier = this.then(
6470
ClickableSingleElement(
6571
enabled = enabled,
72+
onClickLabel = onClickLabel,
73+
role = role,
6674
onClick = onClick,
6775
indicationNodeFactory = null,
6876
),
@@ -101,17 +109,23 @@ fun Modifier.clickableSingleComposed(
101109
*/
102110
fun Modifier.clickableSingle(
103111
enabled: Boolean = true,
112+
onClickLabel: String? = null,
113+
role: Role? = null,
104114
onClick: () -> Unit,
105115
): Modifier = this.then(
106116
ClickableSingleElement(
107117
enabled = enabled,
118+
onClickLabel = onClickLabel,
119+
role = role,
108120
onClick = onClick,
109121
indicationNodeFactory = ripple(),
110122
),
111123
)
112124

113125
private data class ClickableSingleElement(
114126
private val enabled: Boolean,
127+
private val onClickLabel: String?,
128+
private val role: Role?,
115129
private val onClick: () -> Unit,
116130
private val indicationNodeFactory: IndicationNodeFactory?,
117131
) : ModifierNodeElement<ClickableSingleNode>() {
@@ -121,6 +135,8 @@ private data class ClickableSingleElement(
121135
Log.d(TAG, "✅ Node: CREATE #${ClickableTestCounter.nodeCreateCount} - Element 객체ID = ${System.identityHashCode(this)}")
122136
return ClickableSingleNode(
123137
enabled = enabled,
138+
onClickLabel = onClickLabel,
139+
role = role,
124140
onClick = onClick,
125141
indicationNodeFactory = indicationNodeFactory,
126142
)
@@ -131,6 +147,8 @@ private data class ClickableSingleElement(
131147
Log.d(TAG, "🔄 Node: UPDATE #${ClickableTestCounter.nodeUpdateCount} - Element 객체ID = ${System.identityHashCode(this)}, Node 객체ID = ${System.identityHashCode(node)}")
132148
node.update(
133149
enabled = enabled,
150+
onClickLabel = onClickLabel,
151+
role = role,
134152
onClick = onClick,
135153
indicationNodeFactory = indicationNodeFactory,
136154
)
@@ -139,9 +157,11 @@ private data class ClickableSingleElement(
139157

140158
private class ClickableSingleNode(
141159
private var enabled: Boolean,
160+
private var onClickLabel: String?,
161+
private var role: Role?,
142162
private var onClick: () -> Unit,
143163
private var indicationNodeFactory: IndicationNodeFactory?,
144-
) : DelegatingNode(), PointerInputModifierNode {
164+
) : DelegatingNode(), PointerInputModifierNode, SemanticsModifierNode {
145165

146166
private val multipleEventsCutter = MultipleEventsCutter.get()
147167
private var interactionSource: MutableInteractionSource? = null
@@ -208,13 +228,22 @@ private class ClickableSingleNode(
208228
pointerInputNode.onCancelPointerInput()
209229
}
210230

231+
override fun SemanticsPropertyReceiver.applySemantics() {
232+
this@ClickableSingleNode.role?.let { this.role = it }
233+
onClick(label = onClickLabel, action = { processClick(); true })
234+
}
235+
211236
fun update(
212237
enabled: Boolean,
238+
onClickLabel: String?,
239+
role: Role?,
213240
onClick: () -> Unit,
214241
indicationNodeFactory: IndicationNodeFactory?,
215242
) {
216243
val indicationChanged = this.indicationNodeFactory != indicationNodeFactory
217244
this.enabled = enabled
245+
this.onClickLabel = onClickLabel
246+
this.role = role
218247
this.onClick = onClick
219248

220249
if (indicationChanged) {

0 commit comments

Comments
 (0)