Adds a UiAutomation#clearCache() to be consistent with A11yService.

Includes a @TestApi for CTS testing that the cache was cleared, also
copied from A11yService.

Bug: 263394275
Test: atest AccessibilityCacheTest
Change-Id: Ia5fee5d13c6e4949ae1206edd9f0b22e53f0a437
This commit is contained in:
Daniel Norman
2023-02-10 12:14:08 -08:00
parent 6e3d589b4e
commit d5125f31d7
3 changed files with 46 additions and 0 deletions

View File

@@ -7275,6 +7275,7 @@ package android.app {
public final class UiAutomation {
method public void adoptShellPermissionIdentity();
method public void adoptShellPermissionIdentity(@Nullable java.lang.String...);
method public boolean clearCache();
method @Deprecated public void clearWindowAnimationFrameStats();
method public boolean clearWindowContentFrameStats(int);
method public void dropShellPermissionIdentity();

View File

@@ -448,6 +448,7 @@ package android.app {
method @Deprecated public boolean grantRuntimePermission(String, String, android.os.UserHandle);
method public boolean injectInputEvent(@NonNull android.view.InputEvent, boolean, boolean);
method public void injectInputEventToInputFilter(@NonNull android.view.InputEvent);
method public boolean isNodeInCache(@NonNull android.view.accessibility.AccessibilityNodeInfo);
method @Deprecated public boolean revokeRuntimePermission(String, String, android.os.UserHandle);
method public void syncInputTransactions();
method public void syncInputTransactions(boolean);

View File

@@ -17,6 +17,7 @@
package android.app;
import android.accessibilityservice.AccessibilityGestureEvent;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityService.Callbacks;
import android.accessibilityservice.AccessibilityService.IAccessibilityServiceClientWrapper;
import android.accessibilityservice.AccessibilityServiceInfo;
@@ -58,6 +59,7 @@ import android.view.ViewRootImpl;
import android.view.Window;
import android.view.WindowAnimationFrameStats;
import android.view.WindowContentFrameStats;
import android.view.accessibility.AccessibilityCache;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -464,6 +466,48 @@ public final class UiAutomation {
mIsDestroyed = true;
}
/**
* Clears the accessibility cache.
*
* @return {@code true} if the cache was cleared
* @see AccessibilityService#clearCache()
*/
public boolean clearCache() {
final int connectionId;
synchronized (mLock) {
throwIfNotConnectedLocked();
connectionId = mConnectionId;
}
final AccessibilityCache cache = AccessibilityInteractionClient.getCache(connectionId);
if (cache == null) {
return false;
}
cache.clear();
return true;
}
/**
* Checks if {@code node} is in the accessibility cache.
*
* @param node the node to check.
* @return {@code true} if {@code node} is in the cache.
* @hide
* @see AccessibilityService#isNodeInCache(AccessibilityNodeInfo)
*/
@TestApi
public boolean isNodeInCache(@NonNull AccessibilityNodeInfo node) {
final int connectionId;
synchronized (mLock) {
throwIfNotConnectedLocked();
connectionId = mConnectionId;
}
final AccessibilityCache cache = AccessibilityInteractionClient.getCache(connectionId);
if (cache == null) {
return false;
}
return cache.isNodeInCache(node);
}
/**
* Adopt the permission identity of the shell UID for all permissions. This allows
* you to call APIs protected permissions which normal apps cannot hold but are