diff --git a/android/build.gradle b/android/build.gradle index 07f6357..035d1ed 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -35,6 +35,17 @@ android { targetSdkVersion getExtOrIntegerDefault('targetSdkVersion') buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() } + + sourceSets { + main { + if (isNewArchitectureEnabled()) { + java.srcDirs += ['src/newarch'] + } else { + java.srcDirs += ['src/oldarch'] + } + } + } + buildTypes { release { minifyEnabled false diff --git a/android/src/main/java/com/reactnativefastshadow/FastShadowPackage.java b/android/src/main/java/com/reactnativefastshadow/FastShadowPackage.java index c778a84..c041c37 100644 --- a/android/src/main/java/com/reactnativefastshadow/FastShadowPackage.java +++ b/android/src/main/java/com/reactnativefastshadow/FastShadowPackage.java @@ -5,6 +5,8 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; +import com.reactnativefastshadow.FastShadowViewManager; + import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/android/src/main/java/com/reactnativefastshadow/FastShadowViewManagerImpl.java b/android/src/main/java/com/reactnativefastshadow/FastShadowViewManagerImpl.java new file mode 100644 index 0000000..51f612c --- /dev/null +++ b/android/src/main/java/com/reactnativefastshadow/FastShadowViewManagerImpl.java @@ -0,0 +1,44 @@ +package com.reactnativefastshadow; + +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.uimanager.ThemedReactContext; + +public class FastShadowViewManagerImpl { + public static final String NAME = "FastShadowView"; + + public FastShadowView createViewInstance(ThemedReactContext context) { + return new FastShadowView(context); + } + + public void setShadowColor(FastShadowView view, int color) { + view.setColor(color); + } + + public void setShadowOpacity(FastShadowView view, float opacity) { + view.setOpacity(opacity); + } + + public void setShadowRadius(FastShadowView view, float radius) { + view.setRadius(radius); + } + + public void setShadowOffset(FastShadowView view, ReadableMap offset) { + if (offset == null) { + view.resetOffset(); + } else { + view.setOffset( + (float) offset.getDouble("width"), + (float) offset.getDouble("height") + ); + } + } + + public void setCornerRadii(FastShadowView view, ReadableMap borderRadius) { + view.setCornerRadii(new float[]{ + (float) borderRadius.getDouble("topLeft"), + (float) borderRadius.getDouble("topRight"), + (float) borderRadius.getDouble("bottomRight"), + (float) borderRadius.getDouble("bottomLeft") + }); + } +} diff --git a/android/src/newarch/java/com/reactnativefastshadow/FastShadowViewManager.java b/android/src/newarch/java/com/reactnativefastshadow/FastShadowViewManager.java new file mode 100644 index 0000000..f12b23a --- /dev/null +++ b/android/src/newarch/java/com/reactnativefastshadow/FastShadowViewManager.java @@ -0,0 +1,83 @@ +package com.reactnativefastshadow; + +import android.graphics.Color; + +import androidx.annotation.NonNull; + +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.annotations.ReactProp; + +import com.facebook.react.uimanager.ViewManagerDelegate; +import com.facebook.react.uimanager.ViewGroupManager; + +import com.facebook.react.module.annotations.ReactModule; + +import com.facebook.react.viewmanagers.FastShadowViewManagerDelegate; +import com.facebook.react.viewmanagers.FastShadowViewManagerInterface; + + +@ReactModule(name = FastShadowViewManagerImpl.NAME) +public class FastShadowViewManager extends ViewGroupManager + implements FastShadowViewManagerInterface { + + private final FastShadowViewManagerDelegate mDelegate; + private final FastShadowViewManagerImpl mFastShadowViewManagerImpl; + + public FastShadowViewManager() { + mDelegate = new FastShadowViewManagerDelegate<>(this); + mFastShadowViewManagerImpl = new FastShadowViewManagerImpl(); + } + + @Override + protected ViewManagerDelegate getDelegate() { + return mDelegate; + } + + @Override + public void onDropViewInstance(@NonNull FastShadowView view) { + super.onDropViewInstance(view); + view.releaseShadow(); + } + + @Override + @NonNull + public String getName() { + return FastShadowViewManagerImpl.NAME; + } + + @Override + public FastShadowView createViewInstance(ThemedReactContext context) { + return mFastShadowViewManagerImpl.createViewInstance(context); + } + + @Override + @ReactProp(name = "shadowColor", customType = "Color", defaultInt = Color.BLACK) + public void setShadowColor(FastShadowView view, int color) { + mFastShadowViewManagerImpl.setShadowColor(view, color); + } + + @Override + @ReactProp(name = "shadowOpacity", defaultFloat = 0) + public void setShadowOpacity(FastShadowView view, float opacity) { + mFastShadowViewManagerImpl.setShadowOpacity(view, opacity); + } + + @Override + @ReactProp(name = "shadowRadius", defaultFloat = 3) + public void setShadowRadius(FastShadowView view, float radius) { + mFastShadowViewManagerImpl.setShadowRadius(view, radius); + } + + @Override + @ReactProp(name = "shadowOffset") + public void setShadowOffset(FastShadowView view, ReadableMap offset) { + mFastShadowViewManagerImpl.setShadowOffset(view, offset); + } + + @Override + @ReactProp(name = "cornerRadii") + public void setCornerRadii(FastShadowView view, ReadableMap borderRadius) { + mFastShadowViewManagerImpl.setCornerRadii(view, borderRadius); + } +} diff --git a/android/src/main/java/com/reactnativefastshadow/FastShadowViewManager.java b/android/src/oldarch/java/com/reactnativefastshadow/FastShadowViewManager.java similarity index 68% rename from android/src/main/java/com/reactnativefastshadow/FastShadowViewManager.java rename to android/src/oldarch/java/com/reactnativefastshadow/FastShadowViewManager.java index 8341ad3..f0e03cd 100644 --- a/android/src/main/java/com/reactnativefastshadow/FastShadowViewManager.java +++ b/android/src/oldarch/java/com/reactnativefastshadow/FastShadowViewManager.java @@ -11,17 +11,22 @@ import com.facebook.react.views.view.ReactViewManager; public class FastShadowViewManager extends ReactViewManager { - public static final String REACT_CLASS = "FastShadowView"; + + private final FastShadowViewManagerImpl mFastShadowViewManagerImpl; + + public FastShadowViewManager() { + mFastShadowViewManagerImpl = new FastShadowViewManagerImpl(); + } @Override @NonNull public String getName() { - return REACT_CLASS; + return FastShadowViewManagerImpl.NAME; } @Override public FastShadowView createViewInstance(ThemedReactContext context) { - return new FastShadowView(context); + return mFastShadowViewManagerImpl.createViewInstance(context); } @Override @@ -32,38 +37,26 @@ public void onDropViewInstance(@NonNull ReactViewGroup view) { @ReactProp(name = "shadowColor", customType = "Color", defaultInt = Color.BLACK) public void setShadowColor(FastShadowView view, int color) { - view.setColor(color); + mFastShadowViewManagerImpl.setShadowColor(view, color); } @ReactProp(name = "shadowOpacity", defaultFloat = 0) public void setShadowOpacity(FastShadowView view, float opacity) { - view.setOpacity(opacity); + mFastShadowViewManagerImpl.setShadowOpacity(view, opacity); } @ReactProp(name = "shadowRadius", defaultFloat = 3) public void setShadowRadius(FastShadowView view, float radius) { - view.setRadius(radius); + mFastShadowViewManagerImpl.setShadowRadius(view, radius); } @ReactProp(name = "shadowOffset") public void setShadowOffset(FastShadowView view, ReadableMap offset) { - if (offset == null) { - view.resetOffset(); - } else { - view.setOffset( - (float) offset.getDouble("width"), - (float) offset.getDouble("height") - ); - } + mFastShadowViewManagerImpl.setShadowOffset(view, offset); } @ReactProp(name = "cornerRadii") public void setCornerRadii(FastShadowView view, ReadableMap borderRadius) { - view.setCornerRadii(new float[]{ - (float) borderRadius.getDouble("topLeft"), - (float) borderRadius.getDouble("topRight"), - (float) borderRadius.getDouble("bottomRight"), - (float) borderRadius.getDouble("bottomLeft") - }); + mFastShadowViewManagerImpl.setCornerRadii(view, borderRadius); } } diff --git a/package.json b/package.json index 8157a7d..0a246ec 100644 --- a/package.json +++ b/package.json @@ -123,5 +123,10 @@ } ] ] + }, + "codegenConfig": { + "name": "FastShadowViewSpec", + "type": "components", + "jsSrcsDir": "./src" } } diff --git a/src/FastShadowViewNativeComponent.ts b/src/FastShadowViewNativeComponent.ts new file mode 100644 index 0000000..e85234d --- /dev/null +++ b/src/FastShadowViewNativeComponent.ts @@ -0,0 +1,23 @@ +import type { HostComponent, ViewProps } from 'react-native' +import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent' +import { Int32, Float } from 'react-native/Libraries/Types/CodegenTypes' + +export interface FastShadowViewProps extends ViewProps { + shadowColor?: Int32 + shadowOpacity?: Float + shadowRadius?: Float + shadowOffset?: { + width: Float + height: Float + } + cornerRadii?: { + topLeft: Float + topRight: Float + bottomLeft: Float + bottomRight: Float + } +} + +export default codegenNativeComponent( + 'FastShadowView' +) as HostComponent