From 1d315608ef0f7e91809aef5a1fd8d1ad482dafcc Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Mon, 4 Nov 2019 15:58:49 -0800 Subject: [PATCH] Make RCTCameraRollManager TurboModule-compatible Summary: See title. Changelog: [iOS][Added] - Make RCTCameraRollManager TurboModule-compatible Reviewed By: PeteTheHeat Differential Revision: D18148892 fbshipit-source-id: de49e368615032b2c4de129dc55191c562cbdfbe --- Libraries/CameraRoll/RCTCameraRollManager.mm | 22 +- .../FBReactNativeSpec-generated.mm | 77 +++++ .../FBReactNativeSpec/FBReactNativeSpec.h | 306 ++++++++++++++++++ .../specs/NativeCameraRollManagerSpec.java | 37 +++ 4 files changed, 435 insertions(+), 7 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeCameraRollManagerSpec.java diff --git a/Libraries/CameraRoll/RCTCameraRollManager.mm b/Libraries/CameraRoll/RCTCameraRollManager.mm index bccd3b005c1..f7480ea4914 100644 --- a/Libraries/CameraRoll/RCTCameraRollManager.mm +++ b/Libraries/CameraRoll/RCTCameraRollManager.mm @@ -69,6 +69,9 @@ RCT_ENUM_CONVERTER(PHAssetCollectionSubtype, (@{ @end +@interface RCTCameraRollManager() +@end + @implementation RCTCameraRollManager RCT_EXPORT_MODULE() @@ -181,18 +184,18 @@ static void RCTResolvePromise(RCTPromiseResolveBlock resolve, }); } -RCT_EXPORT_METHOD(getPhotos:(NSDictionary *)params +RCT_EXPORT_METHOD(getPhotos:(JS::NativeCameraRollManager::GetPhotosParams &)params resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { checkPhotoLibraryConfig(); - NSUInteger const first = [RCTConvert NSInteger:params[@"first"]]; - NSString *const afterCursor = [RCTConvert NSString:params[@"after"]]; - NSString *const groupName = [RCTConvert NSString:params[@"groupName"]]; - NSString *const groupTypes = [[RCTConvert NSString:params[@"groupTypes"]] lowercaseString]; - NSString *const mediaType = [RCTConvert NSString:params[@"assetType"]]; - NSArray *const mimeTypes = [RCTConvert NSStringArray:params[@"mimeTypes"]]; + NSUInteger const first = [RCTConvert NSInteger:[NSNumber numberWithDouble:params.first()]]; + NSString *const afterCursor = [RCTConvert NSString:params.after()]; + NSString *const groupName = [RCTConvert NSString:params.groupName()]; + NSString *const groupTypes = [[RCTConvert NSString:params.groupTypes()] lowercaseString]; + NSString *const mediaType = [RCTConvert NSString:params.assetType()]; + NSArray *const mimeTypes = [RCTConvert NSStringArray:RCTConvertOptionalVecToArray(params.mimeTypes())]; // If groupTypes is "all", we want to fetch the SmartAlbum "all photos". Otherwise, all // other groupTypes values require the "album" collection type. @@ -346,6 +349,11 @@ static void checkPhotoLibraryConfig() #endif } +- (std::shared_ptr)getTurboModuleWithJsInvoker:(std::shared_ptr)jsInvoker +{ + return std::make_shared(self, jsInvoker); +} + @end Class RCTCameraRollManagerCls(void) { diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm index 6dd7a40420c..1e8ab1bd2af 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm @@ -696,6 +696,83 @@ namespace facebook { } // namespace react } // namespace facebook +@implementation RCTCxxConvert (NativeCameraRollManager_GetPhotosParams) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_GetPhotosParams:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +namespace facebook { + namespace react { + + + static facebook::jsi::Value __hostFunction_NativeCameraRollManagerSpecJSI_getPhotos(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "getPhotos", @selector(getPhotos:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeCameraRollManagerSpecJSI_saveToCameraRoll(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "saveToCameraRoll", @selector(saveToCameraRoll:type:resolve:reject:), args, count); + } + + static facebook::jsi::Value __hostFunction_NativeCameraRollManagerSpecJSI_deletePhotos(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, PromiseKind, "deletePhotos", @selector(deletePhotos:resolve:reject:), args, count); + } + + + NativeCameraRollManagerSpecJSI::NativeCameraRollManagerSpecJSI(id instance, std::shared_ptr jsInvoker) + : ObjCTurboModule("CameraRollManager", instance, jsInvoker) { + + methodMap_["getPhotos"] = MethodMetadata {1, __hostFunction_NativeCameraRollManagerSpecJSI_getPhotos}; + + setMethodArgConversionSelector(@"getPhotos", 0, @"JS_NativeCameraRollManager_GetPhotosParams:"); + + methodMap_["saveToCameraRoll"] = MethodMetadata {2, __hostFunction_NativeCameraRollManagerSpecJSI_saveToCameraRoll}; + + + methodMap_["deletePhotos"] = MethodMetadata {1, __hostFunction_NativeCameraRollManagerSpecJSI_deletePhotos}; + + + + } + + } // namespace react +} // namespace facebook +@implementation RCTCxxConvert (NativeCameraRollManager_PhotoIdentifierNodeImage) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifierNodeImage:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeCameraRollManager_PhotoIdentifierNodeLocation) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifierNodeLocation:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeCameraRollManager_PhotoIdentifierNode) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifierNode:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeCameraRollManager_PhotoIdentifier) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifier:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeCameraRollManager_PhotoIdentifiersPagePage_info) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifiersPagePage_info:(id)json +{ + return facebook::react::managedPointer(json); +} +@end +@implementation RCTCxxConvert (NativeCameraRollManager_PhotoIdentifiersPage) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifiersPage:(id)json +{ + return facebook::react::managedPointer(json); +} +@end namespace facebook { namespace react { diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h index 6bad8d4ad06..17f2f980169 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h @@ -644,6 +644,167 @@ namespace facebook { }; } // namespace react } // namespace facebook + +namespace JS { + namespace NativeCameraRollManager { + struct GetPhotosParams { + double first() const; + NSString *after() const; + NSString *groupName() const; + NSString *groupTypes() const; + NSString *assetType() const; + folly::Optional maxSize() const; + folly::Optional> mimeTypes() const; + + GetPhotosParams(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeCameraRollManager_GetPhotosParams) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_GetPhotosParams:(id)json; +@end +@protocol NativeCameraRollManagerSpec + +- (void)getPhotos:(JS::NativeCameraRollManager::GetPhotosParams &)params + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)saveToCameraRoll:(NSString *)uri + type:(NSString *)type + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; +- (void)deletePhotos:(NSArray *)assets + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject; + +@end +namespace facebook { + namespace react { + /** + * ObjC++ class for module 'CameraRollManager' + */ + + class JSI_EXPORT NativeCameraRollManagerSpecJSI : public ObjCTurboModule { + public: + NativeCameraRollManagerSpecJSI(id instance, std::shared_ptr jsInvoker); + + }; + } // namespace react +} // namespace facebook + +namespace JS { + namespace NativeCameraRollManager { + struct PhotoIdentifierNodeImage { + NSString *uri() const; + double playableDuration() const; + double width() const; + double height() const; + folly::Optional isStored() const; + NSString *filename() const; + + PhotoIdentifierNodeImage(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeCameraRollManager_PhotoIdentifierNodeImage) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifierNodeImage:(id)json; +@end + +namespace JS { + namespace NativeCameraRollManager { + struct PhotoIdentifierNodeLocation { + double longitude() const; + double latitude() const; + folly::Optional altitude() const; + folly::Optional heading() const; + folly::Optional speed() const; + + PhotoIdentifierNodeLocation(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeCameraRollManager_PhotoIdentifierNodeLocation) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifierNodeLocation:(id)json; +@end + +namespace JS { + namespace NativeCameraRollManager { + struct PhotoIdentifierNode { + JS::NativeCameraRollManager::PhotoIdentifierNodeImage image() const; + NSString *type() const; + NSString *group_name() const; + double timestamp() const; + JS::NativeCameraRollManager::PhotoIdentifierNodeLocation location() const; + + PhotoIdentifierNode(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeCameraRollManager_PhotoIdentifierNode) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifierNode:(id)json; +@end + +namespace JS { + namespace NativeCameraRollManager { + struct PhotoIdentifier { + JS::NativeCameraRollManager::PhotoIdentifierNode node() const; + + PhotoIdentifier(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeCameraRollManager_PhotoIdentifier) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifier:(id)json; +@end + +namespace JS { + namespace NativeCameraRollManager { + struct PhotoIdentifiersPagePage_info { + bool has_next_page() const; + NSString *start_cursor() const; + NSString *end_cursor() const; + + PhotoIdentifiersPagePage_info(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeCameraRollManager_PhotoIdentifiersPagePage_info) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifiersPagePage_info:(id)json; +@end + +namespace JS { + namespace NativeCameraRollManager { + struct PhotoIdentifiersPage { + facebook::react::LazyVector edges() const; + JS::NativeCameraRollManager::PhotoIdentifiersPagePage_info page_info() const; + + PhotoIdentifiersPage(NSDictionary *const v) : _v(v) {} + private: + NSDictionary *_v; + }; + } +} + +@interface RCTCxxConvert (NativeCameraRollManager_PhotoIdentifiersPage) ++ (RCTManagedPointer *)JS_NativeCameraRollManager_PhotoIdentifiersPage:(id)json; +@end @protocol NativeClipboardSpec - (void)getString:(RCTPromiseResolveBlock)resolve @@ -2862,6 +3023,151 @@ inline JS::NativeBlobModule::Constants::Builder::Builder(const Input i) : _facto inline JS::NativeBlobModule::Constants::Builder::Builder(Constants i) : _factory(^{ return i.unsafeRawValue(); }) {} +inline double JS::NativeCameraRollManager::GetPhotosParams::first() const +{ + id const p = _v[@"first"]; + return RCTBridgingToDouble(p); +} +inline NSString *JS::NativeCameraRollManager::GetPhotosParams::after() const +{ + id const p = _v[@"after"]; + return RCTBridgingToString(p); +} +inline NSString *JS::NativeCameraRollManager::GetPhotosParams::groupName() const +{ + id const p = _v[@"groupName"]; + return RCTBridgingToString(p); +} +inline NSString *JS::NativeCameraRollManager::GetPhotosParams::groupTypes() const +{ + id const p = _v[@"groupTypes"]; + return RCTBridgingToString(p); +} +inline NSString *JS::NativeCameraRollManager::GetPhotosParams::assetType() const +{ + id const p = _v[@"assetType"]; + return RCTBridgingToString(p); +} +inline folly::Optional JS::NativeCameraRollManager::GetPhotosParams::maxSize() const +{ + id const p = _v[@"maxSize"]; + return RCTBridgingToOptionalDouble(p); +} +inline folly::Optional> JS::NativeCameraRollManager::GetPhotosParams::mimeTypes() const +{ + id const p = _v[@"mimeTypes"]; + return RCTBridgingToOptionalVec(p, ^NSString *(id itemValue_0) { return RCTBridgingToString(itemValue_0); }); +} +inline NSString *JS::NativeCameraRollManager::PhotoIdentifierNodeImage::uri() const +{ + id const p = _v[@"uri"]; + return RCTBridgingToString(p); +} +inline double JS::NativeCameraRollManager::PhotoIdentifierNodeImage::playableDuration() const +{ + id const p = _v[@"playableDuration"]; + return RCTBridgingToDouble(p); +} +inline double JS::NativeCameraRollManager::PhotoIdentifierNodeImage::width() const +{ + id const p = _v[@"width"]; + return RCTBridgingToDouble(p); +} +inline double JS::NativeCameraRollManager::PhotoIdentifierNodeImage::height() const +{ + id const p = _v[@"height"]; + return RCTBridgingToDouble(p); +} +inline folly::Optional JS::NativeCameraRollManager::PhotoIdentifierNodeImage::isStored() const +{ + id const p = _v[@"isStored"]; + return RCTBridgingToOptionalBool(p); +} +inline NSString *JS::NativeCameraRollManager::PhotoIdentifierNodeImage::filename() const +{ + id const p = _v[@"filename"]; + return RCTBridgingToString(p); +} +inline double JS::NativeCameraRollManager::PhotoIdentifierNodeLocation::longitude() const +{ + id const p = _v[@"longitude"]; + return RCTBridgingToDouble(p); +} +inline double JS::NativeCameraRollManager::PhotoIdentifierNodeLocation::latitude() const +{ + id const p = _v[@"latitude"]; + return RCTBridgingToDouble(p); +} +inline folly::Optional JS::NativeCameraRollManager::PhotoIdentifierNodeLocation::altitude() const +{ + id const p = _v[@"altitude"]; + return RCTBridgingToOptionalDouble(p); +} +inline folly::Optional JS::NativeCameraRollManager::PhotoIdentifierNodeLocation::heading() const +{ + id const p = _v[@"heading"]; + return RCTBridgingToOptionalDouble(p); +} +inline folly::Optional JS::NativeCameraRollManager::PhotoIdentifierNodeLocation::speed() const +{ + id const p = _v[@"speed"]; + return RCTBridgingToOptionalDouble(p); +} +inline JS::NativeCameraRollManager::PhotoIdentifierNodeImage JS::NativeCameraRollManager::PhotoIdentifierNode::image() const +{ + id const p = _v[@"image"]; + return JS::NativeCameraRollManager::PhotoIdentifierNodeImage(p); +} +inline NSString *JS::NativeCameraRollManager::PhotoIdentifierNode::type() const +{ + id const p = _v[@"type"]; + return RCTBridgingToString(p); +} +inline NSString *JS::NativeCameraRollManager::PhotoIdentifierNode::group_name() const +{ + id const p = _v[@"group_name"]; + return RCTBridgingToString(p); +} +inline double JS::NativeCameraRollManager::PhotoIdentifierNode::timestamp() const +{ + id const p = _v[@"timestamp"]; + return RCTBridgingToDouble(p); +} +inline JS::NativeCameraRollManager::PhotoIdentifierNodeLocation JS::NativeCameraRollManager::PhotoIdentifierNode::location() const +{ + id const p = _v[@"location"]; + return JS::NativeCameraRollManager::PhotoIdentifierNodeLocation(p); +} +inline JS::NativeCameraRollManager::PhotoIdentifierNode JS::NativeCameraRollManager::PhotoIdentifier::node() const +{ + id const p = _v[@"node"]; + return JS::NativeCameraRollManager::PhotoIdentifierNode(p); +} +inline bool JS::NativeCameraRollManager::PhotoIdentifiersPagePage_info::has_next_page() const +{ + id const p = _v[@"has_next_page"]; + return RCTBridgingToBool(p); +} +inline NSString *JS::NativeCameraRollManager::PhotoIdentifiersPagePage_info::start_cursor() const +{ + id const p = _v[@"start_cursor"]; + return RCTBridgingToString(p); +} +inline NSString *JS::NativeCameraRollManager::PhotoIdentifiersPagePage_info::end_cursor() const +{ + id const p = _v[@"end_cursor"]; + return RCTBridgingToString(p); +} +inline facebook::react::LazyVector JS::NativeCameraRollManager::PhotoIdentifiersPage::edges() const +{ + id const p = _v[@"edges"]; + return RCTBridgingToVec(p, ^JS::NativeCameraRollManager::PhotoIdentifier(id itemValue_0) { return JS::NativeCameraRollManager::PhotoIdentifier(itemValue_0); }); +} +inline JS::NativeCameraRollManager::PhotoIdentifiersPagePage_info JS::NativeCameraRollManager::PhotoIdentifiersPage::page_info() const +{ + id const p = _v[@"page_info"]; + return JS::NativeCameraRollManager::PhotoIdentifiersPagePage_info(p); +} inline JS::NativeDeviceInfo::DisplayMetrics::Builder::Builder(const Input i) : _factory(^{ NSMutableDictionary *d = [NSMutableDictionary new]; auto width = i.width.get(); diff --git a/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeCameraRollManagerSpec.java b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeCameraRollManagerSpec.java new file mode 100644 index 00000000000..3dd691799c9 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/fbreact/specs/NativeCameraRollManagerSpec.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + * + *

Generated by an internal genrule from Flow types. + * + * @generated + * @nolint + */ + +package com.facebook.fbreact.specs; + +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.ReactModuleWithSpec; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; + +public abstract class NativeCameraRollManagerSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public NativeCameraRollManagerSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @ReactMethod + public abstract void getPhotos(ReadableMap params, Promise promise); + + @ReactMethod + public abstract void deletePhotos(ReadableArray assets, Promise promise); + + @ReactMethod + public abstract void saveToCameraRoll(String uri, String type, Promise promise); +}