11package com.smarttoolfactory.tutorial1_1basics.chapter5_gesture
22
3- import android.widget.Toast
43import androidx.compose.foundation.background
54import androidx.compose.foundation.gestures.awaitFirstDown
65import androidx.compose.foundation.gestures.forEachGesture
@@ -15,7 +14,6 @@ import androidx.compose.ui.Modifier
1514import androidx.compose.ui.draw.shadow
1615import androidx.compose.ui.graphics.Color
1716import androidx.compose.ui.input.pointer.*
18- import androidx.compose.ui.platform.LocalContext
1917import androidx.compose.ui.unit.dp
2018import com.smarttoolfactory.tutorial1_1basics.chapter2_material_widgets.CheckBoxWithTextRippleFullRow
2119import 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
5556private 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