*/
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() {
private boolean mKeyEventSequenceStarted;
+ private boolean mFilterKeyEvents;
+
AccessibilityInputFilter(Context context, AccessibilityManagerService service) {
super(context.getMainLooper());
mContext = context;
}
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);
}
}
- void reset() {
- setEnabledFeatures(0);
- mKeyEventSequenceStarted = false;
- mMotionEventSequenceStarted = false;
- mHoverEventSequenceStarted = false;
- }
-
private void enableFeatures() {
mMotionEventSequenceStarted = false;
mHoverEventSequenceStarted = false;
mEventHandler = mTouchExplorer;
}
}
+ if ((mEnabledFeatures & FLAG_FEATURE_FILTER_KEY_EVENTS) != 0) {
+ mFilterKeyEvents = true;
+ }
}
private void disableFeatures() {
mScreenMagnifier = null;
}
mEventHandler = null;
+ mKeyEventSequenceStarted = false;
+ mMotionEventSequenceStarted = false;
+ mHoverEventSequenceStarted = false;
+ mFilterKeyEvents = false;
}
@Override
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) {
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;
}
private void onUserStateChangedLocked(UserState userState) {
updateLegacyCapabilities(userState);
updateServicesLocked(userState);
+ updateFilterKeyEventsLocked(userState);
updateTouchExplorationLocked(userState);
updateEnhancedWebAccessibilityLocked(userState);
scheduleUpdateInputFilter(userState);
}
}
+ 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);
public boolean mIsTouchExplorationEnabled;
public boolean mIsEnhancedWebAccessibilityEnabled;
public boolean mIsDisplayMagnificationEnabled;
+ public boolean mIsFilterKeyEventsEnabled;
private Service mUiAutomationService;
private IAccessibilityServiceClient mUiAutomationServiceClient;