Skip to content

Commit 3cab7a1

Browse files
committed
#1394 automatically set power trigger key to long press
1 parent 522696f commit 3cab7a1

4 files changed

Lines changed: 196 additions & 13 deletions

File tree

base/src/main/java/io/github/sds100/keymapper/base/trigger/ConfigTriggerDelegate.kt

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.github.sds100.keymapper.base.trigger
22

3+
import android.view.KeyEvent
34
import io.github.sds100.keymapper.base.floating.FloatingButtonData
45
import io.github.sds100.keymapper.base.keymaps.ClickType
56
import io.github.sds100.keymapper.base.system.accessibility.FingerprintGestureType
67
import io.github.sds100.keymapper.common.models.EvdevDeviceInfo
78
import io.github.sds100.keymapper.system.inputevents.KeyEventUtils
9+
import io.github.sds100.keymapper.system.inputevents.Scancode
810

911
/**
1012
* This extracts the core logic when configuring a trigger which makes it easier to write tests.
@@ -56,6 +58,13 @@ class ConfigTriggerDelegate {
5658
return addTriggerKey(trigger, triggerKey)
5759
}
5860

61+
private fun isPowerButtonKey(keyCode: Int, scanCode: Int): Boolean {
62+
return keyCode == KeyEvent.KEYCODE_POWER ||
63+
keyCode == KeyEvent.KEYCODE_TV_POWER ||
64+
scanCode == Scancode.KEY_POWER ||
65+
scanCode == Scancode.KEY_POWER2
66+
}
67+
5968
/**
6069
* @param otherTriggerKeys This needs to check the other triggers in the app so that it can
6170
* enable scancode detection by default in some situations.
@@ -68,10 +77,16 @@ class ConfigTriggerDelegate {
6877
requiresIme: Boolean,
6978
otherTriggerKeys: List<KeyCodeTriggerKey> = emptyList()
7079
): Trigger {
71-
val clickType = when (trigger.mode) {
72-
is TriggerMode.Parallel -> trigger.mode.clickType
73-
TriggerMode.Sequence -> ClickType.SHORT_PRESS
74-
TriggerMode.Undefined -> ClickType.SHORT_PRESS
80+
val isPowerKey = isPowerButtonKey(keyCode, scanCode)
81+
82+
val clickType = if (isPowerKey) {
83+
ClickType.LONG_PRESS
84+
} else {
85+
when (trigger.mode) {
86+
is TriggerMode.Parallel -> trigger.mode.clickType
87+
TriggerMode.Sequence -> ClickType.SHORT_PRESS
88+
TriggerMode.Undefined -> ClickType.SHORT_PRESS
89+
}
7590
}
7691

7792
var consumeKeyEvent = true
@@ -101,9 +116,19 @@ class ConfigTriggerDelegate {
101116
detectWithScanCodeUserSetting = logicallyEqualKeys.isNotEmpty()
102117
)
103118

104-
val newKeys = trigger.keys.filter { it !is EvdevTriggerKey }
119+
var newKeys = trigger.keys.filter { it !is EvdevTriggerKey }
120+
121+
if (isPowerKey && trigger.mode is TriggerMode.Parallel) {
122+
newKeys = newKeys.map { it.setClickType(ClickType.LONG_PRESS) }
123+
}
124+
125+
val newMode = if (isPowerKey && trigger.mode is TriggerMode.Parallel) {
126+
TriggerMode.Parallel(ClickType.LONG_PRESS)
127+
} else {
128+
trigger.mode
129+
}
105130

106-
return addTriggerKey(trigger.copy(keys = newKeys), triggerKey)
131+
return addTriggerKey(trigger.copy(mode = newMode, keys = newKeys), triggerKey)
107132
}
108133

109134
fun addEvdevTriggerKey(
@@ -113,10 +138,16 @@ class ConfigTriggerDelegate {
113138
device: EvdevDeviceInfo,
114139
otherTriggerKeys: List<KeyCodeTriggerKey> = emptyList()
115140
): Trigger {
116-
val clickType = when (trigger.mode) {
117-
is TriggerMode.Parallel -> trigger.mode.clickType
118-
TriggerMode.Sequence -> ClickType.SHORT_PRESS
119-
TriggerMode.Undefined -> ClickType.SHORT_PRESS
141+
val isPowerKey = isPowerButtonKey(keyCode, scanCode)
142+
143+
val clickType = if (isPowerKey) {
144+
ClickType.LONG_PRESS
145+
} else {
146+
when (trigger.mode) {
147+
is TriggerMode.Parallel -> trigger.mode.clickType
148+
TriggerMode.Sequence -> ClickType.SHORT_PRESS
149+
TriggerMode.Undefined -> ClickType.SHORT_PRESS
150+
}
120151
}
121152

122153
// Scan code detection should be turned on by default if there are other
@@ -138,9 +169,19 @@ class ConfigTriggerDelegate {
138169
detectWithScanCodeUserSetting = conflictingKeys.isNotEmpty()
139170
)
140171

141-
val newKeys = trigger.keys.filter { it !is KeyEventTriggerKey }
172+
var newKeys = trigger.keys.filter { it !is KeyEventTriggerKey }
173+
174+
if (isPowerKey && trigger.mode is TriggerMode.Parallel) {
175+
newKeys = newKeys.map { it.setClickType(ClickType.LONG_PRESS) }
176+
}
177+
178+
val newMode = if (isPowerKey && trigger.mode is TriggerMode.Parallel) {
179+
TriggerMode.Parallel(ClickType.LONG_PRESS)
180+
} else {
181+
trigger.mode
182+
}
142183

143-
return addTriggerKey(trigger.copy(keys = newKeys), triggerKey)
184+
return addTriggerKey(trigger.copy(mode = newMode, keys = newKeys), triggerKey)
144185
}
145186

146187
private fun addTriggerKey(

base/src/test/java/io/github/sds100/keymapper/base/actions/GetActionErrorUseCaseTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,10 @@ class GetActionErrorUseCaseTest {
6969
systemFeatureAdapter = mock(),
7070
cameraAdapter = mock(),
7171
soundsManager = mock(),
72-
shizukuAdapter = mockShizukuAdapter,
7372
ringtoneAdapter = mock(),
7473
buildConfigProvider = TestBuildConfigProvider(),
74+
systemBridgeConnectionManager = mock(),
75+
preferenceRepository = mock()
7576
)
7677
}
7778

base/src/test/java/io/github/sds100/keymapper/base/actions/PerformActionsUseCaseTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class PerformActionsUseCaseTest {
8080
notificationReceiverAdapter = mock(),
8181
ringtoneAdapter = mock(),
8282
inputEventHub = mockInputEventHub,
83+
systemBridgeConnectionManager = mock()
8384
)
8485
}
8586

base/src/test/java/io/github/sds100/keymapper/base/trigger/ConfigTriggerDelegateTest.kt

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,146 @@ class ConfigTriggerDelegateTest {
3939
mockedKeyEvent.close()
4040
}
4141

42+
@Test
43+
fun `set click type to long press when adding power button by key event to empty trigger`() {
44+
val trigger = Trigger()
45+
46+
val newTrigger = delegate.addKeyEventTriggerKey(
47+
trigger,
48+
keyCode = KeyEvent.KEYCODE_POWER,
49+
scanCode = Scancode.KEY_POWER,
50+
device = KeyEventTriggerDevice.Internal,
51+
requiresIme = false,
52+
)
53+
54+
assertThat(newTrigger.keys, hasSize(1))
55+
assertThat(newTrigger.keys[0].clickType, `is`(ClickType.LONG_PRESS))
56+
}
57+
58+
@Test
59+
fun `set click type to long press when adding KEY_POWER by evdev event to empty trigger`() {
60+
val trigger = Trigger()
61+
val device = EvdevDeviceInfo(
62+
name = "Power Button",
63+
bus = 0,
64+
vendor = 1,
65+
product = 2,
66+
)
67+
68+
val newTrigger = delegate.addEvdevTriggerKey(
69+
trigger,
70+
keyCode = KeyEvent.KEYCODE_POWER,
71+
scanCode = Scancode.KEY_POWER,
72+
device = device,
73+
)
74+
75+
assertThat(newTrigger.keys, hasSize(1))
76+
assertThat(newTrigger.keys[0].clickType, `is`(ClickType.LONG_PRESS))
77+
}
78+
79+
@Test
80+
fun `set click type to long press when adding KEY_POWER2 by evdev event to empty trigger`() {
81+
val trigger = Trigger()
82+
val device = EvdevDeviceInfo(
83+
name = "Power Button",
84+
bus = 0,
85+
vendor = 1,
86+
product = 2,
87+
)
88+
89+
val newTrigger = delegate.addEvdevTriggerKey(
90+
trigger,
91+
keyCode = KeyEvent.KEYCODE_POWER,
92+
scanCode = Scancode.KEY_POWER2,
93+
device = device,
94+
)
95+
96+
assertThat(newTrigger.keys, hasSize(1))
97+
assertThat(newTrigger.keys[0].clickType, `is`(ClickType.LONG_PRESS))
98+
}
99+
100+
@Test
101+
fun `set click type to long press when adding TV power button by evdev event to empty trigger`() {
102+
val trigger = Trigger()
103+
val device = EvdevDeviceInfo(
104+
name = "TV Remote",
105+
bus = 0,
106+
vendor = 1,
107+
product = 2,
108+
)
109+
110+
val newTrigger = delegate.addEvdevTriggerKey(
111+
trigger,
112+
keyCode = KeyEvent.KEYCODE_TV_POWER,
113+
scanCode = Scancode.KEY_POWER,
114+
device = device,
115+
)
116+
117+
assertThat(newTrigger.keys, hasSize(1))
118+
assertThat(newTrigger.keys[0].clickType, `is`(ClickType.LONG_PRESS))
119+
}
120+
121+
@Test
122+
fun `set click type to long press when adding power button to parallel trigger`() {
123+
val trigger = parallelTrigger(
124+
KeyEventTriggerKey(
125+
keyCode = KeyEvent.KEYCODE_VOLUME_DOWN,
126+
scanCode = Scancode.KEY_VOLUMEDOWN,
127+
device = KeyEventTriggerDevice.Internal,
128+
clickType = ClickType.SHORT_PRESS,
129+
detectWithScanCodeUserSetting = true
130+
),
131+
KeyEventTriggerKey(
132+
keyCode = KeyEvent.KEYCODE_VOLUME_UP,
133+
scanCode = Scancode.KEY_VOLUMEUP,
134+
device = KeyEventTriggerDevice.Internal,
135+
clickType = ClickType.SHORT_PRESS,
136+
detectWithScanCodeUserSetting = true
137+
),
138+
)
139+
140+
val newTrigger = delegate.addKeyEventTriggerKey(
141+
trigger,
142+
keyCode = KeyEvent.KEYCODE_POWER,
143+
scanCode = Scancode.KEY_POWER,
144+
device = KeyEventTriggerDevice.Internal,
145+
requiresIme = false,
146+
)
147+
148+
assertThat(newTrigger.keys, hasSize(3))
149+
assertThat((newTrigger.mode as TriggerMode.Parallel).clickType, `is`(ClickType.LONG_PRESS))
150+
assertThat(newTrigger.keys[2].clickType, `is`(ClickType.LONG_PRESS))
151+
}
152+
153+
@Test
154+
fun `set click type to long press when adding power button to sequence trigger`() {
155+
val trigger = sequenceTrigger(
156+
KeyEventTriggerKey(
157+
keyCode = KeyEvent.KEYCODE_VOLUME_DOWN,
158+
scanCode = Scancode.KEY_VOLUMEDOWN,
159+
device = KeyEventTriggerDevice.Internal,
160+
clickType = ClickType.SHORT_PRESS,
161+
detectWithScanCodeUserSetting = true
162+
),
163+
AssistantTriggerKey(
164+
type = AssistantTriggerType.ANY,
165+
clickType = ClickType.SHORT_PRESS,
166+
)
167+
)
168+
169+
val newTrigger = delegate.addKeyEventTriggerKey(
170+
trigger,
171+
keyCode = KeyEvent.KEYCODE_POWER,
172+
scanCode = Scancode.KEY_POWER,
173+
device = KeyEventTriggerDevice.Internal,
174+
requiresIme = false,
175+
)
176+
177+
assertThat(newTrigger.keys, hasSize(3))
178+
assertThat(newTrigger.mode, `is`(TriggerMode.Sequence))
179+
assertThat(newTrigger.keys[2].clickType, `is`(ClickType.LONG_PRESS))
180+
}
181+
42182
@Test
43183
fun `Remove keys with the same scan code if scan code detection is enabled when switching to a parallel trigger`() {
44184
val key = KeyEventTriggerKey(

0 commit comments

Comments
 (0)