From fef991a8ce6b4f3490dca08ff4db345677d39376 Mon Sep 17 00:00:00 2001 From: Ran Greenberg Date: Sat, 2 Jul 2016 01:11:56 +0300 Subject: [PATCH] add upload from camera and gallery view after images screen --- ios/lib/ReactNativeCameraKit/CKCamera.m | 50 +++++--- .../ReactNativeCameraKit/CKGalleryManager.m | 31 +++++ .../CKGalleryViewManager.h | 2 + .../CKGalleryViewManager.m | 110 +++++++++--------- src/CameraKitCamera.ios.js | 4 - src/CameraKitGallery.ios.js | 10 +- src/CameraKitGalleryView.ios.js | 2 - 7 files changed, 132 insertions(+), 77 deletions(-) diff --git a/ios/lib/ReactNativeCameraKit/CKCamera.m b/ios/lib/ReactNativeCameraKit/CKCamera.m index 04bc942..72e5cd3 100644 --- a/ios/lib/ReactNativeCameraKit/CKCamera.m +++ b/ios/lib/ReactNativeCameraKit/CKCamera.m @@ -107,7 +107,6 @@ RCT_ENUM_CONVERTER(CKCameraZoomMode, (@{ - (void)removeReactSubview:(UIView *)subview { [subview removeFromSuperview]; - return; } @@ -436,21 +435,26 @@ RCT_ENUM_CONVERTER(CKCameraZoomMode, (@{ imageInfoDict[@"size"] = [NSNumber numberWithInteger:imageData.length]; if (shouldSaveToCameraRoll) { - [self saveImageToCameraRoll:imageData temporaryFileURL:temporaryFileURL]; - } - - - PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:self.fetchOptions]; - PHAsset *lastImageAsset = [fetchResult firstObject]; - - if (lastImageAsset.localIdentifier) { - imageInfoDict[@"id"] = lastImageAsset.localIdentifier; - } - - - - if (block) { - block(imageInfoDict); + [self saveImageToCameraRoll:imageData temporaryFileURL:temporaryFileURL block:^(BOOL success) { + if (success) { + + PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:self.fetchOptions]; + PHAsset *lastImageAsset = [fetchResult lastObject]; + + if (lastImageAsset.localIdentifier) { + imageInfoDict[@"id"] = lastImageAsset.localIdentifier; + } + + + + if (block) { + block(imageInfoDict); + } + } + else { + NSLog( @"Could not save to camera roll"); + } + }]; } } }]; @@ -522,7 +526,10 @@ RCT_ENUM_CONVERTER(CKCameraZoomMode, (@{ --(void)saveImageToCameraRoll:(NSData*)imageData temporaryFileURL:(NSURL*)temporaryFileURL{ +-(void)saveImageToCameraRoll:(NSData*)imageData + temporaryFileURL:(NSURL*)temporaryFileURL + block:(CallbackBlock)block{ + // To preserve the metadata, we create an asset from the JPEG NSData representation. // Note that creating an asset from a UIImage discards the metadata. // In iOS 9, we can use -[PHAssetCreationRequest addResourceWithType:data:options]. @@ -533,6 +540,10 @@ RCT_ENUM_CONVERTER(CKCameraZoomMode, (@{ } completionHandler:^( BOOL success, NSError *error ) { if ( ! success ) { NSLog( @"Error occurred while saving image to photo library: %@", error ); + block(NO); + } + else { + block(YES); } }]; } @@ -548,6 +559,10 @@ RCT_ENUM_CONVERTER(CKCameraZoomMode, (@{ } completionHandler:^( BOOL success, NSError *error ) { if ( ! success ) { NSLog( @"Error occurred while saving image to photo library: %@", error ); + block(NO); + } + else { + block(YES); } }]; } @@ -746,6 +761,7 @@ RCT_ENUM_CONVERTER(CKCameraZoomMode, (@{ - (void)removeObservers { + NSLog(@"############################ removeObservers"); [[NSNotificationCenter defaultCenter] removeObserver:self]; [self.session removeObserver:self forKeyPath:@"running" context:SessionRunningContext]; diff --git a/ios/lib/ReactNativeCameraKit/CKGalleryManager.m b/ios/lib/ReactNativeCameraKit/CKGalleryManager.m index 877e766..2c003d9 100644 --- a/ios/lib/ReactNativeCameraKit/CKGalleryManager.m +++ b/ios/lib/ReactNativeCameraKit/CKGalleryManager.m @@ -9,6 +9,7 @@ #import "CKGalleryManager.h" #import #import "RCTConvert.h" +#import "CKGalleryViewManager.h" typedef void (^AlbumsBlock)(NSDictionary *albums); @@ -159,6 +160,36 @@ RCT_EXPORT_METHOD(getAlbumsWithThumbnails:(RCTPromiseResolveBlock)resolve }]; } +RCT_EXPORT_METHOD(getImagesForIds:(NSArray*)imagesIdArray + resolve:(RCTPromiseResolveBlock)resolve + reject:(__unused RCTPromiseRejectBlock)reject) { + + NSMutableArray *assetsArray = [[NSMutableArray alloc] init]; + + PHImageRequestOptions *imageRequestOptions = [[PHImageRequestOptions alloc] init]; + imageRequestOptions.synchronous = YES; + + PHFetchResult *assets = [PHAsset fetchAssetsWithLocalIdentifiers:imagesIdArray options:nil]; + + for (PHAsset *asset in assets) { + + NSDictionary *assetInfoDict = [CKGalleryViewManager infoForAsset:asset imageRequestOptions:imageRequestOptions]; + + [assetsArray addObject:@{@"uri": assetInfoDict[@"uri"], + @"size": assetInfoDict[@"size"], + @"name": assetInfoDict[@"name"]}]; + + } + + if (resolve) { + resolve(@{@"images": assetsArray}); + } +} + + + + + @end diff --git a/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.h b/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.h index 5478010..f41eb18 100644 --- a/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.h +++ b/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.h @@ -17,5 +17,7 @@ @interface CKGalleryViewManager : RCTViewManager ++(NSMutableDictionary*)infoForAsset:(PHAsset*)asset imageRequestOptions:(PHImageRequestOptions*)imageRequestOptions; + @end diff --git a/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m b/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m index 84a642d..e568cf0 100644 --- a/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m +++ b/ios/lib/ReactNativeCameraKit/CKGalleryViewManager.m @@ -51,11 +51,11 @@ static NSString * const CellReuseIdentifier = @"Cell"; self.selectedAssets = [[NSMutableArray alloc] init]; self.imageManager = [[PHCachingImageManager alloc] init]; - PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init]; - allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; - - PHFetchOptions *albumsOptions = [[PHFetchOptions alloc] init]; - albumsOptions.predicate = [NSPredicate predicateWithFormat:@"estimatedAssetCount > 0"]; +// PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init]; +// allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; +// +// PHFetchOptions *albumsOptions = [[PHFetchOptions alloc] init]; +// albumsOptions.predicate = [NSPredicate predicateWithFormat:@"estimatedAssetCount > 0"]; self.imageRequestOptions = [[PHImageRequestOptions alloc] init]; self.imageRequestOptions.synchronous = YES; @@ -118,7 +118,7 @@ static NSString * const CellReuseIdentifier = @"Cell"; -(void)setAlbumName:(NSString *)albumName { PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init]; - allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; + allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]]; if ([albumName caseInsensitiveCompare:@"all photos"] == NSOrderedSame || !albumName || [albumName isEqualToString:@""]) { // self.assetsCollection = [PHAsset fetchAssetsWithOptions:allPhotosOptions]; @@ -242,52 +242,6 @@ static NSString * const CellReuseIdentifier = @"Cell"; } -+(NSMutableDictionary*)infoForAsset:(PHAsset*)asset imageRequestOptions:(PHImageRequestOptions*)imageRequestOptions { - - NSError *error = nil; - NSURL *directoryURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]] isDirectory:YES]; - - __block NSMutableDictionary *assetInfoDict = nil; - - [[PHCachingImageManager defaultManager] requestImageDataForAsset:asset options:imageRequestOptions resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) { - - - NSURL *fileURLKey = info[@"PHImageFileURLKey"]; - - if (fileURLKey) { - - assetInfoDict = [[NSMutableDictionary alloc] init]; - - NSString *fileName = ((NSURL*)info[@"PHImageFileURLKey"]).lastPathComponent; - if (fileName) { - assetInfoDict[@"name"] = fileName; - } - - float imageSize = imageData.length; - assetInfoDict[@"size"] = [NSNumber numberWithFloat:imageSize]; - - NSURL *fileURL = [directoryURL URLByAppendingPathComponent:fileName]; - NSError *error = nil; - [imageData writeToURL:fileURL options:NSDataWritingAtomic error:&error]; - - if (!error && fileURL) { - assetInfoDict[@"uri"] = fileURL.absoluteString; - } - else if (error){ - NSLog(@"%@", error); - } - } - }]; - - if (assetInfoDict && asset) { - assetInfoDict[@"asset"] = asset; - } - - return assetInfoDict; -} - - - @end @interface CKGalleryViewManager () @@ -368,5 +322,57 @@ RCT_EXPORT_METHOD(getSelectedImages:(RCTPromiseResolveBlock)resolve } } ++(NSMutableDictionary*)infoForAsset:(PHAsset*)asset imageRequestOptions:(PHImageRequestOptions*)imageRequestOptions { + + NSError *error = nil; + NSURL *directoryURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]] isDirectory:YES]; + + [[NSFileManager defaultManager] createDirectoryAtURL:directoryURL withIntermediateDirectories:YES attributes:nil error:&error]; + + if (error) { + NSLog(@"ERROR while creating directory:%@",error); + } + + + __block NSMutableDictionary *assetInfoDict = nil; + + [[PHCachingImageManager defaultManager] requestImageDataForAsset:asset options:imageRequestOptions resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) { + + + NSURL *fileURLKey = info[@"PHImageFileURLKey"]; + + if (fileURLKey) { + + assetInfoDict = [[NSMutableDictionary alloc] init]; + + NSString *fileName = ((NSURL*)info[@"PHImageFileURLKey"]).lastPathComponent; + if (fileName) { + assetInfoDict[@"name"] = fileName; + } + + float imageSize = imageData.length; + assetInfoDict[@"size"] = [NSNumber numberWithFloat:imageSize]; + + NSURL *fileURL = [directoryURL URLByAppendingPathComponent:fileName]; + NSError *error = nil; + + [imageData writeToURL:fileURL options:NSDataWritingAtomic error:&error]; + + if (!error && fileURL) { + assetInfoDict[@"uri"] = fileURL.absoluteString; + } + else if (error){ + NSLog(@"%@", error); + } + } + }]; + + if (assetInfoDict && asset) { + assetInfoDict[@"asset"] = asset; + } + + return assetInfoDict; +} + @end diff --git a/src/CameraKitCamera.ios.js b/src/CameraKitCamera.ios.js index bd16aab..a8f0360 100644 --- a/src/CameraKitCamera.ios.js +++ b/src/CameraKitCamera.ios.js @@ -20,20 +20,16 @@ export default class CameraKitCamera extends React.Component { async capture(saveToCameraRoll = true) { const imageTmpPath = await NativeCameraAction.capture(saveToCameraRoll); - console.log(imageTmpPath); return imageTmpPath; } async changeCamera() { const success = await NativeCameraAction.changeCamera(); - console.log(success); return success; } async setFleshMode(flashMode = 'auto') { - console.log(flashMode); const success = await NativeCameraAction.setFlashMode(flashMode); - console.log(success); return success; } } diff --git a/src/CameraKitGallery.ios.js b/src/CameraKitGallery.ios.js index 752c45c..e25c228 100644 --- a/src/CameraKitGallery.ios.js +++ b/src/CameraKitGallery.ios.js @@ -1,16 +1,21 @@ +import _ from 'lodash'; import { NativeModules, - CameraRoll } from 'react-native'; var CKGallery = NativeModules.CKGalleryManager; -import _ from 'lodash'; + async function getAlbumsWithThumbnails() { const albums = await CKGallery.getAlbumsWithThumbnails(); return albums; } +async function getImagesForIds(imagesId = []) { + const images = await CKGallery.getImagesForIds(imagesId); + return images; +} + //function getPhotosForAlbum(albumName, numberOfPhotos, callback, error) { // @@ -33,4 +38,5 @@ async function getAlbumsWithThumbnails() { export default { getAlbumsWithThumbnails, + getImagesForIds } diff --git a/src/CameraKitGalleryView.ios.js b/src/CameraKitGalleryView.ios.js index 533d8d4..508d381 100644 --- a/src/CameraKitGalleryView.ios.js +++ b/src/CameraKitGalleryView.ios.js @@ -25,6 +25,4 @@ export default class CameraKitGalleryView extends Component { const selectedImages = await GalleryViewManager.getSelectedImages(); return selectedImages; } - - }