Skip to content

Commit eff4bbf

Browse files
committed
#2016 feat: show a warning when repeating a key code action less than 20 ms with expert mode triggers
1 parent 93f4021 commit eff4bbf

File tree

4 files changed

+39
-1
lines changed

4 files changed

+39
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- #2024 support Expert mode on all Android versions supported by Key Mapper (8.0+).
88
- #2025 add report bug button to home screen menu.
99
- #2027 Make the key map sorting feature easier to understand.
10+
- #2016 Show a warning when repeating a key code action less than 20 ms with expert mode triggers.
1011

1112
## Fixed
1213

base/src/main/java/io/github/sds100/keymapper/base/actions/ActionOptionsBottomSheet.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.compose.foundation.rememberScrollState
1414
import androidx.compose.foundation.verticalScroll
1515
import androidx.compose.material.icons.Icons
1616
import androidx.compose.material.icons.automirrored.rounded.HelpOutline
17+
import androidx.compose.material.icons.rounded.Warning
1718
import androidx.compose.material3.ButtonDefaults
1819
import androidx.compose.material3.ExperimentalMaterial3Api
1920
import androidx.compose.material3.FilledTonalButton
@@ -126,6 +127,29 @@ fun ActionOptionsBottomSheet(
126127
)
127128
}
128129

130+
if (state.showRepeatRateWarning) {
131+
Spacer(Modifier.height(8.dp))
132+
133+
Row(
134+
verticalAlignment = Alignment.CenterVertically,
135+
) {
136+
Spacer(Modifier.width(16.dp))
137+
Icon(
138+
Icons.Rounded.Warning,
139+
contentDescription = null,
140+
tint = MaterialTheme.colorScheme.error,
141+
)
142+
Spacer(Modifier.width(8.dp))
143+
Text(
144+
modifier = Modifier.weight(1f),
145+
text = stringResource(R.string.action_repeat_rate_warning),
146+
color = MaterialTheme.colorScheme.error,
147+
style = MaterialTheme.typography.labelLarge,
148+
)
149+
Spacer(Modifier.width(16.dp))
150+
}
151+
}
152+
129153
if (state.showRepeatRate) {
130154
Spacer(Modifier.height(8.dp))
131155

@@ -421,6 +445,7 @@ private fun Preview() {
421445
showEditButton = true,
422446
showRepeat = true,
423447
isRepeatChecked = true,
448+
showRepeatRateWarning = true,
424449

425450
showRepeatRate = true,
426451
repeatRate = 400,
@@ -480,6 +505,7 @@ private fun PreviewNoEditButton() {
480505
showEditButton = false,
481506
showRepeat = true,
482507
isRepeatChecked = true,
508+
showRepeatRateWarning = true,
483509

484510
showRepeatRate = true,
485511
repeatRate = 400,

base/src/main/java/io/github/sds100/keymapper/base/actions/ConfigActionsViewModel.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import io.github.sds100.keymapper.base.onboarding.OnboardingTapTarget
1111
import io.github.sds100.keymapper.base.onboarding.OnboardingTipDelegate
1212
import io.github.sds100.keymapper.base.onboarding.OnboardingUseCase
1313
import io.github.sds100.keymapper.base.onboarding.SetupAccessibilityServiceDelegate
14+
import io.github.sds100.keymapper.base.trigger.EvdevTriggerKey
1415
import io.github.sds100.keymapper.base.utils.getFullMessage
1516
import io.github.sds100.keymapper.base.utils.isFixable
1617
import io.github.sds100.keymapper.base.utils.navigation.NavDestination
@@ -29,7 +30,6 @@ import io.github.sds100.keymapper.common.utils.mapData
2930
import io.github.sds100.keymapper.common.utils.onFailure
3031
import io.github.sds100.keymapper.system.SystemError
3132
import io.github.sds100.keymapper.system.permissions.Permission
32-
import javax.inject.Inject
3333
import kotlinx.coroutines.flow.MutableStateFlow
3434
import kotlinx.coroutines.flow.SharingStarted
3535
import kotlinx.coroutines.flow.StateFlow
@@ -42,6 +42,7 @@ import kotlinx.coroutines.flow.map
4242
import kotlinx.coroutines.flow.stateIn
4343
import kotlinx.coroutines.flow.update
4444
import kotlinx.coroutines.launch
45+
import javax.inject.Inject
4546

4647
@HiltViewModel
4748
class ConfigActionsViewModel @Inject constructor(
@@ -261,6 +262,7 @@ class ConfigActionsViewModel @Inject constructor(
261262
)
262263

263264
RepeatMode.LIMIT_REACHED -> config.setActionStopRepeatingWhenLimitReached(uid)
265+
264266
RepeatMode.TRIGGER_PRESSED_AGAIN ->
265267
config.setActionStopRepeatingWhenTriggerPressedAgain(uid)
266268
}
@@ -395,10 +397,17 @@ class ConfigActionsViewModel @Inject constructor(
395397
Int.MAX_VALUE
396398
}
397399

400+
val showRepeatRateWarning =
401+
keyMap.isRepeatingActionsAllowed() &&
402+
action.data is ActionData.InputKeyEvent &&
403+
(action.repeatRate ?: defaultRepeatRate) < 20 &&
404+
keyMap.trigger.keys.any { it is EvdevTriggerKey }
405+
398406
return ActionOptionsState(
399407
showEditButton = action.data.isEditable(),
400408

401409
showRepeat = keyMap.isRepeatingActionsAllowed(),
410+
showRepeatRateWarning = showRepeatRateWarning,
402411
isRepeatChecked = action.repeat,
403412

404413
showRepeatRate = keyMap.isChangingActionRepeatRateAllowed(action),
@@ -470,6 +479,7 @@ data class ActionOptionsState(
470479
val isRepeatChecked: Boolean,
471480

472481
val showRepeatRate: Boolean,
482+
val showRepeatRateWarning: Boolean,
473483
val repeatRate: Int,
474484
val defaultRepeatRate: Int,
475485

base/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,6 +1615,7 @@
16151615
<string name="action_list_delete_yes">Yes, delete</string>
16161616
<string name="action_list_delete_cancel">Cancel</string>
16171617
<string name="action_list_explanation_header">Run these actions when you trigger the key map:</string>
1618+
<string name="action_repeat_rate_warning">Repeating under 20 ms can lag! Adjust for your device and game.</string>
16181619

16191620
<string name="action_config_flashlight_choose_side">Choose side</string>
16201621
<string name="action_config_flashlight_brightness">Brightness</string>

0 commit comments

Comments
 (0)