Skip to content

Commit c629092

Browse files
committed
refactor: enhance ReflectionUtils and update DevSupportManagerHelpers to use new methods
1 parent f4bf4e2 commit c629092

3 files changed

Lines changed: 63 additions & 15 deletions

File tree

android/src/main/java/com/facebook/react/devsupport/DevSupportManagerHelpers.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ fun setBundleDownloadListener(
99
listener: DevBundleDownloadListener
1010
) {
1111
devSupportManager?.apply {
12-
ReflectionUtils.setFieldOfSuperclass(this, "mBundleDownloadListener", listener)
12+
ReflectionUtils.setFieldOfSuperclass(
13+
this,
14+
listener,
15+
"mBundleDownloadListener",
16+
"devBundleDownloadListener"
17+
)
1318
}
1419
}
1520

@@ -18,6 +23,11 @@ fun overrideDevLoadingViewController(
1823
devLoadingViewController: DefaultDevLoadingViewImplementation
1924
) {
2025
devSupportManager.apply {
21-
ReflectionUtils.setFieldOfSuperclass(this, "mDevLoadingViewManager", devLoadingViewController)
26+
ReflectionUtils.setFieldOfSuperclass(
27+
this,
28+
devLoadingViewController,
29+
"mDevLoadingViewManager",
30+
"devLoadingViewManager"
31+
)
2232
}
2333
}

android/src/main/java/com/facebook/react/devsupport/MendixShakeDetector.kt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.facebook.react.devsupport.interfaces.DevSupportManager
77
import com.mendix.mendixnative.util.ReflectionUtils
88

99
const val SHAKE_DETECTECTOR_VAR = "mShakeDetector"
10+
const val SHAKE_DETECTOR_VAR = "shakeDetector"
1011

1112
fun makeShakeDetector(applicationContext: Context, onShake: () -> Unit): ShakeDetector {
1213
val shakeDetector = ShakeDetector(onShake)
@@ -18,9 +19,28 @@ fun makeShakeDetector(applicationContext: Context, onShake: () -> Unit): ShakeDe
1819
fun attachMendixSupportManagerShakeDetector(
1920
shakeDetector: ShakeDetector,
2021
devSupportManager: DevSupportManager?
21-
): Unit = devSupportManager.let { supportManager ->
22-
val devShakeDetector =
23-
ReflectionUtils.getFieldOfSuperclass<ShakeDetector>(supportManager, SHAKE_DETECTECTOR_VAR)
24-
(devShakeDetector != shakeDetector).let { devShakeDetector.stop() }
25-
ReflectionUtils.setFieldOfSuperclass(supportManager, SHAKE_DETECTECTOR_VAR, shakeDetector)
22+
) {
23+
val supportManager = devSupportManager ?: return
24+
25+
try {
26+
val devShakeDetector =
27+
ReflectionUtils.getFieldOfSuperclass<ShakeDetector>(
28+
supportManager,
29+
SHAKE_DETECTECTOR_VAR,
30+
SHAKE_DETECTOR_VAR
31+
)
32+
33+
if (devShakeDetector !== shakeDetector) {
34+
devShakeDetector.stop()
35+
}
36+
37+
ReflectionUtils.setFieldOfSuperclass(
38+
supportManager,
39+
shakeDetector,
40+
SHAKE_DETECTECTOR_VAR,
41+
SHAKE_DETECTOR_VAR
42+
)
43+
} catch (_: RuntimeException) {
44+
// React Native internals changed; keep the Mendix detector active without replacing RN's.
45+
}
2646
}

android/src/main/java/com/mendix/mendixnative/util/ReflectionUtils.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,20 @@
66
import java.lang.reflect.Method;
77

88
public class ReflectionUtils {
9+
private static Field findDeclaredField(Class<?> objectClass, String... fieldNames) {
10+
NoSuchFieldException lastException = null;
11+
12+
for (String fieldName : fieldNames) {
13+
try {
14+
return objectClass.getDeclaredField(fieldName);
15+
} catch (NoSuchFieldException e) {
16+
lastException = e;
17+
}
18+
}
19+
20+
throw new RuntimeException(lastException);
21+
}
22+
923
public static ConstructorWrapper findConstructor(String className, Class<?>... parameterTypes) {
1024
try {
1125
Constructor constructor = Class.forName(className).getDeclaredConstructor(parameterTypes);
@@ -63,12 +77,12 @@ public void invoke(Object... args) {
6377
}
6478

6579
public static void setFieldOfSuperclass(Object object, String fieldName, Object value) {
66-
try {
67-
Field field = object.getClass().getSuperclass().getDeclaredField(fieldName);
68-
setField(object, field, value);
69-
} catch (NoSuchFieldException e) {
70-
throw new RuntimeException(e);
71-
}
80+
setFieldOfSuperclass(object, value, fieldName);
81+
}
82+
83+
public static void setFieldOfSuperclass(Object object, Object value, String... fieldNames) {
84+
Field field = findDeclaredField(object.getClass().getSuperclass(), fieldNames);
85+
setField(object, field, value);
7286
}
7387

7488
public static void setField(Object object, String fieldName, Object value) {
@@ -92,11 +106,15 @@ private static void setField(Object object, Field field, Object value) {
92106
}
93107

94108
public static <T> T getFieldOfSuperclass(Object object, String fieldName) {
109+
return getFieldOfSuperclass(object, new String[] { fieldName });
110+
}
111+
112+
public static <T> T getFieldOfSuperclass(Object object, String... fieldNames) {
95113
try {
96-
Field field = object.getClass().getSuperclass().getDeclaredField(fieldName);
114+
Field field = findDeclaredField(object.getClass().getSuperclass(), fieldNames);
97115
field.setAccessible(true);
98116
return (T) field.get(object);
99-
} catch (NoSuchFieldException | IllegalAccessException | ClassCastException e) {
117+
} catch (IllegalAccessException | ClassCastException e) {
100118
throw new RuntimeException(e);
101119
}
102120
}

0 commit comments

Comments
 (0)