Skip to content

Commit 3701d9d

Browse files
WoLewickizoontek
andauthored
feat: add new arch (#748)
* feat: add FabricExample app * feat: add code from example * feat: add codegen spec and entry point for RN * feat: add spec and change methods files * feat: add Android impl * feat: add iOS impl * feat: enable new arch without permissions type working * fix: make both platforms work on both archs * chore: rename back to rnpermissions * chore: remove FabricExample from PR * fix: ts * fix: lazily get constants * fix package.json --------- Co-authored-by: Mathieu Acthernoene <zoontek@gmail.com>
1 parent 863d50d commit 3701d9d

36 files changed

+567
-150
lines changed

RNPermissions.podspec

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
require 'json'
22
package = JSON.parse(File.read('./package.json'))
33

4+
fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
5+
46
Pod::Spec.new do |s|
57
s.name = "RNPermissions"
6-
s.dependency "React-Core"
78

89
s.version = package["version"]
910
s.license = package["license"]
@@ -16,5 +17,29 @@ Pod::Spec.new do |s|
1617
s.requires_arc = true
1718

1819
s.source = { :git => package["repository"]["url"], :tag => s.version }
19-
s.source_files = "ios/*.{h,m,mm}"
20+
s.source_files = "ios/*.{h,m,mm}"
21+
22+
if fabric_enabled
23+
folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
24+
25+
s.pod_target_xcconfig = {
26+
'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"',
27+
'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17',
28+
}
29+
s.platforms = { ios: '11.0', tvos: '11.0' }
30+
s.compiler_flags = folly_compiler_flags + ' -DRCT_NEW_ARCH_ENABLED'
31+
32+
s.dependency "React"
33+
s.dependency "React-RCTFabric" # This is for fabric component
34+
s.dependency "React-Codegen"
35+
s.dependency "RCT-Folly"
36+
s.dependency "RCTRequired"
37+
s.dependency "RCTTypeSafety"
38+
s.dependency "ReactCommon/turbomodule/core"
39+
else
40+
s.platforms = { :ios => "9.0", :tvos => "9.0" }
41+
42+
s.dependency "React-Core"
43+
end
44+
2045
end

android/build.gradle

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,57 @@ buildscript {
1919

2020
apply plugin: "com.android.library"
2121

22+
def resolveReactNativeDirectory() {
23+
// monorepo workaround
24+
// react-native can be hoisted or in project's own node_modules
25+
def reactNativeFromProjectNodeModules = file("${rootProject.projectDir}/../node_modules/react-native")
26+
if (reactNativeFromProjectNodeModules.exists()) {
27+
return reactNativeFromProjectNodeModules
28+
}
29+
30+
def reactNativeFromNodeModulesWithLibrary = file("${projectDir}/../../react-native")
31+
if (reactNativeFromNodeModulesWithLibrary.exists()) {
32+
return reactNativeFromNodeModulesWithLibrary
33+
}
34+
35+
throw new Exception(
36+
"[react-native-clipboard] Unable to resolve react-native location in " +
37+
"node_modules. You should add project extension property (in app/build.gradle) " +
38+
"`REACT_NATIVE_NODE_MODULES_DIR` with path to react-native."
39+
)
40+
}
41+
42+
def REACT_NATIVE_DIR = resolveReactNativeDirectory()
43+
44+
def reactProperties = new Properties()
45+
file("$REACT_NATIVE_DIR/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
46+
47+
def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME")
48+
def REACT_NATIVE_MINOR_VERSION = REACT_NATIVE_VERSION.startsWith("0.0.0-") ? 1000 : REACT_NATIVE_VERSION.split("\\.")[1].toInteger()
49+
50+
def isNewArchitectureEnabled() {
51+
// To opt-in for the New Architecture, you can either:
52+
// - Set `newArchEnabled` to true inside the `gradle.properties` file
53+
// - Invoke gradle with `-newArchEnabled=true`
54+
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
55+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
56+
}
57+
58+
if (isNewArchitectureEnabled()) {
59+
apply plugin: "com.facebook.react"
60+
}
61+
2262
android {
63+
64+
// Used to override the NDK path/version on internal CI or by allowing
65+
// users to customize the NDK path/version from their root project (e.g. for M1 support)
66+
if (rootProject.hasProperty("ndkPath")) {
67+
ndkPath rootProject.ext.ndkPath
68+
}
69+
if (rootProject.hasProperty("ndkVersion")) {
70+
ndkVersion rootProject.ext.ndkVersion
71+
}
72+
2373
compileSdkVersion safeExtGet("compileSdkVersion", 33)
2474
buildToolsVersion safeExtGet("buildToolsVersion", "33.0.0")
2575
defaultConfig {
@@ -29,6 +79,15 @@ android {
2979
lintOptions {
3080
abortOnError false
3181
}
82+
83+
84+
sourceSets.main {
85+
java {
86+
if (!isNewArchitectureEnabled()) {
87+
srcDirs += 'src/paper/java'
88+
}
89+
}
90+
}
3291
}
3392

3493
repositories {
@@ -46,6 +105,10 @@ repositories {
46105
}
47106

48107
dependencies {
49-
//noinspection GradleDynamicVersion
50-
implementation "com.facebook.react:react-native:+" // From node_modules
108+
if (isNewArchitectureEnabled() && REACT_NATIVE_MINOR_VERSION < 71) {
109+
implementation project(":ReactAndroid")
110+
} else {
111+
//noinspection GradleDynamicVersion
112+
implementation 'com.facebook.react:react-native:+'
113+
}
51114
}

android/src/main/java/com/zoontek/rnpermissions/RNPermissionsModule.java

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import com.facebook.react.bridge.Callback;
1919
import com.facebook.react.bridge.Promise;
2020
import com.facebook.react.bridge.ReactApplicationContext;
21-
import com.facebook.react.bridge.ReactContextBaseJavaModule;
2221
import com.facebook.react.bridge.ReactMethod;
2322
import com.facebook.react.bridge.ReadableArray;
2423
import com.facebook.react.bridge.WritableMap;
@@ -28,12 +27,14 @@
2827
import com.facebook.react.modules.core.PermissionListener;
2928

3029
import java.util.ArrayList;
30+
import java.util.HashMap;
31+
import java.util.Map;
3132

32-
@ReactModule(name = RNPermissionsModule.MODULE_NAME)
33-
public class RNPermissionsModule extends ReactContextBaseJavaModule implements PermissionListener {
33+
@ReactModule(name = RNPermissionsModule.NAME)
34+
public class RNPermissionsModule extends NativePermissionsModuleSpec implements PermissionListener {
3435

3536
private static final String ERROR_INVALID_ACTIVITY = "E_INVALID_ACTIVITY";
36-
public static final String MODULE_NAME = "RNPermissions";
37+
public static final String NAME = "RNPermissionsModule";
3738

3839
private final SparseArray<Callback> mCallbacks;
3940
private int mRequestCode = 0;
@@ -49,7 +50,7 @@ public RNPermissionsModule(ReactApplicationContext reactContext) {
4950

5051
@Override
5152
public String getName() {
52-
return MODULE_NAME;
53+
return NAME;
5354
}
5455

5556
private @Nullable String getFieldName(final String permission) {
@@ -373,6 +374,41 @@ public void invoke(Object... args) {
373374
}
374375
}
375376

377+
@Override
378+
protected Map<String, Object> getTypedExportedConstants() {
379+
return new HashMap<>();
380+
}
381+
382+
@Override
383+
public void check(String permission, Promise promise) {
384+
promise.reject("Permissions:check", "check is not supported on Android");
385+
}
386+
387+
@Override
388+
public void checkLocationAccuracy(Promise promise) {
389+
promise.reject("Permissions:checkLocationAccuracy", "checkLocationAccuracy is not supported on Android");
390+
}
391+
392+
@Override
393+
public void request(String permission, Promise promise) {
394+
promise.reject("Permissions:request", "request is not supported on Android");
395+
}
396+
397+
@Override
398+
public void requestLocationAccuracy(String purposeKey, Promise promise) {
399+
promise.reject("Permissions:requestLocationAccuracy", "requestLocationAccuracy is not supported on Android");
400+
}
401+
402+
@Override
403+
public void requestNotifications(ReadableArray options, Promise promise) {
404+
promise.reject("Permissions:requestNotifications", "requestNotifications is not supported on Android");
405+
}
406+
407+
@Override
408+
public void openLimitedPhotoLibraryPicker(Promise promise) {
409+
promise.reject("Permissions:openLimitedPhotoLibraryPicker", "openLimitedPhotoLibraryPicker is not supported on Android");
410+
}
411+
376412
@Override
377413
public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
378414
mCallbacks.get(requestCode).invoke(grantResults, getPermissionAwareActivity());

android/src/main/java/com/zoontek/rnpermissions/RNPermissionsPackage.java

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,102 @@
11
package com.zoontek.rnpermissions;
22

3-
import com.facebook.react.ReactPackage;
3+
import java.util.Collections;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
import com.facebook.react.TurboReactPackage;
9+
import com.facebook.react.ViewManagerOnDemandReactPackage;
10+
import com.facebook.react.bridge.ModuleSpec;
411
import com.facebook.react.bridge.NativeModule;
512
import com.facebook.react.bridge.ReactApplicationContext;
13+
import com.facebook.react.module.annotations.ReactModule;
14+
import com.facebook.react.module.annotations.ReactModuleList;
15+
import com.facebook.react.module.model.ReactModuleInfo;
16+
import com.facebook.react.module.model.ReactModuleInfoProvider;
17+
import com.facebook.react.turbomodule.core.interfaces.TurboModule;
618
import com.facebook.react.uimanager.ViewManager;
719

8-
import java.util.Collections;
9-
import java.util.List;
20+
import javax.annotation.Nonnull;
21+
import javax.annotation.Nullable;
22+
23+
@ReactModuleList(
24+
nativeModules = {
25+
RNPermissionsModule.class,
26+
})
27+
public class RNPermissionsPackage extends TurboReactPackage implements ViewManagerOnDemandReactPackage {
28+
29+
/** {@inheritDoc} */
30+
@Override
31+
public List<String> getViewManagerNames(ReactApplicationContext reactContext) {
32+
return null;
33+
}
34+
35+
@Override
36+
protected List<ModuleSpec> getViewManagers(ReactApplicationContext reactContext) {
37+
return null;
38+
}
1039

11-
public class RNPermissionsPackage implements ReactPackage {
40+
/** {@inheritDoc} */
41+
@Override
42+
public @Nullable
43+
ViewManager createViewManager(
44+
ReactApplicationContext reactContext, String viewManagerName) {
45+
return null;
46+
}
47+
48+
@Override
49+
public NativeModule getModule(String name, @Nonnull ReactApplicationContext reactContext) {
50+
switch (name) {
51+
case RNPermissionsModule.NAME:
52+
return new RNPermissionsModule(reactContext);
53+
default:
54+
return null;
55+
}
56+
}
57+
58+
@Override
59+
public ReactModuleInfoProvider getReactModuleInfoProvider() {
60+
try {
61+
Class<?> reactModuleInfoProviderClass =
62+
Class.forName("com.zoontek.rnpermissions.RNPermissionsPackage$$ReactModuleInfoProvider");
63+
return (ReactModuleInfoProvider) reactModuleInfoProviderClass.newInstance();
64+
} catch (ClassNotFoundException e) {
65+
// ReactModuleSpecProcessor does not run at build-time. Create this ReactModuleInfoProvider by
66+
// hand.
67+
return new ReactModuleInfoProvider() {
68+
@Override
69+
public Map<String, ReactModuleInfo> getReactModuleInfos() {
70+
final Map<String, ReactModuleInfo> reactModuleInfoMap = new HashMap<>();
71+
72+
Class<? extends NativeModule>[] moduleList =
73+
new Class[] {
74+
RNPermissionsModule.class,
75+
};
76+
77+
for (Class<? extends NativeModule> moduleClass : moduleList) {
78+
ReactModule reactModule = moduleClass.getAnnotation(ReactModule.class);
79+
80+
reactModuleInfoMap.put(
81+
reactModule.name(),
82+
new ReactModuleInfo(
83+
reactModule.name(),
84+
moduleClass.getName(),
85+
reactModule.canOverrideExistingModule(),
86+
reactModule.needsEagerInit(),
87+
reactModule.hasConstants(),
88+
reactModule.isCxxModule(),
89+
TurboModule.class.isAssignableFrom(moduleClass)));
90+
}
91+
92+
return reactModuleInfoMap;
93+
}
94+
};
95+
} catch (InstantiationException | IllegalAccessException e) {
96+
throw new RuntimeException(
97+
"No ReactModuleInfoProvider for com.zoontek.rnpermissions.RNPermissionsPackage$$ReactModuleInfoProvider", e);
98+
}
99+
}
12100

13101
@Override
14102
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {

0 commit comments

Comments
 (0)