aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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",
};