aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Gaillard <jgaillard@google.com>2023-11-29 15:31:28 +0000
committerCherrypicker Worker <android-build-cherrypicker-worker@google.com>2023-11-30 12:09:52 +0000
commitb2ba3bf14ca96ec852d581c511412cca3920b6f2 (patch)
tree5e67a9cd2b723f1346e2300012f6ad208bf814c6
parent1cb93bced2afc95be8401ddcc646db4e4780c278 (diff)
downloadlayoutlib-b2ba3bf14ca96ec852d581c511412cca3920b6f2.tar.gz
Clear Accessibility caches once not needed
This ensures that caches in AccessibilityInteractionClient are cleared as soon as they are not needed, without having to wait for the render session to be disposed. Bug: 312996644 Test: tests updated (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:aae8dd05cf194f568350253fa49b88dde39b4990) Merged-In: I1280faa5a983a395099e7549da82448a46540108 Change-Id: I1280faa5a983a395099e7549da82448a46540108
-rw-r--r--bridge/src/android/view/accessibility/AccessibilityInteractionClient_Accessor.java27
-rw-r--r--bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java2
-rw-r--r--bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java15
-rw-r--r--bridge/tests/src/com/android/layoutlib/bridge/android/AccessibilityTest.java4
-rw-r--r--create/src/com/android/tools/layoutlib/create/CreateInfo.java5
5 files changed, 53 insertions, 0 deletions
diff --git a/bridge/src/android/view/accessibility/AccessibilityInteractionClient_Accessor.java b/bridge/src/android/view/accessibility/AccessibilityInteractionClient_Accessor.java
new file mode 100644
index 0000000000..8c87c22e88
--- /dev/null
+++ b/bridge/src/android/view/accessibility/AccessibilityInteractionClient_Accessor.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view.accessibility;
+
+public class AccessibilityInteractionClient_Accessor {
+ public static void clearCaches() {
+ AccessibilityInteractionClient.sCaches.clear();
+ AccessibilityInteractionClient.sClients.clear();
+ AccessibilityInteractionClient.sConnectionCache.clear();
+ AccessibilityInteractionClient.sScrollingWindows.clear();
+ AccessibilityInteractionClient.sDirectConnectionCount = 0;
+ }
+}
diff --git a/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
index 8048ff1e1a..98b59565f7 100644
--- a/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
+++ b/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java
@@ -43,6 +43,7 @@ import android.view.IWindowManagerImpl;
import android.view.Surface;
import android.view.ViewConfiguration_Accessor;
import android.view.WindowManagerGlobal_Delegate;
+import android.view.accessibility.AccessibilityInteractionClient_Accessor;
import android.view.inputmethod.InputMethodManager_Accessor;
import java.util.Collections;
@@ -313,6 +314,7 @@ public abstract class RenderAction<T extends RenderParams> {
ParserFactory.setParserFactory(null);
PropertyValuesHolder_Accessor.clearClassCaches();
+ AccessibilityInteractionClient_Accessor.clearCaches();
}
public static BridgeContext getCurrentContext() {
diff --git a/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
index 034a92df75..9ed5d17531 100644
--- a/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
+++ b/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java
@@ -72,6 +72,8 @@ import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.ViewParent;
+import android.view.ViewRootImpl;
+import android.view.ViewRootImpl_Accessor;
import android.view.WindowManagerImpl;
import android.widget.ActionMenuView;
import android.widget.FrameLayout;
@@ -1206,6 +1208,19 @@ public class RenderSessionImpl extends RenderAction<SessionParams> {
}
}
+ @Override
+ public void release() {
+ super.release();
+ if (mViewRoot == null) {
+ return;
+ }
+ ViewRootImpl viewRootImpl = mViewRoot.getViewRootImpl();
+ if (viewRootImpl == null) {
+ return;
+ }
+ ViewRootImpl_Accessor.detachFromWindow(viewRootImpl);
+ }
+
private void disposeImageSurface() {
if (mCanvas != null) {
mCanvas.release();
diff --git a/bridge/tests/src/com/android/layoutlib/bridge/android/AccessibilityTest.java b/bridge/tests/src/com/android/layoutlib/bridge/android/AccessibilityTest.java
index dc24d845ca..e1cad4ee2d 100644
--- a/bridge/tests/src/com/android/layoutlib/bridge/android/AccessibilityTest.java
+++ b/bridge/tests/src/com/android/layoutlib/bridge/android/AccessibilityTest.java
@@ -31,6 +31,7 @@ import org.junit.Test;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityNodeInfo;
import java.io.FileNotFoundException;
@@ -63,6 +64,7 @@ public class AccessibilityTest extends RenderTestBase {
try {
Result renderResult = session.render(50000);
assertTrue(renderResult.isSuccess());
+ assertEquals(0, AccessibilityInteractionClient.sConnectionCache.size());
View rootView = (View)session.getSystemRootViews().get(0).getViewObject();
AccessibilityNodeInfo rootNode = rootView.createAccessibilityNodeInfo();
assertNotNull(rootNode);
@@ -148,6 +150,7 @@ public class AccessibilityTest extends RenderTestBase {
try {
Result renderResult = session.render(50000);
assertTrue(renderResult.isSuccess());
+ assertEquals(0, AccessibilityInteractionClient.sConnectionCache.size());
View rootView =
(View)((View) session.getSystemRootViews().get(1).getViewObject()).getParent();
int[] counter = {0};
@@ -157,6 +160,7 @@ public class AccessibilityTest extends RenderTestBase {
rootNode.setQueryFromAppProcessEnabled(rootView, true);
traverseAccessibilityTree(rootNode, counter);
});
+ assertEquals(0, AccessibilityInteractionClient.sConnectionCache.size());
assertEquals(17, counter[0]);
} finally {
session.dispose();
diff --git a/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/create/src/com/android/tools/layoutlib/create/CreateInfo.java
index b2b7e7084b..fbfd66895f 100644
--- a/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ b/create/src/com/android/tools/layoutlib/create/CreateInfo.java
@@ -336,6 +336,11 @@ public final class CreateInfo implements ICreateInfo {
"android.view.Choreographer#mCallbackQueues", // required for tests only
"android.view.Choreographer$CallbackQueue#mHead", // required for tests only
"android.view.ViewRootImpl#mTmpFrames",
+ "android.view.accessibility.AccessibilityInteractionClient#sCaches",
+ "android.view.accessibility.AccessibilityInteractionClient#sClients",
+ "android.view.accessibility.AccessibilityInteractionClient#sConnectionCache",
+ "android.view.accessibility.AccessibilityInteractionClient#sDirectConnectionCount",
+ "android.view.accessibility.AccessibilityInteractionClient#sScrollingWindows",
"com.android.internal.util.ArrayUtils#sCache",
};