From 912cca9f736624094e13ca1d5006e2097672cd84 Mon Sep 17 00:00:00 2001 From: Ameer Armaly Date: Wed, 5 Oct 2022 19:53:45 +0000 Subject: [PATCH] [DO NOT MERGE] Fix bugs with changing service gesture detection state. 1) Fix accidental brace movement that alters state change logic when enabling or disabling service flags. 2) Clean up service gesture detection state when services shut down. Previously, we did not turn this flag off. This can be observed by running 'atest TouchInteractionControllerTest TouchExplorerTest' TouchInteractionControllerTest turns on service gesture detection. TouchExplorerTest assumes it to be off. TouchExplorerTest will fail. Bug: 243487199 Test: atest TouchInteractionControllerTest TouchExplorerTest Change-Id: Ie9440bacd069ac9cdb13a4cbadf6513f7d16d7cc --- .../AccessibilityInputFilter.java | 3 ++ .../AccessibilityManagerService.java | 42 ++++++++++++------- .../accessibility/AccessibilityUserState.java | 3 ++ 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java index bf4c02d83883d..952e85a310bc7 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -906,6 +906,9 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo mServiceDetectsGestures.put(displayId, mode); } + public void resetServiceDetectsGestures() { + mServiceDetectsGestures.clear(); + } public void requestTouchExploration(int displayId) { if (mTouchExplorer.contains(displayId)) { mTouchExplorer.get(displayId).requestTouchExploration(); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 73793c7a8abee..cdfa0c0411e48 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2304,6 +2304,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (userState.isTwoFingerPassthroughEnabledLocked()) { flags |= AccessibilityInputFilter.FLAG_REQUEST_2_FINGER_PASSTHROUGH; } + } if (userState.isFilterKeyEventsEnabledLocked()) { flags |= AccessibilityInputFilter.FLAG_FEATURE_FILTER_KEY_EVENTS; } @@ -2321,26 +2322,27 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (!mHasInputFilter) { mHasInputFilter = true; if (mInputFilter == null) { - mInputFilter = new AccessibilityInputFilter(mContext, - AccessibilityManagerService.this); + mInputFilter = + new AccessibilityInputFilter( + mContext, AccessibilityManagerService.this); } inputFilter = mInputFilter; setInputFilter = true; } mInputFilter.setUserAndEnabledFeatures(userState.mUserId, flags); } else { - if (mHasInputFilter) { - mHasInputFilter = false; - mInputFilter.setUserAndEnabledFeatures(userState.mUserId, 0); - if (userState.isTouchExplorationEnabledLocked()) { - // Service gesture detection is turned on and off on a per-display - // basis. - final ArrayList displays = getValidDisplayList(); - for (Display display : displays) { - int displayId = display.getDisplayId(); - boolean mode = userState.isServiceDetectsGesturesEnabled(displayId); - mInputFilter.setServiceDetectsGesturesEnabled(displayId, mode); - } + if (mHasInputFilter) { + mHasInputFilter = false; + mInputFilter.setUserAndEnabledFeatures(userState.mUserId, 0); + mInputFilter.resetServiceDetectsGestures(); + if (userState.isTouchExplorationEnabledLocked()) { + // Service gesture detection is turned on and off on a per-display + // basis. + final ArrayList displays = getValidDisplayList(); + for (Display display : displays) { + int displayId = display.getDisplayId(); + boolean mode = userState.isServiceDetectsGesturesEnabled(displayId); + mInputFilter.setServiceDetectsGesturesEnabled(displayId, mode); } } inputFilter = null; @@ -2658,6 +2660,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub Binder.restoreCallingIdentity(identity); } } + // Service gesture detection is turned on and off on a per-display + // basis. + userState.resetServiceDetectsGestures(); + final ArrayList displays = getValidDisplayList(); + for (AccessibilityServiceConnection service: userState.mBoundServices) { + for (Display display : displays) { + int displayId = display.getDisplayId(); + if (service.isServiceDetectsGesturesEnabled(displayId)) { + userState.setServiceDetectsGesturesEnabled(displayId, true); + } + } + } userState.setServiceHandlesDoubleTapLocked(serviceHandlesDoubleTapEnabled); userState.setMultiFingerGesturesLocked(requestMultiFingerGestures); userState.setTwoFingerPassthroughLocked(requestTwoFingerPassthrough); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java index 0e8f3c0c0cbef..a0fc8d30f64c1 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java @@ -994,6 +994,9 @@ class AccessibilityUserState { mServiceDetectsGestures.put(displayId, mode); } + public void resetServiceDetectsGestures() { + mServiceDetectsGestures.clear(); + } public boolean isServiceDetectsGesturesEnabled(int displayId) { if (mServiceDetectsGestures.contains(displayId)) { return mServiceDetectsGestures.get(displayId);