Skip to content

Commit b5dc9d0

Browse files
authored
feat(#162): fabric support (#221)
* feat(#162): fabric support - add JS Flow spec - make android viewmanager to conform to codegen-ed specs - make android viewmanager extend ReactViewManager instead of ViewGroupManager - add codegen-ed spec to make viewmanager work also in old arch - use install_module_dependencies in the podspec to install deps on both new and old architectures - add subclass of RCTViewComponentView - use fabric implementation when RCT_NEW_ARCH_ENABLED flag is true - set RN peerDependency to be version >= 0.71 * feat(#162): bump RNTA to v3, bump RN to v0.73, add pointerEvents example
1 parent 40ff01d commit b5dc9d0

33 files changed

+3770
-2359
lines changed

.eslintrc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module.exports = {
2-
extends: ['@react-native-community'],
2+
extends: '@react-native',
33
};

RNCMaskedView.podspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Pod::Spec.new do |s|
1313
s.platforms = { :ios => "9.0", :tvos => "9.0" }
1414

1515
s.source = { :git => "https://github.com/react-native-masked-view/masked-view.git", :tag => "v#{s.version}" }
16-
s.source_files = "ios/**/*.{h,m}"
16+
s.source_files = "ios/**/*.{h,m,mm}"
1717

18-
s.dependency 'React-Core'
18+
install_modules_dependencies(s)
1919
end

android/build.gradle

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@ buildscript {
1515
}
1616
}
1717

18+
def isNewArchitectureEnabled() {
19+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
20+
}
21+
1822
apply plugin: 'com.android.library'
23+
if (isNewArchitectureEnabled()) {
24+
apply plugin: "com.facebook.react"
25+
}
1926

2027
def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger()
2128
def shouldUseNameSpace = agpVersion >= 7
@@ -39,20 +46,25 @@ manifestContent.replaceAll(" ", " ")
3946
manifestOutFile.write(manifestContent)
4047

4148
android {
42-
compileSdkVersion safeExtGet('compileSdkVersion', 28)
49+
compileSdkVersion safeExtGet('compileSdkVersion', 33)
4350

4451
if(shouldUseNameSpace){
4552
namespace = "org.reactnative.maskedview"
4653
}
4754

4855
defaultConfig {
49-
minSdkVersion safeExtGet('minSdkVersion', 16)
50-
targetSdkVersion safeExtGet('targetSdkVersion', 28)
56+
minSdkVersion safeExtGet('minSdkVersion', 21)
57+
targetSdkVersion safeExtGet('targetSdkVersion', 33)
58+
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
5159
}
5260

5361
sourceSets {
5462
main {
55-
java.srcDirs = ['src/main/java']
63+
if (isNewArchitectureEnabled()) {
64+
java.srcDirs += ['src/newarch/java', "${project.buildDir}/generated/source/codegen/java"]
65+
} else {
66+
java.srcDirs += ['src/oldarch/java']
67+
}
5668
}
5769
}
5870

android/src/main/java/org/reactnative/maskedview/RNCMaskedView.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88
import android.graphics.PorterDuffXfermode;
99
import android.view.View;
1010

11+
import androidx.annotation.NonNull;
12+
1113
import com.facebook.react.views.view.ReactViewGroup;
1214

1315
public class RNCMaskedView extends ReactViewGroup {
1416
private static final String TAG = "RNCMaskedView";
1517

1618
private Bitmap mBitmapMask = null;
1719
private boolean mBitmapMaskInvalidated = false;
18-
private Paint mPaint;
19-
private PorterDuffXfermode mPorterDuffXferMode;
20+
private final Paint mPaint;
21+
private final PorterDuffXfermode mPorterDuffXferMode;
2022

2123
public RNCMaskedView(Context context) {
2224
super(context);
@@ -48,7 +50,7 @@ protected void dispatchDraw(Canvas canvas) {
4850
}
4951

5052
@Override
51-
public void onDescendantInvalidated(View child, View target) {
53+
public void onDescendantInvalidated(@NonNull View child, @NonNull View target) {
5254
super.onDescendantInvalidated(child, target);
5355

5456
if (!mBitmapMaskInvalidated) {

android/src/main/java/org/reactnative/maskedview/RNCMaskedViewManager.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,38 @@
11
package org.reactnative.maskedview;
22

3-
import android.view.View;
4-
import android.widget.Toast;
3+
import androidx.annotation.NonNull;
54
import androidx.annotation.Nullable;
65

7-
import com.facebook.react.bridge.ReadableArray;
8-
import com.facebook.react.bridge.ReadableMap;
9-
import com.facebook.react.common.MapBuilder;
10-
import com.facebook.react.uimanager.SimpleViewManager;
116
import com.facebook.react.uimanager.ThemedReactContext;
12-
import com.facebook.react.uimanager.ViewGroupManager;
7+
import com.facebook.react.uimanager.ViewManagerDelegate;
138
import com.facebook.react.uimanager.annotations.ReactProp;
9+
import com.facebook.react.viewmanagers.RNCMaskedViewManagerInterface;
10+
import com.facebook.react.views.view.ReactViewGroup;
11+
import com.facebook.react.views.view.ReactViewManager;
1412

15-
import java.util.ArrayList;
16-
import java.util.List;
17-
import java.util.Map;
18-
19-
public class RNCMaskedViewManager extends ViewGroupManager<RNCMaskedView> {
13+
public class RNCMaskedViewManager extends ReactViewManager implements RNCMaskedViewManagerInterface<RNCMaskedView> {
2014
private static final String REACT_CLASS = "RNCMaskedView";
2115

16+
@NonNull
2217
@Override
2318
public String getName() {
2419
return REACT_CLASS;
2520
}
2621

2722
@Override
28-
protected RNCMaskedView createViewInstance(ThemedReactContext themedReactContext) {
23+
public ViewManagerDelegate<ReactViewGroup> getDelegate() {
24+
// ReactViewManager is not generic, so it doesn't let to pass any view, that extends ReactViewGroup
25+
// However, ReactViewManager does not use any delegate, so we can skip it and handle props here
26+
return null;
27+
}
28+
29+
@NonNull
30+
@Override
31+
public RNCMaskedView createViewInstance(ThemedReactContext themedReactContext) {
2932
return new RNCMaskedView(themedReactContext);
3033
}
3134

35+
@Override
3236
@ReactProp(name = "androidRenderingMode")
3337
public void setAndroidRenderingMode(RNCMaskedView view, @Nullable String renderingMode) {
3438
if (renderingMode != null) {
Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,41 @@
11
package org.reactnative.maskedview;
22

3-
import com.facebook.react.ReactPackage;
4-
import com.facebook.react.bridge.JavaScriptModule;
3+
import androidx.annotation.Nullable;
4+
5+
import com.facebook.react.TurboReactPackage;
56
import com.facebook.react.bridge.NativeModule;
67
import com.facebook.react.bridge.ReactApplicationContext;
8+
import com.facebook.react.module.model.ReactModuleInfo;
9+
import com.facebook.react.module.model.ReactModuleInfoProvider;
710
import com.facebook.react.uimanager.ViewManager;
811

912
import java.util.Arrays;
10-
import java.util.Collections;
13+
import java.util.HashMap;
1114
import java.util.List;
15+
import java.util.Map;
16+
17+
public class RNCMaskedViewPackage extends TurboReactPackage {
18+
@Override
19+
@Nullable
20+
public NativeModule getModule(String name, ReactApplicationContext reactContext) {
21+
return null;
22+
}
1223

13-
public class RNCMaskedViewPackage implements ReactPackage {
1424
@Override
15-
public List<NativeModule> createNativeModules(ReactApplicationContext reactApplicationContext) {
16-
return Collections.emptyList();
25+
public ReactModuleInfoProvider getReactModuleInfoProvider() {
26+
final Map<String, ReactModuleInfo> reactModuleInfoMap = new HashMap<>();
27+
return new ReactModuleInfoProvider() {
28+
@Override
29+
public Map<String, ReactModuleInfo> getReactModuleInfos() {
30+
return reactModuleInfoMap;
31+
}
32+
};
1733
}
1834

1935
@Override
2036
public List<ViewManager> createViewManagers(ReactApplicationContext reactApplicationContext) {
21-
return Arrays.<ViewManager>asList(
22-
new RNCMaskedViewManager()
23-
);
37+
return Arrays.<ViewManager>asList(
38+
new RNCMaskedViewManager()
39+
);
2440
}
2541
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3+
*
4+
* Do not edit this file as changes may cause incorrect behavior and will be lost
5+
* once the code is regenerated.
6+
*
7+
* @generated by codegen project: GeneratePropsJavaDelegate.js
8+
*/
9+
10+
package com.facebook.react.viewmanagers;
11+
12+
import android.view.View;
13+
import androidx.annotation.Nullable;
14+
import com.facebook.react.uimanager.BaseViewManagerDelegate;
15+
import com.facebook.react.uimanager.BaseViewManagerInterface;
16+
17+
public class RNCMaskedViewManagerDelegate<T extends View, U extends BaseViewManagerInterface<T> & RNCMaskedViewManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
18+
public RNCMaskedViewManagerDelegate(U viewManager) {
19+
super(viewManager);
20+
}
21+
@Override
22+
public void setProperty(T view, String propName, @Nullable Object value) {
23+
switch (propName) {
24+
case "androidRenderingMode":
25+
mViewManager.setAndroidRenderingMode(view, (String) value);
26+
break;
27+
default:
28+
super.setProperty(view, propName, value);
29+
}
30+
}
31+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3+
*
4+
* Do not edit this file as changes may cause incorrect behavior and will be lost
5+
* once the code is regenerated.
6+
*
7+
* @generated by codegen project: GeneratePropsJavaInterface.js
8+
*/
9+
10+
package com.facebook.react.viewmanagers;
11+
12+
import android.view.View;
13+
import androidx.annotation.Nullable;
14+
15+
public interface RNCMaskedViewManagerInterface<T extends View> {
16+
void setAndroidRenderingMode(T view, @Nullable String value);
17+
}

example/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
.xcode.env
1010
Pods/
1111
build/
12-
dist/
12+
dist/*
13+
!dist/.gitignore
1314
local.properties
1415
msbuild.binlog
1516
node_modules/

example/android/build.gradle

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
buildscript {
2-
def androidTestAppDir = "../node_modules/react-native-test-app/android"
3-
apply(from: "${androidTestAppDir}/dependencies.gradle")
2+
apply(from: {
3+
def searchDir = rootDir.toPath()
4+
do {
5+
def p = searchDir.resolve("node_modules/react-native-test-app/android/dependencies.gradle")
6+
if (p.toFile().exists()) {
7+
return p.toRealPath().toString()
8+
}
9+
} while (searchDir = searchDir.getParent())
10+
throw new GradleException("Could not find `react-native-test-app`");
11+
}())
412

513
repositories {
614
mavenCentral()
@@ -18,7 +26,16 @@ allprojects {
1826
repositories {
1927
maven {
2028
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
21-
url("${rootDir}/../node_modules/react-native/android")
29+
url({
30+
def searchDir = rootDir.toPath()
31+
do {
32+
def p = searchDir.resolve("node_modules/react-native/android")
33+
if (p.toFile().exists()) {
34+
return p.toRealPath().toString()
35+
}
36+
} while (searchDir = searchDir.getParent())
37+
throw new GradleException("Could not find `react-native`");
38+
}())
2239
}
2340
mavenCentral()
2441
google()

0 commit comments

Comments
 (0)