Merge "Deliver key events to the system if no accessibility service handles them." into jb-mr2-dev
This commit is contained in:
@@ -56,6 +56,13 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
|
|||||||
*/
|
*/
|
||||||
static final int FLAG_FEATURE_TOUCH_EXPLORATION = 0x00000002;
|
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() {
|
private final Runnable mProcessBatchedEventsRunnable = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -101,6 +108,8 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
|
|||||||
|
|
||||||
private boolean mKeyEventSequenceStarted;
|
private boolean mKeyEventSequenceStarted;
|
||||||
|
|
||||||
|
private boolean mFilterKeyEvents;
|
||||||
|
|
||||||
AccessibilityInputFilter(Context context, AccessibilityManagerService service) {
|
AccessibilityInputFilter(Context context, AccessibilityManagerService service) {
|
||||||
super(context.getMainLooper());
|
super(context.getMainLooper());
|
||||||
mContext = context;
|
mContext = context;
|
||||||
@@ -198,6 +207,10 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onKeyEvent(KeyEvent event, int policyFlags) {
|
private void onKeyEvent(KeyEvent event, int policyFlags) {
|
||||||
|
if (!mFilterKeyEvents) {
|
||||||
|
super.onInputEvent(event, policyFlags);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if ((policyFlags & WindowManagerPolicy.FLAG_PASS_TO_USER) == 0) {
|
if ((policyFlags & WindowManagerPolicy.FLAG_PASS_TO_USER) == 0) {
|
||||||
mKeyEventSequenceStarted = false;
|
mKeyEventSequenceStarted = false;
|
||||||
super.onInputEvent(event, policyFlags);
|
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() {
|
private void enableFeatures() {
|
||||||
mMotionEventSequenceStarted = false;
|
mMotionEventSequenceStarted = false;
|
||||||
mHoverEventSequenceStarted = false;
|
mHoverEventSequenceStarted = false;
|
||||||
@@ -338,6 +344,9 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
|
|||||||
mEventHandler = mTouchExplorer;
|
mEventHandler = mTouchExplorer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((mEnabledFeatures & FLAG_FEATURE_FILTER_KEY_EVENTS) != 0) {
|
||||||
|
mFilterKeyEvents = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void disableFeatures() {
|
private void disableFeatures() {
|
||||||
@@ -352,6 +361,10 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
|
|||||||
mScreenMagnifier = null;
|
mScreenMagnifier = null;
|
||||||
}
|
}
|
||||||
mEventHandler = null;
|
mEventHandler = null;
|
||||||
|
mKeyEventSequenceStarted = false;
|
||||||
|
mMotionEventSequenceStarted = false;
|
||||||
|
mHoverEventSequenceStarted = false;
|
||||||
|
mFilterKeyEvents = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1170,9 +1170,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
boolean setInputFilter = false;
|
boolean setInputFilter = false;
|
||||||
AccessibilityInputFilter inputFilter = null;
|
AccessibilityInputFilter inputFilter = null;
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
// Accessibility enabled means at least one service is enabled.
|
int flags = 0;
|
||||||
if (userState.mIsAccessibilityEnabled
|
if (userState.mIsDisplayMagnificationEnabled) {
|
||||||
|| 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) {
|
if (!mHasInputFilter) {
|
||||||
mHasInputFilter = true;
|
mHasInputFilter = true;
|
||||||
if (mInputFilter == null) {
|
if (mInputFilter == null) {
|
||||||
@@ -1182,19 +1191,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
inputFilter = mInputFilter;
|
inputFilter = mInputFilter;
|
||||||
setInputFilter = true;
|
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);
|
mInputFilter.setEnabledFeatures(flags);
|
||||||
} else {
|
} else {
|
||||||
if (mHasInputFilter) {
|
if (mHasInputFilter) {
|
||||||
mHasInputFilter = false;
|
mHasInputFilter = false;
|
||||||
mInputFilter.reset();
|
mInputFilter.disableFeatures();
|
||||||
inputFilter = null;
|
inputFilter = null;
|
||||||
setInputFilter = true;
|
setInputFilter = true;
|
||||||
}
|
}
|
||||||
@@ -1263,6 +1264,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
private void onUserStateChangedLocked(UserState userState) {
|
private void onUserStateChangedLocked(UserState userState) {
|
||||||
updateLegacyCapabilities(userState);
|
updateLegacyCapabilities(userState);
|
||||||
updateServicesLocked(userState);
|
updateServicesLocked(userState);
|
||||||
|
updateFilterKeyEventsLocked(userState);
|
||||||
updateTouchExplorationLocked(userState);
|
updateTouchExplorationLocked(userState);
|
||||||
updateEnhancedWebAccessibilityLocked(userState);
|
updateEnhancedWebAccessibilityLocked(userState);
|
||||||
scheduleUpdateInputFilter(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) {
|
private void updateServicesLocked(UserState userState) {
|
||||||
if (userState.mIsAccessibilityEnabled) {
|
if (userState.mIsAccessibilityEnabled) {
|
||||||
manageServicesLocked(userState);
|
manageServicesLocked(userState);
|
||||||
@@ -2899,6 +2916,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
|
|||||||
public boolean mIsTouchExplorationEnabled;
|
public boolean mIsTouchExplorationEnabled;
|
||||||
public boolean mIsEnhancedWebAccessibilityEnabled;
|
public boolean mIsEnhancedWebAccessibilityEnabled;
|
||||||
public boolean mIsDisplayMagnificationEnabled;
|
public boolean mIsDisplayMagnificationEnabled;
|
||||||
|
public boolean mIsFilterKeyEventsEnabled;
|
||||||
|
|
||||||
private Service mUiAutomationService;
|
private Service mUiAutomationService;
|
||||||
private IAccessibilityServiceClient mUiAutomationServiceClient;
|
private IAccessibilityServiceClient mUiAutomationServiceClient;
|
||||||
|
|||||||
Reference in New Issue
Block a user