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

Commit ab47c3d2 authored by Coco Duan's avatar Coco Duan Committed by Android (Google) Code Review
Browse files

Merge "Disable horizontal swipe outside of the grid container" into main

parents a1fbb41e 02ed1d91
Loading
Loading
Loading
Loading
+22 −2
Original line number Diff line number Diff line
@@ -23,18 +23,28 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.positionInWindow
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.toSize
import com.android.compose.animation.scene.ContentScope
import com.android.compose.modifiers.thenIf
import com.android.systemui.Flags
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
import com.android.systemui.communal.smartspace.SmartspaceInteractionHandler
import com.android.systemui.communal.ui.compose.extensions.consumeHorizontalDragGestures
import com.android.systemui.communal.ui.compose.section.CommunalLockSection
import com.android.systemui.communal.ui.compose.section.CommunalPopupSection
import com.android.systemui.communal.ui.compose.section.HubOnboardingSection
@@ -69,10 +79,20 @@ constructor(
    fun ContentScope.Content(modifier: Modifier = Modifier) {
        CommunalTouchableSurface(viewModel = viewModel, modifier = modifier) {
            val orientation = LocalConfiguration.current.orientation
            var gridRegion by remember { mutableStateOf<Rect?>(null) }
            Layout(
                modifier = Modifier.fillMaxSize(),
                modifier =
                    Modifier.fillMaxSize().thenIf(communalSettingsInteractor.isV2FlagEnabled()) {
                        Modifier.consumeHorizontalDragGestures(gridRegion)
                    },
                content = {
                    Box(modifier = Modifier.fillMaxSize()) {
                    Box(
                        modifier =
                            Modifier.fillMaxSize().onGloballyPositioned {
                                gridRegion =
                                    Rect(offset = it.positionInWindow(), size = it.size.toSize())
                            }
                    ) {
                        with(communalPopupSection) { Popup() }
                        CommunalHub(
                            viewModel = viewModel,
+32 −0
Original line number Diff line number Diff line
@@ -18,15 +18,20 @@ package com.android.systemui.communal.ui.compose.extensions

import androidx.compose.foundation.gestures.awaitEachGesture
import androidx.compose.foundation.gestures.awaitFirstDown
import androidx.compose.foundation.gestures.detectHorizontalDragGestures
import androidx.compose.foundation.gestures.waitForUpOrCancellation
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.input.pointer.AwaitPointerEventScope
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.PointerEventTimeoutCancellationException
import androidx.compose.ui.input.pointer.PointerInputChange
import androidx.compose.ui.input.pointer.PointerInputScope
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.util.fastAny
import androidx.compose.ui.util.fastForEach
import kotlin.math.abs
import kotlinx.coroutines.coroutineScope

/**
@@ -93,3 +98,30 @@ suspend fun PointerInputScope.consumeAllGestures() = coroutineScope {
            .forEach(PointerInputChange::consume)
    }
}

/**
 * Horizontal swipe gestures on a composable will not propagate to its parent composable unless they
 * originate within the specified swipeable region.
 */
fun Modifier.consumeHorizontalDragGestures(swipeableRegion: Rect? = null): Modifier {
    return this.then(
        Modifier.pointerInput(Unit) {
            var isOriginatedFromSwipeableRegion = false
            detectHorizontalDragGestures(
                onDragStart = { offset ->
                    isOriginatedFromSwipeableRegion = swipeableRegion?.contains(offset) == true
                },
                onDragEnd = { isOriginatedFromSwipeableRegion = false },
                onDragCancel = { isOriginatedFromSwipeableRegion = false },
                onHorizontalDrag = { change, dragAmount ->
                    if (
                        !isOriginatedFromSwipeableRegion &&
                            abs(dragAmount) > viewConfiguration.touchSlop
                    ) {
                        change.consume()
                    }
                },
            )
        }
    )
}