Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b022b221 authored by Darrell Shi's avatar Darrell Shi Committed by Android (Google) Code Review
Browse files

Merge "Put nested scroll logic in a separate modifier" into main

parents 9ce38320 7cfa2ab0
Loading
Loading
Loading
Loading
+51 −40
Original line number Diff line number Diff line
@@ -244,21 +244,46 @@ fun CommunalHub(
                .semantics { testTagsAsResourceId = true }
                .testTag(COMMUNAL_HUB_TEST_TAG)
                .fillMaxSize()
                .nestedScroll(nestedScrollConnection)
                .pointerInput(layoutDirection, gridState, contentOffset, contentListState) {
                // 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) {
                            var event = awaitFirstDown(requireUnconsumed = false)
                                val firstDownEvent = awaitFirstDown(requireUnconsumed = false)
                                // Reset touch on first event.
                                viewModel.onResetTouchState()

                                // Process down event in case it's consumed immediately
                            if (event.isConsumed) {
                                if (firstDownEvent.isConsumed) {
                                    viewModel.onHubTouchConsumed()
                                }

                                do {
                                var event = awaitPointerEvent()
                                    val event = awaitPointerEvent()
                                    for (change in event.changes) {
                                        if (change.isConsumed) {
                                            // Signal touch consumption on any consumed event.
@@ -272,20 +297,6 @@ fun CommunalHub(
                                )
                            }
                        }

                    // 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)
                    }
                }
                .thenIf(!viewModel.isEditMode && !isEmptyState) {
@@ -293,7 +304,7 @@ fun CommunalHub(
                        gridState,
                        contentOffset,
                        communalContent,
                        gridCoordinates
                        gridCoordinates,
                    ) {
                        detectLongPressGesture { offset ->
                            // Deduct both grid offset relative to its container and content