Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
1079be4
bump version to 4.6.0
sds100 Sep 21, 2026
4b5205f
Update whats-new-app.txt
sds100 Sep 21, 2026
37d4a05
#2263 feat: constraints can now be edited in place from the constrain…
sds100 Sep 25, 2026
4cb7e0f
#2252 #2254 redesigned the app bar when configuring a key map, name k…
sds100 Sep 27, 2026
0f4d0d2
#2270 fix: use more visible outline on Select all button
sds100 Sep 27, 2026
09835f8
fix: put Fix button on same row as key map name in home screen
sds100 Sep 27, 2026
f3a5122
#2268 fix: use trampoline when launching device assistant and setting…
sds100 Sep 27, 2026
1c8c74d
#2155 feat: the Expert Mode setup wizard now detects Samsung Auto Blo…
sds100 Sep 27, 2026
031f478
change some action icons
sds100 Sep 27, 2026
135d174
#2075 feat: enable/disable/toggle a group by sending a broadcast inte…
sds100 Sep 27, 2026
a08f370
scroll to the end automatically for some code blocks in intent screen…
sds100 Sep 27, 2026
498e374
feat: show side-by-side view when creating a key map on more devices
sds100 Sep 27, 2026
e33adaa
fix: do not use maximum dialog with for custom dialogs and whats new …
sds100 Sep 27, 2026
ea39494
fix: add padding to end of enable key map switch
sds100 Sep 27, 2026
c1d3f2e
#2271 fix: brightness actions match brightness slider on Android 16.1+
sds100 Sep 27, 2026
4b29534
#2271 brightness actions on old Android versions work again
sds100 Sep 27, 2026
78b6d20
do not stack tabs on top of each other in BaseConfigKeyMapScreen on s…
sds100 Sep 27, 2026
1ce020e
#2127 feat: shut down and restart device actions
sds100 Sep 27, 2026
1694d9f
#1493 feat: the brightness increment for the increase/decrease bright…
sds100 Sep 28, 2026
a5b303a
#2273 fix: show error if device does not support hinge open/closed co…
sds100 Sep 28, 2026
4252117
#2273 fix: use better icons and text for hinge constraints
sds100 Sep 28, 2026
1f8c9d6
#2273 fix: constraints that the device can't support (e.g. no Bluetoo…
sds100 Sep 28, 2026
c18aaa9
show constraint icon on slightly smaller screens
sds100 Sep 28, 2026
93fb1bc
feat: show constraint icons when collapsed
sds100 Sep 28, 2026
e7f3998
fix: use correct padding at top of key map options screen when no tip…
sds100 Sep 28, 2026
3393fff
#1739 fix: check all display resolutions when picking a screenshot an…
sds100 Sep 28, 2026
2f33868
fix: use correct padding at top of key map options screen when no tip…
sds100 Sep 28, 2026
1bae8a3
#1739 fix: use active display when performing gestures
sds100 Sep 28, 2026
61f0a74
only set display id of tap screen gesture if >= Android 11
sds100 Sep 28, 2026
753ac4d
#1739 use active display for brightness actions
sds100 Sep 28, 2026
1ea6705
#1739 use active display for actions, floating button placement, orie…
sds100 Sep 28, 2026
ffb36c3
bump version code
sds100 Sep 28, 2026
0549228
Revert "fix: use correct padding at top of key map options screen whe…
sds100 Sep 28, 2026
55f1935
refactor: create shared KMBottomSheet composable
sds100 Sep 28, 2026
b7a2892
fix: When the bottom sheet fills the whole screen, scrolling pushes t…
sds100 Oct 1, 2026
7df0f88
fix: disable bottom sheet gestures
sds100 Oct 1, 2026
8893c02
#711 feat: variables!
sds100 Oct 1, 2026
a80df3a
feat: Rename "app in foreground" constraint to "app is open"
sds100 Oct 1, 2026
a7176cf
#2277 WIP: automatically create a screenshot with Roborazzi
sds100 Oct 1, 2026
78df6fa
#2281 feat: action text in the key map list is more concise and the d…
sds100 Oct 2, 2026
fd4097f
fix backup manager tests
sds100 Oct 2, 2026
786938a
#2280 removed the confirmation dialogs when deleting actions, constra…
sds100 Oct 2, 2026
8243756
#2276 fix: bottom key maps are obscured by selection bottom sheet
sds100 Oct 2, 2026
7bc9375
Merge branch 'develop' into feature/2277-screenshots
sds100 Oct 2, 2026
ad29090
#2277 create device frame and text in screenshots
sds100 Oct 2, 2026
0d261c8
#2277 create screenshots when releasing
sds100 Oct 2, 2026
ad96ddc
#2277 use google maps icon in screenshot
sds100 Oct 2, 2026
d12e88f
#2277 create first screenshot
sds100 Oct 2, 2026
7ac384a
#2282 moved the group enable switch into the top app bar to save vert…
sds100 Oct 2, 2026
7ea8b90
Merge branch 'develop' into feature/2277-screenshots
sds100 Oct 2, 2026
ecd93de
#2277 update screenshots
sds100 Oct 2, 2026
b36676d
#2277 create the rest of the screenshots
sds100 Oct 3, 2026
3dee255
Merge branch 'feature/2277-screenshots' into develop
sds100 Oct 3, 2026
961b1a4
delete screenshots module
sds100 Oct 3, 2026
660da7a
fix: add more padding around group name text field
sds100 Oct 3, 2026
3500d7b
#2282 fix padding around AND/OR group constraint switcher
sds100 Oct 3, 2026
c557662
fix screenshot task in Fastfile
sds100 Oct 3, 2026
aa84bb3
#2282 fix: add padding to end of group AND/OR switcher
sds100 Oct 3, 2026
0942a76
increase max bottom sheet width
sds100 Oct 3, 2026
0dddc5a
Update README.md
sds100 Oct 3, 2026
5f6e307
Merge remote-tracking branch 'origin/develop' into develop
sds100 Oct 3, 2026
e939b26
#711 split set variable action into set and modify variable actions
sds100 Oct 3, 2026
6d33453
#711 show tooltips on variable operation button selector
sds100 Oct 3, 2026
e6a7229
bump version code
sds100 Oct 3, 2026
4e91ddf
fix: disable Wireless Debugging after manually starting Expert Mode.
sds100 Oct 4, 2026
0ba4850
#2285 fix: show floating button border when configuring even if backg…
sds100 Oct 4, 2026
e9a4d5c
delete unused PurchasingManager.onCompleteProductPurchase
sds100 Oct 4, 2026
de2b8b8
#2283 only show side key app in the launcher if the assistant trigger…
sds100 Oct 4, 2026
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
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,39 @@
## [4.6.0](https://github.com/sds100/KeyMapper/releases/tag/v4.6.0)

#### TO BE RELEASED

## Added

- #711 new action to add to, subtract from or set a variable, and a new constraint for comparing a variable to a value.
- #1493 the brightness increment for the increase/decrease brightness actions can now be configured, from 1% to 50% (default 10%).
- #2075 enable/disable/toggle a group by sending a broadcast intent, configurable from Power user options in Settings.
- #2263 constraints can now be edited in place from the constraints list instead of being deleted and re-added.
- #2254 you can now give a key map a custom name, which is shown in the key map list.
- #2252 undo and redo changes when configuring a key map.
- #2155 the Expert Mode setup wizard now detects Samsung Auto Blocker and guides how to disable it, since it can silently block wireless debugging from staying enabled.
- #2127 shut down and restart device actions.
- #2281 action text in the key map list is more concise and the delay between actions is shown as a timer chip.
- Show constraint icons when collapsed.

## Changed

- #2280 removed the confirmation dialogs when deleting actions, constraints and constraint groups because changes can now be undone.
- #2252 redesigned the app bar when configuring a key map. Changes are saved automatically so there is no Done button, and the help button was removed.
- Show side-by-side view when creating a key map on more devices
- #2273 Constraints that the device can't support (e.g. no Bluetooth or hinge sensor) are now shown as unsupported when choosing a constraint.
- Rename "app in foreground" constraint to "app is open".
- #2282 moved the group enable switch into the top app bar to save vertical space.

## Fixed

- #2268 use trampoline when launching device assistant and settings apps when the device is locked so the lock screen dismisses.
- #2271 brightness actions match brightness slider on Android 16.1+.
- #1739 support multiple displays better.
- #2276 Bottom key maps are obscured by selection bottom sheet.
- Disable Wireless Debugging after manually starting Expert Mode.
- #2285 show floating button border when configuring even if background is not transparent.
- #2283 only show side key app in the launcher if the assistant trigger is used by a key map

## [4.5.0](https://github.com/sds100/KeyMapper/releases/tag/v4.5.0)

#### 21 September 2026
Expand Down
4 changes: 0 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@
<noscript><a href="https://buy.stripe.com/00g16L9YEabldDWdQQ"><img alt="Donate using Stripe" src="https://img.shields.io/badge/Donate-Stripe-blueviolet?style=for-the-badge&logo=stripe"></a></noscript>
</p>

<p align="center">
<img width="700" src="https://github.com/user-attachments/assets/0411203c-4490-42ff-8aff-667cbde32f49" />
</p>

## Unleash your keys!

Make custom macros on your keyboard or gamepad, make on-screen buttons in any app, and unlock new functionality from your volume buttons!
Expand Down
10 changes: 10 additions & 0 deletions api/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@
</intent-filter>
</receiver>

<receiver
android:name=".EnableGroupBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="io.github.sds100.keymapper.ACTION_ENABLE_GROUP" />
<action android:name="io.github.sds100.keymapper.ACTION_DISABLE_GROUP" />
<action android:name="io.github.sds100.keymapper.ACTION_TOGGLE_GROUP" />
</intent-filter>
</receiver>

<!-- Don't require a permission because we want other apps to bind
to this service. The permission wouldn't be signature-level so
if a nefarious app wants to talk to Key Mapper they could add the permission anyway. -->
Expand Down
5 changes: 5 additions & 0 deletions api/src/main/java/io/github/sds100/keymapper/api/Api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,9 @@ object Api {
const val ACTION_ENABLE_KEY_MAP = "io.github.sds100.keymapper.ACTION_ENABLE_KEY_MAP"
const val ACTION_DISABLE_KEY_MAP = "io.github.sds100.keymapper.ACTION_DISABLE_KEY_MAP"
const val ACTION_TOGGLE_KEY_MAP = "io.github.sds100.keymapper.ACTION_TOGGLE_KEY_MAP"

const val ACTION_ENABLE_GROUP = "io.github.sds100.keymapper.ACTION_ENABLE_GROUP"
const val ACTION_DISABLE_GROUP = "io.github.sds100.keymapper.ACTION_DISABLE_GROUP"
const val ACTION_TOGGLE_GROUP = "io.github.sds100.keymapper.ACTION_TOGGLE_GROUP"
const val EXTRA_GROUP_UID = "io.github.sds100.keymapper.EXTRA_GROUP_UID"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io.github.sds100.keymapper.api

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import dagger.hilt.android.AndroidEntryPoint
import io.github.sds100.keymapper.base.keymaps.EnableGroupUseCase
import javax.inject.Inject

// DON'T MOVE THIS CLASS TO A DIFFERENT PACKAGE OR RENAME BECAUSE IT BREAKS THE API
@AndroidEntryPoint
class EnableGroupBroadcastReceiver : BroadcastReceiver() {

@Inject
lateinit var useCase: EnableGroupUseCase

override fun onReceive(context: Context?, intent: Intent?) {
context ?: return
intent?.action ?: return

if (intent.action != Api.ACTION_ENABLE_GROUP &&
intent.action != Api.ACTION_DISABLE_GROUP &&
intent.action != Api.ACTION_TOGGLE_GROUP
) {
return
}

val groupUid = intent.getStringExtra(Api.EXTRA_GROUP_UID) ?: return

when (intent.action) {
Api.ACTION_ENABLE_GROUP -> useCase.enable(groupUid)
Api.ACTION_DISABLE_GROUP -> useCase.disable(groupUid)
Api.ACTION_TOGGLE_GROUP -> useCase.toggle(groupUid)
}
}
}
2 changes: 2 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@
-keep class android.hardware.usb.IUsbManager { *; }
-keep class android.hardware.usb.IUsbManager$Stub { *; }
-keep class android.net.* { *; }
-keep class android.os.IPowerManager { *; }
-keep class android.os.IPowerManager$Stub { *; }

-keepattributes *Annotation*, InnerClasses
-dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ import io.github.sds100.keymapper.base.purchasing.RevenueCatState
import io.github.sds100.keymapper.common.utils.KMResult
import io.github.sds100.keymapper.common.utils.State
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow

class PurchasingManagerImpl : PurchasingManager {
override val onCompleteProductPurchase: MutableSharedFlow<RevenueCatEntitlementId> =
MutableSharedFlow()
override val state: Flow<State<KMResult<RevenueCatState>>> =
MutableStateFlow(State.Data(PurchasingError.PurchasingNotImplemented))

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.5.0
VERSION_CODE=271
VERSION_NAME=4.6.0
VERSION_CODE=277
2 changes: 1 addition & 1 deletion base/src/main/assets/whats-new-app.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
! Group constraints | Organize constraints into groups with their own AND/OR logic
! Constraint groups | Organize constraints into groups with their own AND/OR logic
! Vibrate action | New action with custom duration or haptic effects like Click and Tick
+ • Cycle enabled keyboards action
+ • Notification constraint
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ abstract class BaseKeyMapperApp : MultiDexApplication() {
}
}

private fun init() {
open fun init() {
Log.i(tag, "KeyMapperApp: Init")

val intentFilter = IntentFilter().apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import android.content.Intent
import android.content.IntentFilter
import android.content.res.Configuration
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.Display
import android.view.MotionEvent
import android.widget.Toast
import androidx.activity.SystemBarStyle
Expand Down Expand Up @@ -38,6 +40,7 @@ import io.github.sds100.keymapper.base.utils.ui.ResourceProviderImpl
import io.github.sds100.keymapper.common.BuildConfigProvider
import io.github.sds100.keymapper.sysbridge.service.SystemBridgeSetupControllerImpl
import io.github.sds100.keymapper.system.devices.AndroidDevicesAdapter
import io.github.sds100.keymapper.system.display.AndroidDisplayAdapter
import io.github.sds100.keymapper.system.files.FileUtils
import io.github.sds100.keymapper.system.inputevents.KMGamePadEvent
import io.github.sds100.keymapper.system.network.AndroidNetworkAdapter
Expand Down Expand Up @@ -106,6 +109,9 @@ abstract class BaseMainActivity : AppCompatActivity() {
@Inject
lateinit var configKeyMapState: ConfigKeyMapStateImpl

@Inject
lateinit var displayAdapter: AndroidDisplayAdapter

private lateinit var requestPermissionDelegate: RequestPermissionDelegate

private val currentNightMode: Int
Expand Down Expand Up @@ -205,6 +211,11 @@ abstract class BaseMainActivity : AppCompatActivity() {
onboardingUseCase.handledMigrateScreenOffKeyMapsNotification()
}

override fun onPause() {
configKeyMapState.save()
super.onPause()
}

override fun onSaveInstanceState(outState: Bundle) {
configKeyMapState.saveState(outState)

Expand All @@ -219,6 +230,16 @@ abstract class BaseMainActivity : AppCompatActivity() {
super.onDestroy()
}

override fun onAttachedToWindow() {
super.onAttachedToWindow()

displayAdapter.activityDisplayId = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
display?.displayId
} else {
Display.DEFAULT_DISPLAY
}
}

/**
* Process motion events from the activity so that DPAD buttons can be recorded
* even when the Key Mapper IME is not being used. DO NOT record the key events because
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ import io.github.sds100.keymapper.base.debug.GetEventScreen
import io.github.sds100.keymapper.base.expertmode.ExpertModeScreen
import io.github.sds100.keymapper.base.expertmode.ExpertModeSetupScreen
import io.github.sds100.keymapper.base.expertmode.xiaomi.XiaomiOptimizationScreen
import io.github.sds100.keymapper.base.groups.EnableGroupByIntentScreen
import io.github.sds100.keymapper.base.keymaps.EnableByIntentScreen
import io.github.sds100.keymapper.base.keymaps.PauseResumeByIntentScreen
import io.github.sds100.keymapper.base.keymaps.TriggerByIntentScreen
import io.github.sds100.keymapper.base.logging.LogScreen
import io.github.sds100.keymapper.base.onboarding.HandleAccessibilityServiceDialogs
Expand Down Expand Up @@ -106,9 +108,13 @@ fun BaseMainNavHost(
)
}

composable<NavDestination.ConfigNotificationConstraint> {
composable<NavDestination.ConfigNotificationConstraint> { backStackEntry ->
val viewModel: ConfigNotificationConstraintViewModel = hiltViewModel()

backStackEntry.handleRouteArgs<NavDestination.ConfigNotificationConstraint> {
it.oldJson?.let { json -> viewModel.loadOldData(Json.decodeFromString(json)) }
}

ConfigNotificationConstraintScreen(
modifier = Modifier.fillMaxSize(),
viewModel = viewModel,
Expand Down Expand Up @@ -223,6 +229,20 @@ fun BaseMainNavHost(
)
}

composable<NavDestination.PauseResumeByIntent> {
PauseResumeByIntentScreen(
modifier = Modifier.fillMaxSize(),
onBackClick = { navController.popBackStack() },
)
}

composable<NavDestination.EnableGroupByIntent> {
EnableGroupByIntentScreen(
modifier = Modifier.fillMaxSize(),
viewModel = hiltViewModel(),
)
}

composableDestinations()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import io.github.sds100.keymapper.base.input.InputEventHub
import io.github.sds100.keymapper.base.input.InputEventHubImpl
import io.github.sds100.keymapper.base.keymaps.ConfigKeyMapState
import io.github.sds100.keymapper.base.keymaps.ConfigKeyMapStateImpl
import io.github.sds100.keymapper.base.keymaps.EnableGroupUseCase
import io.github.sds100.keymapper.base.keymaps.EnableGroupUseCaseImpl
import io.github.sds100.keymapper.base.keymaps.EnableKeyMapsUseCase
import io.github.sds100.keymapper.base.keymaps.EnableKeyMapsUseCaseImpl
import io.github.sds100.keymapper.base.keymaps.FingerprintGesturesSupportedUseCase
Expand Down Expand Up @@ -55,6 +57,8 @@ import io.github.sds100.keymapper.base.utils.ui.DialogProvider
import io.github.sds100.keymapper.base.utils.ui.DialogProviderImpl
import io.github.sds100.keymapper.base.utils.ui.ResourceProvider
import io.github.sds100.keymapper.base.utils.ui.ResourceProviderImpl
import io.github.sds100.keymapper.base.variables.VariablesUseCase
import io.github.sds100.keymapper.base.variables.VariablesUseCaseImpl
import io.github.sds100.keymapper.common.utils.Clock
import io.github.sds100.keymapper.common.utils.ClockImpl
import io.github.sds100.keymapper.common.utils.DefaultUuidGenerator
Expand Down Expand Up @@ -199,6 +203,10 @@ abstract class BaseSingletonHiltModule {
@Singleton
abstract fun bindEnableKeyMapsUseCase(impl: EnableKeyMapsUseCaseImpl): EnableKeyMapsUseCase

@Binds
@Singleton
abstract fun bindEnableGroupUseCase(impl: EnableGroupUseCaseImpl): EnableGroupUseCase

@Binds
@Singleton
abstract fun bindSetupAccessibilityServiceDelegate(
Expand All @@ -208,4 +216,8 @@ abstract class BaseSingletonHiltModule {
@Binds
@Singleton
abstract fun bindClock(impl: ClockImpl): Clock

@Binds
@Singleton
abstract fun bindVariablesUseCase(impl: VariablesUseCaseImpl): VariablesUseCase
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import io.github.sds100.keymapper.base.expertmode.SystemBridgeSetupUseCase
import io.github.sds100.keymapper.base.expertmode.SystemBridgeSetupUseCaseImpl
import io.github.sds100.keymapper.base.expertmode.xiaomi.XiaomiOptimizationUseCase
import io.github.sds100.keymapper.base.expertmode.xiaomi.XiaomiOptimizationUseCaseImpl
import io.github.sds100.keymapper.base.groups.SelectGroupUseCase
import io.github.sds100.keymapper.base.groups.SelectGroupUseCaseImpl
import io.github.sds100.keymapper.base.home.ListKeyMapsUseCase
import io.github.sds100.keymapper.base.home.ListKeyMapsUseCaseImpl
import io.github.sds100.keymapper.base.home.ShowHomeScreenAlertsUseCase
Expand Down Expand Up @@ -85,6 +87,10 @@ abstract class BaseViewModelHiltModule {
@ViewModelScoped
abstract fun bindListKeyMapsUseCase(impl: ListKeyMapsUseCaseImpl): ListKeyMapsUseCase

@Binds
@ViewModelScoped
abstract fun bindSelectGroupUseCase(impl: SelectGroupUseCaseImpl): SelectGroupUseCase

@Binds
@ViewModelScoped
abstract fun bindBackupRestoreMappingsUseCase(
Expand Down
15 changes: 15 additions & 0 deletions base/src/main/java/io/github/sds100/keymapper/base/IntentApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,19 @@ object IntentApi {

const val TRIGGER_RECEIVER_CLASS =
"io.github.sds100.keymapper.api.TriggerKeyMapsBroadcastReceiver"

const val ACTION_PAUSE_MAPPINGS = "io.github.sds100.keymapper.ACTION_PAUSE_MAPPINGS"
const val ACTION_RESUME_MAPPINGS = "io.github.sds100.keymapper.ACTION_RESUME_MAPPINGS"
const val ACTION_TOGGLE_MAPPINGS = "io.github.sds100.keymapper.ACTION_TOGGLE_MAPPINGS"

const val PAUSE_RECEIVER_CLASS =
"io.github.sds100.keymapper.api.PauseMappingsBroadcastReceiver"

const val ACTION_ENABLE_GROUP = "io.github.sds100.keymapper.ACTION_ENABLE_GROUP"
const val ACTION_DISABLE_GROUP = "io.github.sds100.keymapper.ACTION_DISABLE_GROUP"
const val ACTION_TOGGLE_GROUP = "io.github.sds100.keymapper.ACTION_TOGGLE_GROUP"
const val EXTRA_GROUP_UID = "io.github.sds100.keymapper.EXTRA_GROUP_UID"

const val GROUP_RECEIVER_CLASS =
"io.github.sds100.keymapper.api.EnableGroupBroadcastReceiver"
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ enum class ActionCategory {
TELEPHONY,
NOTIFICATIONS,
SPECIAL,
VARIABLES,
}
Loading
Loading