diff --git a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java index 35beffdbb6d..17a2fe11f93 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java @@ -9,13 +9,12 @@ package com.facebook.react.animated; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeAnimatedModuleSpec; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.ReactConstants; @@ -75,7 +74,7 @@ import java.util.ArrayList; * while UI thread is "executing" the animation loop. */ @ReactModule(name = NativeAnimatedModule.NAME) -public class NativeAnimatedModule extends ReactContextBaseJavaModule +public class NativeAnimatedModule extends NativeAnimatedModuleSpec implements LifecycleEventListener, UIManagerModuleListener { public static final String NAME = "NativeAnimatedModule"; @@ -110,7 +109,7 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule // and no outstanding tasks on the operations queue. Apparently frame callbacks can // only // be posted from the UI thread and therefore we cannot schedule them directly from - // @ReactMethod methods + // @Override Assertions.assertNotNull(mReactChoreographer) .postFrameCallback( ReactChoreographer.CallbackType.NATIVE_ANIMATED_MODULE, @@ -216,8 +215,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule mNodesManager = nodesManager; } - @ReactMethod - public void createAnimatedNode(final int tag, final ReadableMap config) { + @Override + public void createAnimatedNode(final double tagDouble, final ReadableMap config) { + final int tag = (int) tagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -227,8 +228,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void startListeningToAnimatedNodeValue(final int tag) { + @Override + public void startListeningToAnimatedNodeValue(final double tagDouble) { + final int tag = (int) tagDouble; + final AnimatedNodeValueListener listener = new AnimatedNodeValueListener() { public void onValueUpdate(double value) { @@ -255,8 +258,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void stopListeningToAnimatedNodeValue(final int tag) { + @Override + public void stopListeningToAnimatedNodeValue(final double tagDouble) { + final int tag = (int) tagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -266,8 +271,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void dropAnimatedNode(final int tag) { + @Override + public void dropAnimatedNode(final double tagDouble) { + final int tag = (int) tagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -277,8 +284,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void setAnimatedNodeValue(final int tag, final double value) { + @Override + public void setAnimatedNodeValue(final double tagDouble, final double value) { + final int tag = (int) tagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -288,8 +297,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void setAnimatedNodeOffset(final int tag, final double value) { + @Override + public void setAnimatedNodeOffset(final double tagDouble, final double value) { + final int tag = (int) tagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -299,8 +310,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void flattenAnimatedNodeOffset(final int tag) { + @Override + public void flattenAnimatedNodeOffset(final double tagDouble) { + final int tag = (int) tagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -310,8 +323,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void extractAnimatedNodeOffset(final int tag) { + @Override + public void extractAnimatedNodeOffset(final double tagDouble) { + final int tag = (int) tagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -321,12 +336,15 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod + @Override public void startAnimatingNode( - final int animationId, - final int animatedNodeTag, + final double animationIdDouble, + final double animatedNodeTagDouble, final ReadableMap animationConfig, final Callback endCallback) { + final int animationId = (int) animationIdDouble; + final int animatedNodeTag = (int) animatedNodeTagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -337,8 +355,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void stopAnimation(final int animationId) { + @Override + public void stopAnimation(final double animationIdDouble) { + final int animationId = (int) animationIdDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -348,8 +368,12 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void connectAnimatedNodes(final int parentNodeTag, final int childNodeTag) { + @Override + public void connectAnimatedNodes( + final double parentNodeTagDouble, final double childNodeTagDouble) { + final int parentNodeTag = (int) parentNodeTagDouble; + final int childNodeTag = (int) childNodeTagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -359,8 +383,12 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void disconnectAnimatedNodes(final int parentNodeTag, final int childNodeTag) { + @Override + public void disconnectAnimatedNodes( + final double parentNodeTagDouble, final double childNodeTagDouble) { + final int parentNodeTag = (int) parentNodeTagDouble; + final int childNodeTag = (int) childNodeTagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -370,8 +398,12 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void connectAnimatedNodeToView(final int animatedNodeTag, final int viewTag) { + @Override + public void connectAnimatedNodeToView( + final double animatedNodeTagDouble, final double viewTagDouble) { + final int animatedNodeTag = (int) animatedNodeTagDouble; + final int viewTag = (int) viewTagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -381,8 +413,12 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void disconnectAnimatedNodeFromView(final int animatedNodeTag, final int viewTag) { + @Override + public void disconnectAnimatedNodeFromView( + final double animatedNodeTagDouble, final double viewTagDouble) { + final int animatedNodeTag = (int) animatedNodeTagDouble; + final int viewTag = (int) viewTagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -392,8 +428,10 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod - public void restoreDefaultValues(final int animatedNodeTag) { + @Override + public void restoreDefaultValues(final double animatedNodeTagDouble) { + final int animatedNodeTag = (int) animatedNodeTagDouble; + mPreOperations.add( new UIThreadOperation() { @Override @@ -403,9 +441,11 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod + @Override public void addAnimatedEventToView( - final int viewTag, final String eventName, final ReadableMap eventMapping) { + final double viewTagDouble, final String eventName, final ReadableMap eventMapping) { + final int viewTag = (int) viewTagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -415,9 +455,12 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule }); } - @ReactMethod + @Override public void removeAnimatedEventFromView( - final int viewTag, final String eventName, final int animatedValueTag) { + final double viewTagDouble, final String eventName, final double animatedValueTagDouble) { + final int viewTag = (int) viewTagDouble; + final int animatedValueTag = (int) animatedValueTagDouble; + mOperations.add( new UIThreadOperation() { @Override @@ -426,4 +469,14 @@ public class NativeAnimatedModule extends ReactContextBaseJavaModule } }); } + + @Override + public void addListener(String eventName) { + // iOS only + } + + @Override + public void removeListeners(double count) { + // iOS only + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDevSupport.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDevSupport.java index 1130c32e76b..1b3c60f9850 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDevSupport.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/JSDevSupport.java @@ -10,16 +10,15 @@ package com.facebook.react.devsupport; import android.util.Pair; import android.view.View; import androidx.annotation.Nullable; +import com.facebook.fbreact.specs.NativeJSDevSupportSpec; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.module.annotations.ReactModule; import java.util.HashMap; import java.util.Map; @ReactModule(name = JSDevSupport.MODULE_NAME) -public class JSDevSupport extends ReactContextBaseJavaModule { +public class JSDevSupport extends NativeJSDevSupportSpec { public static final String MODULE_NAME = "JSDevSupport"; public static final int ERROR_CODE_EXCEPTION = 0; @@ -72,7 +71,7 @@ public class JSDevSupport extends ReactContextBaseJavaModule { } @SuppressWarnings("unused") - @ReactMethod + @Override public synchronized void onSuccess(String data) { if (mCurrentCallback != null) { mCurrentCallback.onSuccess(data); @@ -80,15 +79,17 @@ public class JSDevSupport extends ReactContextBaseJavaModule { } @SuppressWarnings("unused") - @ReactMethod - public synchronized void onFailure(int errorCode, String error) { + @Override + public synchronized void onFailure(double errorCodeDouble, String error) { + int errorCode = (int) errorCodeDouble; + if (mCurrentCallback != null) { mCurrentCallback.onFailure(errorCode, new RuntimeException(error)); } } @Override - public Map getConstants() { + public Map getTypedExportedConstants() { HashMap constants = new HashMap<>(); constants.put("ERROR_CODE_EXCEPTION", ERROR_CODE_EXCEPTION); constants.put("ERROR_CODE_VIEW_NOT_FOUND", ERROR_CODE_VIEW_NOT_FOUND); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java index bb7bec2c387..1b8998a5977 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java @@ -19,11 +19,10 @@ import android.provider.Settings; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import androidx.annotation.Nullable; +import com.facebook.fbreact.specs.NativeAccessibilityInfoSpec; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.core.DeviceEventManagerModule; @@ -32,7 +31,7 @@ import com.facebook.react.modules.core.DeviceEventManagerModule; * device. For API >= 19. */ @ReactModule(name = AccessibilityInfoModule.NAME) -public class AccessibilityInfoModule extends ReactContextBaseJavaModule +public class AccessibilityInfoModule extends NativeAccessibilityInfoSpec implements LifecycleEventListener { public static final String NAME = "AccessibilityInfo"; @@ -101,12 +100,12 @@ public class AccessibilityInfoModule extends ReactContextBaseJavaModule return value != null && value.equals("0.0"); } - @ReactMethod + @Override public void isReduceMotionEnabled(Callback successCallback) { successCallback.invoke(mReduceMotionEnabled); } - @ReactMethod + @Override public void isTouchExplorationEnabled(Callback successCallback) { successCallback.invoke(mTouchExplorationEnabled); } @@ -183,7 +182,7 @@ public class AccessibilityInfoModule extends ReactContextBaseJavaModule @Override public void onHostDestroy() {} - @ReactMethod + @Override public void announceForAccessibility(String message) { if (mAccessibilityManager == null || !mAccessibilityManager.isEnabled()) { return; @@ -196,4 +195,9 @@ public class AccessibilityInfoModule extends ReactContextBaseJavaModule mAccessibilityManager.sendAccessibilityEvent(event); } + + @Override + public void setAccessibilityFocus(double reactTag) { + // iOS only + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java index 861d64180bc..162f6bf87c4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.java @@ -9,17 +9,16 @@ package com.facebook.react.modules.appearance; import android.content.Context; import android.content.res.Configuration; +import com.facebook.fbreact.specs.NativeAppearanceSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; /** Module that exposes the user's preferred color scheme. */ @ReactModule(name = AppearanceModule.NAME) -public class AppearanceModule extends ReactContextBaseJavaModule { +public class AppearanceModule extends NativeAppearanceSpec { public static final String NAME = "Appearance"; @@ -51,18 +50,18 @@ public class AppearanceModule extends ReactContextBaseJavaModule { return NAME; } - @ReactMethod(isBlockingSynchronousMethod = true) + @Override public String getColorScheme() { mColorScheme = colorSchemeForCurrentConfiguration(getReactApplicationContext()); return mColorScheme; } /** Stub */ - @ReactMethod + @Override public void addListener(String eventName) {} /** Stub */ - @ReactMethod + @Override public void removeListeners(double count) {} /* diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java index 7b88dda632f..6cfa7841df0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java @@ -7,12 +7,11 @@ package com.facebook.react.modules.appstate; +import com.facebook.fbreact.specs.NativeAppStateSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WindowFocusChangeListener; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.LifecycleState; @@ -23,7 +22,7 @@ import java.util.Map; import javax.annotation.Nullable; @ReactModule(name = AppStateModule.NAME) -public class AppStateModule extends ReactContextBaseJavaModule +public class AppStateModule extends NativeAppStateSpec implements LifecycleEventListener, WindowFocusChangeListener { public static final String TAG = AppStateModule.class.getSimpleName(); @@ -52,13 +51,13 @@ public class AppStateModule extends ReactContextBaseJavaModule } @Override - public Map getConstants() { + public Map getTypedExportedConstants() { HashMap constants = new HashMap<>(); constants.put(INITIAL_STATE, mAppState); return constants; } - @ReactMethod + @Override public void getCurrentAppState(Callback success, Callback error) { success.invoke(createAppStateEventMap()); } @@ -103,4 +102,14 @@ public class AppStateModule extends ReactContextBaseJavaModule private void sendAppStateChangeEvent() { sendEvent("appStateDidChange", createAppStateEventMap()); } + + @Override + public void addListener(String eventName) { + // iOS only + } + + @Override + public void removeListeners(double count) { + // iOS only + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.java index 12ce373ccab..fa782cf9770 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobModule.java @@ -13,11 +13,10 @@ import android.net.Uri; import android.provider.MediaStore; import android.webkit.MimeTypeMap; import androidx.annotation.Nullable; +import com.facebook.fbreact.specs.NativeBlobModuleSpec; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; @@ -43,7 +42,7 @@ import okhttp3.ResponseBody; import okio.ByteString; @ReactModule(name = BlobModule.NAME) -public class BlobModule extends ReactContextBaseJavaModule { +public class BlobModule extends NativeBlobModuleSpec { public static final String NAME = "BlobModule"; @@ -156,7 +155,7 @@ public class BlobModule extends ReactContextBaseJavaModule { } @Override - public @Nullable Map getConstants() { + public @Nullable Map getTypedExportedConstants() { // The application can register BlobProvider as a ContentProvider so that blobs are resolvable. // If it does, it needs to tell us what authority was used via this string resource. Resources resources = getReactApplicationContext().getResources(); @@ -296,7 +295,7 @@ public class BlobModule extends ReactContextBaseJavaModule { return null; } - @ReactMethod + @Override public void addNetworkingHandler() { ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn(); @@ -309,8 +308,10 @@ public class BlobModule extends ReactContextBaseJavaModule { } } - @ReactMethod - public void addWebSocketHandler(final int id) { + @Override + public void addWebSocketHandler(final double idDouble) { + final int id = (int) idDouble; + WebSocketModule webSocketModule = getWebSocketModule("addWebSocketHandler"); if (webSocketModule != null) { @@ -318,8 +319,10 @@ public class BlobModule extends ReactContextBaseJavaModule { } } - @ReactMethod - public void removeWebSocketHandler(final int id) { + @Override + public void removeWebSocketHandler(final double idDouble) { + final int id = (int) idDouble; + WebSocketModule webSocketModule = getWebSocketModule("removeWebSocketHandler"); if (webSocketModule != null) { @@ -327,8 +330,10 @@ public class BlobModule extends ReactContextBaseJavaModule { } } - @ReactMethod - public void sendOverSocket(ReadableMap blob, int id) { + @Override + public void sendOverSocket(ReadableMap blob, double idDouble) { + int id = (int) idDouble; + WebSocketModule webSocketModule = getWebSocketModule("sendOverSocket"); if (webSocketModule != null) { @@ -342,7 +347,7 @@ public class BlobModule extends ReactContextBaseJavaModule { } } - @ReactMethod + @Override public void createFromParts(ReadableArray parts, String blobId) { int totalBlobSize = 0; ArrayList partList = new ArrayList<>(parts.size()); @@ -370,7 +375,7 @@ public class BlobModule extends ReactContextBaseJavaModule { store(buffer.array(), blobId); } - @ReactMethod + @Override public void release(String blobId) { remove(blobId); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/blob/FileReaderModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/blob/FileReaderModule.java index 1345a576bd6..805d744cf0e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/blob/FileReaderModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/blob/FileReaderModule.java @@ -8,15 +8,14 @@ package com.facebook.react.modules.blob; import android.util.Base64; +import com.facebook.fbreact.specs.NativeFileReaderModuleSpec; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.module.annotations.ReactModule; @ReactModule(name = FileReaderModule.NAME) -public class FileReaderModule extends ReactContextBaseJavaModule { +public class FileReaderModule extends NativeFileReaderModuleSpec { public static final String NAME = "FileReaderModule"; private static final String ERROR_INVALID_BLOB = "ERROR_INVALID_BLOB"; @@ -40,7 +39,7 @@ public class FileReaderModule extends ReactContextBaseJavaModule { return null; } - @ReactMethod + @Override public void readAsText(ReadableMap blob, String encoding, Promise promise) { BlobModule blobModule = getBlobModule("readAsText"); @@ -65,7 +64,7 @@ public class FileReaderModule extends ReactContextBaseJavaModule { } } - @ReactMethod + @Override public void readAsDataURL(ReadableMap blob, Promise promise) { BlobModule blobModule = getBlobModule("readAsDataURL"); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java index 4e5f1bd513f..05746f4f508 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/CameraRollManager.java @@ -22,14 +22,13 @@ import android.provider.MediaStore.Images; import android.text.TextUtils; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeCameraRollManagerSpec; import com.facebook.react.bridge.GuardedAsyncTask; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; @@ -56,7 +55,7 @@ import java.util.List; * {@link MediaStore.Images}). */ @ReactModule(name = CameraRollManager.NAME) -public class CameraRollManager extends ReactContextBaseJavaModule { +public class CameraRollManager extends NativeCameraRollManagerSpec { public static final String NAME = "CameraRollManager"; @@ -102,7 +101,7 @@ public class CameraRollManager extends ReactContextBaseJavaModule { * @param uri the file://, http:// or https:// URI of the image to save * @param promise to be resolved or rejected */ - @ReactMethod + @Override public void saveToCameraRoll(String uri, String type, Promise promise) { new SaveToCameraRoll(getReactApplicationContext(), Uri.parse(uri), promise) .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); @@ -223,7 +222,7 @@ public class CameraRollManager extends ReactContextBaseJavaModule { * @param promise the Promise to be resolved when the photos are loaded; for a format of the * parameters passed to this callback, see {@code getPhotosReturnChecker} in CameraRoll.js */ - @ReactMethod + @Override public void getPhotos(final ReadableMap params, final Promise promise) { int first = params.getInt("first"); String after = params.hasKey("after") ? params.getString("after") : null; @@ -523,4 +522,9 @@ public class CameraRollManager extends ReactContextBaseJavaModule { node.putMap("location", location); } } + + @Override + public void deletePhotos(ReadableArray assets, Promise promise) { + // iOS only + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageEditingManager.java b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageEditingManager.java index 9bc82530d34..e1ef2238ede 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageEditingManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageEditingManager.java @@ -22,14 +22,13 @@ import android.provider.MediaStore; import android.text.TextUtils; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeImageEditorSpec; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.GuardedAsyncTask; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.common.ReactConstants; import com.facebook.react.module.annotations.ReactModule; @@ -46,7 +45,7 @@ import java.util.List; /** Native module that provides image cropping functionality. */ @ReactModule(name = ImageEditingManager.NAME) -public class ImageEditingManager extends ReactContextBaseJavaModule { +public class ImageEditingManager extends NativeImageEditorSpec { public static final String NAME = "ImageEditingManager"; @@ -154,7 +153,7 @@ public class ImageEditingManager extends ReactContextBaseJavaModule { * is passed to this callback is the file:// URI of the new image * @param error callback to be invoked when an error occurs (e.g. can't create file etc.) */ - @ReactMethod + @Override public void cropImage( String uri, ReadableMap options, final Callback success, final Callback error) { ReadableMap offset = options.hasKey("offset") ? options.getMap("offset") : null; diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageStoreManager.java b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageStoreManager.java index 5133955d936..8bf377cfb4c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageStoreManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/camera/ImageStoreManager.java @@ -12,12 +12,11 @@ import android.net.Uri; import android.os.AsyncTask; import android.util.Base64; import android.util.Base64OutputStream; +import com.facebook.fbreact.specs.NativeImageStoreSpec; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.GuardedAsyncTask; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.module.annotations.ReactModule; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -26,7 +25,7 @@ import java.io.IOException; import java.io.InputStream; @ReactModule(name = ImageStoreManager.NAME) -public class ImageStoreManager extends ReactContextBaseJavaModule { +public class ImageStoreManager extends NativeImageStoreSpec { public static final String NAME = "ImageStoreManager"; private static final int BUFFER_SIZE = 8192; @@ -47,7 +46,7 @@ public class ImageStoreManager extends ReactContextBaseJavaModule { * @param success callback to be invoked with the base64 string as the only argument * @param error callback to be invoked on error (e.g. file not found, not readable etc.) */ - @ReactMethod + @Override public void getBase64ForTag(String uri, Callback success, Callback error) { new GetBase64Task(getReactApplicationContext(), uri, success, error) .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); @@ -106,4 +105,20 @@ public class ImageStoreManager extends ReactContextBaseJavaModule { // shhh } } + + @Override + public void hasImageForTag(String uri, Callback callback) { + // iOS only + } + + @Override + public void removeImageForTag(String uri) { + // iOS only + } + + @Override + public void addImageFromBase64( + String base64ImageData, Callback successCallback, Callback errorCallback) { + // iOS only + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java index ec8e8c3e2c1..cf823171643 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/core/DeviceEventManagerModule.java @@ -10,19 +10,18 @@ package com.facebook.react.modules.core; import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.facebook.fbreact.specs.NativeDeviceEventManagerSpec; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; /** Native module that handles device hardware events like hardware back presses. */ @ReactModule(name = DeviceEventManagerModule.NAME) -public class DeviceEventManagerModule extends ReactContextBaseJavaModule { +public class DeviceEventManagerModule extends NativeDeviceEventManagerSpec { public static final String NAME = "DeviceEventManager"; @DoNotStrip @@ -71,7 +70,7 @@ public class DeviceEventManagerModule extends ReactContextBaseJavaModule { * Invokes the default back handler for the host of this catalyst instance. This should be invoked * if JS does not want to handle the back press itself. */ - @ReactMethod + @Override public void invokeDefaultBackPressHandler() { // There should be no need to check if the catalyst instance is alive. After initialization // the thread instances cannot be null, and scheduling on a thread after ReactApplicationContext diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/core/ExceptionsManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/core/ExceptionsManagerModule.java index c2d7a38e00c..265ecf88be0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/core/ExceptionsManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/core/ExceptionsManagerModule.java @@ -8,10 +8,9 @@ package com.facebook.react.modules.core; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeExceptionsManagerSpec; import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.JavaOnlyMap; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.common.JavascriptException; @@ -22,13 +21,14 @@ import com.facebook.react.util.ExceptionDataHelper; import com.facebook.react.util.JSStackTrace; @ReactModule(name = ExceptionsManagerModule.NAME) -public class ExceptionsManagerModule extends ReactContextBaseJavaModule { +public class ExceptionsManagerModule extends NativeExceptionsManagerSpec { public static final String NAME = "ExceptionsManager"; private final DevSupportManager mDevSupportManager; public ExceptionsManagerModule(DevSupportManager devSupportManager) { + super(null); mDevSupportManager = devSupportManager; } @@ -37,8 +37,10 @@ public class ExceptionsManagerModule extends ReactContextBaseJavaModule { return NAME; } - @ReactMethod - public void reportFatalException(String message, ReadableArray stack, int id) { + @Override + public void reportFatalException(String message, ReadableArray stack, double idDouble) { + int id = (int) idDouble; + JavaOnlyMap data = new JavaOnlyMap(); data.putString("message", message); data.putArray("stack", stack); @@ -47,8 +49,10 @@ public class ExceptionsManagerModule extends ReactContextBaseJavaModule { reportException(data); } - @ReactMethod - public void reportSoftException(String message, ReadableArray stack, int id) { + @Override + public void reportSoftException(String message, ReadableArray stack, double idDouble) { + int id = (int) idDouble; + JavaOnlyMap data = new JavaOnlyMap(); data.putString("message", message); data.putArray("stack", stack); @@ -57,7 +61,7 @@ public class ExceptionsManagerModule extends ReactContextBaseJavaModule { reportException(data); } - @ReactMethod + @Override public void reportException(ReadableMap data) { String message = data.hasKey("message") ? data.getString("message") : ""; ReadableArray stack = data.hasKey("stack") ? data.getArray("stack") : Arguments.createArray(); @@ -87,14 +91,17 @@ public class ExceptionsManagerModule extends ReactContextBaseJavaModule { } } - @ReactMethod - public void updateExceptionMessage(String title, ReadableArray details, int exceptionId) { + @Override + public void updateExceptionMessage( + String title, ReadableArray details, double exceptionIdDouble) { + int exceptionId = (int) exceptionIdDouble; + if (mDevSupportManager.getDevSupportEnabled()) { mDevSupportManager.updateJSError(title, details, exceptionId); } } - @ReactMethod + @Override public void dismissRedbox() { if (mDevSupportManager.getDevSupportEnabled()) { mDevSupportManager.hideRedboxDialog(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/core/HeadlessJsTaskSupportModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/core/HeadlessJsTaskSupportModule.java index b4459e90f0e..ce9f6fc48c7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/core/HeadlessJsTaskSupportModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/core/HeadlessJsTaskSupportModule.java @@ -8,10 +8,9 @@ package com.facebook.react.modules.core; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeHeadlessJsTaskSupportSpec; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.jstasks.HeadlessJsTaskContext; import com.facebook.react.module.annotations.ReactModule; @@ -20,7 +19,7 @@ import com.facebook.react.module.annotations.ReactModule; * it can e.g. release any resources, stop timers etc. */ @ReactModule(name = HeadlessJsTaskSupportModule.NAME) -public class HeadlessJsTaskSupportModule extends ReactContextBaseJavaModule { +public class HeadlessJsTaskSupportModule extends NativeHeadlessJsTaskSupportSpec { public static final String NAME = "HeadlessJsTaskSupport"; @@ -33,8 +32,10 @@ public class HeadlessJsTaskSupportModule extends ReactContextBaseJavaModule { return NAME; } - @ReactMethod - public void notifyTaskRetry(int taskId, Promise promise) { + @Override + public void notifyTaskRetry(double taskIdDouble, Promise promise) { + int taskId = (int) taskIdDouble; + HeadlessJsTaskContext headlessJsTaskContext = HeadlessJsTaskContext.getInstance(getReactApplicationContext()); if (headlessJsTaskContext.isTaskRunning(taskId)) { @@ -49,8 +50,10 @@ public class HeadlessJsTaskSupportModule extends ReactContextBaseJavaModule { } } - @ReactMethod - public void notifyTaskFinished(int taskId) { + @Override + public void notifyTaskFinished(double taskIdDouble) { + int taskId = (int) taskIdDouble; + HeadlessJsTaskContext headlessJsTaskContext = HeadlessJsTaskContext.getInstance(getReactApplicationContext()); if (headlessJsTaskContext.isTaskRunning(taskId)) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.java index b7e7d052480..dbbbf843b38 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.java @@ -7,10 +7,9 @@ package com.facebook.react.modules.core; +import com.facebook.fbreact.specs.NativeTimingSpec; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.WritableArray; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.jstasks.HeadlessJsTaskContext; @@ -19,7 +18,7 @@ import com.facebook.react.module.annotations.ReactModule; /** Native module for JS timer execution. Timers fire on frame boundaries. */ @ReactModule(name = TimingModule.NAME) -public final class TimingModule extends ReactContextBaseJavaModule +public final class TimingModule extends NativeTimingSpec implements LifecycleEventListener, HeadlessJsTaskEventListener { public class BridgeTimerManager implements JavaScriptTimerManager { @@ -79,21 +78,26 @@ public final class TimingModule extends ReactContextBaseJavaModule return NAME; } - @ReactMethod + @Override public void createTimer( - final int callbackID, - final int duration, + final double callbackIDDouble, + final double durationDouble, final double jsSchedulingTime, final boolean repeat) { + final int callbackID = (int) callbackIDDouble; + final int duration = (int) durationDouble; + mJavaTimerManager.createAndMaybeCallTimer(callbackID, duration, jsSchedulingTime, repeat); } - @ReactMethod - public void deleteTimer(int timerId) { + @Override + public void deleteTimer(double timerIdDouble) { + int timerId = (int) timerIdDouble; + mJavaTimerManager.deleteTimer(timerId); } - @ReactMethod + @Override public void setSendIdleEvents(final boolean sendIdleEvents) { mJavaTimerManager.setSendIdleEvents(sendIdleEvents); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java index d44c4f8b9be..20cb8258938 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java @@ -18,6 +18,7 @@ import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; +import com.facebook.fbreact.specs.NativeDatePickerAndroidSpec; import com.facebook.react.bridge.*; import com.facebook.react.common.annotations.VisibleForTesting; import com.facebook.react.module.annotations.ReactModule; @@ -27,7 +28,7 @@ import com.facebook.react.module.annotations.ReactModule; * the user selects a date. */ @ReactModule(name = DatePickerDialogModule.FRAGMENT_TAG) -public class DatePickerDialogModule extends ReactContextBaseJavaModule { +public class DatePickerDialogModule extends NativeDatePickerAndroidSpec { @VisibleForTesting public static final String FRAGMENT_TAG = "DatePickerAndroid"; @@ -45,7 +46,6 @@ public class DatePickerDialogModule extends ReactContextBaseJavaModule { super(reactContext); } - @Override public @NonNull String getName() { return DatePickerDialogModule.FRAGMENT_TAG; } @@ -100,7 +100,7 @@ public class DatePickerDialogModule extends ReactContextBaseJavaModule { * action is {@code dateSetAction} or {@code dismissedAction}, depending on what the user did. * If the action is dismiss, year, month and date are undefined. */ - @ReactMethod + @Override public void open(@Nullable final ReadableMap options, Promise promise) { Activity raw_activity = getCurrentActivity(); if (raw_activity == null || !(raw_activity instanceof FragmentActivity)) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/AnimationsDebugModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/AnimationsDebugModule.java index 8e0e98a5c21..da69cf93c05 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/AnimationsDebugModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/AnimationsDebugModule.java @@ -10,10 +10,9 @@ package com.facebook.react.modules.debug; import android.widget.Toast; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeAnimationsDebugModuleSpec; import com.facebook.react.bridge.JSApplicationCausedNativeException; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.common.ReactConstants; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.modules.debug.interfaces.DeveloperSettings; @@ -24,7 +23,7 @@ import java.util.Locale; * going from one screen to another). */ @ReactModule(name = AnimationsDebugModule.NAME) -public class AnimationsDebugModule extends ReactContextBaseJavaModule { +public class AnimationsDebugModule extends NativeAnimationsDebugModuleSpec { protected static final String NAME = "AnimationsDebugModule"; @@ -42,7 +41,7 @@ public class AnimationsDebugModule extends ReactContextBaseJavaModule { return NAME; } - @ReactMethod + @Override public void startRecordingFps() { if (mCatalystSettings == null || !mCatalystSettings.isAnimationFpsDebugEnabled()) { return; @@ -61,7 +60,7 @@ public class AnimationsDebugModule extends ReactContextBaseJavaModule { * (unix time) so that we know when the animation stopped from the JS perspective and we don't * count time after as being part of the animation. */ - @ReactMethod + @Override public void stopRecordingFps(double animationStopTimeMs) { if (mFrameCallback == null) { return; diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java index 55ad479ebc7..0a970ca3f7b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java @@ -7,10 +7,9 @@ package com.facebook.react.modules.debug; +import com.facebook.fbreact.specs.NativeDevSettingsSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; import com.facebook.react.devsupport.interfaces.DevOptionHandler; @@ -22,7 +21,7 @@ import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEm * Module that exposes the URL to the source code map (used for exception stack trace parsing) to JS */ @ReactModule(name = DevSettingsModule.NAME) -public class DevSettingsModule extends ReactContextBaseJavaModule { +public class DevSettingsModule extends NativeDevSettingsSpec { public static final String NAME = "DevSettings"; @@ -40,7 +39,7 @@ public class DevSettingsModule extends ReactContextBaseJavaModule { return NAME; } - @ReactMethod + @Override public void reload() { if (mDevSupportManager.getDevSupportEnabled()) { UiThreadUtil.runOnUiThread( @@ -53,37 +52,37 @@ public class DevSettingsModule extends ReactContextBaseJavaModule { } } - @ReactMethod + @Override public void reloadWithReason(String reason) { this.reload(); } - @ReactMethod + @Override public void onFastRefresh() { // noop } - @ReactMethod + @Override public void setHotLoadingEnabled(boolean isHotLoadingEnabled) { mDevSupportManager.setHotModuleReplacementEnabled(isHotLoadingEnabled); } - @ReactMethod + @Override public void setIsDebuggingRemotely(boolean isDebugginRemotelyEnabled) { mDevSupportManager.setRemoteJSDebugEnabled(isDebugginRemotelyEnabled); } - @ReactMethod + @Override public void setProfilingEnabled(boolean isProfilingEnabled) { mDevSupportManager.setFpsDebugEnabled(isProfilingEnabled); } - @ReactMethod + @Override public void toggleElementInspector() { mDevSupportManager.toggleElementInspector(); } - @ReactMethod + @Override public void addMenuItem(final String title) { mDevSupportManager.addCustomDevOption( title, @@ -104,4 +103,9 @@ public class DevSettingsModule extends ReactContextBaseJavaModule { } }); } + + @Override + public void setIsShakeToShowDevMenuEnabled(boolean enabled) { + // iOS only + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogModule.java index 437336f0ab0..e3a25072156 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogModule.java @@ -17,11 +17,10 @@ import androidx.annotation.Nullable; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeDialogManagerAndroidSpec; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.SoftAssertions; @@ -31,7 +30,7 @@ import com.facebook.react.module.annotations.ReactModule; import java.util.Map; @ReactModule(name = DialogModule.NAME) -public class DialogModule extends ReactContextBaseJavaModule implements LifecycleEventListener { +public class DialogModule extends NativeDialogManagerAndroidSpec implements LifecycleEventListener { /* package */ static final String FRAGMENT_TAG = "com.facebook.catalyst.react.dialog.DialogModule"; @@ -149,7 +148,7 @@ public class DialogModule extends ReactContextBaseJavaModule implements Lifecycl } @Override - public Map getConstants() { + public Map getTypedExportedConstants() { return CONSTANTS; } @@ -179,7 +178,7 @@ public class DialogModule extends ReactContextBaseJavaModule implements Lifecycl } } - @ReactMethod + @Override public void showAlert( ReadableMap options, Callback errorCallback, final Callback actionCallback) { final FragmentManagerHelper fragmentManagerHelper = getFragmentManagerHelper(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java index f08290f8e73..7c324332e37 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java @@ -15,11 +15,10 @@ import android.net.Uri; import android.nfc.NfcAdapter; import android.provider.Settings; import androidx.annotation.Nullable; +import com.facebook.fbreact.specs.NativeLinkingSpec; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableType; @@ -27,7 +26,7 @@ import com.facebook.react.module.annotations.ReactModule; /** Intent module. Launch other activities or open URLs. */ @ReactModule(name = IntentModule.NAME) -public class IntentModule extends ReactContextBaseJavaModule { +public class IntentModule extends NativeLinkingSpec { public static final String NAME = "IntentAndroid"; @@ -45,7 +44,7 @@ public class IntentModule extends ReactContextBaseJavaModule { * * @param promise a promise which is resolved with the initial URL */ - @ReactMethod + @Override public void getInitialURL(Promise promise) { try { Activity currentActivity = getCurrentActivity(); @@ -79,7 +78,7 @@ public class IntentModule extends ReactContextBaseJavaModule { * * @param url the URL to open */ - @ReactMethod + @Override public void openURL(String url, Promise promise) { if (url == null || url.isEmpty()) { promise.reject(new JSApplicationIllegalArgumentException("Invalid URL: " + url)); @@ -121,7 +120,7 @@ public class IntentModule extends ReactContextBaseJavaModule { * @param url the URL to open * @param promise a promise that is always resolved with a boolean argument */ - @ReactMethod + @Override public void canOpenURL(String url, Promise promise) { if (url == null || url.isEmpty()) { promise.reject(new JSApplicationIllegalArgumentException("Invalid URL: " + url)); @@ -148,7 +147,7 @@ public class IntentModule extends ReactContextBaseJavaModule { * * @param promise a promise which is resolved when the Settings is opened */ - @ReactMethod + @Override public void openSettings(Promise promise) { try { Intent intent = new Intent(); @@ -182,7 +181,7 @@ public class IntentModule extends ReactContextBaseJavaModule { * @param action The general action to be performed * @param extras An array of extras [{ String, String | Number | Boolean }] */ - @ReactMethod + @Override public void sendIntent(String action, @Nullable ReadableArray extras, Promise promise) { if (action == null || action.isEmpty()) { promise.reject(new JSApplicationIllegalArgumentException("Invalid Action: " + action + ".")); @@ -238,4 +237,14 @@ public class IntentModule extends ReactContextBaseJavaModule { getReactApplicationContext().startActivity(intent); } + + @Override + public void addListener(String eventName) { + // iOS only + } + + @Override + public void removeListeners(double count) { + // iOS only + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/permissions/PermissionsModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/permissions/PermissionsModule.java index 15e93193b6f..879481740de 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/permissions/PermissionsModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/permissions/PermissionsModule.java @@ -13,11 +13,10 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.Process; import android.util.SparseArray; +import com.facebook.fbreact.specs.NativePermissionsAndroidSpec; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeMap; @@ -28,7 +27,7 @@ import java.util.ArrayList; /** Module that exposes the Android M Permission system to JS. */ @ReactModule(name = PermissionsModule.NAME) -public class PermissionsModule extends ReactContextBaseJavaModule implements PermissionListener { +public class PermissionsModule extends NativePermissionsAndroidSpec implements PermissionListener { private static final String ERROR_INVALID_ACTIVITY = "E_INVALID_ACTIVITY"; public static final String NAME = "PermissionsAndroid"; @@ -52,7 +51,7 @@ public class PermissionsModule extends ReactContextBaseJavaModule implements Per * Check if the app has the permission given. successCallback is called with true if the * permission had been granted, false otherwise. See {@link Activity#checkSelfPermission}. */ - @ReactMethod + @Override public void checkPermission(final String permission, final Promise promise) { Context context = getReactApplicationContext().getBaseContext(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { @@ -72,7 +71,7 @@ public class PermissionsModule extends ReactContextBaseJavaModule implements Per * again). For devices before Android M, this always returns false. See {@link * Activity#shouldShowRequestPermissionRationale}. */ - @ReactMethod + @Override public void shouldShowRequestPermissionRationale(final String permission, final Promise promise) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { promise.resolve(false); @@ -92,7 +91,7 @@ public class PermissionsModule extends ReactContextBaseJavaModule implements Per * user has the permission given or not and resolves with GRANTED or DENIED. See {@link * Activity#checkSelfPermission}. */ - @ReactMethod + @Override public void requestPermission(final String permission, final Promise promise) { Context context = getReactApplicationContext().getBaseContext(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { @@ -137,7 +136,7 @@ public class PermissionsModule extends ReactContextBaseJavaModule implements Per } } - @ReactMethod + @Override public void requestMultiplePermissions(final ReadableArray permissions, final Promise promise) { final WritableMap grantedPermissions = new WritableNativeMap(); final ArrayList permissionsToCheck = new ArrayList(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/share/ShareModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/share/ShareModule.java index 024c7eb37a7..ee826d69eb9 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/share/ShareModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/share/ShareModule.java @@ -9,18 +9,17 @@ package com.facebook.react.modules.share; import android.app.Activity; import android.content.Intent; +import com.facebook.fbreact.specs.NativeShareModuleSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.module.annotations.ReactModule; /** Intent module. Launch other activities or open URLs. */ @ReactModule(name = ShareModule.NAME) -public class ShareModule extends ReactContextBaseJavaModule { +public class ShareModule extends NativeShareModuleSpec { public static final String NAME = "ShareModule"; /* package */ static final String ACTION_SHARED = "sharedAction"; @@ -44,7 +43,7 @@ public class ShareModule extends ReactContextBaseJavaModule { * @param content the data to send * @param dialogTitle the title of the chooser dialog */ - @ReactMethod + @Override public void share(ReadableMap content, String dialogTitle, Promise promise) { if (content == null) { promise.reject(ERROR_INVALID_CONTENT, "Content cannot be null"); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/sound/SoundManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/sound/SoundManagerModule.java index 215b76998a0..8e1b122defb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/sound/SoundManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/sound/SoundManagerModule.java @@ -9,15 +9,14 @@ package com.facebook.react.modules.sound; import android.content.Context; import android.media.AudioManager; +import com.facebook.fbreact.specs.NativeSoundManagerSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.module.annotations.ReactModule; /** {@link NativeModule} that allows Playing device sounds from JS. */ @ReactModule(name = SoundManagerModule.NAME) -public class SoundManagerModule extends ReactContextBaseJavaModule { +public class SoundManagerModule extends NativeSoundManagerSpec { public static final String NAME = "SoundManager"; @@ -30,7 +29,7 @@ public class SoundManagerModule extends ReactContextBaseJavaModule { return NAME; } - @ReactMethod + @Override public void playTouchSound() { AudioManager audioManager = (AudioManager) getReactApplicationContext().getSystemService(Context.AUDIO_SERVICE); diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/StatusBarModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/StatusBarModule.java index 3b23b4f0bff..1898a62a127 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/StatusBarModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/StatusBarModule.java @@ -19,11 +19,10 @@ import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeStatusBarManagerAndroidSpec; import com.facebook.react.bridge.GuardedRunnable; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.common.MapBuilder; import com.facebook.react.common.ReactConstants; @@ -33,7 +32,7 @@ import java.util.Map; /** {@link NativeModule} that allows changing the appearance of the status bar. */ @ReactModule(name = StatusBarModule.NAME) -public class StatusBarModule extends ReactContextBaseJavaModule { +public class StatusBarModule extends NativeStatusBarManagerAndroidSpec { private static final String HEIGHT_KEY = "HEIGHT"; private static final String DEFAULT_BACKGROUND_COLOR_KEY = "DEFAULT_BACKGROUND_COLOR"; @@ -49,7 +48,7 @@ public class StatusBarModule extends ReactContextBaseJavaModule { } @Override - public @Nullable Map getConstants() { + public @Nullable Map getTypedExportedConstants() { final Context context = getReactApplicationContext(); final Activity activity = getCurrentActivity(); @@ -70,8 +69,10 @@ public class StatusBarModule extends ReactContextBaseJavaModule { HEIGHT_KEY, height, DEFAULT_BACKGROUND_COLOR_KEY, statusBarColorString); } - @ReactMethod - public void setColor(final int color, final boolean animated) { + @Override + public void setColor(final double colorDouble, final boolean animated) { + final int color = (int) colorDouble; + final Activity activity = getCurrentActivity(); if (activity == null) { FLog.w( @@ -114,7 +115,7 @@ public class StatusBarModule extends ReactContextBaseJavaModule { } } - @ReactMethod + @Override public void setTranslucent(final boolean translucent) { final Activity activity = getCurrentActivity(); if (activity == null) { @@ -156,7 +157,7 @@ public class StatusBarModule extends ReactContextBaseJavaModule { } } - @ReactMethod + @Override public void setHidden(final boolean hidden) { final Activity activity = getCurrentActivity(); if (activity == null) { @@ -180,7 +181,7 @@ public class StatusBarModule extends ReactContextBaseJavaModule { }); } - @ReactMethod + @Override public void setStyle(@Nullable final String style) { final Activity activity = getCurrentActivity(); if (activity == null) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/storage/AsyncStorageModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/storage/AsyncStorageModule.java index 368c2b5ec9c..2b605a571f9 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/storage/AsyncStorageModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/storage/AsyncStorageModule.java @@ -15,12 +15,11 @@ import android.database.Cursor; import android.database.sqlite.SQLiteStatement; import android.os.AsyncTask; import com.facebook.common.logging.FLog; +import com.facebook.fbreact.specs.NativeAsyncStorageSpec; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.GuardedAsyncTask; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; @@ -33,7 +32,7 @@ import java.util.HashSet; import java.util.concurrent.Executor; @ReactModule(name = AsyncStorageModule.NAME) -public final class AsyncStorageModule extends ReactContextBaseJavaModule +public final class AsyncStorageModule extends NativeAsyncStorageSpec implements ModuleDataCleaner.Cleanable { public static final String NAME = "AsyncSQLiteDBStorage"; @@ -120,7 +119,7 @@ public final class AsyncStorageModule extends ReactContextBaseJavaModule * Given an array of keys, this returns a map of (key, value) pairs for the keys found, and (key, * null) for the keys that haven't been found. */ - @ReactMethod + @Override public void multiGet(final ReadableArray keys, final Callback callback) { if (keys == null) { callback.invoke(AsyncStorageErrorUtil.getInvalidKeyError(null), null); @@ -196,7 +195,7 @@ public final class AsyncStorageModule extends ReactContextBaseJavaModule * return AsyncLocalStorageFailure, but all other pairs will have been inserted. The insertion * will replace conflicting (key, value) pairs. */ - @ReactMethod + @Override public void multiSet(final ReadableArray keyValueArray, final Callback callback) { if (keyValueArray.size() == 0) { callback.invoke(AsyncStorageErrorUtil.getInvalidKeyError(null)); @@ -259,7 +258,7 @@ public final class AsyncStorageModule extends ReactContextBaseJavaModule } /** Removes all rows of the keys given. */ - @ReactMethod + @Override public void multiRemove(final ReadableArray keys, final Callback callback) { if (keys.size() == 0) { callback.invoke(AsyncStorageErrorUtil.getInvalidKeyError(null)); @@ -313,7 +312,7 @@ public final class AsyncStorageModule extends ReactContextBaseJavaModule * Given an array of (key, value) pairs, this will merge the given values with the stored values * of the given keys, if they exist. */ - @ReactMethod + @Override public void multiMerge(final ReadableArray keyValueArray, final Callback callback) { new GuardedAsyncTask(getReactApplicationContext()) { @Override @@ -373,7 +372,7 @@ public final class AsyncStorageModule extends ReactContextBaseJavaModule } /** Clears the database. */ - @ReactMethod + @Override public void clear(final Callback callback) { new GuardedAsyncTask(getReactApplicationContext()) { @Override @@ -394,7 +393,7 @@ public final class AsyncStorageModule extends ReactContextBaseJavaModule } /** Returns an array with all keys from the database. */ - @ReactMethod + @Override public void getAllKeys(final Callback callback) { new GuardedAsyncTask(getReactApplicationContext()) { @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java index 3eb747a869f..335cb2062f6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoModule.java @@ -16,10 +16,9 @@ import android.content.res.Resources; import android.os.Build; import android.provider.Settings.Secure; import androidx.annotation.Nullable; +import com.facebook.fbreact.specs.NativePlatformConstantsAndroidSpec; import com.facebook.react.R; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.turbomodule.core.interfaces.TurboModule; @@ -29,7 +28,7 @@ import java.util.Map; /** Module that exposes Android Constants to JS. */ @ReactModule(name = AndroidInfoModule.NAME) @SuppressLint("HardwareIds") -public class AndroidInfoModule extends ReactContextBaseJavaModule implements TurboModule { +public class AndroidInfoModule extends NativePlatformConstantsAndroidSpec implements TurboModule { public static final String NAME = "PlatformConstants"; private static final String IS_TESTING = "IS_TESTING"; @@ -66,7 +65,7 @@ public class AndroidInfoModule extends ReactContextBaseJavaModule implements Tur } @Override - public @Nullable Map getConstants() { + public @Nullable Map getTypedExportedConstants() { HashMap constants = new HashMap<>(); constants.put("Version", Build.VERSION.SDK_INT); constants.put("Release", Build.VERSION.RELEASE); @@ -83,7 +82,7 @@ public class AndroidInfoModule extends ReactContextBaseJavaModule implements Tur return constants; } - @ReactMethod(isBlockingSynchronousMethod = true) + @Override public String getAndroidID() { return Secure.getString(getReactApplicationContext().getContentResolver(), Secure.ANDROID_ID); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/timepicker/TimePickerDialogModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/timepicker/TimePickerDialogModule.java index 412cf5d369a..b40f7b6b46c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/timepicker/TimePickerDialogModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/timepicker/TimePickerDialogModule.java @@ -17,11 +17,10 @@ import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; +import com.facebook.fbreact.specs.NativeTimePickerAndroidSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeMap; @@ -33,7 +32,7 @@ import com.facebook.react.module.annotations.ReactModule; * the user selects a time. */ @ReactModule(name = TimePickerDialogModule.FRAGMENT_TAG) -public class TimePickerDialogModule extends ReactContextBaseJavaModule { +public class TimePickerDialogModule extends NativeTimePickerAndroidSpec { @VisibleForTesting public static final String FRAGMENT_TAG = "TimePickerAndroid"; @@ -87,14 +86,14 @@ public class TimePickerDialogModule extends ReactContextBaseJavaModule { } } - @ReactMethod + @Override public void open(@Nullable final ReadableMap options, Promise promise) { Activity raw_activity = getCurrentActivity(); if (raw_activity == null || !(raw_activity instanceof FragmentActivity)) { promise.reject( - ERROR_NO_ACTIVITY, - "Tried to open a DatePicker dialog while not attached to a FragmentActivity"); + ERROR_NO_ACTIVITY, + "Tried to open a DatePicker dialog while not attached to a FragmentActivity"); return; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/toast/ToastModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/toast/ToastModule.java index a7746375af3..c646c946327 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/toast/ToastModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/toast/ToastModule.java @@ -9,10 +9,9 @@ package com.facebook.react.modules.toast; import android.view.Gravity; import android.widget.Toast; +import com.facebook.fbreact.specs.NativeToastAndroidSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.common.MapBuilder; import com.facebook.react.module.annotations.ReactModule; @@ -20,7 +19,7 @@ import java.util.Map; /** {@link NativeModule} that allows JS to show an Android Toast. */ @ReactModule(name = ToastModule.NAME) -public class ToastModule extends ReactContextBaseJavaModule { +public class ToastModule extends NativeToastAndroidSpec { private static final String DURATION_SHORT_KEY = "SHORT"; private static final String DURATION_LONG_KEY = "LONG"; @@ -40,7 +39,7 @@ public class ToastModule extends ReactContextBaseJavaModule { } @Override - public Map getConstants() { + public Map getTypedExportedConstants() { final Map constants = MapBuilder.newHashMap(); constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT); constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG); @@ -50,8 +49,10 @@ public class ToastModule extends ReactContextBaseJavaModule { return constants; } - @ReactMethod - public void show(final String message, final int duration) { + @Override + public void show(final String message, final double durationDouble) { + final int duration = (int) durationDouble; + UiThreadUtil.runOnUiThread( new Runnable() { @Override @@ -61,8 +62,12 @@ public class ToastModule extends ReactContextBaseJavaModule { }); } - @ReactMethod - public void showWithGravity(final String message, final int duration, final int gravity) { + @Override + public void showWithGravity( + final String message, final double durationDouble, final double gravityDouble) { + final int duration = (int) durationDouble; + final int gravity = (int) gravityDouble; + UiThreadUtil.runOnUiThread( new Runnable() { @Override @@ -74,13 +79,18 @@ public class ToastModule extends ReactContextBaseJavaModule { }); } - @ReactMethod + @Override public void showWithGravityAndOffset( final String message, - final int duration, - final int gravity, - final int xOffset, - final int yOffset) { + final double durationDouble, + final double gravityDouble, + final double xOffsetDouble, + final double yOffsetDouble) { + final int duration = (int) durationDouble; + final int gravity = (int) gravityDouble; + final int xOffset = (int) xOffsetDouble; + final int yOffset = (int) yOffsetDouble; + UiThreadUtil.runOnUiThread( new Runnable() { @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/vibration/VibrationModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/vibration/VibrationModule.java index 5f8eb0c1ed8..5e594ba9bd4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/vibration/VibrationModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/vibration/VibrationModule.java @@ -10,15 +10,14 @@ package com.facebook.react.modules.vibration; import android.annotation.SuppressLint; import android.content.Context; import android.os.Vibrator; +import com.facebook.fbreact.specs.NativeVibrationSpec; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.module.annotations.ReactModule; @SuppressLint("MissingPermission") @ReactModule(name = VibrationModule.NAME) -public class VibrationModule extends ReactContextBaseJavaModule { +public class VibrationModule extends NativeVibrationSpec { public static final String NAME = "Vibration"; @@ -31,16 +30,20 @@ public class VibrationModule extends ReactContextBaseJavaModule { return NAME; } - @ReactMethod - public void vibrate(int duration) { + @Override + public void vibrate(Double durationDouble) { + int duration = (int) durationDouble.doubleValue(); + Vibrator v = (Vibrator) getReactApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { v.vibrate(duration); } } - @ReactMethod - public void vibrateByPattern(ReadableArray pattern, int repeat) { + @Override + public void vibrateByPattern(ReadableArray pattern, double repeatDouble) { + int repeat = (int) repeatDouble; + Vibrator v = (Vibrator) getReactApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { long[] patternLong = new long[pattern.size()]; @@ -51,7 +54,7 @@ public class VibrationModule extends ReactContextBaseJavaModule { } } - @ReactMethod + @Override public void cancel() { Vibrator v = (Vibrator) getReactApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); if (v != null) {