Skip to content

Commit e429c02

Browse files
committed
openboard-team#491 send motion events and register callbacks with an id to the relay service
1 parent ee7de95 commit e429c02

3 files changed

Lines changed: 101 additions & 23 deletions

File tree

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
package io.github.sds100.keymapper.api;
22

33
import android.view.KeyEvent;
4+
import android.view.MotionEvent;
45
import io.github.sds100.keymapper.api.IKeyEventRelayServiceCallback;
56

67
interface IKeyEventRelayService {
78
/**
89
* Send a key event to the target package that is registered with
910
* a callback.
11+
*
12+
* callbackID parameter was added in Key Mapper 2.8.
1013
*/
11-
boolean sendKeyEvent(in KeyEvent event, in String targetPackageName);
14+
boolean sendKeyEvent(in KeyEvent event, in String targetPackageName, in String callbackId);
1215

1316
/**
1417
* Register a callback to receive key events from this relay service. The service
1518
* checks the process uid of the caller to this method and only permits certain applications
1619
* from connecting.
20+
*
21+
* id parameter was added in Key Mapper 2.8.
1722
*/
18-
void registerCallback(IKeyEventRelayServiceCallback client);
23+
void registerCallback(IKeyEventRelayServiceCallback client, String id);
1924

2025
/**
2126
* Unregister all the callbacks associated with the calling package from this relay service.
27+
*
28+
* callbackID parameter was added in Key Mapper 2.8.
2229
*/
23-
void unregisterAllCallbacks();
30+
void unregisterCallback(String callbackId);
2431

2532
/**
26-
* Unregister a callback to receive key events from this relay service.
33+
* Send a motion event to the target package that is registered with
34+
* a callback.
2735
*/
28-
void unregisterCallback(IKeyEventRelayServiceCallback client);
36+
boolean sendMotionEvent(in MotionEvent event, in String targetPackageName, in String callbackId);
2937
}

app/src/main/java/io/github/sds100/keymapper/inputmethod/latin/KeyEventRelayServiceWrapper.kt

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.sds100.keymapper.inputmethod.latin
22

3+
34
import android.content.BroadcastReceiver
45
import android.content.ComponentName
56
import android.content.Context
@@ -11,23 +12,20 @@ import android.os.IBinder
1112
import android.os.RemoteException
1213
import android.util.Log
1314
import android.view.KeyEvent
15+
import android.view.MotionEvent
1416
import androidx.core.content.ContextCompat
1517
import io.github.sds100.keymapper.api.IKeyEventRelayService
1618
import io.github.sds100.keymapper.api.IKeyEventRelayServiceCallback
1719

18-
1920
/**
2021
* This handles connecting to the relay service and exposes an interface
2122
* so other parts of the app can get a reference to the service even when it isn't
22-
* bound yet.
23-
*
24-
* @param servicePackageName This is the package name of the key mapper app to connect to to listen
25-
* to key events. This is needed because the .debug and .ci key mapper builds are commonly
26-
* used.
23+
* bound yet. This class is copied to the Key Mapper GUI Keyboard app as well.
2724
*/
2825
class KeyEventRelayServiceWrapperImpl(
2926
context: Context,
3027
private val servicePackageName: String,
28+
private val id: String,
3129
private val callback: IKeyEventRelayServiceCallback,
3230
) : KeyEventRelayServiceWrapper {
3331

@@ -51,8 +49,7 @@ class KeyEventRelayServiceWrapperImpl(
5149
) {
5250
synchronized(keyEventRelayServiceLock) {
5351
keyEventRelayService = IKeyEventRelayService.Stub.asInterface(service)
54-
Log.d(LatinIME.TAG, "Key event relay service started: $servicePackageName")
55-
keyEventRelayService?.registerCallback(callback)
52+
keyEventRelayService?.registerCallback(callback, id)
5653
}
5754
}
5855

@@ -97,16 +94,36 @@ class KeyEventRelayServiceWrapperImpl(
9794
}
9895

9996
override fun sendKeyEvent(
100-
event: KeyEvent?,
101-
targetPackageName: String?,
97+
event: KeyEvent,
98+
targetPackageName: String,
99+
callbackId: String,
100+
): Boolean {
101+
synchronized(keyEventRelayServiceLock) {
102+
if (keyEventRelayService == null) {
103+
return false
104+
}
105+
106+
try {
107+
return keyEventRelayService!!.sendKeyEvent(event, targetPackageName, callbackId)
108+
} catch (e: DeadObjectException) {
109+
keyEventRelayService = null
110+
return false
111+
}
112+
}
113+
}
114+
115+
override fun sendMotionEvent(
116+
event: MotionEvent,
117+
targetPackageName: String,
118+
callbackId: String,
102119
): Boolean {
103120
synchronized(keyEventRelayServiceLock) {
104121
if (keyEventRelayService == null) {
105122
return false
106123
}
107124

108125
try {
109-
return keyEventRelayService!!.sendKeyEvent(event, targetPackageName)
126+
return keyEventRelayService!!.sendMotionEvent(event, targetPackageName, callbackId)
110127
} catch (e: DeadObjectException) {
111128
keyEventRelayService = null
112129
return false
@@ -141,7 +158,7 @@ class KeyEventRelayServiceWrapperImpl(
141158
// because the connection is already broken at that point and it
142159
// will fail.
143160
try {
144-
keyEventRelayService?.unregisterCallback(callback)
161+
keyEventRelayService?.unregisterCallback(id)
145162
ctx.unbindService(serviceConnection)
146163
} catch (e: RemoteException) {
147164
// do nothing
@@ -154,8 +171,6 @@ class KeyEventRelayServiceWrapperImpl(
154171
}
155172

156173
interface KeyEventRelayServiceWrapper {
157-
fun sendKeyEvent(
158-
event: KeyEvent?,
159-
targetPackageName: String?,
160-
): Boolean
174+
fun sendKeyEvent(event: KeyEvent, targetPackageName: String, callbackId: String): Boolean
175+
fun sendMotionEvent(event: MotionEvent, targetPackageName: String, callbackId: String): Boolean
161176
}

app/src/main/java/io/github/sds100/keymapper/inputmethod/latin/LatinIME.java

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import android.util.SparseArray;
4141
import android.view.Gravity;
4242
import android.view.KeyEvent;
43+
import android.view.MotionEvent;
4344
import android.view.View;
4445
import android.view.ViewGroup.LayoutParams;
4546
import android.view.Window;
@@ -784,20 +785,23 @@ public void onCreate() {
784785
new KeyEventRelayServiceWrapperImpl(
785786
getApplicationContext(),
786787
"io.github.sds100.keymapper",
788+
"input_method",
787789
mKeyEventRelayServiceCallback);
788790
mKeyEventRelayServiceWrapperRelease.onCreate();
789791

790792
mKeyEventRelayServiceWrapperDebug =
791793
new KeyEventRelayServiceWrapperImpl(
792794
getApplicationContext(),
793795
"io.github.sds100.keymapper.debug",
796+
"input_method",
794797
mKeyEventRelayServiceCallback);
795798
mKeyEventRelayServiceWrapperDebug.onCreate();
796799

797800
mKeyEventRelayServiceWrapperCi =
798801
new KeyEventRelayServiceWrapperImpl(
799802
getApplicationContext(),
800803
"io.github.sds100.keymapper.ci",
804+
"input_method",
801805
mKeyEventRelayServiceCallback);
802806
mKeyEventRelayServiceWrapperCi.onCreate();
803807

@@ -1941,7 +1945,19 @@ private HardwareEventDecoder getHardwareKeyEventDecoder(final int deviceId) {
19411945
public boolean onKeyDown(final int keyCode, final KeyEvent keyEvent) {
19421946

19431947
if (mKeyEventRelayServiceWrapperRelease != null) {
1944-
if (mKeyEventRelayServiceWrapperRelease.sendKeyEvent(keyEvent, "io.github.sds100.keymapper")) {
1948+
if (mKeyEventRelayServiceWrapperRelease.sendKeyEvent(keyEvent, "io.github.sds100.keymapper", "accessibility_service")) {
1949+
return true;
1950+
}
1951+
}
1952+
1953+
if (mKeyEventRelayServiceWrapperCi != null) {
1954+
if (mKeyEventRelayServiceWrapperCi.sendKeyEvent(keyEvent, "io.github.sds100.keymapper.ci", "accessibility_service")) {
1955+
return true;
1956+
}
1957+
}
1958+
1959+
if (mKeyEventRelayServiceWrapperDebug != null) {
1960+
if (mKeyEventRelayServiceWrapperDebug.sendKeyEvent(keyEvent, "io.github.sds100.keymapper.debug", "accessibility_service")) {
19451961
return true;
19461962
}
19471963
}
@@ -1973,7 +1989,19 @@ public boolean onKeyDown(final int keyCode, final KeyEvent keyEvent) {
19731989
@Override
19741990
public boolean onKeyUp(final int keyCode, final KeyEvent keyEvent) {
19751991
if (mKeyEventRelayServiceWrapperRelease != null) {
1976-
if (mKeyEventRelayServiceWrapperRelease.sendKeyEvent(keyEvent, "io.github.sds100.keymapper")) {
1992+
if (mKeyEventRelayServiceWrapperRelease.sendKeyEvent(keyEvent, "io.github.sds100.keymapper", "accessibility_service")) {
1993+
return true;
1994+
}
1995+
}
1996+
1997+
if (mKeyEventRelayServiceWrapperCi != null) {
1998+
if (mKeyEventRelayServiceWrapperCi.sendKeyEvent(keyEvent, "io.github.sds100.keymapper.ci", "accessibility_service")) {
1999+
return true;
2000+
}
2001+
}
2002+
2003+
if (mKeyEventRelayServiceWrapperDebug != null) {
2004+
if (mKeyEventRelayServiceWrapperDebug.sendKeyEvent(keyEvent, "io.github.sds100.keymapper.debug", "accessibility_service")) {
19772005
return true;
19782006
}
19792007
}
@@ -1994,6 +2022,33 @@ public boolean onKeyUp(final int keyCode, final KeyEvent keyEvent) {
19942022
return super.onKeyUp(keyCode, keyEvent);
19952023
}
19962024

2025+
@Override
2026+
public boolean onGenericMotionEvent(MotionEvent event) {
2027+
if (event == null) {
2028+
return super.onGenericMotionEvent(null);
2029+
}
2030+
2031+
if (mKeyEventRelayServiceWrapperRelease != null) {
2032+
if (mKeyEventRelayServiceWrapperRelease.sendMotionEvent(event, "io.github.sds100.keymapper", "accessibility_service")) {
2033+
return true;
2034+
}
2035+
}
2036+
2037+
if (mKeyEventRelayServiceWrapperCi != null) {
2038+
if (mKeyEventRelayServiceWrapperCi.sendMotionEvent(event, "io.github.sds100.keymapper.ci", "accessibility_service")) {
2039+
return true;
2040+
}
2041+
}
2042+
2043+
if (mKeyEventRelayServiceWrapperDebug != null) {
2044+
if (mKeyEventRelayServiceWrapperDebug.sendMotionEvent(event, "io.github.sds100.keymapper.debug", "accessibility_service")) {
2045+
return true;
2046+
}
2047+
}
2048+
2049+
return super.onGenericMotionEvent(event);
2050+
}
2051+
19972052
// onKeyDown and onKeyUp are the main events we are interested in. There are two more events
19982053
// related to handling of hardware key events that we may want to implement in the future:
19992054
// boolean onKeyLongPress(final int keyCode, final KeyEvent event);

0 commit comments

Comments
 (0)