Skip to content

Commit

Permalink
fix: use proper classes for bridgeless (#5997)
Browse files Browse the repository at this point in the history
## Summary

Thanks to @lukmccall we discovered that on bridgeless mode invoking
`getReactInstanceManager` creates another instance of application. This
PR makes it behave correctly there.

## Test plan

Run application and see that without this code, on bridgeless, there is
no additional button in dev menu since it is created and the button is
added in another instance.
  • Loading branch information
WoLewicki committed May 14, 2024
1 parent b40f64c commit 5cf6dfc
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 12 deletions.
7 changes: 7 additions & 0 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,13 @@ android {
srcDirs += "src/reactNativeVersionPatch/ReanimatedUIManager/latest"
}

// ReactHost
if (REACT_NATIVE_MINOR_VERSION <= 72) {
srcDirs += "src/reactNativeVersionPatch/ReactHost/72"
} else {
srcDirs += "src/reactNativeVersionPatch/ReactHost/latest"
}

// ReactFeatureFlags
if (IS_NEW_ARCHITECTURE_ENABLED) {
if (REACT_NATIVE_MINOR_VERSION <= 72) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,16 @@
import android.util.Log;
import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.ReactApplication;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableNativeArray;
import com.facebook.react.devsupport.interfaces.DevSupportManager;
import com.facebook.soloader.SoLoader;
import com.swmansion.common.GestureHandlerStateManager;
import com.swmansion.reanimated.AndroidUIScheduler;
import com.swmansion.reanimated.BuildConfig;
import com.swmansion.reanimated.DevMenuUtils;
import com.swmansion.reanimated.NativeProxy;
import com.swmansion.reanimated.NodesManager;
import com.swmansion.reanimated.ReanimatedModule;
Expand Down Expand Up @@ -83,16 +82,7 @@ private void toggleSlowAnimations() {

private void addDevMenuOption() {
// In Expo, `ApplicationContext` is not an instance of `ReactApplication`
if (mContext.get().getApplicationContext() instanceof ReactApplication) {
final DevSupportManager devSupportManager =
((ReactApplication) mContext.get().getApplicationContext())
.getReactNativeHost()
.getReactInstanceManager()
.getDevSupportManager();

devSupportManager.addCustomDevOption(
"Toggle slow animations (Reanimated)", this::toggleSlowAnimations);
}
DevMenuUtils.addDevMenuOption(mContext.get(), this::toggleSlowAnimations);
}

@DoNotStrip
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.swmansion.reanimated;

public class DevMenuUtils {

private void addDevMenuOption(ReactApplicationContext context, DevOptionHandler handler) {
// In Expo, `ApplicationContext` is not an instance of `ReactApplication`
if (context.getApplicationContext() instanceof ReactApplication) {
final DevSupportManager devSupportManager =
((ReactApplication) context.getApplicationContext())
.getReactNativeHost()
.getReactInstanceManager()
.getDevSupportManager();

devSupportManager.addCustomDevOption(
"Toggle slow animations (Reanimated)", handler);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.swmansion.reanimated;

import com.facebook.react.ReactApplication;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.devsupport.interfaces.DevOptionHandler;
import com.facebook.react.devsupport.interfaces.DevSupportManager;

public class DevMenuUtils {

public static void addDevMenuOption(ReactApplicationContext context, DevOptionHandler handler) {
// In Expo, `ApplicationContext` is not an instance of `ReactApplication`
if (context.getApplicationContext() instanceof ReactApplication) {
DevSupportManager devSupportManager;
if (context.isBridgeless()) {
devSupportManager =
((ReactApplication) context.getApplicationContext())
.getReactHost().getDevSupportManager();
} else {
devSupportManager =
((ReactApplication) context.getApplicationContext())
.getReactNativeHost()
.getReactInstanceManager()
.getDevSupportManager();
}

if (devSupportManager != null) {
devSupportManager.addCustomDevOption(
"Toggle slow animations (Reanimated)", handler);
} else {
throw new RuntimeException("[Reanimated] DevSupportManager is not available");
}
}
}
}

0 comments on commit 5cf6dfc

Please sign in to comment.