mirror of
https://github.com/revanced/revanced-manager.git
synced 2025-04-30 05:54:26 +02:00
fix: only perform haptics on events
This commit is contained in:
parent
b4c37e6ddc
commit
cf322147d5
@ -6,10 +6,9 @@ import androidx.compose.material3.Checkbox
|
|||||||
import androidx.compose.material3.CheckboxColors
|
import androidx.compose.material3.CheckboxColors
|
||||||
import androidx.compose.material3.CheckboxDefaults
|
import androidx.compose.material3.CheckboxDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalView
|
import app.revanced.manager.util.withHapticFeedback
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HapticCheckbox(
|
fun HapticCheckbox(
|
||||||
@ -20,18 +19,9 @@ fun HapticCheckbox (
|
|||||||
colors: CheckboxColors = CheckboxDefaults.colors(),
|
colors: CheckboxColors = CheckboxDefaults.colors(),
|
||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
|
||||||
) {
|
) {
|
||||||
val checkedState = remember { mutableStateOf(checked) }
|
|
||||||
|
|
||||||
// Perform haptic feedback
|
|
||||||
if (checkedState.value != checked) {
|
|
||||||
val view = LocalView.current
|
|
||||||
view.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK)
|
|
||||||
checkedState.value = checked
|
|
||||||
}
|
|
||||||
|
|
||||||
Checkbox(
|
Checkbox(
|
||||||
checked = checked,
|
checked = checked,
|
||||||
onCheckedChange = onCheckedChange,
|
onCheckedChange = onCheckedChange?.withHapticFeedback(HapticFeedbackConstants.CLOCK_TICK),
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
enabled = enabled,
|
enabled = enabled,
|
||||||
colors = colors,
|
colors = colors,
|
||||||
|
@ -11,7 +11,7 @@ import androidx.compose.runtime.remember
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.Shape
|
import androidx.compose.ui.graphics.Shape
|
||||||
import androidx.compose.ui.platform.LocalView
|
import app.revanced.manager.util.withHapticFeedback
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HapticExtendedFloatingActionButton (
|
fun HapticExtendedFloatingActionButton (
|
||||||
@ -26,17 +26,10 @@ fun HapticExtendedFloatingActionButton (
|
|||||||
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
|
elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(),
|
||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||||
) {
|
) {
|
||||||
val view = LocalView.current
|
|
||||||
|
|
||||||
ExtendedFloatingActionButton(
|
ExtendedFloatingActionButton(
|
||||||
text = text,
|
text = text,
|
||||||
icon = icon,
|
icon = icon,
|
||||||
onClick = {
|
onClick = onClick.withHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY),
|
||||||
// Perform haptic feedback
|
|
||||||
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
|
|
||||||
|
|
||||||
onClick()
|
|
||||||
},
|
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
expanded = expanded,
|
expanded = expanded,
|
||||||
shape = shape,
|
shape = shape,
|
||||||
|
@ -11,7 +11,7 @@ import androidx.compose.runtime.remember
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.Shape
|
import androidx.compose.ui.graphics.Shape
|
||||||
import androidx.compose.ui.platform.LocalView
|
import app.revanced.manager.util.withHapticFeedback
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HapticFloatingActionButton (
|
fun HapticFloatingActionButton (
|
||||||
@ -24,15 +24,8 @@ fun HapticFloatingActionButton (
|
|||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||||
content: @Composable () -> Unit,
|
content: @Composable () -> Unit,
|
||||||
) {
|
) {
|
||||||
val view = LocalView.current
|
|
||||||
|
|
||||||
FloatingActionButton(
|
FloatingActionButton(
|
||||||
onClick = {
|
onClick = onClick.withHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY),
|
||||||
// Perform haptic feedback
|
|
||||||
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
|
|
||||||
|
|
||||||
onClick()
|
|
||||||
},
|
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
shape = shape,
|
shape = shape,
|
||||||
containerColor = containerColor,
|
containerColor = containerColor,
|
||||||
|
@ -6,7 +6,6 @@ import androidx.compose.material3.RadioButton
|
|||||||
import androidx.compose.material3.RadioButtonColors
|
import androidx.compose.material3.RadioButtonColors
|
||||||
import androidx.compose.material3.RadioButtonDefaults
|
import androidx.compose.material3.RadioButtonDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalView
|
import androidx.compose.ui.platform.LocalView
|
||||||
@ -20,20 +19,17 @@ fun HapticRadioButton (
|
|||||||
colors: RadioButtonColors = RadioButtonDefaults.colors(),
|
colors: RadioButtonColors = RadioButtonDefaults.colors(),
|
||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
|
||||||
) {
|
) {
|
||||||
val selectedState = remember { mutableStateOf(selected) }
|
|
||||||
|
|
||||||
// Perform haptic feedback
|
|
||||||
if (selectedState.value != selected) {
|
|
||||||
if (selected) {
|
|
||||||
val view = LocalView.current
|
val view = LocalView.current
|
||||||
view.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK)
|
|
||||||
}
|
|
||||||
selectedState.value = selected
|
|
||||||
}
|
|
||||||
|
|
||||||
RadioButton(
|
RadioButton(
|
||||||
selected = selected,
|
selected = selected,
|
||||||
onClick = onClick,
|
onClick = onClick?.let {
|
||||||
|
{
|
||||||
|
// Perform haptic feedback
|
||||||
|
if (!selected) view.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK)
|
||||||
|
it()
|
||||||
|
}
|
||||||
|
},
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
enabled = enabled,
|
enabled = enabled,
|
||||||
colors = colors,
|
colors = colors,
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
package app.revanced.manager.ui.component.haptics
|
package app.revanced.manager.ui.component.haptics
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.view.HapticFeedbackConstants
|
import android.view.HapticFeedbackConstants
|
||||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||||
@ -6,37 +7,31 @@ import androidx.compose.material3.Switch
|
|||||||
import androidx.compose.material3.SwitchColors
|
import androidx.compose.material3.SwitchColors
|
||||||
import androidx.compose.material3.SwitchDefaults
|
import androidx.compose.material3.SwitchDefaults
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.mutableStateOf
|
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalView
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HapticSwitch(
|
fun HapticSwitch(
|
||||||
checked: Boolean,
|
checked: Boolean,
|
||||||
onCheckedChange: ((Boolean) -> Unit),
|
onCheckedChange: (Boolean) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
thumbContent: (@Composable () -> Unit)? = null,
|
thumbContent: (@Composable () -> Unit)? = null,
|
||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
colors: SwitchColors = SwitchDefaults.colors(),
|
colors: SwitchColors = SwitchDefaults.colors(),
|
||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||||
) {
|
) {
|
||||||
val checkedState = remember { mutableStateOf(checked) }
|
|
||||||
|
|
||||||
// Perform haptic feedback
|
|
||||||
if (checkedState.value != checked) {
|
|
||||||
val view = LocalView.current
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
|
||||||
view.performHapticFeedback(if (checked) HapticFeedbackConstants.TOGGLE_ON else HapticFeedbackConstants.TOGGLE_OFF)
|
|
||||||
} else {
|
|
||||||
view.performHapticFeedback(if (checked) HapticFeedbackConstants.VIRTUAL_KEY else HapticFeedbackConstants.CLOCK_TICK)
|
|
||||||
}
|
|
||||||
checkedState.value = checked
|
|
||||||
}
|
|
||||||
|
|
||||||
Switch(
|
Switch(
|
||||||
checked = checked,
|
checked = checked,
|
||||||
onCheckedChange = onCheckedChange,
|
onCheckedChange = { newChecked ->
|
||||||
|
val useNewConstants = Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
|
||||||
|
when {
|
||||||
|
newChecked && useNewConstants -> HapticFeedbackConstants.TOGGLE_ON
|
||||||
|
newChecked -> HapticFeedbackConstants.VIRTUAL_KEY
|
||||||
|
!newChecked && useNewConstants -> HapticFeedbackConstants.TOGGLE_OFF
|
||||||
|
!newChecked -> HapticFeedbackConstants.CLOCK_TICK
|
||||||
|
}
|
||||||
|
onCheckedChange(newChecked)
|
||||||
|
},
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
thumbContent = thumbContent,
|
thumbContent = thumbContent,
|
||||||
enabled = enabled,
|
enabled = enabled,
|
||||||
|
@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable
|
|||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.platform.LocalView
|
import app.revanced.manager.util.withHapticFeedback
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HapticTab (
|
fun HapticTab (
|
||||||
@ -22,16 +22,9 @@ fun HapticTab (
|
|||||||
unselectedContentColor: Color = selectedContentColor,
|
unselectedContentColor: Color = selectedContentColor,
|
||||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
|
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
|
||||||
) {
|
) {
|
||||||
val view = LocalView.current
|
|
||||||
|
|
||||||
Tab(
|
Tab(
|
||||||
selected = selected,
|
selected = selected,
|
||||||
onClick = {
|
onClick = onClick.withHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY),
|
||||||
// Perform haptic feedback
|
|
||||||
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY)
|
|
||||||
|
|
||||||
onClick()
|
|
||||||
},
|
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
enabled = enabled,
|
enabled = enabled,
|
||||||
text = text,
|
text = text,
|
||||||
|
@ -4,6 +4,7 @@ import android.app.ActivityManager
|
|||||||
import android.content.ClipData
|
import android.content.ClipData
|
||||||
import android.content.ClipboardManager
|
import android.content.ClipboardManager
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.view.HapticFeedbackConstants
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
@ -17,9 +18,7 @@ import androidx.compose.material3.*
|
|||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@ -35,6 +34,7 @@ import app.revanced.manager.ui.component.settings.IntegerItem
|
|||||||
import app.revanced.manager.ui.component.settings.SettingsListItem
|
import app.revanced.manager.ui.component.settings.SettingsListItem
|
||||||
import app.revanced.manager.ui.viewmodel.AdvancedSettingsViewModel
|
import app.revanced.manager.ui.viewmodel.AdvancedSettingsViewModel
|
||||||
import app.revanced.manager.util.toast
|
import app.revanced.manager.util.toast
|
||||||
|
import app.revanced.manager.util.withHapticFeedback
|
||||||
import org.koin.androidx.compose.koinViewModel
|
import org.koin.androidx.compose.koinViewModel
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
|
||||||
@ -52,7 +52,6 @@ fun AdvancedSettingsScreen(
|
|||||||
activityManager.largeMemoryClass
|
activityManager.largeMemoryClass
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
val haptics = LocalHapticFeedback.current
|
|
||||||
|
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
@ -159,13 +158,12 @@ fun AdvancedSettingsScreen(
|
|||||||
onClick = { },
|
onClick = { },
|
||||||
onLongClickLabel = stringResource(R.string.copy_to_clipboard),
|
onLongClickLabel = stringResource(R.string.copy_to_clipboard),
|
||||||
onLongClick = {
|
onLongClick = {
|
||||||
haptics.performHapticFeedback(HapticFeedbackType.LongPress)
|
|
||||||
clipboard.setPrimaryClip(
|
clipboard.setPrimaryClip(
|
||||||
ClipData.newPlainText("Device Information", deviceContent)
|
ClipData.newPlainText("Device Information", deviceContent)
|
||||||
)
|
)
|
||||||
|
|
||||||
context.toast(context.getString(R.string.toast_copied_to_clipboard))
|
context.toast(context.getString(R.string.toast_copied_to_clipboard))
|
||||||
}
|
}.withHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
|
||||||
),
|
),
|
||||||
headlineContent = stringResource(R.string.about_device),
|
headlineContent = stringResource(R.string.about_device),
|
||||||
supportingContent = deviceContent
|
supportingContent = deviceContent
|
||||||
|
@ -14,6 +14,7 @@ import androidx.annotation.StringRes
|
|||||||
import androidx.compose.foundation.ScrollState
|
import androidx.compose.foundation.ScrollState
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.ReadOnlyComposable
|
||||||
import androidx.compose.runtime.State
|
import androidx.compose.runtime.State
|
||||||
import androidx.compose.runtime.derivedStateOf
|
import androidx.compose.runtime.derivedStateOf
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
@ -21,6 +22,7 @@ import androidx.compose.runtime.mutableIntStateOf
|
|||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.platform.LocalView
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
@ -219,3 +221,23 @@ fun ScrollState.isScrollingUp(): State<Boolean> {
|
|||||||
|
|
||||||
val LazyListState.isScrollingUp: Boolean @Composable get() = this.isScrollingUp().value
|
val LazyListState.isScrollingUp: Boolean @Composable get() = this.isScrollingUp().value
|
||||||
val ScrollState.isScrollingUp: Boolean @Composable get() = this.isScrollingUp().value
|
val ScrollState.isScrollingUp: Boolean @Composable get() = this.isScrollingUp().value
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@ReadOnlyComposable
|
||||||
|
fun <R> (() -> R).withHapticFeedback(constant: Int): () -> R {
|
||||||
|
val view = LocalView.current
|
||||||
|
return {
|
||||||
|
view.performHapticFeedback(constant)
|
||||||
|
this()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@ReadOnlyComposable
|
||||||
|
fun <T, R> ((T) -> R).withHapticFeedback(constant: Int): (T) -> R {
|
||||||
|
val view = LocalView.current
|
||||||
|
return {
|
||||||
|
view.performHapticFeedback(constant)
|
||||||
|
this(it)
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user