Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
## Added

- #2140 Add monochrome app icon layer for themed icon support on Android 13+.
- #2174 Add "Do not remap by default" preference to the default options settings page.

## Fixed

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ class GetDefaultKeyMapOptionsUseCaseImpl @Inject constructor(
preferenceRepository.get(Keys.defaultVibrateDuration)
.map { it ?: PreferenceDefaults.VIBRATION_DURATION }
.stateIn(coroutineScope, SharingStarted.Lazily, PreferenceDefaults.VIBRATION_DURATION)

override val defaultDoNotRemap: StateFlow<Boolean> =
preferenceRepository.get(Keys.defaultDoNotRemap)
.map { it ?: PreferenceDefaults.DO_NOT_REMAP }
.stateIn(coroutineScope, SharingStarted.Lazily, PreferenceDefaults.DO_NOT_REMAP)
}

interface GetDefaultKeyMapOptionsUseCase {
Expand All @@ -65,4 +70,5 @@ interface GetDefaultKeyMapOptionsUseCase {
val defaultDoublePressDelay: StateFlow<Int>
val defaultSequenceTriggerTimeout: StateFlow<Int>
val defaultVibrateDuration: StateFlow<Int>
val defaultDoNotRemap: StateFlow<Boolean>
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Keyboard
import androidx.compose.material3.BottomAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
Expand All @@ -35,6 +36,7 @@ import io.github.sds100.keymapper.base.utils.ui.SliderMaximums
import io.github.sds100.keymapper.base.utils.ui.SliderMinimums
import io.github.sds100.keymapper.base.utils.ui.SliderStepSizes
import io.github.sds100.keymapper.base.utils.ui.compose.SliderOptionText
import io.github.sds100.keymapper.base.utils.ui.compose.SwitchPreferenceCompose

@Composable
fun DefaultOptionsSettingsScreen(modifier: Modifier = Modifier, viewModel: SettingsViewModel) {
Expand Down Expand Up @@ -209,6 +211,16 @@ private fun Content(
stepSize = SliderStepSizes.TRIGGER_SEQUENCE_TRIGGER_TIMEOUT,
)
Spacer(Modifier.height(8.dp))

// Do not remap
SwitchPreferenceCompose(
title = stringResource(R.string.title_pref_default_do_not_remap),
text = stringResource(R.string.summary_pref_default_do_not_remap),
icon = Icons.Rounded.Keyboard,
isChecked = state.doNotRemap,
onCheckedChange = { callback.onDefaultDoNotRemapChanged(it) },
)
Spacer(Modifier.height(8.dp))
}
}

Expand All @@ -219,6 +231,7 @@ interface DefaultOptionsSettingsCallback {
fun onRepeatDelayChanged(delay: Int) = run { }
fun onRepeatRateChanged(rate: Int) = run { }
fun onSequenceTriggerTimeoutChanged(timeout: Int) = run { }
fun onDefaultDoNotRemapChanged(doNotRemap: Boolean) = run { }
}

@Preview
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,27 +72,32 @@ class SettingsViewModel @Inject constructor(
}.stateIn(viewModelScope, SharingStarted.Lazily, MainSettingsState())

val defaultSettingsScreenState: StateFlow<DefaultSettingsState> = combine(
useCase.getPreference(Keys.defaultLongPressDelay),
useCase.getPreference(Keys.defaultDoublePressDelay),
useCase.getPreference(Keys.defaultVibrateDuration),
useCase.getPreference(Keys.defaultRepeatDelay),
useCase.getPreference(Keys.defaultRepeatRate),
useCase.getPreference(Keys.defaultSequenceTriggerTimeout),
) { values ->
DefaultSettingsState(
longPressDelay = values[0] ?: PreferenceDefaults.LONG_PRESS_DELAY,
defaultLongPressDelay = PreferenceDefaults.LONG_PRESS_DELAY,
doublePressDelay = values[1] ?: PreferenceDefaults.DOUBLE_PRESS_DELAY,
defaultDoublePressDelay = PreferenceDefaults.DOUBLE_PRESS_DELAY,
vibrateDuration = values[2] ?: PreferenceDefaults.VIBRATION_DURATION,
defaultVibrateDuration = PreferenceDefaults.VIBRATION_DURATION,
repeatDelay = values[3] ?: PreferenceDefaults.REPEAT_DELAY,
defaultRepeatDelay = PreferenceDefaults.REPEAT_DELAY,
repeatRate = values[4] ?: PreferenceDefaults.REPEAT_RATE,
defaultRepeatRate = PreferenceDefaults.REPEAT_RATE,
sequenceTriggerTimeout = values[5] ?: PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT,
defaultSequenceTriggerTimeout = PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT,
)
combine(
useCase.getPreference(Keys.defaultLongPressDelay),
useCase.getPreference(Keys.defaultDoublePressDelay),
useCase.getPreference(Keys.defaultVibrateDuration),
useCase.getPreference(Keys.defaultRepeatDelay),
useCase.getPreference(Keys.defaultRepeatRate),
useCase.getPreference(Keys.defaultSequenceTriggerTimeout),
) { values ->
DefaultSettingsState(
longPressDelay = values[0] ?: PreferenceDefaults.LONG_PRESS_DELAY,
defaultLongPressDelay = PreferenceDefaults.LONG_PRESS_DELAY,
doublePressDelay = values[1] ?: PreferenceDefaults.DOUBLE_PRESS_DELAY,
defaultDoublePressDelay = PreferenceDefaults.DOUBLE_PRESS_DELAY,
vibrateDuration = values[2] ?: PreferenceDefaults.VIBRATION_DURATION,
defaultVibrateDuration = PreferenceDefaults.VIBRATION_DURATION,
repeatDelay = values[3] ?: PreferenceDefaults.REPEAT_DELAY,
defaultRepeatDelay = PreferenceDefaults.REPEAT_DELAY,
repeatRate = values[4] ?: PreferenceDefaults.REPEAT_RATE,
defaultRepeatRate = PreferenceDefaults.REPEAT_RATE,
sequenceTriggerTimeout = values[5] ?: PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT,
defaultSequenceTriggerTimeout = PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT,
)
},
useCase.getPreference(Keys.defaultDoNotRemap),
) { state, doNotRemap ->
state.copy(doNotRemap = doNotRemap ?: PreferenceDefaults.DO_NOT_REMAP)
}.stateIn(viewModelScope, SharingStarted.Lazily, DefaultSettingsState())

val automaticChangeImeSettingsState: StateFlow<AutomaticChangeImeSettingsState> = combine(
Expand Down Expand Up @@ -241,6 +246,12 @@ class SettingsViewModel @Inject constructor(
}
}

override fun onDefaultDoNotRemapChanged(doNotRemap: Boolean) {
viewModelScope.launch {
useCase.setPreference(Keys.defaultDoNotRemap, doNotRemap)
}
}

fun onShowToastWhenAutoChangingImeToggled(enabled: Boolean) {
viewModelScope.launch {
useCase.setPreference(Keys.showToastWhenAutoChangingIme, enabled)
Expand Down Expand Up @@ -387,6 +398,8 @@ data class DefaultSettingsState(

val sequenceTriggerTimeout: Int = PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT,
val defaultSequenceTriggerTimeout: Int = PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT,

val doNotRemap: Boolean = PreferenceDefaults.DO_NOT_REMAP,
)

data class AutomaticChangeImeSettingsState(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class ConfigTriggerDelegate {
device: KeyEventTriggerDevice,
requiresIme: Boolean,
otherTriggerKeys: List<KeyCodeTriggerKey> = emptyList(),
defaultDoNotRemap: Boolean = false,
): Trigger {
val isPowerKey = KeyEventUtils.isPowerButtonKey(keyCode, scanCode)

Expand All @@ -79,7 +80,7 @@ class ConfigTriggerDelegate {
}
}

var consumeKeyEvent = true
var consumeKeyEvent = !defaultDoNotRemap

// Issue #753
if (KeyEventUtils.isModifierKey(keyCode)) {
Expand Down Expand Up @@ -130,6 +131,7 @@ class ConfigTriggerDelegate {
scanCode: Int,
device: EvdevDeviceInfo,
otherTriggerKeys: List<KeyCodeTriggerKey> = emptyList(),
defaultDoNotRemap: Boolean = false,
): Trigger {
val isPowerKey = KeyEventUtils.isPowerButtonKey(keyCode, scanCode)

Expand Down Expand Up @@ -158,7 +160,7 @@ class ConfigTriggerDelegate {
scanCode = scanCode,
device = device,
clickType = clickType,
consumeEvent = true,
consumeEvent = !defaultDoNotRemap,
detectWithScanCodeUserSetting = conflictingKeys.isNotEmpty(),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ class ConfigTriggerUseCaseImpl @Inject constructor(
device,
requiresIme,
otherTriggerKeys = otherTriggerKeys,
defaultDoNotRemap = defaultDoNotRemap.value,
)
}

Expand All @@ -129,6 +130,7 @@ class ConfigTriggerUseCaseImpl @Inject constructor(
scanCode,
device,
otherTriggerKeys = otherTriggerKeys,
defaultDoNotRemap = defaultDoNotRemap.value,
)
}

Expand Down
3 changes: 3 additions & 0 deletions base/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,9 @@
<string name="title_pref_default_options">Change default options</string>
<string name="summary_pref_default_options">For triggers and actions</string>

<string name="title_pref_default_do_not_remap">Do not remap by default</string>
<string name="summary_pref_default_do_not_remap">New trigger keys will not consume the key event by default</string>

<string name="title_pref_reset_settings">Reset all</string>
<string name="dialog_title_reset_settings">DANGER!</string>
<string name="dialog_message_reset_settings">Are you sure you want to reset all settings in the app to the default? Your existing key maps will not be affected. The introductions and warning pop ups will show again.</string>
Expand Down
1 change: 1 addition & 0 deletions data/src/main/java/io/github/sds100/keymapper/data/Keys.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ object Keys {
val defaultRepeatRate = intPreferencesKey("pref_repeat_delay")
val defaultSequenceTriggerTimeout = intPreferencesKey("pref_sequence_trigger_timeout")
val defaultHoldDownDuration = intPreferencesKey("pref_hold_down_duration")
val defaultDoNotRemap = booleanPreferencesKey("pref_default_do_not_remap")
val toggleKeyboardOnToggleKeymaps =
booleanPreferencesKey("key_toggle_keyboard_on_pause_resume_keymaps")
val automaticBackupLocation = stringPreferencesKey("pref_automatic_backup_location")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ object PreferenceDefaults {
// It is false by default and the first time they turn on the system bridge,
// the preference will be set to true.
const val KEY_EVENT_ACTIONS_USE_SYSTEM_BRIDGE = false

const val DO_NOT_REMAP = false
}
Loading