diff --git a/lib/android/app/build.gradle b/lib/android/app/build.gradle index 786acea6856..2874194d463 100644 --- a/lib/android/app/build.gradle +++ b/lib/android/app/build.gradle @@ -79,6 +79,10 @@ android { dimension "RNN.reactNativeVersion" buildConfigField("int", "REACT_NATVE_VERSION_MINOR", "60") } + reactNative62 { + dimension "RNN.reactNativeVersion" + buildConfigField("int", "REACT_NATVE_VERSION_MINOR", "62") + } } } diff --git a/lib/android/app/src/reactNative62/java/reactnativenavigation/react/DevBundleDownloadListenerAdapter.java b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/DevBundleDownloadListenerAdapter.java new file mode 100644 index 00000000000..d5ad33c75c5 --- /dev/null +++ b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/DevBundleDownloadListenerAdapter.java @@ -0,0 +1,22 @@ +package com.reactnativenavigation.react; + +import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; + +import javax.annotation.Nullable; + +public class DevBundleDownloadListenerAdapter implements DevBundleDownloadListener, NavigationDevBundleDownloadListener { + @Override + public void onSuccess() { + onSuccess(); + } + + @Override + public void onProgress(@Nullable String status, @Nullable Integer done, @Nullable Integer total) { + + } + + @Override + public void onFailure(Exception cause) { + + } +} diff --git a/lib/android/app/src/reactNative62/java/reactnativenavigation/react/JsDevReloadHandlerFacade.java b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/JsDevReloadHandlerFacade.java new file mode 100644 index 00000000000..feb40fb680e --- /dev/null +++ b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/JsDevReloadHandlerFacade.java @@ -0,0 +1,22 @@ +package com.reactnativenavigation.react; + +import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; + +import javax.annotation.Nullable; + +public class JsDevReloadHandlerFacade implements DevBundleDownloadListener, NavigationDevBundleDownloadListener { + @Override + public void onSuccess() { + onSuccess(); + } + + @Override + public void onProgress(@Nullable String status, @Nullable Integer done, @Nullable Integer total) { + + } + + @Override + public void onFailure(Exception cause) { + + } +} diff --git a/lib/android/app/src/reactNative62/java/reactnativenavigation/react/NavigationReactNativeHost.java b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/NavigationReactNativeHost.java new file mode 100644 index 00000000000..1917ab6490f --- /dev/null +++ b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/NavigationReactNativeHost.java @@ -0,0 +1,107 @@ +package com.reactnativenavigation.react; + +import android.app.Application; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.facebook.infer.annotation.Assertions; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactInstanceManagerBuilder; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.common.LifecycleState; +import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; +import com.facebook.react.shell.MainReactPackage; +import com.reactnativenavigation.NavigationApplication; + +import java.util.ArrayList; +import java.util.List; + +/** + * Default implementation of {@link ReactNativeHost} that includes {@link NavigationPackage} + * and user-defined additional packages. + */ +public class NavigationReactNativeHost extends ReactNativeHost implements BundleDownloadListenerProvider { + + private final boolean isDebug; + private final List additionalReactPackages; + private @Nullable NavigationDevBundleDownloadListener bundleListener; + private final DevBundleDownloadListener bundleListenerMediator = new DevBundleDownloadListenerAdapter() { + @Override + public void onSuccess() { + if (bundleListener != null) { + bundleListener.onSuccess(); + } + } + }; + + public NavigationReactNativeHost(NavigationApplication application) { + this(application, application.isDebug(), application.createAdditionalReactPackages()); + } + + @SuppressWarnings("WeakerAccess") + public NavigationReactNativeHost(Application application, boolean isDebug, final List additionalReactPackages) { + super(application); + this.isDebug = isDebug; + this.additionalReactPackages = additionalReactPackages; + } + + @Override + public void setBundleLoaderListener(NavigationDevBundleDownloadListener listener) { + bundleListener = listener; + } + + @Override + public boolean getUseDeveloperSupport() { + return isDebug; + } + + @Override + protected List getPackages() { + List packages = new ArrayList<>(); + boolean hasMainReactPackage = false; + packages.add(new NavigationPackage(this)); + if (additionalReactPackages != null) { + for (ReactPackage p : additionalReactPackages) { + if (!(p instanceof NavigationPackage)) { + packages.add(p); + } + if (p instanceof MainReactPackage) hasMainReactPackage = true; + } + } + if (!hasMainReactPackage) { + packages.add(new MainReactPackage()); + } + return packages; + } + + protected ReactInstanceManager createReactInstanceManager() { + ReactInstanceManagerBuilder builder = ReactInstanceManager.builder() + .setApplication(getApplication()) + .setJSMainModulePath(getJSMainModuleName()) + .setUseDeveloperSupport(getUseDeveloperSupport()) + .setRedBoxHandler(getRedBoxHandler()) + .setJavaScriptExecutorFactory(getJavaScriptExecutorFactory()) + .setUIImplementationProvider(getUIImplementationProvider()) + .setInitialLifecycleState(LifecycleState.BEFORE_CREATE) + .setDevBundleDownloadListener(getDevBundleDownloadListener()); + + for (ReactPackage reactPackage : getPackages()) { + builder.addPackage(reactPackage); + } + + String jsBundleFile = getJSBundleFile(); + if (jsBundleFile != null) { + builder.setJSBundleFile(jsBundleFile); + } else { + builder.setBundleAssetName(Assertions.assertNotNull(getBundleAssetName())); + } + return builder.build(); + } + + @SuppressWarnings("WeakerAccess") + @NonNull + protected DevBundleDownloadListener getDevBundleDownloadListener() { + return bundleListenerMediator; + } +} diff --git a/lib/android/app/src/reactNative62/java/reactnativenavigation/react/ReloadHandlerFacade.java b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/ReloadHandlerFacade.java new file mode 100644 index 00000000000..f30f66b91b6 --- /dev/null +++ b/lib/android/app/src/reactNative62/java/reactnativenavigation/react/ReloadHandlerFacade.java @@ -0,0 +1,22 @@ +package com.reactnativenavigation.react; + +import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; + +import javax.annotation.Nullable; + +public abstract class ReloadHandlerFacade implements DevBundleDownloadListener { + @Override + public void onSuccess() { + + } + + @Override + public void onProgress(@Nullable String status, @Nullable Integer done, @Nullable Integer total) { + + } + + @Override + public void onFailure(Exception cause) { + + } +}