Skip to content

Commit 0848974

Browse files
authored
Merge pull request #1891 from keymapperorg/develop
Version 4.0.0 Beta 2
2 parents 72ded4a + a79c196 commit 0848974

File tree

121 files changed

+980
-512
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

121 files changed

+980
-512
lines changed

CHANGELOG.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
1+
## [4.0.0 Beta 2](https://github.com/sds100/KeyMapper/releases/tag/v4.0.0-beta.02)
2+
3+
#### 08 November 2025
4+
5+
## Added
6+
7+
- #1890 add button to save log to file and share it. The clipboard button now cuts off older entries and keeps newest ones.
8+
9+
## Fixed
10+
11+
- Only autostart PRO mode with Shizuku if Shizuku permission is granted. Otherwise fallback to method with Wireless Debugging and WRITE_SECURE_SETTINGS permission.
12+
- Starting system bridge for the first time would be janky because granting READ_LOGS kills the app process. Only grant for READ_LOGS when sharing logcat from settings.
13+
- #1886 mobile data actions work in PRO mode.
14+
115
## [4.0.0 Beta 1](https://github.com/sds100/KeyMapper/releases/tag/v4.0.0-beta.01)
216

3-
#### TO BE RELEASED
17+
#### 01 November 2025
418

519
## Added
620

app/proguard-rules.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@
7575
-keep class io.github.sds100.keymapper.api.IKeyEventRelayService$Stub { *; }
7676
-keep class io.github.sds100.keymapper.api.IKeyEventRelayServiceCallback { *; }
7777
-keep class io.github.sds100.keymapper.api.IKeyEventRelayServiceCallback$Stub { *; }
78+
-keep class com.android.internal.telephony.ITelephony { *; }
79+
-keep class com.android.internal.telephony.ITelephony$Stub { *; }
7880

7981
-keepattributes *Annotation*, InnerClasses
8082
-dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations

app/version.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
VERSION_NAME=4.0.0-beta.1
2-
VERSION_CODE=185
1+
VERSION_NAME=4.0.0-beta.2
2+
VERSION_CODE=187
33
VERSION_NUM=01

base/src/main/assets/whats-new.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
✨ Screen-off remapping
2-
You can now remap buttons when the screen is off (including the power button) for free with PRO mode.
2+
You can now remap ALL buttons when the screen is off (including the power button) for free with PRO mode.
33

44
🎯 New Actions
55
• Run shell commands

base/src/main/java/io/github/sds100/keymapper/base/BaseKeyMapperApp.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import io.github.sds100.keymapper.data.repositories.LogRepository
2929
import io.github.sds100.keymapper.data.repositories.PreferenceRepositoryImpl
3030
import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionManagerImpl
3131
import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionState
32+
import io.github.sds100.keymapper.sysbridge.manager.isConnected
3233
import io.github.sds100.keymapper.system.apps.AndroidPackageManagerAdapter
3334
import io.github.sds100.keymapper.system.devices.AndroidDevicesAdapter
3435
import io.github.sds100.keymapper.system.inputmethod.KeyEventRelayServiceWrapperImpl
@@ -224,6 +225,12 @@ abstract class BaseKeyMapperApp : MultiDexApplication() {
224225
autoGrantPermissionController.start()
225226
keyEventRelayServiceWrapper.bind()
226227

228+
if (systemBridgeConnectionManager.isConnected()) {
229+
Timber.i("KeyMapperApp: System bridge is connected")
230+
} else {
231+
Timber.i("KeyMapperApp: System bridge is disconnected")
232+
}
233+
227234
if (Build.VERSION.SDK_INT >= Constants.SYSTEM_BRIDGE_MIN_API) {
228235
systemBridgeAutoStarter.init()
229236

base/src/main/java/io/github/sds100/keymapper/base/BaseMainActivity.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,10 @@ abstract class BaseMainActivity : AppCompatActivity() {
201201
// the activities have not necessarily resumed at that point.
202202
permissionAdapter.onPermissionsChanged()
203203
serviceAdapter.invalidateState()
204-
suAdapter.invalidateIsRooted()
204+
suAdapter.requestPermission()
205205
systemBridgeSetupController.invalidateSettings()
206206
networkAdapter.invalidateState()
207+
onboardingUseCase.handledMigrateScreenOffKeyMapsNotification()
207208
}
208209

209210
override fun onDestroy() {

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package io.github.sds100.keymapper.base.actions.swipescreen
33
import android.accessibilityservice.GestureDescription
44
import android.graphics.Bitmap
55
import android.graphics.Point
6-
import android.os.Build
76
import androidx.lifecycle.ViewModel
87
import androidx.lifecycle.viewModelScope
98
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -96,9 +95,7 @@ class SwipePickDisplayCoordinateViewModel @Inject constructor(
9695

9796
var maxFingerCount = 10
9897

99-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
100-
maxFingerCount = GestureDescription.getMaxStrokeCount()
101-
}
98+
maxFingerCount = GestureDescription.getMaxStrokeCount()
10299

103100
if (count > maxFingerCount) {
104101
return@map resourceProvider.getString(

base/src/main/java/io/github/sds100/keymapper/base/home/KeyMapListScreen.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,9 @@ private fun getTriggerErrorMessage(error: TriggerError): String {
506506
TriggerError.EVDEV_DEVICE_NOT_FOUND -> stringResource(
507507
R.string.trigger_error_evdev_device_not_found,
508508
)
509+
TriggerError.MIGRATE_SCREEN_OFF_TRIGGER -> stringResource(
510+
R.string.trigger_error_migrate_screen_off_key_map,
511+
)
509512
}
510513
}
511514

base/src/main/java/io/github/sds100/keymapper/base/input/EvdevHandleCache.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ class EvdevHandleCache @Inject constructor(
5555
devicesAdapter.connectedInputDevices,
5656
systemBridgeConnectionManager.connectionState,
5757
) { _, connectionState ->
58-
if (connectionState !is SystemBridgeConnectionState.Connected) {
59-
devicesByPath.value = emptyMap()
60-
} else {
58+
if (connectionState is SystemBridgeConnectionState.Connected) {
6159
invalidate()
60+
} else {
61+
devicesByPath.value = emptyMap()
6262
}
6363
}.collect()
6464
}

base/src/main/java/io/github/sds100/keymapper/base/input/InputEventHub.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import io.github.sds100.keymapper.sysbridge.IEvdevCallback
2121
import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionManager
2222
import io.github.sds100.keymapper.sysbridge.manager.SystemBridgeConnectionState
2323
import io.github.sds100.keymapper.sysbridge.manager.isConnected
24+
import io.github.sds100.keymapper.sysbridge.utils.SystemBridgeError
2425
import io.github.sds100.keymapper.system.inputevents.KMEvdevEvent
2526
import io.github.sds100.keymapper.system.inputevents.KMGamePadEvent
2627
import io.github.sds100.keymapper.system.inputevents.KMInputEvent
@@ -304,8 +305,11 @@ class InputEventHubImpl @Inject constructor(
304305
.onSuccess { result ->
305306
Timber.i("Grabbed evdev devices [${evdevDevices.joinToString { it.name }}]")
306307
}
307-
.onFailure {
308-
Timber.e("Failed to grab evdev devices.")
308+
.onFailure { error ->
309+
// Do not log if it is expected to prevent log spam.
310+
if (error !is SystemBridgeError.Disconnected) {
311+
Timber.e("Failed to grab evdev devices.")
312+
}
309313
}
310314
}
311315

0 commit comments

Comments
 (0)