diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java index 9811ef46f54..6d9084c0021 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAccessibilityNodeInfo.java @@ -8,6 +8,7 @@ import static android.os.Build.VERSION_CODES.N; import static android.os.Build.VERSION_CODES.Q; import static org.robolectric.RuntimeEnvironment.getApiLevel; +import static org.robolectric.util.reflector.Reflector.reflector; import android.graphics.Rect; import android.os.Bundle; @@ -36,7 +37,9 @@ import org.robolectric.annotation.Resetter; import org.robolectric.shadow.api.Shadow; import org.robolectric.util.ReflectionHelpers; -import org.robolectric.util.ReflectionHelpers.ClassParameter; +import org.robolectric.util.reflector.Accessor; +import org.robolectric.util.reflector.ForType; +import org.robolectric.util.reflector.Static; /** * Properties of {@link android.view.accessibility.AccessibilityNodeInfo} that are normally locked @@ -191,8 +194,7 @@ public AccessibilityNodeInfo[] newArray(int size) { @Implementation protected void __constructor__() { - ReflectionHelpers.setStaticField( - AccessibilityNodeInfo.class, "CREATOR", ShadowAccessibilityNodeInfo.CREATOR); + reflector(AccessibilityNodeInfoReflector.class).setCreator(ShadowAccessibilityNodeInfo.CREATOR); } @Implementation @@ -1223,11 +1225,7 @@ public static final class ShadowAccessibilityAction { @Implementation protected void __constructor__(int id, CharSequence label) { - if (((id - & (int) - ReflectionHelpers.getStaticField( - AccessibilityNodeInfo.class, "ACTION_TYPE_MASK")) - == 0) + if (((id & reflector(AccessibilityNodeInfoReflector.class).getActionTypeMask()) == 0) && Integer.bitCount(id) != 1) { throw new IllegalArgumentException("Invalid standard action id"); } @@ -1266,8 +1264,8 @@ public boolean equals(Object other) { @Override public String toString() { - String actionSybolicName = ReflectionHelpers.callStaticMethod( - AccessibilityNodeInfo.class, "getActionSymbolicName", ClassParameter.from(int.class, id)); + String actionSybolicName = + reflector(AccessibilityNodeInfoReflector.class).getActionSymbolicName(id); return "AccessibilityAction: " + actionSybolicName + " - " + label; } } @@ -1292,19 +1290,16 @@ protected void writeToParcel(Parcel dest, int flags) { private static int getActionTypeMaskFromFramework() { // Get the mask to determine whether an int is a legit ID for an action, defined by Android - return (int)ReflectionHelpers.getStaticField(AccessibilityNodeInfo.class, "ACTION_TYPE_MASK"); + return reflector(AccessibilityNodeInfoReflector.class).getActionTypeMask(); } private static AccessibilityAction getActionFromIdFromFrameWork(int id) { // Convert an action ID to Android standard Accessibility Action defined by Android - return ReflectionHelpers.callStaticMethod( - AccessibilityNodeInfo.class, "getActionSingleton", ClassParameter.from(int.class, id)); + return reflector(AccessibilityNodeInfoReflector.class).getActionSingleton(id); } private static int getLastLegacyActionFromFrameWork() { - return (int) - ReflectionHelpers.getStaticField( - AccessibilityNodeInfo.class, "LAST_LEGACY_STANDARD_ACTION"); + return reflector(AccessibilityNodeInfoReflector.class).getLastLegacyStandardAction(); } /** @@ -1331,4 +1326,25 @@ public String toString() { + className + "}"; } + + @ForType(AccessibilityNodeInfo.class) + interface AccessibilityNodeInfoReflector { + @Static + @Accessor("CREATOR") + void setCreator(Parcelable.Creator creator); + + @Static + @Accessor("ACTION_TYPE_MASK") + int getActionTypeMask(); + + @Static + @Accessor("LAST_LEGACY_STANDARD_ACTION") + int getLastLegacyStandardAction(); + + @Static + String getActionSymbolicName(int id); + + @Static + AccessibilityAction getActionSingleton(int id); + } } diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager10.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager10.java index 470df765bb9..3c4ba90a1a1 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager10.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager10.java @@ -73,6 +73,7 @@ import org.robolectric.res.android.ResXMLTree; import org.robolectric.res.android.ResourceTypes.Res_value; import org.robolectric.shadow.api.Shadow; +import org.robolectric.util.PerfStatsCollector; import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers.ClassParameter; import org.robolectric.util.reflector.Direct; @@ -1388,6 +1389,30 @@ protected static void nativeApplyStyle( @NonNull int[] java_attrs, long out_values_ptr, long out_indices_ptr) { + PerfStatsCollector.getInstance() + .measure( + "applyStyle", + () -> + nativeApplyStyle_measured( + ptr, + theme_ptr, + def_style_attr, + def_style_resid, + xml_parser_ptr, + java_attrs, + out_values_ptr, + out_indices_ptr)); + } + + private static void nativeApplyStyle_measured( + long ptr, + long theme_ptr, + @AttrRes int def_style_attr, + @StyleRes int def_style_resid, + long xml_parser_ptr, + @NonNull int[] java_attrs, + long out_values_ptr, + long out_indices_ptr) { CppAssetManager2 assetmanager = AssetManagerFromLong(ptr); Theme theme = Registries.NATIVE_THEME9_REGISTRY.getNativeObject(theme_ptr); CHECK(theme.GetAssetManager() == assetmanager); diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager9.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager9.java index a33eab2f75a..71342beba41 100644 --- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager9.java +++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscAssetManager9.java @@ -73,6 +73,7 @@ import org.robolectric.res.android.ResXMLTree; import org.robolectric.res.android.ResourceTypes.Res_value; import org.robolectric.shadow.api.Shadow; +import org.robolectric.util.PerfStatsCollector; import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers.ClassParameter; import org.robolectric.util.reflector.Direct; @@ -1378,6 +1379,30 @@ protected static void nativeApplyStyle( @NonNull int[] java_attrs, long out_values_ptr, long out_indices_ptr) { + PerfStatsCollector.getInstance() + .measure( + "applyStyle", + () -> + nativeApplyStyle_measured( + ptr, + theme_ptr, + def_style_attr, + def_style_resid, + xml_parser_ptr, + java_attrs, + out_values_ptr, + out_indices_ptr)); + } + + private static void nativeApplyStyle_measured( + long ptr, + long theme_ptr, + @AttrRes int def_style_attr, + @StyleRes int def_style_resid, + long xml_parser_ptr, + @NonNull int[] java_attrs, + long out_values_ptr, + long out_indices_ptr) { CppAssetManager2 assetmanager = AssetManagerFromLong(ptr); Theme theme = Registries.NATIVE_THEME9_REGISTRY.getNativeObject(theme_ptr); CHECK(theme.GetAssetManager() == assetmanager);