Merge "Make AM#isEnabled() true if any direct a11y connection exists."

This commit is contained in:
TreeHugger Robot
2022-10-07 21:49:14 +00:00
committed by Android (Google) Code Review
4 changed files with 32 additions and 3 deletions

View File

@@ -2970,6 +2970,7 @@ package android.view.accessibility {
public final class AccessibilityManager {
method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public java.util.List<java.lang.String> getAccessibilityShortcutTargets(int);
method public boolean hasAnyDirectConnection();
}
public class AccessibilityNodeInfo implements android.os.Parcelable {

View File

@@ -10497,6 +10497,8 @@ public final class ViewRootImpl implements ViewParent,
if (mDirectConnectionId == AccessibilityNodeInfo.UNDEFINED_CONNECTION_ID) {
mDirectConnectionId = AccessibilityInteractionClient.addDirectConnection(
new AccessibilityInteractionConnection(ViewRootImpl.this));
// Notify listeners in the app process.
mAccessibilityManager.notifyAccessibilityStateChanged();
}
return mDirectConnectionId;
}
@@ -10505,6 +10507,8 @@ public final class ViewRootImpl implements ViewParent,
if (mDirectConnectionId != AccessibilityNodeInfo.UNDEFINED_CONNECTION_ID) {
AccessibilityInteractionClient.removeConnection(mDirectConnectionId);
mDirectConnectionId = AccessibilityNodeInfo.UNDEFINED_CONNECTION_ID;
// Notify listeners in the app process.
mAccessibilityManager.notifyAccessibilityStateChanged();
}
}
}

View File

@@ -117,6 +117,7 @@ public final class AccessibilityInteractionClient
// Used to generate connection ids for direct app-process connections. Start sufficiently far
// enough from the connection ids generated by AccessibilityManagerService.
private static int sDirectConnectionIdCounter = 1 << 30;
private static int sDirectConnectionCount = 0;
/** List of timestamps which indicate the latest time an a11y service receives a scroll event
from a window, mapping from windowId -> timestamp. */
@@ -272,12 +273,18 @@ public final class AccessibilityInteractionClient
DirectAccessibilityConnection directAccessibilityConnection =
new DirectAccessibilityConnection(connection);
sConnectionCache.put(connectionId, directAccessibilityConnection);
sDirectConnectionCount++;
// Do not use AccessibilityCache for this connection, since there is no corresponding
// AccessibilityService to handle cache invalidation events.
return connectionId;
}
}
/** Check if any {@link DirectAccessibilityConnection} is currently in the connection cache. */
public static boolean hasAnyDirectConnection() {
return sDirectConnectionCount > 0;
}
/**
* Gets a cached associated with the connection id if available.
*
@@ -295,6 +302,9 @@ public final class AccessibilityInteractionClient
*/
public static void removeConnection(int connectionId) {
synchronized (sConnectionCache) {
if (getConnection(connectionId) instanceof DirectAccessibilityConnection) {
sDirectConnectionCount--;
}
sConnectionCache.remove(connectionId);
sCaches.remove(connectionId);
}

View File

@@ -602,11 +602,20 @@ public final class AccessibilityManager {
*/
public boolean isEnabled() {
synchronized (mLock) {
return mIsEnabled || (mAccessibilityPolicy != null
&& mAccessibilityPolicy.isEnabled(mIsEnabled));
return mIsEnabled || hasAnyDirectConnection()
|| (mAccessibilityPolicy != null && mAccessibilityPolicy.isEnabled(mIsEnabled));
}
}
/**
* @see AccessibilityInteractionClient#hasAnyDirectConnection
* @hide
*/
@TestApi
public boolean hasAnyDirectConnection() {
return AccessibilityInteractionClient.hasAnyDirectConnection();
}
/**
* Returns if the touch exploration in the system is enabled.
* <p>
@@ -1942,8 +1951,13 @@ public final class AccessibilityManager {
/**
* Notifies the registered {@link AccessibilityStateChangeListener}s.
*
* Note: this method notifies only the listeners of this single instance.
* AccessibilityManagerService is responsible for calling this method on all of
* its AccessibilityManager clients in order to notify all listeners.
* @hide
*/
private void notifyAccessibilityStateChanged() {
public void notifyAccessibilityStateChanged() {
final boolean isEnabled;
final ArrayMap<AccessibilityStateChangeListener, Handler> listeners;
synchronized (mLock) {