Merge "Put nested scroll logic in a separate modifier" into main
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
index 4c29e79..69f1174 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt
@@ -244,48 +244,59 @@
                 .semantics { testTagsAsResourceId = true }
                 .testTag(COMMUNAL_HUB_TEST_TAG)
                 .fillMaxSize()
-                .nestedScroll(nestedScrollConnection)
-                .pointerInput(layoutDirection, gridState, contentOffset, contentListState) {
-                    awaitPointerEventScope {
-                        while (true) {
-                            var event = awaitFirstDown(requireUnconsumed = false)
-                            // Reset touch on first event.
-                            viewModel.onResetTouchState()
-
-                            // Process down event in case it's consumed immediately
-                            if (event.isConsumed) {
-                                viewModel.onHubTouchConsumed()
-                            }
-
-                            do {
-                                var event = awaitPointerEvent()
-                                for (change in event.changes) {
-                                    if (change.isConsumed) {
-                                        // Signal touch consumption on any consumed event.
-                                        viewModel.onHubTouchConsumed()
-                                    }
-                                }
-                            } while (
-                                !event.changes.fastAll {
-                                    it.changedToUp() || it.changedToUpIgnoreConsumed()
-                                }
-                            )
+                // Observe taps for selecting items
+                .thenIf(viewModel.isEditMode) {
+                    Modifier.pointerInput(
+                        layoutDirection,
+                        gridState,
+                        contentOffset,
+                        contentListState,
+                    ) {
+                        observeTaps { offset ->
+                            // if RTL, flip offset direction from Left side to Right
+                            val adjustedOffset =
+                                Offset(
+                                    if (layoutDirection == LayoutDirection.Rtl)
+                                        screenWidth - offset.x
+                                    else offset.x,
+                                    offset.y
+                                ) - contentOffset
+                            val index = firstIndexAtOffset(gridState, adjustedOffset)
+                            val key =
+                                index?.let { keyAtIndexIfEditable(contentListState.list, index) }
+                            viewModel.setSelectedKey(key)
                         }
                     }
+                }
+                // Nested scroll for full screen swipe to get to shade and bouncer
+                .thenIf(!viewModel.isEditMode) {
+                    Modifier.nestedScroll(nestedScrollConnection).pointerInput(viewModel) {
+                        awaitPointerEventScope {
+                            while (true) {
+                                val firstDownEvent = awaitFirstDown(requireUnconsumed = false)
+                                // Reset touch on first event.
+                                viewModel.onResetTouchState()
 
-                    // If not in edit mode, don't allow selecting items.
-                    if (!viewModel.isEditMode) return@pointerInput
-                    observeTaps { offset ->
-                        // if RTL, flip offset direction from Left side to Right
-                        val adjustedOffset =
-                            Offset(
-                                if (layoutDirection == LayoutDirection.Rtl) screenWidth - offset.x
-                                else offset.x,
-                                offset.y
-                            ) - contentOffset
-                        val index = firstIndexAtOffset(gridState, adjustedOffset)
-                        val key = index?.let { keyAtIndexIfEditable(contentListState.list, index) }
-                        viewModel.setSelectedKey(key)
+                                // Process down event in case it's consumed immediately
+                                if (firstDownEvent.isConsumed) {
+                                    viewModel.onHubTouchConsumed()
+                                }
+
+                                do {
+                                    val event = awaitPointerEvent()
+                                    for (change in event.changes) {
+                                        if (change.isConsumed) {
+                                            // Signal touch consumption on any consumed event.
+                                            viewModel.onHubTouchConsumed()
+                                        }
+                                    }
+                                } while (
+                                    !event.changes.fastAll {
+                                        it.changedToUp() || it.changedToUpIgnoreConsumed()
+                                    }
+                                )
+                            }
+                        }
                     }
                 }
                 .thenIf(!viewModel.isEditMode && !isEmptyState) {
@@ -293,7 +304,7 @@
                         gridState,
                         contentOffset,
                         communalContent,
-                        gridCoordinates
+                        gridCoordinates,
                     ) {
                         detectLongPressGesture { offset ->
                             // Deduct both grid offset relative to its container and content