Skip to content

Commit 20fe313

Browse files
committed
Fix tags missing for compose view hierarchies
1 parent b5b9f8b commit 20fe313

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

sentry-compose-helper/src/jvmMain/java/io/sentry/compose/gestures/ComposeGestureTargetLocator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public ComposeGestureTargetLocator(final @NotNull ILogger logger) {
7575
boolean isClickable = false;
7676
boolean isScrollable = false;
7777

78+
// needs to be in-sync with ComposeGestureTargetLocator
7879
final List<ModifierInfo> modifiers = node.getModifierInfo();
7980
for (ModifierInfo modifierInfo : modifiers) {
8081
if (modifierInfo.getModifier() instanceof SemanticsModifier) {
@@ -103,7 +104,8 @@ public ComposeGestureTargetLocator(final @NotNull ILogger logger) {
103104
isClickable = true;
104105
} else if ("androidx.compose.foundation.ScrollingLayoutElement".equals(type)) {
105106
isScrollable = true;
106-
} else if ("androidx.compose.ui.platform.TestTagElement".equals(type)) {
107+
} else if ("androidx.compose.ui.platform.TestTagElement".equals(type)
108+
|| "io.sentry.compose.SentryModifier.SentryTagModifierNodeElement".equals(type)) {
107109
// Newer Jetpack Compose uses TestTagElement as node elements
108110
// See
109111
// https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TestTag.kt;l=34;drc=dcaa116fbfda77e64a319e1668056ce3b032469f

sentry-compose-helper/src/jvmMain/java/io/sentry/compose/viewhierarchy/ComposeViewHierarchyExporter.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.sentry.compose.viewhierarchy;
22

33
import androidx.compose.runtime.collection.MutableVector;
4+
import androidx.compose.ui.Modifier;
45
import androidx.compose.ui.geometry.Rect;
56
import androidx.compose.ui.layout.ModifierInfo;
67
import androidx.compose.ui.node.LayoutNode;
@@ -14,6 +15,7 @@
1415
import io.sentry.internal.viewhierarchy.ViewHierarchyExporter;
1516
import io.sentry.protocol.ViewHierarchyNode;
1617
import io.sentry.util.AutoClosableReentrantLock;
18+
import java.lang.reflect.Field;
1719
import java.util.ArrayList;
1820
import java.util.List;
1921
import java.util.Map;
@@ -84,9 +86,13 @@ private static void addChild(
8486

8587
private static void setTag(
8688
final @NotNull LayoutNode node, final @NotNull ViewHierarchyNode vhNode) {
89+
// needs to be in-sync with ComposeGestureTargetLocator
8790
final List<ModifierInfo> modifiers = node.getModifierInfo();
8891
for (ModifierInfo modifierInfo : modifiers) {
89-
if (modifierInfo.getModifier() instanceof SemanticsModifier) {
92+
final @NotNull Modifier modifier = modifierInfo.getModifier();
93+
// Newer Jetpack Compose 1.5 uses Node modifier elements
94+
final @Nullable String type = modifier.getClass().getCanonicalName();
95+
if (modifier instanceof SemanticsModifier) {
9096
final SemanticsModifier semanticsModifierCore =
9197
(SemanticsModifier) modifierInfo.getModifier();
9298
final SemanticsConfiguration semanticsConfiguration =
@@ -99,6 +105,21 @@ private static void setTag(
99105
}
100106
}
101107
}
108+
} else if ("androidx.compose.ui.platform.TestTagElement".equals(type)
109+
|| "io.sentry.compose.SentryModifier.SentryTagModifierNodeElement".equals(type)) {
110+
// Newer Jetpack Compose uses TestTagElement as node elements
111+
// See
112+
// https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/TestTag.kt;l=34;drc=dcaa116fbfda77e64a319e1668056ce3b032469f
113+
try {
114+
final Field tagField = modifier.getClass().getDeclaredField("tag");
115+
tagField.setAccessible(true);
116+
final @Nullable Object value = tagField.get(modifier);
117+
if (value instanceof String) {
118+
vhNode.setTag((String) value);
119+
}
120+
} catch (Throwable e) {
121+
// ignored
122+
}
102123
}
103124
}
104125
}

sentry-compose/proguard-rules.pro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
-keepnames class androidx.compose.foundation.CombinedClickableElement
1414
-keepnames class androidx.compose.foundation.ScrollingLayoutElement
1515
-keepnames class androidx.compose.ui.platform.TestTagElement { *; }
16+
-keepnames class io.sentry.compose.SentryModifier.SentryTagModifierNodeElement { *; }
1617

1718
# R8 will warn about missing classes if people don't have androidx.compose-navigation on their
1819
# classpath, but this is fine, these classes are used in an internal class which is only used when

0 commit comments

Comments
 (0)