From 332867b7567d4b6f923eba57723003ba06869210 Mon Sep 17 00:00:00 2001 From: Joshua Sierles Date: Thu, 9 Apr 2015 17:25:28 +0200 Subject: [PATCH 1/3] support fetching videos from the camera roll. Make the default fetch both videos and photos --- Libraries/CameraRoll/CameraRoll.js | 5 +++++ Libraries/Image/RCTCameraRollManager.m | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Libraries/CameraRoll/CameraRoll.js b/Libraries/CameraRoll/CameraRoll.js index 6acc949e5449c3..5e41dd46e4ab9c 100644 --- a/Libraries/CameraRoll/CameraRoll.js +++ b/Libraries/CameraRoll/CameraRoll.js @@ -58,6 +58,11 @@ var getPhotosParamChecker = createStrictShapeTypeChecker({ * titles. */ groupName: ReactPropTypes.string, + + /** + * Specifies filter on asset type, like 'all', 'photos' or 'videos' + */ + assetType: ReactPropTypes.string, }); /** diff --git a/Libraries/Image/RCTCameraRollManager.m b/Libraries/Image/RCTCameraRollManager.m index b0734b1bd80e29..361d0a5bf2b989 100644 --- a/Libraries/Image/RCTCameraRollManager.m +++ b/Libraries/Image/RCTCameraRollManager.m @@ -67,7 +67,9 @@ - (void)getPhotos:(NSDictionary *)params callback:(RCTResponseSenderBlock)callba NSString *afterCursor = params[@"after"]; NSString *groupTypesStr = params[@"groupTypes"]; NSString *groupName = params[@"groupName"]; + NSString *assetType = params[@"assetType"]; ALAssetsGroupType groupTypes; + if ([groupTypesStr isEqualToString:@"Album"]) { groupTypes = ALAssetsGroupAlbum; } else if ([groupTypesStr isEqualToString:@"All"]) { @@ -83,7 +85,7 @@ - (void)getPhotos:(NSDictionary *)params callback:(RCTResponseSenderBlock)callba } else { groupTypes = ALAssetsGroupSavedPhotos; } - + BOOL __block foundAfter = NO; BOOL __block hasNextPage = NO; BOOL __block calledCallback = NO; @@ -91,7 +93,15 @@ - (void)getPhotos:(NSDictionary *)params callback:(RCTResponseSenderBlock)callba [[RCTImageLoader assetsLibrary] enumerateGroupsWithTypes:groupTypes usingBlock:^(ALAssetsGroup *group, BOOL *stopGroups) { if (group && (groupName == nil || [groupName isEqualToString:[group valueForProperty:ALAssetsGroupPropertyName]])) { - [group setAssetsFilter:ALAssetsFilter.allPhotos]; + + if (assetType == nil || [assetType isEqualToString:@"all"]) { + [group setAssetsFilter:ALAssetsFilter.allAssets]; + } else if ([assetType isEqualToString:@"photos"]) { + [group setAssetsFilter:ALAssetsFilter.allPhotos]; + } else if ([assetType isEqualToString:@"videos"]) { + [group setAssetsFilter:ALAssetsFilter.allVideos]; + } + [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stopAssets) { if (result) { NSString *uri = [(NSURL *)[result valueForProperty:ALAssetPropertyAssetURL] absoluteString]; From 87a9ce5ef46abae2b7450a176dcdd2940df807d3 Mon Sep 17 00:00:00 2001 From: Joshua Sierles Date: Thu, 9 Apr 2015 18:43:48 +0200 Subject: [PATCH 2/3] Make photos the default camera roll asset type. Define asset types using PropTypes.oneOf. Add support for asset types to CameraRollView. --- Examples/UIExplorer/CameraRollView.ios.js | 17 +++++++++++++++-- Libraries/CameraRoll/CameraRoll.js | 13 +++++++++++-- Libraries/Image/RCTCameraRollManager.m | 6 +++--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Examples/UIExplorer/CameraRollView.ios.js b/Examples/UIExplorer/CameraRollView.ios.js index 87dd23e6decf13..5da73e1d8815aa 100644 --- a/Examples/UIExplorer/CameraRollView.ios.js +++ b/Examples/UIExplorer/CameraRollView.ios.js @@ -59,6 +59,16 @@ var propTypes = { * imagesPerRow: Number of images to be shown in each row. */ imagesPerRow: React.PropTypes.number, + + /** + * The asset type, one of 'Photos', 'Videos' or 'All' + */ + assetType: React.PropTypes.oneOf([ + 'Photos', + 'Videos', + 'All', + ]), + }; var CameraRollView = React.createClass({ @@ -69,6 +79,7 @@ var CameraRollView = React.createClass({ groupTypes: 'SavedPhotos', batchSize: 5, imagesPerRow: 1, + assetType: 'Photos', renderImage: function(asset) { var imageSize = 150; var imageStyle = [styles.image, {width: imageSize, height: imageSize}]; @@ -89,6 +100,7 @@ var CameraRollView = React.createClass({ assets: ([]: Array), groupTypes: this.props.groupTypes, lastCursor: (null : ?string), + assetType: this.props.assetType, noMore: false, loadingMore: false, dataSource: ds, @@ -124,7 +136,8 @@ var CameraRollView = React.createClass({ var fetchParams: Object = { first: this.props.batchSize, - groupTypes: this.props.groupTypes + groupTypes: this.props.groupTypes, + assetType: this.props.assetType }; if (this.state.lastCursor) { fetchParams.after = this.state.lastCursor; @@ -238,4 +251,4 @@ var styles = StyleSheet.create({ }, }); -module.exports = CameraRollView; +module.exports = CameraRollView; \ No newline at end of file diff --git a/Libraries/CameraRoll/CameraRoll.js b/Libraries/CameraRoll/CameraRoll.js index 5e41dd46e4ab9c..8f6c174b21fc68 100644 --- a/Libraries/CameraRoll/CameraRoll.js +++ b/Libraries/CameraRoll/CameraRoll.js @@ -29,8 +29,16 @@ var GROUP_TYPES_OPTIONS = [ 'SavedPhotos', // default ]; +var ASSET_TYPE_OPTIONS = [ + 'All', + 'Videos', + 'Photos', // default +]; + + // Flow treats Object and Array as disjoint types, currently. deepFreezeAndThrowOnMutationInDev((GROUP_TYPES_OPTIONS: any)); +deepFreezeAndThrowOnMutationInDev((ASSET_TYPE_OPTIONS: any)); /** * Shape of the param arg for the `getPhotos` function. @@ -60,9 +68,9 @@ var getPhotosParamChecker = createStrictShapeTypeChecker({ groupName: ReactPropTypes.string, /** - * Specifies filter on asset type, like 'all', 'photos' or 'videos' + * Specifies filter on asset type */ - assetType: ReactPropTypes.string, + assetType: ReactPropTypes.oneOf(ASSET_TYPE_OPTIONS), }); /** @@ -157,5 +165,6 @@ class CameraRoll { } CameraRoll.GroupTypesOptions = GROUP_TYPES_OPTIONS; +CameraRoll.AssetTypeOptions = ASSET_TYPE_OPTIONS; module.exports = CameraRoll; diff --git a/Libraries/Image/RCTCameraRollManager.m b/Libraries/Image/RCTCameraRollManager.m index 361d0a5bf2b989..559e144f5bb125 100644 --- a/Libraries/Image/RCTCameraRollManager.m +++ b/Libraries/Image/RCTCameraRollManager.m @@ -94,12 +94,12 @@ - (void)getPhotos:(NSDictionary *)params callback:(RCTResponseSenderBlock)callba [[RCTImageLoader assetsLibrary] enumerateGroupsWithTypes:groupTypes usingBlock:^(ALAssetsGroup *group, BOOL *stopGroups) { if (group && (groupName == nil || [groupName isEqualToString:[group valueForProperty:ALAssetsGroupPropertyName]])) { - if (assetType == nil || [assetType isEqualToString:@"all"]) { - [group setAssetsFilter:ALAssetsFilter.allAssets]; - } else if ([assetType isEqualToString:@"photos"]) { + if (assetType == nil || [assetType isEqualToString:@"photos"]) { [group setAssetsFilter:ALAssetsFilter.allPhotos]; } else if ([assetType isEqualToString:@"videos"]) { [group setAssetsFilter:ALAssetsFilter.allVideos]; + } else if ([assetType isEqualToString:@"all"]) { + [group setAssetsFilter:ALAssetsFilter.allAssets]; } [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stopAssets) { From c90a5cebac28a81444b5653153a302e589a61091 Mon Sep 17 00:00:00 2001 From: Joshua Sierles Date: Thu, 9 Apr 2015 21:22:14 +0200 Subject: [PATCH 3/3] Fix capitalization of camera roll asset parameter options. --- Libraries/Image/RCTCameraRollManager.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Libraries/Image/RCTCameraRollManager.m b/Libraries/Image/RCTCameraRollManager.m index e6d8244e93ff4a..0d3ea26bdbb11c 100644 --- a/Libraries/Image/RCTCameraRollManager.m +++ b/Libraries/Image/RCTCameraRollManager.m @@ -96,11 +96,11 @@ - (void)callCallback:(RCTResponseSenderBlock)callback withAssets:(NSArray *)asse [[RCTImageLoader assetsLibrary] enumerateGroupsWithTypes:groupTypes usingBlock:^(ALAssetsGroup *group, BOOL *stopGroups) { if (group && (groupName == nil || [groupName isEqualToString:[group valueForProperty:ALAssetsGroupPropertyName]])) { - if (assetType == nil || [assetType isEqualToString:@"photos"]) { + if (assetType == nil || [assetType isEqualToString:@"Photos"]) { [group setAssetsFilter:ALAssetsFilter.allPhotos]; - } else if ([assetType isEqualToString:@"videos"]) { + } else if ([assetType isEqualToString:@"Videos"]) { [group setAssetsFilter:ALAssetsFilter.allVideos]; - } else if ([assetType isEqualToString:@"all"]) { + } else if ([assetType isEqualToString:@"All"]) { [group setAssetsFilter:ALAssetsFilter.allAssets]; }