diff options
-rw-r--r-- | services/java/com/android/server/accessibility/AccessibilityInputFilter.java | 27 | ||||
-rw-r--r-- | services/java/com/android/server/accessibility/AccessibilityManagerService.java | 42 |
2 files changed, 50 insertions, 19 deletions
diff --git a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java index 0d8a571..6a7aad3 100644 --- a/services/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -56,6 +56,13 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo */ static final int FLAG_FEATURE_TOUCH_EXPLORATION = 0x00000002; + /** + * Flag for enabling the filtering key events feature. + * + * @see #setEnabledFeatures(int) + */ + static final int FLAG_FEATURE_FILTER_KEY_EVENTS = 0x00000004; + private final Runnable mProcessBatchedEventsRunnable = new Runnable() { @Override public void run() { @@ -101,6 +108,8 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo private boolean mKeyEventSequenceStarted; + private boolean mFilterKeyEvents; + AccessibilityInputFilter(Context context, AccessibilityManagerService service) { super(context.getMainLooper()); mContext = context; @@ -198,6 +207,10 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } private void onKeyEvent(KeyEvent event, int policyFlags) { + if (!mFilterKeyEvents) { + super.onInputEvent(event, policyFlags); + return; + } if ((policyFlags & WindowManagerPolicy.FLAG_PASS_TO_USER) == 0) { mKeyEventSequenceStarted = false; super.onInputEvent(event, policyFlags); @@ -314,13 +327,6 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } } - void reset() { - setEnabledFeatures(0); - mKeyEventSequenceStarted = false; - mMotionEventSequenceStarted = false; - mHoverEventSequenceStarted = false; - } - private void enableFeatures() { mMotionEventSequenceStarted = false; mHoverEventSequenceStarted = false; @@ -338,6 +344,9 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo mEventHandler = mTouchExplorer; } } + if ((mEnabledFeatures & FLAG_FEATURE_FILTER_KEY_EVENTS) != 0) { + mFilterKeyEvents = true; + } } private void disableFeatures() { @@ -352,6 +361,10 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo mScreenMagnifier = null; } mEventHandler = null; + mKeyEventSequenceStarted = false; + mMotionEventSequenceStarted = false; + mHoverEventSequenceStarted = false; + mFilterKeyEvents = false; } @Override diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index 3fd534e..d51f48f 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1170,9 +1170,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { boolean setInputFilter = false; AccessibilityInputFilter inputFilter = null; synchronized (mLock) { - // Accessibility enabled means at least one service is enabled. - if (userState.mIsAccessibilityEnabled - || userState.mIsDisplayMagnificationEnabled) { + int flags = 0; + if (userState.mIsDisplayMagnificationEnabled) { + flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER; + } + // Touch exploration without accessibility makes no sense. + if (userState.mIsAccessibilityEnabled && userState.mIsTouchExplorationEnabled) { + flags |= AccessibilityInputFilter.FLAG_FEATURE_TOUCH_EXPLORATION; + } + if (userState.mIsFilterKeyEventsEnabled) { + flags |= AccessibilityInputFilter.FLAG_FEATURE_FILTER_KEY_EVENTS; + } + if (flags != 0) { if (!mHasInputFilter) { mHasInputFilter = true; if (mInputFilter == null) { @@ -1182,19 +1191,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { inputFilter = mInputFilter; setInputFilter = true; } - int flags = 0; - if (userState.mIsDisplayMagnificationEnabled) { - flags |= AccessibilityInputFilter.FLAG_FEATURE_SCREEN_MAGNIFIER; - } - // Touch exploration without accessibility makes no sense. - if (userState.mIsAccessibilityEnabled && userState.mIsTouchExplorationEnabled) { - flags |= AccessibilityInputFilter.FLAG_FEATURE_TOUCH_EXPLORATION; - } mInputFilter.setEnabledFeatures(flags); } else { if (mHasInputFilter) { mHasInputFilter = false; - mInputFilter.reset(); + mInputFilter.disableFeatures(); inputFilter = null; setInputFilter = true; } @@ -1263,6 +1264,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private void onUserStateChangedLocked(UserState userState) { updateLegacyCapabilities(userState); updateServicesLocked(userState); + updateFilterKeyEventsLocked(userState); updateTouchExplorationLocked(userState); updateEnhancedWebAccessibilityLocked(userState); scheduleUpdateInputFilter(userState); @@ -1291,6 +1293,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } + private void updateFilterKeyEventsLocked(UserState userState) { + final int serviceCount = userState.mBoundServices.size(); + for (int i = 0; i < serviceCount; i++) { + Service service = userState.mBoundServices.get(i); + if (service.mRequestFilterKeyEvents + && (service.mAccessibilityServiceInfo.getCapabilities() + & AccessibilityServiceInfo + .CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS) != 0) { + userState.mIsFilterKeyEventsEnabled = true; + return; + } + } + userState.mIsFilterKeyEventsEnabled = false; + } + private void updateServicesLocked(UserState userState) { if (userState.mIsAccessibilityEnabled) { manageServicesLocked(userState); @@ -2899,6 +2916,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { public boolean mIsTouchExplorationEnabled; public boolean mIsEnhancedWebAccessibilityEnabled; public boolean mIsDisplayMagnificationEnabled; + public boolean mIsFilterKeyEventsEnabled; private Service mUiAutomationService; private IAccessibilityServiceClient mUiAutomationServiceClient; |