From d00eeb882d5b76e4aed7f541cb6e2d5421512492 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Tue, 24 Jan 2023 17:49:37 +0100 Subject: [PATCH] Fix tap gestures not dispatched to wallpaper Fix #238 --- .../launcher2/ui/gestures/GestureDetector.kt | 10 +++++++ .../launcher2/ui/gestures/GestureHandler.kt | 5 ++++ .../ui/launcher/LauncherScaffoldVM.kt | 1 + .../launcher2/ui/launcher/PagerScaffold.kt | 11 +++++--- .../launcher2/ui/launcher/PullDownScaffold.kt | 21 ++++++++++----- .../ui/launcher/SharedLauncherActivity.kt | 27 ++++++++++--------- 6 files changed, 52 insertions(+), 23 deletions(-) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureDetector.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureDetector.kt index 951ab92a..b95a7a29 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureDetector.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureDetector.kt @@ -1,5 +1,8 @@ package de.mm20.launcher2.ui.gestures +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.geometry.Offset @@ -9,6 +12,12 @@ class GestureDetector { var gestureListener: OnGestureListener? = null + var shouldDetectDoubleTaps by mutableStateOf(false) + + fun dispatchTap(position: Offset) { + gestureListener?.onTap(position) + } + fun dispatchDoubleTap(position: Offset) { gestureListener?.onDoubleTap(position) } @@ -33,6 +42,7 @@ class GestureDetector { interface OnGestureListener { + fun onTap(position: Offset) {} fun onDoubleTap(position: Offset) {} fun onLongPress(position: Offset) {} diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureHandler.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureHandler.kt index b6dc60c2..3b6407f6 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureHandler.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/gestures/GestureHandler.kt @@ -7,12 +7,17 @@ import androidx.compose.ui.geometry.Offset @Composable fun GestureHandler( detector: GestureDetector, + onTap: (Offset) -> Unit = {}, onLongPress: (Offset) -> Unit = {}, onDoubleTap: (Offset) -> Unit = {}, onDrag: (Offset) -> Boolean = { false }, ) { DisposableEffect(detector) { detector.gestureListener = object : GestureDetector.OnGestureListener { + override fun onTap(position: Offset) { + onTap(position) + } + override fun onLongPress(position: Offset) { onLongPress(position) } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt index 0394ed68..cd28cb61 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldVM.kt @@ -111,6 +111,7 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent { val searchBarStyle = dataStore.data.map { it.searchBar.searchBarStyle }.asLiveData() + val shouldDetectDoubleTapGesture = dataStore.data.map { it.gestures.doubleTap != GestureAction.None }.asLiveData() var failedGestureState by mutableStateOf(null) fun handleGesture(gesture: Gesture): Boolean { val action = when (gesture) { diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt index cafbab9e..175bbade 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PagerScaffold.kt @@ -348,14 +348,17 @@ fun PagerScaffold( modifier = Modifier .requiredWidth(width) .fillMaxHeight() - .pointerInput(Unit) { + .pointerInput(gestureManager.shouldDetectDoubleTaps) { detectTapGestures( - onDoubleTap = { + onDoubleTap = if (gestureManager.shouldDetectDoubleTaps) {{ if (!isWidgetEditMode) gestureManager.dispatchDoubleTap(it) - }, + }} else null, onLongPress = { if (!isWidgetEditMode) gestureManager.dispatchLongPress(it) - } + }, + onTap = { + if (!isWidgetEditMode) gestureManager.dispatchTap(it) + }, ) } .verticalScroll(widgetsScrollState) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt index 89e15e0e..7da31bec 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/PullDownScaffold.kt @@ -387,18 +387,24 @@ fun PullDownScaffold( Column( modifier = Modifier .graphicsLayer { - val progress = pagerState.currentPage + pagerState.currentPageOffsetFraction + val progress = + pagerState.currentPage + pagerState.currentPageOffsetFraction transformOrigin = TransformOrigin.Center alpha = 1 - progress } - .pointerInput(Unit) { + .pointerInput(gestureManager.shouldDetectDoubleTaps) { detectTapGestures( - onDoubleTap = { + onDoubleTap = if (gestureManager.shouldDetectDoubleTaps) {{ if (!isWidgetEditMode) gestureManager.dispatchDoubleTap(it) - }, + }} else null, onLongPress = { - if (!isWidgetEditMode) gestureManager.dispatchLongPress(it) - } + if (!isWidgetEditMode) gestureManager.dispatchLongPress( + it + ) + }, + onTap = { + if (!isWidgetEditMode) gestureManager.dispatchTap(it) + }, ) } .fillMaxSize() @@ -442,7 +448,8 @@ fun PullDownScaffold( SearchColumn( modifier = Modifier .graphicsLayer { - val progress = pagerState.currentPage + pagerState.currentPageOffsetFraction + val progress = + pagerState.currentPage + pagerState.currentPageOffsetFraction transformOrigin = TransformOrigin.Center alpha = progress } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt index 0f0a2b7c..ac154042 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/SharedLauncherActivity.kt @@ -4,6 +4,7 @@ import android.app.WallpaperManager import android.content.res.Configuration import android.content.res.Resources import android.os.Bundle +import android.util.Log import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.compose.foundation.background @@ -94,6 +95,10 @@ abstract class SharedLauncherActivity( val bottomSheetManager = LauncherBottomSheetManager() val gestureDetector = GestureDetector() + viewModel.shouldDetectDoubleTapGesture.observe(this) { + gestureDetector.shouldDetectDoubleTaps = it + } + setContent { val snackbarHostState = remember { SnackbarHostState() } val wallpaperColors by wallpaperColorsAsState() @@ -158,18 +163,6 @@ abstract class SharedLauncherActivity( Box( modifier = Modifier .fillMaxSize() - .pointerInput(null) { - detectTapGestures { - wallpaperManager?.sendWallpaperCommand( - window.decorView.applicationWindowToken, - WallpaperManager.COMMAND_TAP, - it.x.toInt(), - it.y.toInt(), - 0, - null - ) - } - } .background(if (dimBackground) Color.Black.copy(alpha = 0.30f) else Color.Transparent), contentAlignment = Alignment.BottomCenter ) { @@ -291,6 +284,16 @@ abstract class SharedLauncherActivity( } else -> false } + }, + onTap = { + wallpaperManager.sendWallpaperCommand(g + window.decorView.windowToken, + WallpaperManager.COMMAND_TAP, + it.x.toInt(), + it.y.toInt(), + 0, + null + ) } ) if (viewModel.failedGestureState != null) {