feat: Add haptic feedback for buttons
This commit is contained in:
@@ -28,14 +28,11 @@ import androidx.compose.material3.ShortNavigationBarItem
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
@@ -69,14 +66,9 @@ fun AppScreen(
|
||||
val progress by rememberUpdatedState((uiState.totalTime.toFloat() - remainingTime) / uiState.totalTime)
|
||||
|
||||
val layoutDirection = LocalLayoutDirection.current
|
||||
val haptic = LocalHapticFeedback.current
|
||||
val motionScheme = motionScheme
|
||||
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass
|
||||
|
||||
LaunchedEffect(uiState.timerMode) {
|
||||
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
|
||||
}
|
||||
|
||||
val backStack = rememberNavBackStack<Screen>(Screen.Timer)
|
||||
|
||||
Scaffold(
|
||||
|
||||
@@ -63,7 +63,9 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.StrokeCap
|
||||
import androidx.compose.ui.graphics.drawscope.Stroke
|
||||
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
@@ -89,6 +91,7 @@ fun TimerScreen(
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
val motionScheme = motionScheme
|
||||
val haptic = LocalHapticFeedback.current
|
||||
|
||||
val color by animateColorAsState(
|
||||
if (timerState.timerMode == TimerMode.FOCUS) colorScheme.primary
|
||||
@@ -301,6 +304,10 @@ fun TimerScreen(
|
||||
FilledIconToggleButton(
|
||||
onCheckedChange = { checked ->
|
||||
onAction(TimerAction.ToggleTimer)
|
||||
|
||||
if (checked) haptic.performHapticFeedback(HapticFeedbackType.ToggleOn)
|
||||
else haptic.performHapticFeedback(HapticFeedbackType.ToggleOff)
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && checked) {
|
||||
permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
|
||||
}
|
||||
@@ -358,7 +365,10 @@ fun TimerScreen(
|
||||
customItem(
|
||||
{
|
||||
FilledTonalIconButton(
|
||||
onClick = { onAction(TimerAction.ResetTimer) },
|
||||
onClick = {
|
||||
onAction(TimerAction.ResetTimer)
|
||||
haptic.performHapticFeedback(HapticFeedbackType.VirtualKey)
|
||||
},
|
||||
colors = IconButtonDefaults.filledTonalIconButtonColors(
|
||||
containerColor = colorContainer
|
||||
),
|
||||
@@ -395,7 +405,10 @@ fun TimerScreen(
|
||||
customItem(
|
||||
{
|
||||
FilledTonalIconButton(
|
||||
onClick = { onAction(TimerAction.SkipTimer(fromButton = true)) },
|
||||
onClick = {
|
||||
onAction(TimerAction.SkipTimer(fromButton = true))
|
||||
haptic.performHapticFeedback(HapticFeedbackType.VirtualKey)
|
||||
},
|
||||
colors = IconButtonDefaults.filledTonalIconButtonColors(
|
||||
containerColor = colorContainer
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user