Skip to content

Commit 8a42e1d

Browse files
Update gesture propagation samples
1 parent 4a2b049 commit 8a42e1d

File tree

2 files changed

+403
-159
lines changed

2 files changed

+403
-159
lines changed

Tutorial1-1Basics/src/main/java/com/smarttoolfactory/tutorial1_1basics/chapter5_gesture/Tutorial5_6_2GesturePropagation1.kt

Lines changed: 103 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.smarttoolfactory.tutorial1_1basics.chapter5_gesture
22

3-
import android.widget.Toast
43
import androidx.compose.foundation.background
54
import androidx.compose.foundation.gestures.awaitFirstDown
65
import androidx.compose.foundation.gestures.forEachGesture
@@ -15,7 +14,6 @@ import androidx.compose.ui.Modifier
1514
import androidx.compose.ui.draw.shadow
1615
import androidx.compose.ui.graphics.Color
1716
import androidx.compose.ui.input.pointer.*
18-
import androidx.compose.ui.platform.LocalContext
1917
import androidx.compose.ui.unit.dp
2018
import com.smarttoolfactory.tutorial1_1basics.chapter2_material_widgets.CheckBoxWithTextRippleFullRow
2119
import com.smarttoolfactory.tutorial1_1basics.ui.Blue400
@@ -38,7 +36,10 @@ private fun TutorialContent() {
3836
StyleableTutorialText(
3937
text = "This example shows how gestures are propagated " +
4038
"when **pointerInput.consumeX** functions are " +
41-
"called after down, move or up.",
39+
"called after down, move or up.\n" +
40+
"**NOTE:** After changing a flag in a level(outer, center, inner) " +
41+
"press that level to make sure that it's recomposed and " +
42+
"flags work properly in that modifier",
4243
bullets = false
4344
)
4445
GesturePropagationExample()
@@ -54,7 +55,7 @@ private fun TutorialContent() {
5455
@Composable
5556
private fun GesturePropagationExample() {
5657

57-
val context = LocalContext.current
58+
// val context = LocalContext.current
5859

5960
var gestureText by remember { mutableStateOf("") }
6061

@@ -66,20 +67,24 @@ private fun GesturePropagationExample() {
6667
var gestureColorCenter by remember { mutableStateOf(centerColor) }
6768
var gestureColorInner by remember { mutableStateOf(innerColor) }
6869

69-
// FLAGS for consuming events which effects gesture propagation
70+
/*
71+
FLAGS for consuming events which effects gesture propagation
72+
*/
73+
var outerRequireUnconsumed by remember { mutableStateOf(true) }
7074
var outerConsumeDown by remember { mutableStateOf(false) }
7175
var outerConsumePositionChange by remember { mutableStateOf(false) }
7276
var outerConsumeUp by remember { mutableStateOf(false) }
7377

78+
var centerRequireUnconsumed by remember { mutableStateOf(true) }
7479
var centerConsumeDown by remember { mutableStateOf(false) }
7580
var centerConsumePositionChange by remember { mutableStateOf(false) }
7681
var centerConsumeUp by remember { mutableStateOf(false) }
7782

83+
var innerRequireUnconsumed by remember { mutableStateOf(true) }
7884
var innerConsumeDown by remember { mutableStateOf(false) }
7985
var innerConsumePositionChange by remember { mutableStateOf(false) }
8086
var innerConsumeUp by remember { mutableStateOf(false) }
8187

82-
8388
val outerModifier = Modifier
8489
.shadow(4.dp, shape = RoundedCornerShape(8.dp))
8590
.size(300.dp)
@@ -88,8 +93,18 @@ private fun GesturePropagationExample() {
8893
forEachGesture {
8994
awaitPointerEventScope {
9095

96+
println(
97+
"😍outerRequireUnconsumed: $outerRequireUnconsumed, " +
98+
"outerConsumeDown: $outerConsumeDown, " +
99+
"outerConsumePositionChange: $outerConsumePositionChange, " +
100+
"outerConsumeUp: $outerConsumeUp"
101+
)
102+
91103
// Wait for at least one pointer to press down, and set first contact position
92-
val down: PointerInputChange = awaitFirstDown()
104+
val down: PointerInputChange =
105+
// 🔥🔥 When requireUnconsumed false if a parent consumes this pointer
106+
// this down never occurs
107+
awaitFirstDown(requireUnconsumed = outerRequireUnconsumed)
93108

94109
if (outerConsumeDown) {
95110
down.consumeDownChange()
@@ -105,9 +120,9 @@ private fun GesturePropagationExample() {
105120
"anyChangeConsumed: ${down.anyChangeConsumed()}\n"
106121
gestureText += downText
107122

108-
Toast
109-
.makeText(context, downText, Toast.LENGTH_SHORT)
110-
.show()
123+
// Toast
124+
// .makeText(context, downText, Toast.LENGTH_SHORT)
125+
// .show()
111126

112127
gestureColorOuter = Pink400
113128

@@ -140,9 +155,9 @@ private fun GesturePropagationExample() {
140155

141156
gestureText += upText
142157

143-
Toast
144-
.makeText(context, upText, Toast.LENGTH_SHORT)
145-
.show()
158+
// Toast
159+
// .makeText(context, upText, Toast.LENGTH_SHORT)
160+
// .show()
146161
}
147162
it.pressed
148163
}
@@ -165,26 +180,27 @@ private fun GesturePropagationExample() {
165180
val outerText =
166181
"🍏 OUTER MOVE changes size ${event.changes.size}\n" +
167182
"id: ${pointer.id.value}, " +
183+
"changedToDown: ${pointer.changedToDown()}, " +
184+
"changedToDownIgnoreConsumed: ${pointer.changedToDownIgnoreConsumed()}\n" +
168185
"pressed: ${pointer.pressed}\n" +
169186
"changedUp: ${pointer.changedToUp()}\n" +
170187
"changedToUpIgnoreConsumed: ${pointer.changedToUpIgnoreConsumed()}\n" +
171188
"positionChanged: ${pointer.positionChanged()}\n" +
172189
"positionChangeConsumed: ${pointer.positionChangeConsumed()}\n" +
173190
"anyChangeConsumed: ${pointer.anyChangeConsumed()}\n"
174191
gestureText += outerText
175-
Toast
176-
.makeText(context, outerText, Toast.LENGTH_SHORT)
177-
.show()
192+
// Toast
193+
// .makeText(context, outerText, Toast.LENGTH_SHORT)
194+
// .show()
178195
}
179196

180197
pointerSize = event.changes.size
181198
}
182199

183-
184200
gestureColorOuter = Blue400
185201
} else {
186202
// All of the pointers are up
187-
gestureText += "Outer Up\n"
203+
gestureText = "Outer Up\n"
188204
gestureColorOuter = outerColor
189205
break
190206
}
@@ -193,7 +209,6 @@ private fun GesturePropagationExample() {
193209
}
194210
}
195211

196-
197212
val centerModifier = Modifier
198213
.shadow(4.dp, shape = RoundedCornerShape(8.dp))
199214
.size(200.dp)
@@ -202,8 +217,18 @@ private fun GesturePropagationExample() {
202217
forEachGesture {
203218
awaitPointerEventScope {
204219

220+
println(
221+
"🚌centerRequireUnconsumed: $centerRequireUnconsumed, " +
222+
"centerConsumeDown: $centerConsumeDown, " +
223+
"centerConsumePositionChange: $centerConsumePositionChange, " +
224+
"centerConsumeUp: $centerConsumeUp"
225+
)
226+
205227
// Wait for at least one pointer to press down, and set first contact position
206-
val down: PointerInputChange = awaitFirstDown()
228+
val down: PointerInputChange =
229+
// 🔥🔥 When requireUnconsumed false if a parent consumes this pointer
230+
// this down never occurs
231+
awaitFirstDown(requireUnconsumed = centerRequireUnconsumed)
207232

208233
if (centerConsumeDown) {
209234
down.consumeDownChange()
@@ -219,9 +244,9 @@ private fun GesturePropagationExample() {
219244
"anyChangeConsumed: ${down.anyChangeConsumed()}\n"
220245
gestureText += downText
221246

222-
Toast
223-
.makeText(context, downText, Toast.LENGTH_SHORT)
224-
.show()
247+
// Toast
248+
// .makeText(context, downText, Toast.LENGTH_SHORT)
249+
// .show()
225250

226251
gestureColorCenter = Pink400
227252

@@ -252,9 +277,9 @@ private fun GesturePropagationExample() {
252277

253278
gestureText += upText
254279

255-
Toast
256-
.makeText(context, upText, Toast.LENGTH_SHORT)
257-
.show()
280+
// Toast
281+
// .makeText(context, upText, Toast.LENGTH_SHORT)
282+
// .show()
258283
}
259284
it.pressed
260285
}
@@ -277,16 +302,18 @@ private fun GesturePropagationExample() {
277302
val outerText =
278303
"🍏🍏 CENTER MOVE changes size ${event.changes.size}\n" +
279304
"id: ${pointer.id.value}, " +
305+
"changedToDown: ${pointer.changedToDown()}, " +
306+
"changedToDownIgnoreConsumed: ${down.changedToDownIgnoreConsumed()}\n" +
280307
"pressed: ${pointer.pressed}\n" +
281308
"changedUp: ${pointer.changedToUp()}\n" +
282309
"changedToUpIgnoreConsumed: ${pointer.changedToUpIgnoreConsumed()}\n" +
283310
"positionChanged: ${pointer.positionChanged()}\n" +
284311
"positionChangeConsumed: ${pointer.positionChangeConsumed()}\n" +
285312
"anyChangeConsumed: ${pointer.anyChangeConsumed()}\n"
286313
gestureText += outerText
287-
Toast
288-
.makeText(context, outerText, Toast.LENGTH_SHORT)
289-
.show()
314+
// Toast
315+
// .makeText(context, outerText, Toast.LENGTH_SHORT)
316+
// .show()
290317
}
291318

292319
pointerSize = event.changes.size
@@ -312,8 +339,18 @@ private fun GesturePropagationExample() {
312339
forEachGesture {
313340
awaitPointerEventScope {
314341

342+
println(
343+
"🤡innerRequireUnconsumed: $innerRequireUnconsumed, " +
344+
"innerConsumeDown: $innerConsumeDown, " +
345+
"innerConsumePositionChange: $innerConsumePositionChange, " +
346+
"innerConsumeUp: $innerConsumeUp"
347+
)
348+
315349
// Wait for at least one pointer to press down, and set first contact position
316-
val down: PointerInputChange = awaitFirstDown()
350+
val down: PointerInputChange =
351+
// 🔥🔥 When requireUnconsumed false if a parent consumes this pointer
352+
// this down never occurs
353+
awaitFirstDown(requireUnconsumed = innerRequireUnconsumed)
317354

318355
if (innerConsumeDown) {
319356
down.consumeDownChange()
@@ -329,9 +366,9 @@ private fun GesturePropagationExample() {
329366
"anyChangeConsumed: ${down.anyChangeConsumed()}\n"
330367
gestureText += downText
331368

332-
Toast
333-
.makeText(context, downText, Toast.LENGTH_SHORT)
334-
.show()
369+
// Toast
370+
// .makeText(context, downText, Toast.LENGTH_SHORT)
371+
// .show()
335372

336373
gestureColorInner = Pink400
337374

@@ -362,9 +399,9 @@ private fun GesturePropagationExample() {
362399

363400
gestureText += upText
364401

365-
Toast
366-
.makeText(context, upText, Toast.LENGTH_SHORT)
367-
.show()
402+
// Toast
403+
// .makeText(context, upText, Toast.LENGTH_SHORT)
404+
// .show()
368405
}
369406
it.pressed
370407
}
@@ -387,16 +424,18 @@ private fun GesturePropagationExample() {
387424
val outerText =
388425
"🍏🍏🍏 INNER MOVE changes size ${event.changes.size}\n" +
389426
"id: ${pointer.id.value}, " +
427+
"changedToDown: ${pointer.changedToDown()}, " +
428+
"changedToDownIgnoreConsumed: ${pointer.changedToDownIgnoreConsumed()}\n" +
390429
"pressed: ${pointer.pressed}\n" +
391430
"changedUp: ${pointer.changedToUp()}\n" +
392431
"changedToUpIgnoreConsumed: ${pointer.changedToUpIgnoreConsumed()}\n" +
393432
"positionChanged: ${pointer.positionChanged()}\n" +
394433
"positionChangeConsumed: ${pointer.positionChangeConsumed()}\n" +
395434
"anyChangeConsumed: ${pointer.anyChangeConsumed()}\n"
396435
gestureText += outerText
397-
Toast
398-
.makeText(context, outerText, Toast.LENGTH_SHORT)
399-
.show()
436+
// Toast
437+
// .makeText(context, outerText, Toast.LENGTH_SHORT)
438+
// .show()
400439
}
401440

402441
pointerSize = event.changes.size
@@ -429,22 +468,27 @@ private fun GesturePropagationExample() {
429468
}
430469
}
431470

432-
433-
Text("OUTER Composable")
434-
CheckBoxWithTextRippleFullRow(label = "outerConsumeDown", outerConsumeDown) {
435-
outerConsumeDown = it
471+
Text("INNER Composable")
472+
CheckBoxWithTextRippleFullRow(label = "innerRequireUnconsumed", innerRequireUnconsumed) {
473+
innerRequireUnconsumed = it
474+
}
475+
CheckBoxWithTextRippleFullRow(label = "innerConsumeDown", innerConsumeDown) {
476+
innerConsumeDown = it
436477
}
437478
CheckBoxWithTextRippleFullRow(
438-
label = "outerConsumePositionChange",
439-
outerConsumePositionChange
479+
label = "innerConsumePositionChange",
480+
innerConsumePositionChange
440481
) {
441-
outerConsumePositionChange = it
482+
innerConsumePositionChange = it
442483
}
443-
CheckBoxWithTextRippleFullRow(label = "outerConsumeUp", outerConsumeUp) {
444-
outerConsumeUp = it
484+
CheckBoxWithTextRippleFullRow(label = "innerConsumeUp", innerConsumeUp) {
485+
innerConsumeUp = it
445486
}
446487

447488
Text("CENTER Composable")
489+
CheckBoxWithTextRippleFullRow(label = "centerRequireUnconsumed", centerRequireUnconsumed) {
490+
centerRequireUnconsumed = it
491+
}
448492
CheckBoxWithTextRippleFullRow(label = "centerConsumeDown", centerConsumeDown) {
449493
centerConsumeDown = it
450494
}
@@ -457,18 +501,21 @@ private fun GesturePropagationExample() {
457501
centerConsumeUp = it
458502
}
459503

460-
Text("INNER Composable")
461-
CheckBoxWithTextRippleFullRow(label = "innerConsumeDown", innerConsumeDown) {
462-
innerConsumeDown = it
504+
Text("OUTER Composable")
505+
CheckBoxWithTextRippleFullRow(label = "outerRequireUnconsumed", outerRequireUnconsumed) {
506+
outerRequireUnconsumed = it
507+
}
508+
CheckBoxWithTextRippleFullRow(label = "outerConsumeDown", outerConsumeDown) {
509+
outerConsumeDown = it
463510
}
464511
CheckBoxWithTextRippleFullRow(
465-
label = "innerConsumePositionChange",
466-
innerConsumePositionChange
512+
label = "outerConsumePositionChange",
513+
outerConsumePositionChange
467514
) {
468-
innerConsumePositionChange = it
515+
outerConsumePositionChange = it
469516
}
470-
CheckBoxWithTextRippleFullRow(label = "innerConsumeUp", innerConsumeUp) {
471-
innerConsumeUp = it
517+
CheckBoxWithTextRippleFullRow(label = "outerConsumeUp", outerConsumeUp) {
518+
outerConsumeUp = it
472519
}
473520

474521
Text(

0 commit comments

Comments
 (0)