Remove home button gesture

- It causes more problems than it solves
- Who even uses 3 button nav in 2025?

Close #1436
This commit is contained in:
MM20 2025-05-28 21:46:45 +02:00
parent 53d8d93d04
commit 99fd69d5d9
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
7 changed files with 1 additions and 91 deletions

View File

@ -91,7 +91,6 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
val swipeUpAction = settings.swipeUp val swipeUpAction = settings.swipeUp
val longPressAction = settings.longPress val longPressAction = settings.longPress
val doubleTapAction = settings.doubleTap val doubleTapAction = settings.doubleTap
val homeButtonAction = settings.homeButton
val swipeLeftAppKey = (swipeLeftAction as? GestureAction.Launch)?.key val swipeLeftAppKey = (swipeLeftAction as? GestureAction.Launch)?.key
val swipeRightAppKey = (swipeRightAction as? GestureAction.Launch)?.key val swipeRightAppKey = (swipeRightAction as? GestureAction.Launch)?.key
@ -99,7 +98,6 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
val swipeUpAppKey = (swipeUpAction as? GestureAction.Launch)?.key val swipeUpAppKey = (swipeUpAction as? GestureAction.Launch)?.key
val longPressAppKey = (longPressAction as? GestureAction.Launch)?.key val longPressAppKey = (longPressAction as? GestureAction.Launch)?.key
val doubleTapAppKey = (doubleTapAction as? GestureAction.Launch)?.key val doubleTapAppKey = (doubleTapAction as? GestureAction.Launch)?.key
val homeButtonAppKey = (homeButtonAction as? GestureAction.Launch)?.key
val apps = listOfNotNull( val apps = listOfNotNull(
swipeLeftAppKey, swipeLeftAppKey,
swipeRightAppKey, swipeRightAppKey,
@ -107,7 +105,6 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
swipeUpAppKey, swipeUpAppKey,
longPressAppKey, longPressAppKey,
doubleTapAppKey, doubleTapAppKey,
homeButtonAppKey,
).let { searchableRepository.getByKeys(it).first() } ).let { searchableRepository.getByKeys(it).first() }
GestureState( GestureState(
@ -117,14 +114,12 @@ class LauncherScaffoldVM : ViewModel(), KoinComponent {
swipeUpAction = swipeUpAction, swipeUpAction = swipeUpAction,
longPressAction = longPressAction, longPressAction = longPressAction,
doubleTapAction = doubleTapAction, doubleTapAction = doubleTapAction,
homeButtonAction = homeButtonAction,
swipeLeftApp = apps.find { it.key == swipeLeftAppKey }, swipeLeftApp = apps.find { it.key == swipeLeftAppKey },
swipeRightApp = apps.find { it.key == swipeRightAppKey }, swipeRightApp = apps.find { it.key == swipeRightAppKey },
swipeDownApp = apps.find { it.key == swipeDownAppKey }, swipeDownApp = apps.find { it.key == swipeDownAppKey },
swipeUpApp = apps.find { it.key == swipeUpAppKey }, swipeUpApp = apps.find { it.key == swipeUpAppKey },
longPressApp = apps.find { it.key == longPressAppKey }, longPressApp = apps.find { it.key == longPressAppKey },
doubleTapApp = apps.find { it.key == doubleTapAppKey }, doubleTapApp = apps.find { it.key == doubleTapAppKey },
homeButtonApp = apps.find { it.key == homeButtonAppKey },
) )
}.stateIn(viewModelScope, SharingStarted.Eagerly, null) }.stateIn(viewModelScope, SharingStarted.Eagerly, null)
} }
@ -136,13 +131,11 @@ data class GestureState(
val swipeUpAction: GestureAction = GestureAction.NoAction, val swipeUpAction: GestureAction = GestureAction.NoAction,
val longPressAction: GestureAction = GestureAction.NoAction, val longPressAction: GestureAction = GestureAction.NoAction,
val doubleTapAction: GestureAction = GestureAction.NoAction, val doubleTapAction: GestureAction = GestureAction.NoAction,
val homeButtonAction: GestureAction = GestureAction.NoAction,
val swipeLeftApp: SavableSearchable? = null, val swipeLeftApp: SavableSearchable? = null,
val swipeRightApp: SavableSearchable? = null, val swipeRightApp: SavableSearchable? = null,
val swipeDownApp: SavableSearchable? = null, val swipeDownApp: SavableSearchable? = null,
val swipeUpApp: SavableSearchable? = null, val swipeUpApp: SavableSearchable? = null,
val longPressApp: SavableSearchable? = null, val longPressApp: SavableSearchable? = null,
val doubleTapApp: SavableSearchable? = null, val doubleTapApp: SavableSearchable? = null,
val homeButtonApp: SavableSearchable? = null,
) )

View File

@ -345,11 +345,6 @@ abstract class SharedLauncherActivity(
gestures.longPressApp, gestures.longPressApp,
Gesture.LongPress, Gesture.LongPress,
), ),
homeButton = getScaffoldGesture(
gestures.homeButtonAction,
gestures.homeButtonApp,
Gesture.HomeButton,
),
fixedSearchBar = fixedSearchBar, fixedSearchBar = fixedSearchBar,
searchBarStyle = searchBarStyle, searchBarStyle = searchBarStyle,
searchBarPosition = if (bottomSearchBar) SearchBarPosition.Bottom else SearchBarPosition.Top, searchBarPosition = if (bottomSearchBar) SearchBarPosition.Bottom else SearchBarPosition.Top,

View File

@ -142,7 +142,6 @@ internal data class ScaffoldConfiguration(
val swipeRight: ScaffoldGesture? = null, val swipeRight: ScaffoldGesture? = null,
val doubleTap: ScaffoldGesture? = null, val doubleTap: ScaffoldGesture? = null,
val longPress: ScaffoldGesture? = null, val longPress: ScaffoldGesture? = null,
val homeButton: ScaffoldGesture? = null,
/** /**
* Position of the search bar * Position of the search bar
*/ */
@ -208,7 +207,6 @@ private operator fun ScaffoldConfiguration.get(gesture: Gesture): ScaffoldGestur
Gesture.SwipeRight -> swipeRight Gesture.SwipeRight -> swipeRight
Gesture.DoubleTap -> doubleTap Gesture.DoubleTap -> doubleTap
Gesture.LongPress -> longPress Gesture.LongPress -> longPress
Gesture.HomeButton -> homeButton
Gesture.TapSearchBar -> searchBarTap Gesture.TapSearchBar -> searchBarTap
} }
} }
@ -221,7 +219,6 @@ enum class Gesture(val orientation: Orientation?) {
DoubleTap(null), DoubleTap(null),
LongPress(null), LongPress(null),
TapSearchBar(null), TapSearchBar(null),
HomeButton(null),
} }
internal class LauncherScaffoldState( internal class LauncherScaffoldState(
@ -753,11 +750,6 @@ internal class LauncherScaffoldState(
performTapGesture(Gesture.LongPress) performTapGesture(Gesture.LongPress)
} }
suspend fun onHomeButtonPress() {
performTapGesture(Gesture.HomeButton)
}
suspend fun onSearchBarTap() { suspend fun onSearchBarTap() {
if (currentComponent is SearchComponent) return if (currentComponent is SearchComponent) return
openSearch() openSearch()
@ -1198,17 +1190,7 @@ internal fun LauncherScaffold(
var pauseTime = 0L var pauseTime = 0L
lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) { lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
try { try {
if (pauseTime > 0L && System.currentTimeMillis() - pauseTime < 50L) { if (pauseTime > 0L && System.currentTimeMillis() - pauseTime > 5000L) {
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) { if (!state.isLocked) {
state.reset() state.reset()
searchVM.reset() searchVM.reset()

View File

@ -208,29 +208,6 @@ fun GestureSettingsScreen() {
appIcon = longPressAppIcon, appIcon = longPressAppIcon,
onAppChanged = { viewModel.setLongPressApp(it) } onAppChanged = { viewModel.setLongPressApp(it) }
) )
val homeButton by viewModel.homeButton.collectAsStateWithLifecycle(null)
AnimatedVisibility(hasPermission == false && requiresAccessibilityService(homeButton)) {
MissingPermissionBanner(
modifier = Modifier.padding(16.dp),
text = stringResource(R.string.missing_permission_accessibility_gesture_settings),
onClick = { viewModel.requestPermission(context as AppCompatActivity) }
)
}
val homeButtonApp by viewModel.homeButtonApp.collectAsState(null)
val homeButtonAppIcon by remember(homeButtonApp?.key) {
viewModel.getIcon(homeButtonApp, appIconSize.toInt())
}.collectAsState(null)
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) }
)
} }
} }
} }

View File

@ -7,7 +7,6 @@ import de.mm20.launcher2.icons.IconService
import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.BaseLayout
import de.mm20.launcher2.preferences.GestureAction import de.mm20.launcher2.preferences.GestureAction
import de.mm20.launcher2.preferences.ui.GestureSettings import de.mm20.launcher2.preferences.ui.GestureSettings
import de.mm20.launcher2.preferences.ui.UiSettings import de.mm20.launcher2.preferences.ui.UiSettings
@ -20,7 +19,6 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import org.koin.core.component.inject import org.koin.core.component.inject
@ -46,8 +44,6 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val longPress = gestureSettings.longPress val longPress = gestureSettings.longPress
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
val homeButton = gestureSettings.homeButton
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), null)
fun setSwipeDown(action: GestureAction) { fun setSwipeDown(action: GestureAction) {
gestureSettings.setSwipeDown(action) gestureSettings.setSwipeDown(action)
@ -73,10 +69,6 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
gestureSettings.setLongPress(action) gestureSettings.setLongPress(action)
} }
fun setHomeButton(action: GestureAction) {
gestureSettings.setHomeButton(action)
}
val swipeLeftApp: Flow<SavableSearchable?> = swipeLeft val swipeLeftApp: Flow<SavableSearchable?> = swipeLeft
.flatMapLatest { .flatMapLatest {
if (it !is GestureAction.Launch || it.key == null) flowOf(null) if (it !is GestureAction.Launch || it.key == null) flowOf(null)
@ -161,21 +153,6 @@ class GestureSettingsScreenVM : ViewModel(), KoinComponent {
setDoubleTap(GestureAction.Launch(searchable.key)) 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) { fun requestPermission(context: AppCompatActivity) {
permissionsManager.requestPermission(context, PermissionGroup.Accessibility) permissionsManager.requestPermission(context, PermissionGroup.Accessibility)
} }

View File

@ -133,7 +133,6 @@ data class LauncherSettingsData internal constructor(
val gesturesSwipeUp: GestureAction = GestureAction.Widgets, val gesturesSwipeUp: GestureAction = GestureAction.Widgets,
val gesturesDoubleTap: GestureAction = GestureAction.ScreenLock, val gesturesDoubleTap: GestureAction = GestureAction.ScreenLock,
val gesturesLongPress: GestureAction = GestureAction.NoAction, val gesturesLongPress: GestureAction = GestureAction.NoAction,
val gesturesHomeButton: GestureAction = GestureAction.NoAction,
val animationsCharging: Boolean = true, val animationsCharging: Boolean = true,

View File

@ -13,7 +13,6 @@ data class GestureSettingsData(
val swipeUp: GestureAction, val swipeUp: GestureAction,
val doubleTap: GestureAction, val doubleTap: GestureAction,
val longPress: GestureAction, val longPress: GestureAction,
val homeButton: GestureAction,
) )
class GestureSettings internal constructor( class GestureSettings internal constructor(
@ -27,7 +26,6 @@ class GestureSettings internal constructor(
swipeUp = it.gesturesSwipeUp, swipeUp = it.gesturesSwipeUp,
doubleTap = it.gesturesDoubleTap, doubleTap = it.gesturesDoubleTap,
longPress = it.gesturesLongPress, longPress = it.gesturesLongPress,
homeButton = it.gesturesHomeButton,
) )
}.distinctUntilChanged() }.distinctUntilChanged()
) { ) {
@ -49,9 +47,6 @@ class GestureSettings internal constructor(
val longPress: Flow<GestureAction> = dataStore.data.map { it.gesturesLongPress } val longPress: Flow<GestureAction> = dataStore.data.map { it.gesturesLongPress }
.distinctUntilChanged() .distinctUntilChanged()
val homeButton: Flow<GestureAction> = dataStore.data.map { it.gesturesHomeButton }
.distinctUntilChanged()
fun setSwipeDown(action: GestureAction) { fun setSwipeDown(action: GestureAction) {
dataStore.update { dataStore.update {
it.copy(gesturesSwipeDown = action) it.copy(gesturesSwipeDown = action)
@ -87,12 +82,4 @@ class GestureSettings internal constructor(
it.copy(gesturesLongPress = action) it.copy(gesturesLongPress = action)
} }
} }
fun setHomeButton(action: GestureAction) {
dataStore.update {
it.copy(gesturesHomeButton = action)
}
}
} }