<lambda>null1 package versioned.host.exp.exponent.modules.universal
2 
3 import com.facebook.react.bridge.NativeModule
4 import com.facebook.react.bridge.ReactApplicationContext
5 import expo.modules.adapters.react.ModuleRegistryAdapter
6 import expo.modules.adapters.react.ReactModuleRegistryProvider
7 import expo.modules.core.interfaces.RegistryLifecycleListener
8 import expo.modules.font.FontLoaderModule
9 import expo.modules.kotlin.ModulesProvider
10 import expo.modules.manifests.core.Manifest
11 import host.exp.exponent.kernel.ExperienceKey
12 import host.exp.exponent.utils.ScopedContext
13 import versioned.host.exp.exponent.core.modules.ExpoGoModule
14 import versioned.host.exp.exponent.modules.api.notifications.ScopedNotificationsCategoriesSerializer
15 import versioned.host.exp.exponent.modules.api.notifications.channels.ScopedNotificationsChannelsProvider
16 import versioned.host.exp.exponent.modules.universal.av.SharedCookiesDataSourceFactoryProvider
17 import versioned.host.exp.exponent.modules.universal.notifications.ScopedExpoNotificationCategoriesModule
18 import versioned.host.exp.exponent.modules.universal.notifications.ScopedExpoNotificationPresentationModule
19 import versioned.host.exp.exponent.modules.universal.notifications.ScopedNotificationScheduler
20 import versioned.host.exp.exponent.modules.universal.notifications.ScopedNotificationsEmitter
21 import versioned.host.exp.exponent.modules.universal.notifications.ScopedNotificationsHandler
22 import versioned.host.exp.exponent.modules.universal.notifications.ScopedServerRegistrationModule
23 import versioned.host.exp.exponent.modules.universal.sensors.ScopedAccelerometerService
24 import versioned.host.exp.exponent.modules.universal.sensors.ScopedGravitySensorService
25 import versioned.host.exp.exponent.modules.universal.sensors.ScopedGyroscopeService
26 import versioned.host.exp.exponent.modules.universal.sensors.ScopedLinearAccelerationSensorService
27 import versioned.host.exp.exponent.modules.universal.sensors.ScopedMagnetometerService
28 import versioned.host.exp.exponent.modules.universal.sensors.ScopedMagnetometerUncalibratedService
29 import versioned.host.exp.exponent.modules.universal.sensors.ScopedRotationVectorSensorService
30 
31 open class ExpoModuleRegistryAdapter(moduleRegistryProvider: ReactModuleRegistryProvider?, modulesProvider: ModulesProvider? = null) :
32   ModuleRegistryAdapter(moduleRegistryProvider, modulesProvider), ScopedModuleRegistryAdapter {
33   override fun createNativeModules(
34     scopedContext: ScopedContext,
35     experienceKey: ExperienceKey,
36     experienceProperties: Map<String, Any?>,
37     manifest: Manifest,
38     otherModules: List<NativeModule>
39   ): List<NativeModule> {
40     val moduleRegistry = mModuleRegistryProvider[scopedContext]
41 
42     // Overriding sensor services from expo-sensors for scoped implementations using kernel services
43     moduleRegistry.registerInternalModule(ScopedAccelerometerService(experienceKey))
44     moduleRegistry.registerInternalModule(ScopedGravitySensorService(experienceKey))
45     moduleRegistry.registerInternalModule(ScopedGyroscopeService(experienceKey))
46     moduleRegistry.registerInternalModule(ScopedLinearAccelerationSensorService(experienceKey))
47     moduleRegistry.registerInternalModule(ScopedMagnetometerService(experienceKey))
48     moduleRegistry.registerInternalModule(ScopedMagnetometerUncalibratedService(experienceKey))
49     moduleRegistry.registerInternalModule(ScopedRotationVectorSensorService(experienceKey))
50     moduleRegistry.registerInternalModule(SharedCookiesDataSourceFactoryProvider())
51 
52     // Overriding expo-constants/ConstantsService -- binding provides manifest and other expo-related constants
53     moduleRegistry.registerInternalModule(ConstantsBinding(scopedContext, experienceProperties, manifest))
54 
55     // Overriding expo-file-system FilePermissionModule
56     moduleRegistry.registerInternalModule(ScopedFilePermissionModule(scopedContext))
57 
58     // Overriding expo-permissions ScopedPermissionsService
59     moduleRegistry.registerInternalModule(ScopedPermissionsService(scopedContext, experienceKey))
60 
61     // Overriding expo-updates UpdatesService
62     moduleRegistry.registerInternalModule(UpdatesBinding(scopedContext, experienceProperties))
63 
64     // Overriding expo-notifications classes
65     moduleRegistry.registerInternalModule(ScopedNotificationsChannelsProvider(scopedContext, experienceKey))
66     moduleRegistry.registerInternalModule(ScopedNotificationsCategoriesSerializer())
67 
68     // ReactAdapterPackage requires ReactContext
69     val reactContext = scopedContext.context as ReactApplicationContext
70     for (internalModule in mReactAdapterPackage.createInternalModules(reactContext)) {
71       moduleRegistry.registerInternalModule(internalModule)
72     }
73 
74     // Overriding ScopedUIManagerModuleWrapper from ReactAdapterPackage
75     moduleRegistry.registerInternalModule(ScopedUIManagerModuleWrapper(reactContext))
76 
77     // Adding other modules (not universal) to module registry as consumers.
78     // It allows these modules to refer to universal modules.
79     for (otherModule in otherModules) {
80       if (otherModule is RegistryLifecycleListener) {
81         moduleRegistry.registerExtraListener(otherModule as RegistryLifecycleListener)
82       }
83     }
84     return getNativeModulesFromModuleRegistry(
85       reactContext,
86       moduleRegistry
87     ) { appContext ->
88       with(appContext.registry) {
89         register(
90           ExpoGoModule(manifest),
91           ScopedSecureStoreModule(scopedContext),
92           object : FontLoaderModule() {
93             override val prefix: String
94               get() = "ExpoFont-"
95           }
96         )
97 
98         // Notifications
99         register(
100           ScopedNotificationsEmitter(scopedContext, experienceKey),
101           ScopedNotificationsHandler(scopedContext, experienceKey),
102           ScopedServerRegistrationModule(),
103           ScopedNotificationScheduler(scopedContext, experienceKey),
104           ScopedExpoNotificationPresentationModule(scopedContext, experienceKey),
105           ScopedExpoNotificationCategoriesModule(experienceKey)
106         )
107       }
108     }
109   }
110 
111   override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
112     throw RuntimeException("Use other implementation of createNativeModules to get a list of native modules.")
113   }
114 }
115