Adds haptic feedback to draft deletion swipe

This commit is contained in:
Vitor Pamplona 2024-08-06 17:13:06 -04:00
parent 5fdff97cf8
commit e88d1d0d00
3 changed files with 41 additions and 15 deletions

View File

@ -32,6 +32,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SwipeToDismissBox
import androidx.compose.material3.SwipeToDismissBoxState
import androidx.compose.material3.SwipeToDismissBoxValue.EndToStart
@ -39,10 +40,13 @@ import androidx.compose.material3.SwipeToDismissBoxValue.Settled
import androidx.compose.material3.SwipeToDismissBoxValue.StartToEnd
import androidx.compose.material3.rememberSwipeToDismissBoxState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
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.LocalHapticFeedback
import androidx.compose.ui.unit.dp
import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.stringRes
@ -69,6 +73,7 @@ fun SwipeToDeleteContainer(
}
return@rememberSwipeToDismissBoxState true
},
positionalThreshold = { it * .40f },
)
SwipeToDismissBox(
@ -86,11 +91,20 @@ fun DismissBackground(dismissState: SwipeToDismissBoxState) {
if (dismissState.currentValue > dismissState.targetValue) {
Color(0xFFFF1744)
} else {
Color.Transparent
MaterialTheme.colorScheme.surfaceVariant
},
label = "DismissBackground",
)
val haptic = LocalHapticFeedback.current
LaunchedEffect(key1 = dismissState.currentValue > dismissState.targetValue) {
// doesn't run for the first time or when the list is updated.
println("AABBCC ${dismissState.progress}")
if (dismissState.progress > 0 && dismissState.progress < 1) {
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
}
}
Row(
modifier =
Modifier

View File

@ -22,7 +22,6 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
@ -59,6 +58,7 @@ import com.vitorpamplona.amethyst.ui.screen.SaveableFeedState
import com.vitorpamplona.amethyst.ui.screen.ScrollStateKeys.DRAFTS
import com.vitorpamplona.amethyst.ui.theme.DividerThickness
import com.vitorpamplona.amethyst.ui.theme.FeedPadding
import com.vitorpamplona.amethyst.ui.theme.maxWidthWithBackground
@Composable
fun DraftListScreen(
@ -178,24 +178,23 @@ private fun DraftFeedLoaded(
}
}
itemsIndexed(state.feed.value, key = { _, item -> item.idHex }) { _, item ->
SwipeToDeleteContainer(
modifier =
Modifier
.fillMaxWidth()
.animateContentSize(),
onStartToEnd = { accountViewModel.delete(item) },
onEndToStart = { accountViewModel.delete(item) },
Row(
Modifier
.fillMaxWidth()
.animateItemPlacement(),
) {
Row(
Modifier
.fillMaxWidth()
.animateItemPlacement()
.background(MaterialTheme.colorScheme.background),
SwipeToDeleteContainer(
modifier =
Modifier
.fillMaxWidth()
.animateContentSize(),
onStartToEnd = { accountViewModel.delete(item) },
onEndToStart = { accountViewModel.delete(item) },
) {
NoteCompose(
item,
routeForLastRead = routeForLastRead,
modifier = Modifier.fillMaxWidth(),
modifier = MaterialTheme.colorScheme.maxWidthWithBackground,
isBoostedNote = false,
isHiddenFeed = state.showHidden.value,
quotesLeft = 3,

View File

@ -189,6 +189,16 @@ val LightInnerPostBorderModifier =
.clip(shape = QuoteBorder)
.border(1.dp, LightSubtleBorder, QuoteBorder)
val DarkMaxWidthWithBackground =
Modifier
.fillMaxWidth()
.background(DarkColorPalette.background)
val LightMaxWidthWithBackground =
Modifier
.fillMaxWidth()
.background(LightColorPalette.background)
val DarkSelectedReactionBoxModifier =
Modifier
.padding(horizontal = 5.dp, vertical = 5.dp)
@ -395,6 +405,9 @@ val ColorScheme.replyModifier: Modifier
val ColorScheme.innerPostModifier: Modifier
get() = if (isLight) LightInnerPostBorderModifier else DarkInnerPostBorderModifier
val ColorScheme.maxWidthWithBackground: Modifier
get() = if (isLight) LightMaxWidthWithBackground else DarkMaxWidthWithBackground
val ColorScheme.channelNotePictureModifier: Modifier
get() = if (isLight) LightChannelNotePictureModifier else DarkChannelNotePictureModifier