Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +2 −0 Original line number Diff line number Diff line Loading @@ -3928,6 +3928,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mGlobalClients.getRegisteredCallbackCookie(i); pw.append(Arrays.toString(client.mPackageNames)); } pw.println(); mProxyManager.dump(fd, pw, args); } } Loading services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -910,6 +910,10 @@ public class AccessibilityWindowManager { pw.println(" Top Focused Window Id = " + mTopFocusedWindowId); pw.println(" Accessibility Focused Window Id = " + mAccessibilityFocusedWindowId + " ]"); if (mIsProxy) { pw.println("Proxy accessibility focused window = " + mProxyDisplayAccessibilityFocusedWindow); } pw.println(); if (mWindows != null) { final int windowCount = mWindows.size(); Loading services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java +27 −0 Original line number Diff line number Diff line Loading @@ -38,14 +38,18 @@ import android.os.RemoteCallback; import android.os.RemoteException; import android.view.KeyEvent; import android.view.accessibility.AccessibilityDisplayProxy; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; import androidx.annotation.Nullable; import com.android.internal.R; import com.android.internal.util.DumpUtils; import com.android.server.wm.WindowManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; Loading @@ -61,6 +65,8 @@ import java.util.Set; * TODO(241429275): Initialize this when a proxy is registered. */ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceConnection { private static final String LOG_TAG = "ProxyAccessibilityServiceConnection"; private int mDisplayId; private List<AccessibilityServiceInfo> mInstalledAndEnabledServices; Loading Loading @@ -565,4 +571,25 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon public void setAnimationScale(float scale) throws UnsupportedOperationException { throw new UnsupportedOperationException("setAnimationScale is not supported"); } @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; synchronized (mLock) { pw.append("Proxy[displayId=" + mDisplayId); pw.append(", feedbackType" + AccessibilityServiceInfo.feedbackTypeToString(mFeedbackType)); pw.append(", capabilities=" + mAccessibilityServiceInfo.getCapabilities()); pw.append(", eventTypes=" + AccessibilityEvent.eventTypeToString(mEventTypes)); pw.append(", notificationTimeout=" + mNotificationTimeout); pw.append(", focusStrokeWidth=").append(String.valueOf(mFocusStrokeWidth)); pw.append(", focusColor=").append(String.valueOf(mFocusColor)); pw.append(", installedAndEnabledServiceCount=").append(String.valueOf( mInstalledAndEnabledServices.size())); pw.append(", installedAndEnabledServices=").append( mInstalledAndEnabledServices.toString()); pw.append("]"); } } } services/accessibility/java/com/android/server/accessibility/ProxyManager.java +58 −4 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.accessibility.AccessibilityEvent; Loading @@ -30,6 +31,8 @@ import android.view.accessibility.AccessibilityManager; import com.android.server.wm.WindowManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.List; /** Loading @@ -42,6 +45,9 @@ import java.util.List; * TODO(262244375): Add unit tests. */ public class ProxyManager { private static final boolean DEBUG = false; private static final String LOG_TAG = "ProxyManager"; // Names used to populate ComponentName and ResolveInfo in connection.mA11yServiceInfo and in // the infos of connection.setInstalledAndEnabledServices static final String PROXY_COMPONENT_PACKAGE_NAME = "ProxyPackage"; Loading Loading @@ -79,6 +85,9 @@ public class ProxyManager { AbstractAccessibilityServiceConnection.SystemSupport systemSupport, AccessibilityTrace trace, WindowManagerInternal windowManagerInternal) throws RemoteException { if (DEBUG) { Slog.v(LOG_TAG, "Register proxy for display id: " + displayId); } // Set a default AccessibilityServiceInfo that is used before the proxy's info is // populated. A proxy has the touch exploration and window capabilities. Loading Loading @@ -134,6 +143,9 @@ public class ProxyManager { if (mProxyA11yServiceConnections.contains(displayId)) { mProxyA11yServiceConnections.remove(displayId); removed = true; if (DEBUG) { Slog.v(LOG_TAG, "Unregister proxy for display id " + displayId); } } } if (removed) { Loading @@ -155,19 +167,25 @@ public class ProxyManager { */ public boolean isProxyed(int displayId) { synchronized (mLock) { return mProxyA11yServiceConnections.contains(displayId); final boolean tracked = mProxyA11yServiceConnections.contains(displayId); if (DEBUG) { Slog.v(LOG_TAG, "Tracking proxy display " + displayId + " : " + tracked); } return tracked; } } /** * Sends AccessibilityEvents to all proxies. * {@link android.view.accessibility.AccessibilityDisplayProxy} will filter based on display. * TODO(b/250929565): Filtering should happen in the system, not in the proxy. * Sends AccessibilityEvents to a proxy given the event's displayId. */ public void sendAccessibilityEventLocked(AccessibilityEvent event) { final ProxyAccessibilityServiceConnection proxy = mProxyA11yServiceConnections.get(event.getDisplayId()); if (proxy != null) { if (DEBUG) { Slog.v(LOG_TAG, "Send proxy event " + event + " for display id " + event.getDisplayId()); } proxy.notifyAccessibilityEvent(event); } } Loading @@ -186,6 +204,9 @@ public class ProxyManager { break; } } if (DEBUG) { Slog.v(LOG_TAG, "At least one proxy can retrieve windows: " + observingWindows); } return observingWindows; } Loading @@ -205,6 +226,14 @@ public class ProxyManager { clientState |= AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED; } } if (DEBUG) { Slog.v(LOG_TAG, "Accessibility is enabled for all proxies: " + ((clientState & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0)); Slog.v(LOG_TAG, "Touch exploration is enabled for all proxies: " + ((clientState & AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED) != 0)); } return clientState; // TODO(b/254545943): When A11yManager is separated, include support for other properties. } Loading Loading @@ -234,6 +263,10 @@ public class ProxyManager { mProxyA11yServiceConnections.valueAt(i); relevantEventTypes |= proxy.getRelevantEventTypes(); } if (DEBUG) { Slog.v(LOG_TAG, "Relevant event types for all proxies: " + AccessibilityEvent.eventTypeToString(relevantEventTypes)); } return relevantEventTypes; } Loading Loading @@ -275,4 +308,25 @@ public class ProxyManager { void setAccessibilityInputFilter(AccessibilityInputFilter filter) { mA11yInputFilter = filter; } /** * Prints information belonging to each display that is controlled by an * AccessibilityDisplayProxy. */ void dump(FileDescriptor fd, PrintWriter pw, String[] args) { synchronized (mLock) { pw.println(); pw.println("Proxy manager state:"); pw.println(" Number of proxy connections: " + mProxyA11yServiceConnections.size()); pw.println(" Registered proxy connections:"); for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) { final ProxyAccessibilityServiceConnection proxy = mProxyA11yServiceConnections.valueAt(i); if (proxy != null) { proxy.dump(fd, pw, args); } } } } } No newline at end of file Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +2 −0 Original line number Diff line number Diff line Loading @@ -3928,6 +3928,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mGlobalClients.getRegisteredCallbackCookie(i); pw.append(Arrays.toString(client.mPackageNames)); } pw.println(); mProxyManager.dump(fd, pw, args); } } Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java +4 −0 Original line number Diff line number Diff line Loading @@ -910,6 +910,10 @@ public class AccessibilityWindowManager { pw.println(" Top Focused Window Id = " + mTopFocusedWindowId); pw.println(" Accessibility Focused Window Id = " + mAccessibilityFocusedWindowId + " ]"); if (mIsProxy) { pw.println("Proxy accessibility focused window = " + mProxyDisplayAccessibilityFocusedWindow); } pw.println(); if (mWindows != null) { final int windowCount = mWindows.size(); Loading
services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java +27 −0 Original line number Diff line number Diff line Loading @@ -38,14 +38,18 @@ import android.os.RemoteCallback; import android.os.RemoteException; import android.view.KeyEvent; import android.view.accessibility.AccessibilityDisplayProxy; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; import androidx.annotation.Nullable; import com.android.internal.R; import com.android.internal.util.DumpUtils; import com.android.server.wm.WindowManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; Loading @@ -61,6 +65,8 @@ import java.util.Set; * TODO(241429275): Initialize this when a proxy is registered. */ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceConnection { private static final String LOG_TAG = "ProxyAccessibilityServiceConnection"; private int mDisplayId; private List<AccessibilityServiceInfo> mInstalledAndEnabledServices; Loading Loading @@ -565,4 +571,25 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon public void setAnimationScale(float scale) throws UnsupportedOperationException { throw new UnsupportedOperationException("setAnimationScale is not supported"); } @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; synchronized (mLock) { pw.append("Proxy[displayId=" + mDisplayId); pw.append(", feedbackType" + AccessibilityServiceInfo.feedbackTypeToString(mFeedbackType)); pw.append(", capabilities=" + mAccessibilityServiceInfo.getCapabilities()); pw.append(", eventTypes=" + AccessibilityEvent.eventTypeToString(mEventTypes)); pw.append(", notificationTimeout=" + mNotificationTimeout); pw.append(", focusStrokeWidth=").append(String.valueOf(mFocusStrokeWidth)); pw.append(", focusColor=").append(String.valueOf(mFocusColor)); pw.append(", installedAndEnabledServiceCount=").append(String.valueOf( mInstalledAndEnabledServices.size())); pw.append(", installedAndEnabledServices=").append( mInstalledAndEnabledServices.toString()); pw.append("]"); } } }
services/accessibility/java/com/android/server/accessibility/ProxyManager.java +58 −4 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.accessibility.AccessibilityEvent; Loading @@ -30,6 +31,8 @@ import android.view.accessibility.AccessibilityManager; import com.android.server.wm.WindowManagerInternal; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.List; /** Loading @@ -42,6 +45,9 @@ import java.util.List; * TODO(262244375): Add unit tests. */ public class ProxyManager { private static final boolean DEBUG = false; private static final String LOG_TAG = "ProxyManager"; // Names used to populate ComponentName and ResolveInfo in connection.mA11yServiceInfo and in // the infos of connection.setInstalledAndEnabledServices static final String PROXY_COMPONENT_PACKAGE_NAME = "ProxyPackage"; Loading Loading @@ -79,6 +85,9 @@ public class ProxyManager { AbstractAccessibilityServiceConnection.SystemSupport systemSupport, AccessibilityTrace trace, WindowManagerInternal windowManagerInternal) throws RemoteException { if (DEBUG) { Slog.v(LOG_TAG, "Register proxy for display id: " + displayId); } // Set a default AccessibilityServiceInfo that is used before the proxy's info is // populated. A proxy has the touch exploration and window capabilities. Loading Loading @@ -134,6 +143,9 @@ public class ProxyManager { if (mProxyA11yServiceConnections.contains(displayId)) { mProxyA11yServiceConnections.remove(displayId); removed = true; if (DEBUG) { Slog.v(LOG_TAG, "Unregister proxy for display id " + displayId); } } } if (removed) { Loading @@ -155,19 +167,25 @@ public class ProxyManager { */ public boolean isProxyed(int displayId) { synchronized (mLock) { return mProxyA11yServiceConnections.contains(displayId); final boolean tracked = mProxyA11yServiceConnections.contains(displayId); if (DEBUG) { Slog.v(LOG_TAG, "Tracking proxy display " + displayId + " : " + tracked); } return tracked; } } /** * Sends AccessibilityEvents to all proxies. * {@link android.view.accessibility.AccessibilityDisplayProxy} will filter based on display. * TODO(b/250929565): Filtering should happen in the system, not in the proxy. * Sends AccessibilityEvents to a proxy given the event's displayId. */ public void sendAccessibilityEventLocked(AccessibilityEvent event) { final ProxyAccessibilityServiceConnection proxy = mProxyA11yServiceConnections.get(event.getDisplayId()); if (proxy != null) { if (DEBUG) { Slog.v(LOG_TAG, "Send proxy event " + event + " for display id " + event.getDisplayId()); } proxy.notifyAccessibilityEvent(event); } } Loading @@ -186,6 +204,9 @@ public class ProxyManager { break; } } if (DEBUG) { Slog.v(LOG_TAG, "At least one proxy can retrieve windows: " + observingWindows); } return observingWindows; } Loading @@ -205,6 +226,14 @@ public class ProxyManager { clientState |= AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED; } } if (DEBUG) { Slog.v(LOG_TAG, "Accessibility is enabled for all proxies: " + ((clientState & AccessibilityManager.STATE_FLAG_ACCESSIBILITY_ENABLED) != 0)); Slog.v(LOG_TAG, "Touch exploration is enabled for all proxies: " + ((clientState & AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED) != 0)); } return clientState; // TODO(b/254545943): When A11yManager is separated, include support for other properties. } Loading Loading @@ -234,6 +263,10 @@ public class ProxyManager { mProxyA11yServiceConnections.valueAt(i); relevantEventTypes |= proxy.getRelevantEventTypes(); } if (DEBUG) { Slog.v(LOG_TAG, "Relevant event types for all proxies: " + AccessibilityEvent.eventTypeToString(relevantEventTypes)); } return relevantEventTypes; } Loading Loading @@ -275,4 +308,25 @@ public class ProxyManager { void setAccessibilityInputFilter(AccessibilityInputFilter filter) { mA11yInputFilter = filter; } /** * Prints information belonging to each display that is controlled by an * AccessibilityDisplayProxy. */ void dump(FileDescriptor fd, PrintWriter pw, String[] args) { synchronized (mLock) { pw.println(); pw.println("Proxy manager state:"); pw.println(" Number of proxy connections: " + mProxyA11yServiceConnections.size()); pw.println(" Registered proxy connections:"); for (int i = 0; i < mProxyA11yServiceConnections.size(); i++) { final ProxyAccessibilityServiceConnection proxy = mProxyA11yServiceConnections.valueAt(i); if (proxy != null) { proxy.dump(fd, pw, args); } } } } } No newline at end of file