FreeRDP
Loading...
Searching...
No Matches
KeyboardAccessibilityService.java
1/*
2 Physical Keyboard Accessibility Service
3
4 Copyright 2026 Ibrahim Sevinc <ibrahim.sevinc.mail@gmail.com>
5
6 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
7 If a copy of the MPL was not distributed with this file, You can obtain one at
8 http://mozilla.org/MPL/2.0/.
9 */
10
11package com.freerdp.freerdpcore.presentation;
12
13import android.accessibilityservice.AccessibilityService;
14import android.accessibilityservice.AccessibilityServiceInfo;
15import android.view.InputDevice;
16import android.view.KeyEvent;
17import android.view.accessibility.AccessibilityEvent;
18
19public class KeyboardAccessibilityService extends AccessibilityService
20{
21 @Override public boolean onKeyEvent(KeyEvent event)
22 {
23 SessionActivity session = SessionActivity.activeSession;
24 if (session == null)
25 return super.onKeyEvent(event);
26
27 InputDevice device = event.getDevice();
28 if (device != null &&
29 (device.getSources() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD)
30 return super.onKeyEvent(event);
31
32 switch (event.getKeyCode())
33 {
34 case KeyEvent.KEYCODE_VOLUME_UP:
35 case KeyEvent.KEYCODE_VOLUME_DOWN:
36 case KeyEvent.KEYCODE_POWER:
37 return super.onKeyEvent(event);
38 }
39
40 /* Some tablets map the physical ESC key to KEYCODE_BACK (scancode 1).*/
41 if (event.getScanCode() == 1 && event.getKeyCode() != KeyEvent.KEYCODE_ESCAPE)
42 {
43 event =
44 new KeyEvent(event.getDownTime(), event.getEventTime(), event.getAction(),
45 KeyEvent.KEYCODE_ESCAPE, event.getRepeatCount(), event.getMetaState());
46 }
47
48 return session.handleKeyEvent(event);
49 }
50
51 @Override public void onServiceConnected()
52 {
53 AccessibilityServiceInfo info = new AccessibilityServiceInfo();
54 info.packageNames = new String[] { getApplicationContext().getPackageName() };
55 info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
56 info.notificationTimeout = 100;
57 info.flags = AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS;
58 info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
59 setServiceInfo(info);
60 }
61
62 @Override public void onAccessibilityEvent(AccessibilityEvent event)
63 {
64 }
65
66 @Override public void onInterrupt()
67 {
68 }
69}