Revert "Remove home button gesture"

This reverts commit 99fd69d5d9.
This commit is contained in:
MM20
2025-06-03 18:27:13 +02:00
parent d81936212d
commit c4ec894add
7 changed files with 102 additions and 1 deletions
@@ -91,6 +91,7 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
val swipeUpAction = settings.swipeUp
val longPressAction = settings.longPress
val doubleTapAction = settings.doubleTap
val homeButtonAction = settings.homeButton
val swipeLeftAppKey = (swipeLeftAction as? GestureAction.Launch)?.key
val swipeRightAppKey = (swipeRightAction as? GestureAction.Launch)?.key
@@ -98,6 +99,7 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
val swipeUpAppKey = (swipeUpAction as? GestureAction.Launch)?.key
val longPressAppKey = (longPressAction as? GestureAction.Launch)?.key
val doubleTapAppKey = (doubleTapAction as? GestureAction.Launch)?.key
val homeButtonAppKey = (homeButtonAction as? GestureAction.Launch)?.key
val apps = listOfNotNull(
swipeLeftAppKey,
swipeRightAppKey,
@@ -105,6 +107,7 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
swipeUpAppKey,
longPressAppKey,
doubleTapAppKey,
homeButtonAppKey,
).let { searchableRepository.getByKeys(it).first() }
GestureState(
@@ -114,12 +117,14 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
swipeUpAction = swipeUpAction,
longPressAction = longPressAction,
doubleTapAction = doubleTapAction,
homeButtonAction = homeButtonAction,
swipeLeftApp = apps.find { it.key == swipeLeftAppKey },
swipeRightApp = apps.find { it.key == swipeRightAppKey },
swipeDownApp = apps.find { it.key == swipeDownAppKey },
swipeUpApp = apps.find { it.key == swipeUpAppKey },
longPressApp = apps.find { it.key == longPressAppKey },
doubleTapApp = apps.find { it.key == doubleTapAppKey },
homeButtonApp = apps.find { it.key == homeButtonAppKey },
)
}.stateIn(viewModelScope, SharingStarted.Eagerly, null)
}
@@ -131,11 +136,13 @@ data class GestureState(
val swipeUpAction: GestureAction = GestureAction.NoAction,
val longPressAction: GestureAction = GestureAction.NoAction,
val doubleTapAction: GestureAction = GestureAction.NoAction,
val homeButtonAction: GestureAction = GestureAction.NoAction,
val swipeLeftApp: SavableSearchable? = null,
val swipeRightApp: SavableSearchable? = null,
val swipeDownApp: SavableSearchable? = null,
val swipeUpApp: SavableSearchable? = null,
val longPressApp: SavableSearchable? = null,
val doubleTapApp: SavableSearchable? = null,
val homeButtonApp: SavableSearchable? = null,
)
@@ -1,6 +1,7 @@
package de.mm20.launcher2.ui.launcher
import android.app.WallpaperManager
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.content.res.Resources
@@ -349,6 +350,11 @@ abstract class SharedLauncherActivity(
gestures.longPressApp,
Gesture.LongPress,
),
homeButton = getScaffoldGesture(
gestures.homeButtonAction,
gestures.homeButtonApp,
Gesture.HomeButton,
),
fixedSearchBar = fixedSearchBar,
searchBarStyle = searchBarStyle,
searchBarPosition = if (bottomSearchBar) SearchBarPosition.Bottom else SearchBarPosition.Top,
@@ -419,6 +425,17 @@ abstract class SharedLauncherActivity(
}
}
var isNewIntent = false
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
isNewIntent = true
}
override fun onPause() {
super.onPause()
isNewIntent = false
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val windowController = WindowCompat.getInsetsController(window, window.decorView.rootView)
@@ -95,6 +95,7 @@ import de.mm20.launcher2.preferences.SearchBarStyle
import de.mm20.launcher2.searchactions.actions.SearchAction
import de.mm20.launcher2.ui.component.SearchBarLevel
import de.mm20.launcher2.ui.ktx.toPixels
import de.mm20.launcher2.ui.launcher.SharedLauncherActivity
import de.mm20.launcher2.ui.launcher.helper.WallpaperBlur
import de.mm20.launcher2.ui.launcher.search.SearchVM
import de.mm20.launcher2.ui.launcher.search.filters.KeyboardFilterBar
@@ -142,6 +143,7 @@ internal data class ScaffoldConfiguration(
val swipeRight: ScaffoldGesture? = null,
val doubleTap: ScaffoldGesture? = null,
val longPress: ScaffoldGesture? = null,
val homeButton: ScaffoldGesture? = null,
/**
* Position of the search bar
*/
@@ -207,6 +209,7 @@ private operator fun ScaffoldConfiguration.get(gesture: Gesture): ScaffoldGestur
Gesture.SwipeRight -> swipeRight
Gesture.DoubleTap -> doubleTap
Gesture.LongPress -> longPress
Gesture.HomeButton -> homeButton
Gesture.TapSearchBar -> searchBarTap
}
}
@@ -219,6 +222,7 @@ enum class Gesture(val orientation: Orientation?) {
DoubleTap(null),
LongPress(null),
TapSearchBar(null),
HomeButton(null),
}
internal class LauncherScaffoldState(
@@ -750,6 +754,11 @@ internal class LauncherScaffoldState(
performTapGesture(Gesture.LongPress)
}
suspend fun onHomeButtonPress() {
performTapGesture(Gesture.HomeButton)
}
suspend fun onSearchBarTap() {
if (currentComponent is SearchComponent) return
openSearch()
@@ -1190,7 +1199,17 @@ internal fun LauncherScaffold(
var pauseTime = 0L
lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
try {
if (pauseTime > 0L && System.currentTimeMillis() - pauseTime > 5000L) {
if (pauseTime > 0L && System.currentTimeMillis() - pauseTime < 50L && (activity as? SharedLauncherActivity)?.isNewIntent == true) {
if (!state.isLocked) {
if (state.currentProgress > 0f) {
state.onPredictiveBackEnd()
} else {
state.onHomeButtonPress()
}
} else {
activity.onBackPressedDispatcher.onBackPressed()
}
} else if (pauseTime > 0L && System.currentTimeMillis() - pauseTime > 5000L) {
if (!state.isLocked) {
state.reset()
searchVM.reset()
@@ -204,6 +204,27 @@ fun GestureSettingsScreen() {
onAppChanged = { viewModel.setLongPressApp(it) }
)
}
val homeButton by viewModel.homeButton.collectAsStateWithLifecycle(null)
val homeButtonApp by viewModel.homeButtonApp.collectAsState(null)
val homeButtonAppIcon by remember(homeButtonApp?.key) {
viewModel.getIcon(homeButtonApp, appIconSize.toInt())
}.collectAsState(null)
GuardedPreference(
locked = hasPermission == false && requiresAccessibilityService(homeButton),
description = stringResource(R.string.missing_permission_accessibility_gesture_settings),
onUnlock = { viewModel.requestPermission(context as AppCompatActivity) },
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_home_button),
icon = Icons.Rounded.Home,
value = homeButton,
onValueChanged = { viewModel.setHomeButton(it) },
options = options,
app = homeButtonApp,
appIcon = homeButtonAppIcon,
onAppChanged = { viewModel.setHomeButtonApp(it) }
)
}
}
}
}
@@ -7,6 +7,7 @@ import de.mm20.launcher2.icons.IconService
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.BaseLayout
import de.mm20.launcher2.preferences.GestureAction
import de.mm20.launcher2.preferences.ui.GestureSettings
import de.mm20.launcher2.preferences.ui.UiSettings
@@ -19,6 +20,7 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@@ -44,6 +46,8 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val longPress = gestureSettings.longPress
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val homeButton = gestureSettings.homeButton
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
fun setSwipeDown(action: GestureAction) {
gestureSettings.setSwipeDown(action)
@@ -69,6 +73,10 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
gestureSettings.setLongPress(action)
}
fun setHomeButton(action: GestureAction) {
gestureSettings.setHomeButton(action)
}
val swipeLeftApp: Flow<SavableSearchable?> = swipeLeft
.flatMapLatest {
if (it !is GestureAction.Launch || it.key == null) flowOf(null)
@@ -153,6 +161,21 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
setDoubleTap(GestureAction.Launch(searchable.key))
}
val homeButtonApp: Flow<SavableSearchable?> = homeButton
.flatMapLatest {
if (it !is GestureAction.Launch || it.key == null) flowOf(null)
else searchableRepository.getByKeys(listOf(it.key!!)).map {
it.firstOrNull()
}
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(stopTimeoutMillis = 10000), null)
fun setHomeButtonApp(searchable: SavableSearchable?) {
searchable?.let { searchableRepository.insert(it) } ?: return
setHomeButton(GestureAction.Launch(searchable.key))
}
fun requestPermission(context: AppCompatActivity) {
permissionsManager.requestPermission(context, PermissionGroup.Accessibility)
}