Skip to content

Commit f5346d4

Browse files
committed
feat: implement new architecture support for RNIterableAPI with modular structure
1 parent 5abcb25 commit f5346d4

6 files changed

Lines changed: 147 additions & 23 deletions

File tree

android/build.gradle

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@
9999
// // api project(":iterableapi") // links to local android SDK repo rather than by release
100100
// }
101101

102+
def isNewArchitectureEnabled() {
103+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
104+
}
102105

103106
buildscript {
104107
ext.getExtOrDefault = {name ->
@@ -121,7 +124,9 @@ buildscript {
121124
apply plugin: "com.android.library"
122125
apply plugin: "kotlin-android"
123126

124-
apply plugin: "com.facebook.react"
127+
if (isNewArchitectureEnabled()) {
128+
apply plugin: "com.facebook.react"
129+
}
125130

126131
def getExtOrIntegerDefault(name) {
127132
return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["RNIterable_" + name]).toInteger()
@@ -135,6 +140,7 @@ android {
135140
defaultConfig {
136141
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
137142
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
143+
buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString())
138144
}
139145

140146
buildFeatures {
@@ -158,10 +164,15 @@ android {
158164

159165
sourceSets {
160166
main {
161-
java.srcDirs += [
162-
"generated/java",
163-
"generated/jni"
164-
]
167+
// java.srcDirs += [
168+
// "generated/java",
169+
// "generated/jni"
170+
// ]
171+
if (isNewArchitectureEnabled()) {
172+
java.srcDirs += ['src/newarch']
173+
} else {
174+
java.srcDirs += ['src/oldarch']
175+
}
165176
}
166177
}
167178
}
@@ -179,9 +190,11 @@ dependencies {
179190
api "com.iterable:iterableapi:3.5.2"
180191
}
181192

182-
react {
183-
jsRootDir = file("../src/api/")
184-
libraryName = "RNIterableAPISpec"
185-
codegenJavaPackageName = "com.iterable.reactnative"
186-
}
193+
// if (isNewArchitectureEnabled()) {
194+
// react {
195+
// jsRootDir = file("../src/api/")
196+
// libraryName = "RNIterableAPISpec"
197+
// codegenJavaPackageName = "com.iterable.reactnative"
198+
// }
199+
// }
187200

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.iterable.reactnative;
2+
3+
import androidx.annotation.NonNull;
4+
import com.facebook.react.bridge.Promise;
5+
import java.util.Map;
6+
import java.util.HashMap;
7+
8+
public class RNIterableAPIModuleImpl {
9+
10+
public static final String NAME = "RNIterableAPI";
11+
12+
public static void add(double a, double b, Promise promise) {
13+
promise.resolve(a + b);
14+
}
15+
16+
}

android/src/main/java/com/iterable/reactnative/RNIterableAPIPackage.java

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,60 @@
33
import java.util.ArrayList;
44
import java.util.Arrays;
55
import java.util.Collections;
6+
import java.util.HashMap;
67
import java.util.List;
8+
import java.util.Map;
79

8-
import com.facebook.react.ReactPackage;
10+
import androidx.annotation.Nullable;
11+
import com.facebook.react.bridge.JavaScriptModule; // TODO: instructrions says to remove
912
import com.facebook.react.bridge.NativeModule;
1013
import com.facebook.react.bridge.ReactApplicationContext;
14+
import com.facebook.react.module.model.ReactModuleInfo;
15+
import com.facebook.react.module.model.ReactModuleInfoProvider;
16+
import com.facebook.react.ReactPackage; // TODO: instructrions says to remove
17+
import com.facebook.react.TurboReactPackage;
1118
import com.facebook.react.uimanager.ViewManager;
12-
import com.facebook.react.bridge.JavaScriptModule;
1319

14-
public class RNIterableAPIPackage implements ReactPackage {
15-
@Override
16-
public List<NativeModule> createNativeModules(
17-
ReactApplicationContext reactContext) {
18-
List<NativeModule> modules = new ArrayList<>();
19-
20-
modules.add(new RNIterableAPIModule(reactContext));
2120

22-
return modules;
21+
public class RNIterableAPIPackage extends TurboReactPackage {
22+
@Nullable
23+
@Override
24+
public NativeModule getModule(String name, ReactApplicationContext reactContext) {
25+
if (name.equals(RNIterableAPIModuleImpl.NAME)) {
26+
return new RNIterableAPIModule(reactContext);
27+
} else {
28+
return null;
29+
}
2330
}
31+
// public List<NativeModule> createNativeModules(
32+
// ReactApplicationContext reactContext) {
33+
// List<NativeModule> modules = new ArrayList<>();
34+
35+
// modules.add(new RNIterableAPIModule(reactContext));
2436

37+
// return modules;
38+
// }
2539
@Override
26-
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
27-
return Collections.emptyList();
40+
public ReactModuleInfoProvider getReactModuleInfoProvider() {
41+
return () -> {
42+
final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
43+
boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
44+
moduleInfos.put(
45+
RNIterableAPIModuleImpl.NAME,
46+
new ReactModuleInfo(
47+
RNIterableAPIModuleImpl.NAME,
48+
RNIterableAPIModuleImpl.NAME,
49+
false, // canOverrideExistingModule
50+
false, // needsEagerInit
51+
true, // hasConstants
52+
false, // isCxxModule
53+
isTurboModule // isTurboModule
54+
));
55+
return moduleInfos;
56+
};
2857
}
58+
// @Override
59+
// public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
60+
// return Collections.emptyList();
61+
// }
2962
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.iterable.reactnative;
2+
3+
import androidx.annotation.NonNull;
4+
import com.facebook.react.bridge.NativeModule;
5+
import com.facebook.react.bridge.Promise;
6+
import com.facebook.react.bridge.ReactApplicationContext;
7+
import com.facebook.react.bridge.ReactContext;
8+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
9+
import com.facebook.react.bridge.ReactMethod;
10+
import java.util.Map;
11+
import java.util.HashMap;
12+
13+
public class RNIterableAPIModule extends NativeRNIterableAPISpec {
14+
private final ReactApplicationContext reactContext;
15+
16+
RNIterableAPIModule(ReactApplicationContext context) {
17+
super(context);
18+
this.reactContext = context;
19+
}
20+
21+
@Override
22+
@NonNull
23+
public String getName() {
24+
return RNIterableAPIModuleImpl.NAME;
25+
}
26+
27+
@Override
28+
public void add(double a, double b, Promise promise) {
29+
// promise.resolve(a + b);
30+
RNIterableAPIModuleImpl.add(a, b, promise);
31+
}
32+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.iterable.reactnative;
2+
3+
import com.facebook.react.bridge.NativeModule;
4+
import com.facebook.react.bridge.Promise;
5+
import com.facebook.react.bridge.ReactApplicationContext;
6+
import com.facebook.react.bridge.ReactContext;
7+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
8+
import com.facebook.react.bridge.ReactMethod;
9+
import java.util.Map;
10+
import java.util.HashMap;
11+
12+
public class RNIterableAPIModule extends ReactContextBaseJavaModule {
13+
private final ReactApplicationContext reactContext;
14+
15+
RNIterableAPIModule(ReactApplicationContext context) {
16+
super(context);
17+
this.reactContext = context;
18+
}
19+
20+
@Override
21+
public String getName() {
22+
return RNIterableAPIModuleImpl.NAME;
23+
}
24+
25+
@ReactMethod
26+
public void add(int a, int b, Promise promise) {
27+
// promise.resolve(a + b);
28+
RNIterableAPIModuleImpl.add(a, b, promise);
29+
}
30+
}

example/android/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
3232
# your application. You should enable this flag either if you want
3333
# to write custom TurboModules/Fabric components OR use libraries that
3434
# are providing them.
35-
newArchEnabled=false
35+
newArchEnabled=true
3636

3737
# Use this property to enable or disable the Hermes JS engine.
3838
# If set to false, you will be using JSC instead.

0 commit comments

Comments
 (0)