1616
1717package io .github .sds100 .keymapper .inputmethod .latin ;
1818
19+ import static io .github .sds100 .keymapper .inputmethod .latin .common .Constants .ImeOption .FORCE_ASCII ;
20+ import static io .github .sds100 .keymapper .inputmethod .latin .common .Constants .ImeOption .NO_MICROPHONE ;
21+ import static io .github .sds100 .keymapper .inputmethod .latin .common .Constants .ImeOption .NO_MICROPHONE_COMPAT ;
22+
1923import android .app .AlertDialog ;
2024import android .content .BroadcastReceiver ;
25+ import android .content .ComponentName ;
2126import android .content .Context ;
2227import android .content .DialogInterface ;
2328import android .content .DialogInterface .OnClickListener ;
2429import android .content .Intent ;
2530import android .content .IntentFilter ;
31+ import android .content .ServiceConnection ;
2632import android .content .res .Configuration ;
2733import android .content .res .Resources ;
2834import android .graphics .Color ;
3339import android .os .IBinder ;
3440import android .os .Message ;
3541import android .os .Process ;
36- import android .os .SystemClock ;
42+ import android .os .RemoteException ;
3743import android .text .InputType ;
3844import android .util .Log ;
3945import android .util .PrintWriterPrinter ;
5056import android .view .inputmethod .InputConnection ;
5157import android .view .inputmethod .InputMethodSubtype ;
5258
59+ import java .io .FileDescriptor ;
60+ import java .io .PrintWriter ;
61+ import java .util .ArrayList ;
62+ import java .util .List ;
63+ import java .util .Locale ;
64+ import java .util .concurrent .TimeUnit ;
65+
66+ import javax .annotation .Nonnull ;
67+
68+ import io .github .sds100 .keymapper .api .IKeyEventReceiver ;
5369import io .github .sds100 .keymapper .inputmethod .accessibility .AccessibilityUtils ;
5470import io .github .sds100 .keymapper .inputmethod .annotations .UsedForTesting ;
5571import io .github .sds100 .keymapper .inputmethod .compat .EditorInfoCompatUtils ;
92108import io .github .sds100 .keymapper .inputmethod .latin .utils .SubtypeLocaleUtils ;
93109import io .github .sds100 .keymapper .inputmethod .latin .utils .ViewLayoutUtils ;
94110
95- import java .io .FileDescriptor ;
96- import java .io .PrintWriter ;
97- import java .util .ArrayList ;
98- import java .util .List ;
99- import java .util .Locale ;
100- import java .util .concurrent .TimeUnit ;
101-
102- import javax .annotation .Nonnull ;
103-
104- import static io .github .sds100 .keymapper .inputmethod .latin .common .Constants .ImeOption .FORCE_ASCII ;
105- import static io .github .sds100 .keymapper .inputmethod .latin .common .Constants .ImeOption .NO_MICROPHONE ;
106- import static io .github .sds100 .keymapper .inputmethod .latin .common .Constants .ImeOption .NO_MICROPHONE_COMPAT ;
107-
108111/**
109112 * Input method implementation for Qwerty'ish keyboard.
110113 */
@@ -214,8 +217,28 @@ public void onReceive(Context context, Intent intent) {
214217 }
215218 }
216219 }
220+
217221 final RestartAfterDeviceUnlockReceiver mRestartAfterDeviceUnlockReceiver = new RestartAfterDeviceUnlockReceiver ();
218222
223+ private final Object keyEventReceiverLock = new Object ();
224+ private IKeyEventReceiver keyEventReceiverBinder = null ;
225+
226+ private final ServiceConnection keyEventReceiverConnection = new ServiceConnection () {
227+ @ Override
228+ public void onServiceConnected (ComponentName name , IBinder service ) {
229+ synchronized (keyEventReceiverLock ) {
230+ keyEventReceiverBinder = IKeyEventReceiver .Stub .asInterface (service );
231+ }
232+ }
233+
234+ @ Override
235+ public void onServiceDisconnected (ComponentName name ) {
236+ synchronized (keyEventReceiverLock ) {
237+ keyEventReceiverBinder = null ;
238+ }
239+ }
240+ };
241+
219242 final static class KeyMapperBroadcastReceiver extends BroadcastReceiver {
220243 private final InputMethodService mIms ;
221244
@@ -759,6 +782,15 @@ public void onCreate() {
759782
760783 registerReceiver (mKeyMapperBroadcastReceiver , keyMapperIntentFilter );
761784
785+ try {
786+ ComponentName keyEventReceiverComponent = new ComponentName ("io.github.sds100.keymapper" , "io.github.sds100.keymapper.api.KeyEventReceiver" );
787+ Intent keyEventReceiverServiceIntent = new Intent ();
788+ keyEventReceiverServiceIntent .setComponent (keyEventReceiverComponent );
789+ bindService (keyEventReceiverServiceIntent , keyEventReceiverConnection , 0 );
790+ } catch (SecurityException e ) {
791+ Log .e (TAG , e .toString ());
792+ }
793+
762794 StatsUtils .onCreate (mSettings .getCurrent (), mRichImm );
763795 }
764796
@@ -871,6 +903,7 @@ public void onDestroy() {
871903 unregisterReceiver (mRestartAfterDeviceUnlockReceiver );
872904 unregisterReceiver (mKeyMapperBroadcastReceiver );
873905 mStatsUtilsManager .onDestroy (this /* context */ );
906+ unbindService (keyEventReceiverConnection );
874907 super .onDestroy ();
875908 }
876909
@@ -1889,6 +1922,17 @@ private HardwareEventDecoder getHardwareKeyEventDecoder(final int deviceId) {
18891922 // Hooks for hardware keyboard
18901923 @ Override
18911924 public boolean onKeyDown (final int keyCode , final KeyEvent keyEvent ) {
1925+
1926+ if (keyEventReceiverBinder != null ) {
1927+ try {
1928+ if (keyEventReceiverBinder .onKeyEvent (keyEvent )) {
1929+ return true ;
1930+ }
1931+ } catch (RemoteException e ) {
1932+
1933+ }
1934+ }
1935+
18921936 if (mEmojiAltPhysicalKeyDetector == null ) {
18931937 mEmojiAltPhysicalKeyDetector = new EmojiAltPhysicalKeyDetector (
18941938 getApplicationContext ().getResources ());
@@ -1909,11 +1953,22 @@ public boolean onKeyDown(final int keyCode, final KeyEvent keyEvent) {
19091953 mHandler );
19101954 return true ;
19111955 }
1956+
19121957 return super .onKeyDown (keyCode , keyEvent );
19131958 }
19141959
19151960 @ Override
19161961 public boolean onKeyUp (final int keyCode , final KeyEvent keyEvent ) {
1962+ if (keyEventReceiverBinder != null ) {
1963+ try {
1964+ if (keyEventReceiverBinder .onKeyEvent (keyEvent )) {
1965+ return true ;
1966+ }
1967+ } catch (RemoteException e ) {
1968+
1969+ }
1970+ }
1971+
19171972 if (mEmojiAltPhysicalKeyDetector == null ) {
19181973 mEmojiAltPhysicalKeyDetector = new EmojiAltPhysicalKeyDetector (
19191974 getApplicationContext ().getResources ());
@@ -1926,6 +1981,7 @@ public boolean onKeyUp(final int keyCode, final KeyEvent keyEvent) {
19261981 if (mInputLogic .mCurrentlyPressedHardwareKeys .remove (keyIdentifier )) {
19271982 return true ;
19281983 }
1984+
19291985 return super .onKeyUp (keyCode , keyEvent );
19301986 }
19311987
0 commit comments