Skip to content
Merged
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
18 changes: 17 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
## [4.0.0 Beta 6](https://github.com/sds100/KeyMapper/releases/tag/v4.0.0-beta.06)

#### 4 January 2026

## Added

- #1964 show the command to start Expert Mode with a shell command.

## Bug fixes

- #1968 Device controls action no longer works on Android 16+ so it has been disabled on new Android versions.
- #1967 Still start system bridge if granting WRITE_SECURE_SETTINGS fails.
- #1965 Better system bridge support on Xiaomi devices and ask to enable "USB debugging security settings" in developer options.

## [4.0.0 Beta 5](https://github.com/sds100/KeyMapper/releases/tag/v4.0.0-beta.05)

#### TO BE RELEASED
#### 1 January 2026

Happy new year!

## Added
- #1947 show tip to use expert mode where the old option for screen off remapping used to be
Expand Down
4 changes: 2 additions & 2 deletions app/version.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
VERSION_NAME=4.0.0-beta.05
VERSION_CODE=220
VERSION_NAME=4.0.0-beta.06
VERSION_CODE=226
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,8 @@ object ActionUtils {
// is not marked as deprecated even though it doesn't work.
ActionId.TOGGLE_SPLIT_SCREEN -> Build.VERSION_CODES.S

ActionId.DEVICE_CONTROLS -> Build.VERSION_CODES.VANILLA_ICE_CREAM

else -> Constants.MAX_API
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -689,19 +689,24 @@ class PerformActionsUseCaseImpl @AssistedInject constructor(
val actionType = when (action.direction) {
ActionData.MoveCursor.Direction.START ->
AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY

ActionData.MoveCursor.Direction.END ->
AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
}

val granularity = when (action.moveType) {
ActionData.MoveCursor.Type.CHAR ->
AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER

ActionData.MoveCursor.Type.WORD ->
AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD

ActionData.MoveCursor.Type.LINE ->
AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE

ActionData.MoveCursor.Type.PARAGRAPH ->
AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH

ActionData.MoveCursor.Type.PAGE ->
AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE
}
Expand Down Expand Up @@ -1040,10 +1045,13 @@ class PerformActionsUseCaseImpl @AssistedInject constructor(
is Success -> Timber.d(
"Performed action $action, input event type: $inputEventAction, key meta state: $keyMetaState",
)

is KMError -> Timber.d(
"Failed to perform action $action, reason: ${result.getFullMessage(
resourceProvider,
)}, action: $action, input event type: $inputEventAction, key meta state: $keyMetaState",
"Failed to perform action $action, reason: ${
result.getFullMessage(
resourceProvider,
)
}, action: $action, input event type: $inputEventAction, key meta state: $keyMetaState",
)
}

Expand Down
Loading
Loading