From 7ce2cba6ef1effc14aeb78e82c3e12eb9cb2f94e Mon Sep 17 00:00:00 2001 From: sallyyuen Date: Mon, 6 Feb 2023 14:40:41 -0800 Subject: [PATCH] Disable input filter features for a display if it is proxy-ed Test: atest AccessibilityDisplayProxyTest Bug: 268088816 Change-Id: I8e94a8b32b805ab1f776d27880c6c1a6eb48024e --- .../AccessibilityInputFilter.java | 26 ++++++++++----- .../AccessibilityManagerService.java | 7 +++- .../server/accessibility/ProxyManager.java | 33 ++++++++++++++++--- 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java index c87d1c8efafc2..8e7d27795c077 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -229,17 +229,12 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo } void onDisplayAdded(@NonNull Display display) { - if (mInstalled) { - resetStreamStateForDisplay(display.getDisplayId()); - enableFeaturesForDisplay(display); - } + enableFeaturesForDisplayIfInstalled(display); + } void onDisplayRemoved(int displayId) { - if (mInstalled) { - disableFeaturesForDisplay(displayId); - resetStreamStateForDisplay(displayId); - } + disableFeaturesForDisplayIfInstalled(displayId); } @Override @@ -479,6 +474,9 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo final Context displayContext = mContext.createDisplayContext(display); final int displayId = display.getDisplayId(); + if (mAms.isDisplayProxyed(displayId)) { + return; + } if (!mServiceDetectsGestures.contains(displayId)) { mServiceDetectsGestures.put(displayId, false); } @@ -613,6 +611,18 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo mEventHandler.remove(displayId); } } + void enableFeaturesForDisplayIfInstalled(Display display) { + if (mInstalled) { + resetStreamStateForDisplay(display.getDisplayId()); + enableFeaturesForDisplay(display); + } + } + void disableFeaturesForDisplayIfInstalled(int displayId) { + if (mInstalled) { + disableFeaturesForDisplay(displayId); + resetStreamStateForDisplay(displayId); + } + } private void disableDisplayIndependentFeatures() { if (mAutoclickController != null) { diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 776405d23035e..e3d1d251cf787 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -474,7 +474,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub new MagnificationScaleProvider(mContext)); mMagnificationProcessor = new MagnificationProcessor(mMagnificationController); mCaptioningManagerImpl = new CaptioningManagerImpl(mContext); - mProxyManager = new ProxyManager(mLock, mA11yWindowManager); + mProxyManager = new ProxyManager(mLock, mA11yWindowManager, mContext); mFlashNotificationsController = new FlashNotificationsController(mContext); init(); } @@ -2495,6 +2495,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } inputFilter = mInputFilter; setInputFilter = true; + mProxyManager.setAccessibilityInputFilter(mInputFilter); } mInputFilter.setUserAndEnabledFeatures(userState.mUserId, flags); mInputFilter.setCombinedGenericMotionEventSources( @@ -3884,6 +3885,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return mProxyManager.unregisterProxy(displayId); } + boolean isDisplayProxyed(int displayId) { + return mProxyManager.isProxyed(displayId); + } + @Override public float getUiContrast() { if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_ACCESSIBILITY_MANAGER)) { mTraceManager.logTrace(LOG_TAG + ".getUiContrast", FLAGS_ACCESSIBILITY_MANAGER); diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java index 54cdb04b56f53..2530338a03ab0 100644 --- a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java +++ b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java @@ -19,10 +19,12 @@ import android.accessibilityservice.AccessibilityTrace; import android.accessibilityservice.IAccessibilityServiceClient; import android.content.ComponentName; import android.content.Context; +import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.util.SparseArray; +import android.view.Display; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -47,6 +49,8 @@ public class ProxyManager { private final Object mLock; + private final Context mContext; + // Used to determine if we should notify AccessibilityManager clients of updates. // TODO(254545943): Separate this so each display id has its own state. Currently there is no // way to identify from AccessibilityManager which proxy state should be returned. @@ -57,9 +61,12 @@ public class ProxyManager { private AccessibilityWindowManager mA11yWindowManager; - ProxyManager(Object lock, AccessibilityWindowManager awm) { + private AccessibilityInputFilter mA11yInputFilter; + + ProxyManager(Object lock, AccessibilityWindowManager awm, Context context) { mLock = lock; mA11yWindowManager = awm; + mContext = context; } /** @@ -109,6 +116,9 @@ public class ProxyManager { connection.mSystemSupport.onClientChangeLocked(true); } + if (mA11yInputFilter != null) { + mA11yInputFilter.disableFeaturesForDisplayIfInstalled(displayId); + } connection.initializeServiceInterface(client); } @@ -120,14 +130,25 @@ public class ProxyManager { } private boolean clearConnection(int displayId) { + boolean removed = false; synchronized (mLock) { if (mProxyA11yServiceConnections.contains(displayId)) { mProxyA11yServiceConnections.remove(displayId); - return true; + removed = true; } } - mA11yWindowManager.stopTrackingDisplayProxy(displayId); - return false; + if (removed) { + mA11yWindowManager.stopTrackingDisplayProxy(displayId); + if (mA11yInputFilter != null) { + final DisplayManager displayManager = (DisplayManager) + mContext.getSystemService(Context.DISPLAY_SERVICE); + final Display proxyDisplay = displayManager.getDisplay(displayId); + if (proxyDisplay != null) { + mA11yInputFilter.enableFeaturesForDisplayIfInstalled(proxyDisplay); + } + } + } + return removed; } /** @@ -251,4 +272,8 @@ public class ProxyManager { proxy.notifyClearAccessibilityNodeInfoCache(); } } + + void setAccessibilityInputFilter(AccessibilityInputFilter filter) { + mA11yInputFilter = filter; + } } \ No newline at end of file