Set accessibility ID to window surface
The change allowes HAL to access accessibility ID. Bug: 143734779 Test: TBD Change-Id: Ib4ad2b2c62264bb8ea73dd3e663b9ff797c62a7a
This commit is contained in:
@@ -441,6 +441,12 @@ public final class SurfaceControl implements Parcelable {
|
||||
*/
|
||||
public static final int METADATA_TASK_ID = 3;
|
||||
|
||||
/**
|
||||
* Accessibility ID to allow association between surfaces and accessibility tree.
|
||||
* @hide
|
||||
*/
|
||||
public static final int METADATA_ACCESSIBILITY_ID = 4;
|
||||
|
||||
/**
|
||||
* A wrapper around GraphicBuffer that contains extra information about how to
|
||||
* interpret the screenshot GraphicBuffer.
|
||||
|
||||
@@ -972,6 +972,9 @@ public class AccessibilityWindowManager {
|
||||
if (shouldComputeWindows) {
|
||||
mWindowManagerInternal.computeWindowsForAccessibility(displayId);
|
||||
}
|
||||
|
||||
mWindowManagerInternal.setAccessibilityIdToSurfaceMetadata(
|
||||
windowToken.asBinder(), windowId);
|
||||
return windowId;
|
||||
}
|
||||
|
||||
@@ -991,7 +994,7 @@ public class AccessibilityWindowManager {
|
||||
final int removedWindowId = removeAccessibilityInteractionConnectionInternalLocked(
|
||||
token, mGlobalWindowTokens, mGlobalInteractionConnections);
|
||||
if (removedWindowId >= 0) {
|
||||
onAccessibilityInteractionConnectionRemovedLocked(removedWindowId);
|
||||
onAccessibilityInteractionConnectionRemovedLocked(removedWindowId, token);
|
||||
if (DEBUG) {
|
||||
Slog.i(LOG_TAG, "Removed global connection for pid:" + Binder.getCallingPid()
|
||||
+ " with windowId: " + removedWindowId + " and token: "
|
||||
@@ -1007,7 +1010,8 @@ public class AccessibilityWindowManager {
|
||||
getWindowTokensForUserLocked(userId),
|
||||
getInteractionConnectionsForUserLocked(userId));
|
||||
if (removedWindowIdForUser >= 0) {
|
||||
onAccessibilityInteractionConnectionRemovedLocked(removedWindowIdForUser);
|
||||
onAccessibilityInteractionConnectionRemovedLocked(
|
||||
removedWindowIdForUser, token);
|
||||
if (DEBUG) {
|
||||
Slog.i(LOG_TAG, "Removed user connection for pid:" + Binder.getCallingPid()
|
||||
+ " with windowId: " + removedWindowIdForUser + " and userId:"
|
||||
@@ -1069,18 +1073,21 @@ public class AccessibilityWindowManager {
|
||||
* @param userId The userId to remove
|
||||
*/
|
||||
private void removeAccessibilityInteractionConnectionLocked(int windowId, int userId) {
|
||||
IBinder window = null;
|
||||
if (userId == UserHandle.USER_ALL) {
|
||||
window = mGlobalWindowTokens.get(windowId);
|
||||
mGlobalWindowTokens.remove(windowId);
|
||||
mGlobalInteractionConnections.remove(windowId);
|
||||
} else {
|
||||
if (isValidUserForWindowTokensLocked(userId)) {
|
||||
window = getWindowTokensForUserLocked(userId).get(windowId);
|
||||
getWindowTokensForUserLocked(userId).remove(windowId);
|
||||
}
|
||||
if (isValidUserForInteractionConnectionsLocked(userId)) {
|
||||
getInteractionConnectionsForUserLocked(userId).remove(windowId);
|
||||
}
|
||||
}
|
||||
onAccessibilityInteractionConnectionRemovedLocked(windowId);
|
||||
onAccessibilityInteractionConnectionRemovedLocked(windowId, window);
|
||||
if (DEBUG) {
|
||||
Slog.i(LOG_TAG, "Removing interaction connection to windowId: " + windowId);
|
||||
}
|
||||
@@ -1091,12 +1098,17 @@ public class AccessibilityWindowManager {
|
||||
*
|
||||
* @param windowId Removed windowId
|
||||
*/
|
||||
private void onAccessibilityInteractionConnectionRemovedLocked(int windowId) {
|
||||
private void onAccessibilityInteractionConnectionRemovedLocked(
|
||||
int windowId, @Nullable IBinder binder) {
|
||||
// Active window will not update, if windows callback is unregistered.
|
||||
// Update active window to invalid, when its a11y interaction connection is removed.
|
||||
if (!isTrackingWindowsLocked() && windowId >= 0 && mActiveWindowId == windowId) {
|
||||
mActiveWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
|
||||
}
|
||||
if (binder != null) {
|
||||
mWindowManagerInternal.setAccessibilityIdToSurfaceMetadata(
|
||||
binder, AccessibilityWindowInfo.UNDEFINED_WINDOW_ID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -550,4 +550,10 @@ public abstract class WindowManagerInternal {
|
||||
* the next time the activities are opened.
|
||||
*/
|
||||
public abstract void clearSnapshotCache();
|
||||
|
||||
/**
|
||||
* Assigns accessibility ID a window surface as a layer metadata.
|
||||
*/
|
||||
public abstract void setAccessibilityIdToSurfaceMetadata(
|
||||
IBinder windowToken, int accessibilityWindowId);
|
||||
}
|
||||
|
||||
@@ -7401,6 +7401,27 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
public @Nullable KeyInterceptionInfo getKeyInterceptionInfoFromToken(IBinder inputToken) {
|
||||
return mKeyInterceptionInfoForToken.get(inputToken);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAccessibilityIdToSurfaceMetadata(
|
||||
IBinder windowToken, int accessibilityWindowId) {
|
||||
synchronized (mGlobalLock) {
|
||||
final WindowState state = mWindowMap.get(windowToken);
|
||||
if (state == null) {
|
||||
Slog.w(TAG, "Cannot find window which accessibility connection is added to");
|
||||
return;
|
||||
}
|
||||
try (SurfaceControl.Transaction t = new SurfaceControl.Transaction()) {
|
||||
t.setMetadata(
|
||||
state.mSurfaceControl,
|
||||
SurfaceControl.METADATA_ACCESSIBILITY_ID,
|
||||
accessibilityWindowId);
|
||||
t.apply();
|
||||
} finally {
|
||||
SurfaceControl.closeTransaction();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void registerAppFreezeListener(AppFreezeListener listener) {
|
||||
|
||||
Reference in New Issue
Block a user