Skip to content

Commit 7c6044d

Browse files
committed
[BOOK-291] fix: preventMultiTouch Modifier 확장함수 부모 컴포저블에 적용
1 parent 45b866b commit 7c6044d

File tree

3 files changed

+30
-2
lines changed
  • core
    • common/src/main/kotlin/com/ninecraft/booket/core/common/extensions
    • ui/src/main/kotlin/com/ninecraft/booket/core/ui
  • feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register

3 files changed

+30
-2
lines changed

core/common/src/main/kotlin/com/ninecraft/booket/core/common/extensions/Modifier.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.ninecraft.booket.core.common.extensions
22

33
import androidx.compose.foundation.clickable
4+
import androidx.compose.foundation.gestures.awaitEachGesture
5+
import androidx.compose.foundation.gestures.awaitFirstDown
46
import androidx.compose.foundation.interaction.MutableInteractionSource
57
import androidx.compose.material3.ripple
68
import androidx.compose.runtime.remember
@@ -9,6 +11,8 @@ import androidx.compose.ui.composed
911
import androidx.compose.ui.draw.drawWithContent
1012
import androidx.compose.ui.graphics.layer.GraphicsLayer
1113
import androidx.compose.ui.graphics.layer.drawLayer
14+
import androidx.compose.ui.input.pointer.PointerEventPass
15+
import androidx.compose.ui.input.pointer.pointerInput
1216
import androidx.compose.ui.platform.debugInspectorInfo
1317
import androidx.compose.ui.semantics.Role
1418
import com.ninecraft.booket.core.common.utils.MultipleEventsCutter
@@ -54,3 +58,21 @@ fun Modifier.captureToGraphicsLayer(graphicsLayer: GraphicsLayer) =
5458
graphicsLayer.record { this@drawWithContent.drawContent() }
5559
drawLayer(graphicsLayer)
5660
}
61+
62+
/**
63+
* 부모 영역에서 동시 터치(두 손가락 이상)를 차단하는 Modifier
64+
*/
65+
fun Modifier.preventMultiTouch() = pointerInput(Unit) {
66+
// awaitEachGesture: 한 번의 제스쳐 세션을 추상화
67+
awaitEachGesture {
68+
val first = awaitFirstDown(requireUnconsumed = false)
69+
do {
70+
// 이벤트 전파 초기 단계(PointerEventPass.Initial)에서 하위 컴포저블로 이벤트가 내려가기 전에 가로채 소비한다
71+
val event = awaitPointerEvent(pass = PointerEventPass.Initial)
72+
event.changes.forEach { change ->
73+
if (change.id != first.id && change.pressed) change.consume()
74+
}
75+
// 루프 조건: 첫 포인터가 pressed 상태일 동안만 유지한다 (up이거나 cancel되면 pressed=false로 루프 종료)
76+
} while (event.changes.any { it.id == first.id && it.pressed })
77+
}
78+
}

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/ReedScaffold.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.material3.ScaffoldDefaults
77
import androidx.compose.runtime.Composable
88
import androidx.compose.ui.Modifier
99
import androidx.compose.ui.graphics.Color
10+
import com.ninecraft.booket.core.common.extensions.preventMultiTouch
1011
import com.ninecraft.booket.core.designsystem.theme.White
1112
import tech.thdev.compose.extensions.keyboard.state.foundation.keyboardHide
1213

@@ -22,7 +23,9 @@ fun ReedScaffold(
2223
content: @Composable (PaddingValues) -> Unit,
2324
) {
2425
Scaffold(
25-
modifier = modifier.keyboardHide(),
26+
modifier = modifier
27+
.keyboardHide()
28+
.preventMultiTouch(),
2629
topBar = topBar,
2730
bottomBar = bottomBar,
2831
snackbarHost = snackbarHost,

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/register/RecordRegisterUi.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier
1717
import androidx.compose.ui.res.painterResource
1818
import androidx.compose.ui.res.stringResource
1919
import androidx.compose.ui.unit.dp
20+
import com.ninecraft.booket.core.common.extensions.preventMultiTouch
2021
import com.ninecraft.booket.core.designsystem.DevicePreview
2122
import com.ninecraft.booket.core.designsystem.RecordStep
2223
import com.ninecraft.booket.core.designsystem.component.RecordProgressBar
@@ -46,7 +47,9 @@ internal fun RecordRegisterUi(
4647
}
4748

4849
Scaffold(
49-
modifier = modifier.fillMaxSize(),
50+
modifier = modifier
51+
.fillMaxSize()
52+
.preventMultiTouch(),
5053
containerColor = White,
5154
contentWindowInsets = ScaffoldDefaults.contentWindowInsets.exclude(WindowInsets.ime),
5255
) { innerPadding ->

0 commit comments

Comments
 (0)