Migrate MainReactPackage to Kotlin (#47070)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/47070

For the sake of Stable API, I'd like to get this class converted to Kotlin

The class is becoming `final` so could be breaking for some users if they subclass `MainReactPackage` which I believe this should not be a valid usage of this API.

Changelog:
[Android] [Changed] - Migrate MainReactPackage to Kotlin (and make it final)

Reviewed By: tdn120

Differential Revision: D64479418

fbshipit-source-id: 24a07de4e5796a7b82ba34c9b36511b8fc526f1a
This commit is contained in:
Nicola Corti
2024-10-17 05:29:04 -07:00
committed by Facebook GitHub Bot
parent 2d2bb9c588
commit 7bbac8ee27
12 changed files with 335 additions and 343 deletions
@@ -3028,6 +3028,8 @@ public abstract interface class com/facebook/react/module/model/ReactModuleInfoP
}
public final class com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule : com/facebook/fbreact/specs/NativeAccessibilityInfoSpec, com/facebook/react/bridge/LifecycleEventListener {
public static final field Companion Lcom/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun announceForAccessibility (Ljava/lang/String;)V
public fun getRecommendedTimeoutMillis (DLcom/facebook/react/bridge/Callback;)V
@@ -3043,6 +3045,9 @@ public final class com/facebook/react/modules/accessibilityinfo/AccessibilityInf
public fun setAccessibilityFocus (D)V
}
public final class com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule$Companion {
}
public final class com/facebook/react/modules/appearance/AppearanceModule : com/facebook/fbreact/specs/NativeAppearanceSpec {
public static final field Companion Lcom/facebook/react/modules/appearance/AppearanceModule$Companion;
public static final field NAME Ljava/lang/String;
@@ -3387,11 +3392,16 @@ public final class com/facebook/react/modules/devloading/DevLoadingModule$Compan
}
public final class com/facebook/react/modules/devtoolsruntimesettings/ReactDevToolsRuntimeSettingsModule : com/facebook/fbreact/specs/NativeReactDevToolsRuntimeSettingsModuleSpec {
public static final field Companion Lcom/facebook/react/modules/devtoolsruntimesettings/ReactDevToolsRuntimeSettingsModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun getReloadAndProfileConfig ()Lcom/facebook/react/bridge/WritableMap;
public fun setReloadAndProfileConfig (Lcom/facebook/react/bridge/ReadableMap;)V
}
public final class com/facebook/react/modules/devtoolsruntimesettings/ReactDevToolsRuntimeSettingsModule$Companion {
}
public class com/facebook/react/modules/dialog/AlertFragment : androidx/fragment/app/DialogFragment, android/content/DialogInterface$OnClickListener {
public fun <init> ()V
public fun <init> (Lcom/facebook/react/modules/dialog/DialogModule$AlertFragmentListener;Landroid/os/Bundle;)V
@@ -3414,6 +3424,7 @@ public class com/facebook/react/modules/dialog/DialogModule : com/facebook/fbrea
public class com/facebook/react/modules/fresco/FrescoModule : com/facebook/react/bridge/ReactContextBaseJavaModule, com/facebook/react/bridge/LifecycleEventListener, com/facebook/react/modules/common/ModuleDataCleaner$Cleanable, com/facebook/react/turbomodule/core/interfaces/TurboModule {
public static final field Companion Lcom/facebook/react/modules/fresco/FrescoModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;Lcom/facebook/imagepipeline/core/ImagePipeline;)V
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;Lcom/facebook/imagepipeline/core/ImagePipeline;Z)V
@@ -3469,6 +3480,8 @@ public final class com/facebook/react/modules/fresco/XmlFormat {
}
public final class com/facebook/react/modules/i18nmanager/I18nManagerModule : com/facebook/fbreact/specs/NativeI18nManagerSpec {
public static final field Companion Lcom/facebook/react/modules/i18nmanager/I18nManagerModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun allowRTL (Z)V
public fun forceRTL (Z)V
@@ -3476,6 +3489,9 @@ public final class com/facebook/react/modules/i18nmanager/I18nManagerModule : co
public fun swapLeftAndRightInRTL (Z)V
}
public final class com/facebook/react/modules/i18nmanager/I18nManagerModule$Companion {
}
public final class com/facebook/react/modules/i18nmanager/I18nUtil {
public static final field Companion Lcom/facebook/react/modules/i18nmanager/I18nUtil$Companion;
public final fun allowRTL (Landroid/content/Context;Z)V
@@ -3647,6 +3663,8 @@ public class com/facebook/react/modules/network/TLSSocketFactory : javax/net/ssl
}
public final class com/facebook/react/modules/permissions/PermissionsModule : com/facebook/fbreact/specs/NativePermissionsAndroidSpec, com/facebook/react/modules/core/PermissionListener {
public static final field Companion Lcom/facebook/react/modules/permissions/PermissionsModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun checkPermission (Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V
public fun onRequestPermissionsResult (I[Ljava/lang/String;[I)Z
@@ -3655,15 +3673,24 @@ public final class com/facebook/react/modules/permissions/PermissionsModule : co
public fun shouldShowRequestPermissionRationale (Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V
}
public final class com/facebook/react/modules/permissions/PermissionsModule$Companion {
}
public final class com/facebook/react/modules/reactdevtoolssettings/ReactDevToolsSettingsManagerModule : com/facebook/fbreact/specs/NativeReactDevToolsSettingsManagerSpec {
public static final field Companion Lcom/facebook/react/modules/reactdevtoolssettings/ReactDevToolsSettingsManagerModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun getGlobalHookSettings ()Ljava/lang/String;
public fun setGlobalHookSettings (Ljava/lang/String;)V
}
public final class com/facebook/react/modules/reactdevtoolssettings/ReactDevToolsSettingsManagerModule$Companion {
}
public final class com/facebook/react/modules/share/ShareModule : com/facebook/fbreact/specs/NativeShareModuleSpec {
public static final field Companion Lcom/facebook/react/modules/share/ShareModule$Companion;
public static final field ERROR_INVALID_CONTENT Ljava/lang/String;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun share (Lcom/facebook/react/bridge/ReadableMap;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V
}
@@ -3672,10 +3699,15 @@ public final class com/facebook/react/modules/share/ShareModule$Companion {
}
public final class com/facebook/react/modules/sound/SoundManagerModule : com/facebook/fbreact/specs/NativeSoundManagerSpec {
public static final field Companion Lcom/facebook/react/modules/sound/SoundManagerModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun playTouchSound ()V
}
public final class com/facebook/react/modules/sound/SoundManagerModule$Companion {
}
public final class com/facebook/react/modules/statusbar/StatusBarModule : com/facebook/fbreact/specs/NativeStatusBarManagerAndroidSpec {
public static final field Companion Lcom/facebook/react/modules/statusbar/StatusBarModule$Companion;
public static final field NAME Ljava/lang/String;
@@ -3729,12 +3761,17 @@ public final class com/facebook/react/modules/toast/ToastModule$Companion {
}
public final class com/facebook/react/modules/vibration/VibrationModule : com/facebook/fbreact/specs/NativeVibrationSpec {
public static final field Companion Lcom/facebook/react/modules/vibration/VibrationModule$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun cancel ()V
public fun vibrate (D)V
public fun vibrateByPattern (Lcom/facebook/react/bridge/ReadableArray;D)V
}
public final class com/facebook/react/modules/vibration/VibrationModule$Companion {
}
public final class com/facebook/react/modules/websocket/WebSocketModule : com/facebook/fbreact/specs/NativeWebSocketModuleSpec {
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun addListener (Ljava/lang/String;)V
@@ -4022,16 +4059,17 @@ public final class com/facebook/react/shell/MainPackageConfig {
public final fun getFrescoConfig ()Lcom/facebook/imagepipeline/core/ImagePipelineConfig;
}
public class com/facebook/react/shell/MainReactPackage : com/facebook/react/BaseReactPackage, com/facebook/react/ViewManagerOnDemandReactPackage {
public final class com/facebook/react/shell/MainReactPackage : com/facebook/react/BaseReactPackage, com/facebook/react/ViewManagerOnDemandReactPackage {
public fun <init> ()V
public fun <init> (Lcom/facebook/react/shell/MainPackageConfig;)V
public synthetic fun <init> (Lcom/facebook/react/shell/MainPackageConfig;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun createViewManager (Lcom/facebook/react/bridge/ReactApplicationContext;Ljava/lang/String;)Lcom/facebook/react/uimanager/ViewManager;
public fun createViewManagers (Lcom/facebook/react/bridge/ReactApplicationContext;)Ljava/util/List;
public fun getModule (Ljava/lang/String;Lcom/facebook/react/bridge/ReactApplicationContext;)Lcom/facebook/react/bridge/NativeModule;
public fun getReactModuleInfoProvider ()Lcom/facebook/react/module/model/ReactModuleInfoProvider;
public fun getViewManagerNames (Lcom/facebook/react/bridge/ReactApplicationContext;)Ljava/util/Collection;
public fun getViewManagers (Lcom/facebook/react/bridge/ReactApplicationContext;)Ljava/util/List;
public fun getViewManagersMap ()Ljava/util/Map;
public final fun getViewManagersMap ()Ljava/util/Map;
}
public class com/facebook/react/shell/MainReactPackage$$ReactModuleInfoProvider : com/facebook/react/module/model/ReactModuleInfoProvider {
@@ -255,7 +255,8 @@ public class AccessibilityInfoModule(context: ReactApplicationContext) :
successCallback.invoke(recommendedTimeout)
}
private companion object {
public companion object {
public const val NAME: String = NativeAccessibilityInfoSpec.NAME
private const val REDUCE_MOTION_EVENT_NAME = "reduceMotionDidChange"
private const val HIGH_TEXT_CONTRAST_EVENT_NAME = "highTextContrastDidChange"
private const val TOUCH_EXPLORATION_EVENT_NAME = "touchExplorationDidChange"
@@ -25,9 +25,10 @@ private class Settings {
public class ReactDevToolsRuntimeSettingsModule(reactContext: ReactApplicationContext?) :
NativeReactDevToolsRuntimeSettingsModuleSpec(reactContext) {
// static to persist across Turbo Module reloads
private companion object {
public companion object {
// static to persist across Turbo Module reloads
private val settings = Settings()
public const val NAME: String = NativeReactDevToolsRuntimeSettingsModuleSpec.NAME
}
override fun setReloadAndProfileConfig(map: ReadableMap) {
@@ -132,7 +132,7 @@ constructor(
}
public companion object {
internal const val NAME = "FrescoModule"
public const val NAME: String = "FrescoModule"
private var hasBeenInitialized = false
/**
@@ -35,4 +35,8 @@ public class I18nManagerModule(context: ReactApplicationContext?) : NativeI18nMa
override fun swapLeftAndRightInRTL(value: Boolean) {
I18nUtil.instance.swapLeftAndRightInRTL(getReactApplicationContext(), value)
}
public companion object {
public const val NAME: String = NativeI18nManagerSpec.NAME
}
}
@@ -183,7 +183,8 @@ public class PermissionsModule(reactContext: ReactApplicationContext?) :
return activity
}
private companion object {
public companion object {
public const val NAME: String = NativePermissionsAndroidSpec.NAME
private const val ERROR_INVALID_ACTIVITY = "E_INVALID_ACTIVITY"
}
}
@@ -26,7 +26,8 @@ public class ReactDevToolsSettingsManagerModule(reactContext: ReactApplicationCo
public override fun getGlobalHookSettings(): String? =
sharedPreferences.getString(KEY_HOOK_SETTINGS, null)
private companion object {
public companion object {
public const val NAME: String = NativeReactDevToolsSettingsManagerSpec.NAME
private const val SHARED_PREFERENCES_PREFIX = "ReactNative__DevToolsSettings"
private const val KEY_HOOK_SETTINGS = "HookSettings"
}
@@ -59,6 +59,7 @@ public class ShareModule(reactContext: ReactApplicationContext) :
}
public companion object {
public const val NAME: String = NativeShareModuleSpec.NAME
const private val ACTION_SHARED: String = "sharedAction"
const public val ERROR_INVALID_CONTENT: String = "E_INVALID_CONTENT"
const private val ERROR_UNABLE_TO_OPEN_DIALOG: String = "E_UNABLE_TO_OPEN_DIALOG"
@@ -23,4 +23,8 @@ public class SoundManagerModule(reactContext: ReactApplicationContext?) :
getReactApplicationContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK)
}
public companion object {
public const val NAME: String = NativeSoundManagerSpec.NAME
}
}
@@ -61,4 +61,8 @@ public class VibrationModule(reactContext: ReactApplicationContext) :
@Suppress("DEPRECATION")
getReactApplicationContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator?
}
public companion object {
public const val NAME: String = NativeVibrationSpec.NAME
}
}
@@ -1,335 +0,0 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.shell;
import android.annotation.SuppressLint;
import androidx.annotation.Nullable;
import com.facebook.react.BaseReactPackage;
import com.facebook.react.ViewManagerOnDemandReactPackage;
import com.facebook.react.animated.NativeAnimatedModule;
import com.facebook.react.bridge.ModuleSpec;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.common.ClassFinder;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.module.annotations.ReactModuleList;
import com.facebook.react.module.model.ReactModuleInfo;
import com.facebook.react.module.model.ReactModuleInfoProvider;
import com.facebook.react.modules.accessibilityinfo.AccessibilityInfoModule;
import com.facebook.react.modules.appearance.AppearanceModule;
import com.facebook.react.modules.appstate.AppStateModule;
import com.facebook.react.modules.blob.BlobModule;
import com.facebook.react.modules.blob.FileReaderModule;
import com.facebook.react.modules.camera.ImageStoreManager;
import com.facebook.react.modules.clipboard.ClipboardModule;
import com.facebook.react.modules.devloading.DevLoadingModule;
import com.facebook.react.modules.devtoolsruntimesettings.ReactDevToolsRuntimeSettingsModule;
import com.facebook.react.modules.dialog.DialogModule;
import com.facebook.react.modules.fresco.FrescoModule;
import com.facebook.react.modules.i18nmanager.I18nManagerModule;
import com.facebook.react.modules.image.ImageLoaderModule;
import com.facebook.react.modules.intent.IntentModule;
import com.facebook.react.modules.network.NetworkingModule;
import com.facebook.react.modules.permissions.PermissionsModule;
import com.facebook.react.modules.reactdevtoolssettings.ReactDevToolsSettingsManagerModule;
import com.facebook.react.modules.share.ShareModule;
import com.facebook.react.modules.sound.SoundManagerModule;
import com.facebook.react.modules.statusbar.StatusBarModule;
import com.facebook.react.modules.toast.ToastModule;
import com.facebook.react.modules.vibration.VibrationModule;
import com.facebook.react.modules.websocket.WebSocketModule;
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.ViewManager;
import com.facebook.react.views.drawer.ReactDrawerLayoutManager;
import com.facebook.react.views.image.ReactImageManager;
import com.facebook.react.views.modal.ReactModalHostManager;
import com.facebook.react.views.progressbar.ReactProgressBarViewManager;
import com.facebook.react.views.safeareaview.ReactSafeAreaViewManager;
import com.facebook.react.views.scroll.ReactHorizontalScrollContainerViewManager;
import com.facebook.react.views.scroll.ReactHorizontalScrollViewManager;
import com.facebook.react.views.scroll.ReactScrollViewManager;
import com.facebook.react.views.swiperefresh.SwipeRefreshLayoutManager;
import com.facebook.react.views.switchview.ReactSwitchManager;
import com.facebook.react.views.text.ReactRawTextManager;
import com.facebook.react.views.text.ReactTextViewManager;
import com.facebook.react.views.text.ReactVirtualTextViewManager;
import com.facebook.react.views.text.frescosupport.FrescoBasedReactTextInlineImageViewManager;
import com.facebook.react.views.textinput.ReactTextInputManager;
import com.facebook.react.views.unimplementedview.ReactUnimplementedViewManager;
import com.facebook.react.views.view.ReactViewManager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Provider;
/** Package defining basic modules and view managers. */
@ReactModuleList(
nativeModules = {
AccessibilityInfoModule.class,
AppearanceModule.class,
AppStateModule.class,
BlobModule.class,
DevLoadingModule.class,
FileReaderModule.class,
ClipboardModule.class,
DialogModule.class,
FrescoModule.class,
I18nManagerModule.class,
ImageLoaderModule.class,
ImageStoreManager.class,
IntentModule.class,
NativeAnimatedModule.class,
NetworkingModule.class,
PermissionsModule.class,
ReactDevToolsSettingsManagerModule.class,
ReactDevToolsRuntimeSettingsModule.class,
ShareModule.class,
SoundManagerModule.class,
StatusBarModule.class,
ToastModule.class,
VibrationModule.class,
WebSocketModule.class,
})
public class MainReactPackage extends BaseReactPackage implements ViewManagerOnDemandReactPackage {
private MainPackageConfig mConfig;
private @Nullable Map<String, ModuleSpec> mViewManagers;
public MainReactPackage() {}
/** Create a new package with configuration */
public MainReactPackage(MainPackageConfig config) {
mConfig = config;
}
@Override
public @Nullable NativeModule getModule(String name, ReactApplicationContext context) {
switch (name) {
case AccessibilityInfoModule.NAME:
return new AccessibilityInfoModule(context);
case AppearanceModule.NAME:
return new AppearanceModule(context);
case AppStateModule.NAME:
return new AppStateModule(context);
case BlobModule.NAME:
return new BlobModule(context);
case DevLoadingModule.NAME:
return new DevLoadingModule(context);
case FileReaderModule.NAME:
return new FileReaderModule(context);
case ClipboardModule.NAME:
return new ClipboardModule(context);
case DialogModule.NAME:
return new DialogModule(context);
case FrescoModule.NAME:
return new FrescoModule(context, true, mConfig != null ? mConfig.getFrescoConfig() : null);
case I18nManagerModule.NAME:
return new I18nManagerModule(context);
case ImageLoaderModule.NAME:
return new ImageLoaderModule(context);
case ImageStoreManager.NAME:
return new ImageStoreManager(context);
case IntentModule.NAME:
return new IntentModule(context);
case NativeAnimatedModule.NAME:
return new NativeAnimatedModule(context);
case NetworkingModule.NAME:
return new NetworkingModule(context);
case PermissionsModule.NAME:
return new PermissionsModule(context);
case ShareModule.NAME:
return new ShareModule(context);
case StatusBarModule.NAME:
return new StatusBarModule(context);
case SoundManagerModule.NAME:
return new SoundManagerModule(context);
case ToastModule.NAME:
return new ToastModule(context);
case VibrationModule.NAME:
return new VibrationModule(context);
case WebSocketModule.NAME:
return new WebSocketModule(context);
case ReactDevToolsSettingsManagerModule.NAME:
return new ReactDevToolsSettingsManagerModule(context);
case ReactDevToolsRuntimeSettingsModule.NAME:
return new ReactDevToolsRuntimeSettingsModule(context);
default:
return null;
}
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
List<ViewManager> viewManagers = new ArrayList<>();
viewManagers.add(new ReactDrawerLayoutManager());
viewManagers.add(new ReactHorizontalScrollViewManager());
viewManagers.add(new ReactHorizontalScrollContainerViewManager());
viewManagers.add(new ReactProgressBarViewManager());
viewManagers.add(new ReactScrollViewManager());
viewManagers.add(new ReactSwitchManager());
viewManagers.add(new ReactSafeAreaViewManager());
viewManagers.add(new SwipeRefreshLayoutManager());
// Native equivalents
viewManagers.add(new FrescoBasedReactTextInlineImageViewManager());
viewManagers.add(new ReactImageManager());
viewManagers.add(new ReactModalHostManager());
viewManagers.add(new ReactRawTextManager());
viewManagers.add(new ReactTextInputManager());
viewManagers.add(new ReactTextViewManager());
viewManagers.add(new ReactViewManager());
viewManagers.add(new ReactVirtualTextViewManager());
viewManagers.add(new ReactUnimplementedViewManager());
return viewManagers;
}
private static void appendMap(
Map<String, ModuleSpec> map, String name, Provider<? extends NativeModule> provider) {
map.put(name, ModuleSpec.viewManagerSpec(provider));
}
/**
* @return a map of view managers that should be registered with {@link UIManagerModule}
*/
@SuppressLint("VisibleForTests")
public Map<String, ModuleSpec> getViewManagersMap() {
if (mViewManagers == null) {
Map<String, ModuleSpec> viewManagers = new HashMap<>();
appendMap(viewManagers, ReactDrawerLayoutManager.REACT_CLASS, ReactDrawerLayoutManager::new);
appendMap(
viewManagers,
ReactHorizontalScrollViewManager.REACT_CLASS,
ReactHorizontalScrollViewManager::new);
appendMap(
viewManagers,
ReactHorizontalScrollContainerViewManager.REACT_CLASS,
ReactHorizontalScrollContainerViewManager::new);
appendMap(
viewManagers, ReactProgressBarViewManager.REACT_CLASS, ReactProgressBarViewManager::new);
appendMap(viewManagers, ReactSafeAreaViewManager.REACT_CLASS, ReactSafeAreaViewManager::new);
appendMap(viewManagers, ReactScrollViewManager.REACT_CLASS, ReactScrollViewManager::new);
appendMap(viewManagers, ReactSwitchManager.REACT_CLASS, ReactSwitchManager::new);
appendMap(
viewManagers, SwipeRefreshLayoutManager.REACT_CLASS, SwipeRefreshLayoutManager::new);
appendMap(
viewManagers,
FrescoBasedReactTextInlineImageViewManager.REACT_CLASS,
FrescoBasedReactTextInlineImageViewManager::new);
appendMap(viewManagers, ReactImageManager.REACT_CLASS, ReactImageManager::new);
appendMap(viewManagers, ReactModalHostManager.REACT_CLASS, ReactModalHostManager::new);
appendMap(viewManagers, ReactRawTextManager.REACT_CLASS, ReactRawTextManager::new);
appendMap(viewManagers, ReactTextInputManager.REACT_CLASS, ReactTextInputManager::new);
appendMap(viewManagers, ReactTextViewManager.REACT_CLASS, ReactTextViewManager::new);
appendMap(viewManagers, ReactViewManager.REACT_CLASS, ReactViewManager::new);
appendMap(
viewManagers, ReactVirtualTextViewManager.REACT_CLASS, ReactVirtualTextViewManager::new);
appendMap(
viewManagers,
ReactUnimplementedViewManager.REACT_CLASS,
ReactUnimplementedViewManager::new);
mViewManagers = viewManagers;
}
return mViewManagers;
}
@Override
public List<ModuleSpec> getViewManagers(ReactApplicationContext reactContext) {
return new ArrayList<>(getViewManagersMap().values());
}
@Override
public Collection<String> getViewManagerNames(ReactApplicationContext reactContext) {
return getViewManagersMap().keySet();
}
@Override
public @Nullable ViewManager createViewManager(
ReactApplicationContext reactContext, String viewManagerName) {
ModuleSpec spec = getViewManagersMap().get(viewManagerName);
return spec != null ? (ViewManager) spec.getProvider().get() : null;
}
@Override
public ReactModuleInfoProvider getReactModuleInfoProvider() {
if (!ClassFinder.canLoadClassesFromAnnotationProcessors()) {
return fallbackForMissingClass();
}
try {
Class<?> reactModuleInfoProviderClass =
ClassFinder.findClass(
"com.facebook.react.shell.MainReactPackage$$ReactModuleInfoProvider");
return (ReactModuleInfoProvider) reactModuleInfoProviderClass.newInstance();
} catch (ClassNotFoundException e) {
return fallbackForMissingClass();
} catch (InstantiationException e) {
throw new RuntimeException(
"No ReactModuleInfoProvider for"
+ " com.facebook.react.shell.MainReactPackage$$ReactModuleInfoProvider",
e);
} catch (IllegalAccessException e) {
throw new RuntimeException(
"No ReactModuleInfoProvider for"
+ " com.facebook.react.shell.MainReactPackage$$ReactModuleInfoProvider",
e);
}
}
private ReactModuleInfoProvider fallbackForMissingClass() {
// In the OSS case, the annotation processor does not run.
// We fall back to creating this by hand
Class<? extends NativeModule>[] moduleList =
new Class[] {
AccessibilityInfoModule.class,
AppearanceModule.class,
AppStateModule.class,
BlobModule.class,
DevLoadingModule.class,
FileReaderModule.class,
ClipboardModule.class,
DialogModule.class,
FrescoModule.class,
I18nManagerModule.class,
ImageLoaderModule.class,
ImageStoreManager.class,
IntentModule.class,
NativeAnimatedModule.class,
NetworkingModule.class,
PermissionsModule.class,
ReactDevToolsSettingsManagerModule.class,
ReactDevToolsRuntimeSettingsModule.class,
ShareModule.class,
StatusBarModule.class,
SoundManagerModule.class,
ToastModule.class,
VibrationModule.class,
WebSocketModule.class
};
final Map<String, ReactModuleInfo> reactModuleInfoMap = new HashMap<>();
for (Class<? extends NativeModule> moduleClass : moduleList) {
ReactModule reactModule = moduleClass.getAnnotation(ReactModule.class);
if (reactModule != null) {
reactModuleInfoMap.put(
reactModule.name(),
new ReactModuleInfo(
reactModule.name(),
moduleClass.getName(),
reactModule.canOverrideExistingModule(),
reactModule.needsEagerInit(),
reactModule.isCxxModule(),
ReactModuleInfo.classIsTurboModule(moduleClass)));
}
}
return () -> reactModuleInfoMap;
}
}
@@ -0,0 +1,272 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.react.shell
import android.annotation.SuppressLint
import com.facebook.react.BaseReactPackage
import com.facebook.react.ViewManagerOnDemandReactPackage
import com.facebook.react.animated.NativeAnimatedModule
import com.facebook.react.bridge.ModuleSpec
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.common.ClassFinder
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.module.annotations.ReactModuleList
import com.facebook.react.module.model.ReactModuleInfo
import com.facebook.react.module.model.ReactModuleInfo.Companion.classIsTurboModule
import com.facebook.react.module.model.ReactModuleInfoProvider
import com.facebook.react.modules.accessibilityinfo.AccessibilityInfoModule
import com.facebook.react.modules.appearance.AppearanceModule
import com.facebook.react.modules.appstate.AppStateModule
import com.facebook.react.modules.blob.BlobModule
import com.facebook.react.modules.blob.FileReaderModule
import com.facebook.react.modules.camera.ImageStoreManager
import com.facebook.react.modules.clipboard.ClipboardModule
import com.facebook.react.modules.devloading.DevLoadingModule
import com.facebook.react.modules.devtoolsruntimesettings.ReactDevToolsRuntimeSettingsModule
import com.facebook.react.modules.dialog.DialogModule
import com.facebook.react.modules.fresco.FrescoModule
import com.facebook.react.modules.i18nmanager.I18nManagerModule
import com.facebook.react.modules.image.ImageLoaderModule
import com.facebook.react.modules.intent.IntentModule
import com.facebook.react.modules.network.NetworkingModule
import com.facebook.react.modules.permissions.PermissionsModule
import com.facebook.react.modules.reactdevtoolssettings.ReactDevToolsSettingsManagerModule
import com.facebook.react.modules.share.ShareModule
import com.facebook.react.modules.sound.SoundManagerModule
import com.facebook.react.modules.statusbar.StatusBarModule
import com.facebook.react.modules.toast.ToastModule
import com.facebook.react.modules.vibration.VibrationModule
import com.facebook.react.modules.websocket.WebSocketModule
import com.facebook.react.uimanager.ViewManager
import com.facebook.react.views.drawer.ReactDrawerLayoutManager
import com.facebook.react.views.image.ReactImageManager
import com.facebook.react.views.modal.ReactModalHostManager
import com.facebook.react.views.progressbar.ReactProgressBarViewManager
import com.facebook.react.views.safeareaview.ReactSafeAreaViewManager
import com.facebook.react.views.scroll.ReactHorizontalScrollContainerViewManager
import com.facebook.react.views.scroll.ReactHorizontalScrollViewManager
import com.facebook.react.views.scroll.ReactScrollViewManager
import com.facebook.react.views.swiperefresh.SwipeRefreshLayoutManager
import com.facebook.react.views.switchview.ReactSwitchManager
import com.facebook.react.views.text.ReactRawTextManager
import com.facebook.react.views.text.ReactTextViewManager
import com.facebook.react.views.text.ReactVirtualTextViewManager
import com.facebook.react.views.text.frescosupport.FrescoBasedReactTextInlineImageViewManager
import com.facebook.react.views.textinput.ReactTextInputManager
import com.facebook.react.views.unimplementedview.ReactUnimplementedViewManager
import com.facebook.react.views.view.ReactViewManager
/**
* Package defining basic modules and view managers.
*
* @param config configuration for the Main package.
*/
@ReactModuleList(
nativeModules =
[
AccessibilityInfoModule::class,
AppearanceModule::class,
AppStateModule::class,
BlobModule::class,
DevLoadingModule::class,
FileReaderModule::class,
ClipboardModule::class,
DialogModule::class,
FrescoModule::class,
I18nManagerModule::class,
ImageLoaderModule::class,
ImageStoreManager::class,
IntentModule::class,
NativeAnimatedModule::class,
NetworkingModule::class,
PermissionsModule::class,
ReactDevToolsSettingsManagerModule::class,
ReactDevToolsRuntimeSettingsModule::class,
ShareModule::class,
SoundManagerModule::class,
StatusBarModule::class,
ToastModule::class,
VibrationModule::class,
WebSocketModule::class,
])
public class MainReactPackage
@JvmOverloads
constructor(private val config: MainPackageConfig? = null) :
BaseReactPackage(), ViewManagerOnDemandReactPackage {
override fun getModule(name: String, context: ReactApplicationContext): NativeModule? =
when (name) {
AccessibilityInfoModule.NAME -> AccessibilityInfoModule(context)
AppearanceModule.NAME -> AppearanceModule(context)
AppStateModule.NAME -> AppStateModule(context)
BlobModule.NAME -> BlobModule(context)
DevLoadingModule.NAME -> DevLoadingModule(context)
FileReaderModule.NAME -> FileReaderModule(context)
ClipboardModule.NAME -> ClipboardModule(context)
DialogModule.NAME -> DialogModule(context)
FrescoModule.NAME -> FrescoModule(context, true, config?.frescoConfig)
I18nManagerModule.NAME -> I18nManagerModule(context)
ImageLoaderModule.NAME -> ImageLoaderModule(context)
ImageStoreManager.NAME -> ImageStoreManager(context)
IntentModule.NAME -> IntentModule(context)
NativeAnimatedModule.NAME -> NativeAnimatedModule(context)
NetworkingModule.NAME -> NetworkingModule(context)
PermissionsModule.NAME -> PermissionsModule(context)
ShareModule.NAME -> ShareModule(context)
StatusBarModule.NAME -> StatusBarModule(context)
SoundManagerModule.NAME -> SoundManagerModule(context)
ToastModule.NAME -> ToastModule(context)
VibrationModule.NAME -> VibrationModule(context)
WebSocketModule.NAME -> WebSocketModule(context)
ReactDevToolsSettingsManagerModule.NAME -> ReactDevToolsSettingsManagerModule(context)
ReactDevToolsRuntimeSettingsModule.NAME -> ReactDevToolsRuntimeSettingsModule(context)
else -> null
}
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> =
listOf(
ReactDrawerLayoutManager(),
ReactHorizontalScrollViewManager(),
ReactHorizontalScrollContainerViewManager(),
ReactProgressBarViewManager(),
ReactScrollViewManager(),
ReactSwitchManager(),
ReactSafeAreaViewManager(),
SwipeRefreshLayoutManager(),
// Native equivalents
FrescoBasedReactTextInlineImageViewManager(),
ReactImageManager(),
ReactModalHostManager(),
ReactRawTextManager(),
ReactTextInputManager(),
ReactTextViewManager(),
ReactViewManager(),
ReactVirtualTextViewManager(),
ReactUnimplementedViewManager())
/**
* A map of view managers that should be registered with
* [com.facebook.react.uimanager.UIManagerModule]
*/
@SuppressLint("VisibleForTests")
public val viewManagersMap: Map<String, ModuleSpec> =
mapOf(
ReactDrawerLayoutManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactDrawerLayoutManager() },
ReactHorizontalScrollViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactHorizontalScrollViewManager() },
ReactHorizontalScrollContainerViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactHorizontalScrollContainerViewManager() },
ReactProgressBarViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactProgressBarViewManager() },
ReactSafeAreaViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactSafeAreaViewManager() },
ReactScrollViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactScrollViewManager() },
ReactSwitchManager.REACT_CLASS to ModuleSpec.viewManagerSpec { ReactSwitchManager() },
SwipeRefreshLayoutManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { SwipeRefreshLayoutManager() },
FrescoBasedReactTextInlineImageViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { FrescoBasedReactTextInlineImageViewManager() },
ReactImageManager.REACT_CLASS to ModuleSpec.viewManagerSpec { ReactImageManager() },
ReactModalHostManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactModalHostManager() },
ReactRawTextManager.REACT_CLASS to ModuleSpec.viewManagerSpec { ReactRawTextManager() },
ReactTextInputManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactTextInputManager() },
ReactTextViewManager.REACT_CLASS to ModuleSpec.viewManagerSpec { ReactTextViewManager() },
ReactViewManager.REACT_CLASS to ModuleSpec.viewManagerSpec { ReactViewManager() },
ReactVirtualTextViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactVirtualTextViewManager() },
ReactUnimplementedViewManager.REACT_CLASS to
ModuleSpec.viewManagerSpec { ReactUnimplementedViewManager() })
public override fun getViewManagers(reactContext: ReactApplicationContext): List<ModuleSpec> =
viewManagersMap.values.toList()
override fun getViewManagerNames(reactContext: ReactApplicationContext): Collection<String> =
viewManagersMap.keys
override fun createViewManager(
reactContext: ReactApplicationContext,
viewManagerName: String
): ViewManager<*, *>? {
val spec = viewManagersMap[viewManagerName]
return spec?.provider?.get() as? ViewManager<*, *>
}
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
if (!ClassFinder.canLoadClassesFromAnnotationProcessors()) {
return fallbackForMissingClass()
}
try {
val reactModuleInfoProviderClass =
ClassFinder.findClass(
"com.facebook.react.shell.MainReactPackage$\$ReactModuleInfoProvider")
@Suppress("DEPRECATION")
return reactModuleInfoProviderClass?.newInstance() as? ReactModuleInfoProvider
?: fallbackForMissingClass()
} catch (e: ClassNotFoundException) {
return fallbackForMissingClass()
} catch (e: InstantiationException) {
throw RuntimeException(
"No ReactModuleInfoProvider for MainReactPackage$\$ReactModuleInfoProvider", e)
} catch (e: IllegalAccessException) {
throw RuntimeException(
"No ReactModuleInfoProvider for MainReactPackage$\$ReactModuleInfoProvider", e)
}
}
private fun fallbackForMissingClass(): ReactModuleInfoProvider {
// In the OSS case, the annotation processor does not run.
// We fall back to creating this by hand
val moduleList: Array<Class<*>> =
arrayOf(
AccessibilityInfoModule::class.java,
AppearanceModule::class.java,
AppStateModule::class.java,
BlobModule::class.java,
DevLoadingModule::class.java,
FileReaderModule::class.java,
ClipboardModule::class.java,
DialogModule::class.java,
FrescoModule::class.java,
I18nManagerModule::class.java,
ImageLoaderModule::class.java,
ImageStoreManager::class.java,
IntentModule::class.java,
NativeAnimatedModule::class.java,
NetworkingModule::class.java,
PermissionsModule::class.java,
ReactDevToolsSettingsManagerModule::class.java,
ReactDevToolsRuntimeSettingsModule::class.java,
ShareModule::class.java,
StatusBarModule::class.java,
SoundManagerModule::class.java,
ToastModule::class.java,
VibrationModule::class.java,
WebSocketModule::class.java)
val moduleMap =
moduleList
.filter { it.isAnnotationPresent(ReactModule::class.java) }
.associate { moduleClass ->
val reactModule = checkNotNull(moduleClass.getAnnotation(ReactModule::class.java))
reactModule.name to
ReactModuleInfo(
reactModule.name,
moduleClass.name,
reactModule.canOverrideExistingModule,
reactModule.needsEagerInit,
reactModule.isCxxModule,
classIsTurboModule(moduleClass))
}
return ReactModuleInfoProvider { moduleMap }
}
}