summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2011-03-30 02:25:18 -0700
committerJeff Brown <jeffbrown@google.com>2011-03-30 16:55:15 -0700
commit0029c66203ab9ded4342976bf7a17bb63af8c44a (patch)
treea0d5f54ff6f88dae18179d1621dd2c87f1fa8d27 /services/java/com/android/server/accessibility/AccessibilityInputFilter.java
parent6e6cd7a5660af1a4b5a9ad091c41ef1c72ad2000 (diff)
downloadframeworks_base-0029c66203ab9ded4342976bf7a17bb63af8c44a.zip
frameworks_base-0029c66203ab9ded4342976bf7a17bb63af8c44a.tar.gz
frameworks_base-0029c66203ab9ded4342976bf7a17bb63af8c44a.tar.bz2
Add input filter mechanism for accessibility.
This patch adds a mechanism for capturing, filtering, transforming and injecting input events at a very low level before the input dispatcher attempts to deliver them to applications. At this time, the mechanism is only intended to be used by the accessibility system to implement built-in system-level accessibility affordances. The accessibility input filter is currently just a stub. It logs the input events receives and reinjects them unchanged, except that it transforms KEYCODE_Q into KEYCODE_Z. Currently, the accessibility input filter is installed whenever accessibility is enabled. We'll probably want to change that so it only enables the input filter when a screen reader is installed and we want touch exploration. Change-Id: I35764fdf75522b69d09ebd78c9766eb7593c1afe
Diffstat (limited to 'services/java/com/android/server/accessibility/AccessibilityInputFilter.java')
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityInputFilter.java86
1 files changed, 86 insertions, 0 deletions
diff --git a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
new file mode 100644
index 0000000..ced8feb
--- /dev/null
+++ b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.accessibility;
+
+import com.android.server.wm.InputFilter;
+
+import android.content.Context;
+import android.util.Slog;
+import android.view.InputEvent;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.WindowManagerPolicy;
+
+/**
+ * Input filter for accessibility.
+ *
+ * Currently just a stub but will eventually implement touch exploration, etc.
+ */
+public class AccessibilityInputFilter extends InputFilter {
+ private static final String TAG = "AccessibilityInputFilter";
+ private static final boolean DEBUG = true;
+
+ private final Context mContext;
+
+ public AccessibilityInputFilter(Context context) {
+ super(context.getMainLooper());
+ mContext = context;
+ }
+
+ @Override
+ public void onInstalled() {
+ if (DEBUG) {
+ Slog.d(TAG, "Accessibility input filter installed.");
+ }
+ super.onInstalled();
+ }
+
+ @Override
+ public void onUninstalled() {
+ if (DEBUG) {
+ Slog.d(TAG, "Accessibility input filter uninstalled.");
+ }
+ super.onUninstalled();
+ }
+
+ @Override
+ public void onInputEvent(InputEvent event, int policyFlags) {
+ if (DEBUG) {
+ Slog.d(TAG, "Accessibility input filter received input event: "
+ + event + ", policyFlags=0x" + Integer.toHexString(policyFlags));
+ }
+
+ // To prove that this is working as intended, we will silently transform
+ // Q key presses into non-repeating Z's as part of this stub implementation.
+ // TODO: Replace with the real thing.
+ if (event instanceof KeyEvent) {
+ final KeyEvent keyEvent = (KeyEvent)event;
+ if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_Q) {
+ if (keyEvent.getRepeatCount() == 0) {
+ sendInputEvent(new KeyEvent(keyEvent.getDownTime(), keyEvent.getEventTime(),
+ keyEvent.getAction(), KeyEvent.KEYCODE_Z, keyEvent.getRepeatCount(),
+ keyEvent.getMetaState(), keyEvent.getDeviceId(), keyEvent.getScanCode(),
+ keyEvent.getFlags(), keyEvent.getSource()),
+ policyFlags | WindowManagerPolicy.FLAG_DISABLE_KEY_REPEAT);
+ }
+ return;
+ }
+ }
+
+ super.onInputEvent(event, policyFlags);
+ }
+}