Add missing long press haptic feedback to composables.

As recommended by https://developer.android.com/develop/ui/compose/touch-input/pointer-input/tap-and-press

> As a best practice, you should include haptic feedback when the user long-presses elements.
This commit is contained in:
Jeffrey Starke
2025-04-28 17:00:23 -04:00
committed by Cody Henthorne
parent c89fbbe49f
commit fe853f7b65
3 changed files with 20 additions and 2 deletions

View File

@@ -30,8 +30,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
@@ -285,6 +287,7 @@ fun FolderRow(
showDragHandle: Boolean = false
) {
val menuController = remember { DropdownMenus.MenuController() }
val haptics = LocalHapticFeedback.current
Row(
verticalAlignment = Alignment.CenterVertically,
@@ -292,7 +295,10 @@ fun FolderRow(
modifier
.combinedClickable(
onClick = onClick,
onLongClick = { menuController.show() }
onLongClick = {
haptics.performHapticFeedback(HapticFeedbackType.LongPress)
menuController.show()
}
)
.fillMaxWidth()
.defaultMinSize(minHeight = dimensionResource(id = R.dimen.chat_folder_row_height))

View File

@@ -55,7 +55,9 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction
@@ -604,6 +606,7 @@ fun MediaList(
}
}
val haptics = LocalHapticFeedback.current
var selectionState by remember { mutableStateOf(MediaMultiSelectState()) }
Box(modifier = Modifier.fillMaxSize()) {
@@ -620,6 +623,7 @@ fun MediaList(
selectionState = selectionState.copy(selected = if (selectionState.selected.contains(attachment.id)) selectionState.selected - attachment.id else selectionState.selected + attachment.id)
}
}, onLongClick = {
haptics.performHapticFeedback(HapticFeedbackType.LongPress)
selectionState = if (selectionState.selecting) MediaMultiSelectState() else MediaMultiSelectState(selecting = true, selected = setOf(attachment.id))
})
.padding(horizontal = 16.dp, vertical = 8.dp)

View File

@@ -39,6 +39,8 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
@@ -300,13 +302,19 @@ object Rows {
onLongClick: (() -> Unit)? = null,
enabled: Boolean = true
) {
val haptics = LocalHapticFeedback.current
Row(
modifier = modifier
.fillMaxWidth()
.combinedClickable(
enabled = enabled && (onClick != null || onLongClick != null),
onClick = onClick ?: {},
onLongClick = onLongClick ?: {}
onLongClick = {
if (onLongClick != null) {
haptics.performHapticFeedback(HapticFeedbackType.LongPress)
onLongClick()
}
}
)
.padding(defaultPadding()),
verticalAlignment = CenterVertically