App Extension - Limit memory consumption

- In case of image sharing, we suggest the original resolution only if the image orientation is up, or if the image size is moderate.
- Bug Fix: no image is sent when no compression is required.
This commit is contained in:
Giom Foret
2017-08-24 12:59:46 +02:00
parent fabf8903c0
commit b2ee009adf
@@ -211,10 +211,17 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
{
typeof(self) self = weakSelf;
UIImage *image = [[UIImage alloc] initWithData:imageData];
UIAlertController *compressionPrompt = [self compressionPromptForImage:image shareBlock:^{
[self sendImage:imageData withProvider:itemProvider toRoom:room extensionItem:item failureBlock:failureBlock];
[self sendImage:image withProvider:itemProvider toRoom:room extensionItem:item failureBlock:failureBlock];
}];
[self.delegate shareExtensionManager:self showImageCompressionPrompt:compressionPrompt];
if (compressionPrompt)
{
[self.delegate shareExtensionManager:self showImageCompressionPrompt:compressionPrompt];
}
}
});
@@ -294,7 +301,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
{
UIAlertController *compressionPrompt;
// Get availabe sizes for this image
// Get available sizes for this image
MXKImageCompressionSizes compressionSizes = [MXKTools availableCompressionSizesForImage:image];
// Apply the compression mode
@@ -386,28 +393,32 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
}]];
}
NSString *resolution = [NSString stringWithFormat:@"%@ (%d x %d)", [MXTools fileSizeToString:compressionSizes.original.fileSize round:NO], (int)compressionSizes.original.imageSize.width, (int)compressionSizes.original.imageSize.height];
NSString *title = [NSString stringWithFormat:[NSBundle mxk_localizedStringForKey:@"attachment_original"], resolution];
[compressionPrompt addAction:[UIAlertAction actionWithTitle:title
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
// To limit memory consumption, we suggest the original resolution only if the image orientation is up, or if the image size is moderate
if (image.imageOrientation == UIImageOrientationUp || !compressionSizes.large.fileSize)
{
NSString *resolution = [NSString stringWithFormat:@"%@ (%d x %d)", [MXTools fileSizeToString:compressionSizes.original.fileSize round:NO], (int)compressionSizes.original.imageSize.width, (int)compressionSizes.original.imageSize.height];
NSString *title = [NSString stringWithFormat:[NSBundle mxk_localizedStringForKey:@"attachment_original"], resolution];
[compressionPrompt addAction:[UIAlertAction actionWithTitle:title
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
self.imageCompressionMode = ImageCompressionModeNone;
if (shareBlock)
if (weakSelf)
{
shareBlock();
typeof(self) self = weakSelf;
self.imageCompressionMode = ImageCompressionModeNone;
if (shareBlock)
{
shareBlock();
}
[compressionPrompt dismissViewControllerAnimated:YES completion:nil];
}
[compressionPrompt dismissViewControllerAnimated:YES completion:nil];
}
}]];
}]];
}
[compressionPrompt addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
style:UIAlertActionStyleDefault
@@ -422,6 +433,14 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
}
else
{
self.imageCompressionMode = ImageCompressionModeNone;
if (shareBlock)
{
shareBlock();
}
}
return compressionPrompt;
}
@@ -513,10 +532,10 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
} keepActualFilename:YES];
}
- (void)sendImage:(NSData *)imageData withProvider:(NSItemProvider*)itemProvider toRoom:(MXRoom *)room extensionItem:(NSExtensionItem *)extensionItem failureBlock:(void(^)())failureBlock
- (void)sendImage:(UIImage *)image withProvider:(NSItemProvider*)itemProvider toRoom:(MXRoom *)room extensionItem:(NSExtensionItem *)extensionItem failureBlock:(void(^)())failureBlock
{
[self didStartSendingToRoom:room];
if (!imageData)
if (!image)
{
NSLog(@"[ShareExtensionManager] sendImage: failed.");
if (failureBlock)
@@ -527,15 +546,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
}
// Prepare the image
BOOL rotated = NO;
UIImage *image = [[UIImage alloc] initWithData:imageData];
// Make sure the uploaded image orientation is up
if (image.imageOrientation != UIImageOrientationUp)
{
image = [MXKTools forceImageOrientationUp:image];
rotated = YES;
}
NSData *imageData;
if (self.imageCompressionMode == ImageCompressionModeSmall)
{
@@ -550,32 +561,20 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode)
image = [MXKTools reduceImage:image toFitInSize:CGSizeMake(self.actualLargeSize, self.actualLargeSize)];
}
// Make sure the uploaded image orientation is up
image = [MXKTools forceImageOrientationUp:image];
NSString *mimeType;
if ([itemProvider hasItemConformingToTypeIdentifier:(__bridge NSString *)kUTTypePNG])
{
mimeType = @"image/png";
if (rotated)
{
// Update imageData
imageData = UIImagePNGRepresentation(image);
}
}
else if ([itemProvider hasItemConformingToTypeIdentifier:(__bridge NSString *)kUTTypeJPEG])
{
mimeType = @"image/jpeg";
if (rotated)
{
// Update imageData
imageData = UIImageJPEGRepresentation(image, 1.0);
}
imageData = UIImagePNGRepresentation(image);
}
else
{
imageData = UIImageJPEGRepresentation(image, 1.0);
image = [[UIImage alloc] initWithData:imageData];
// Use jpeg format by default.
mimeType = @"image/jpeg";
imageData = UIImageJPEGRepresentation(image, 0.9);
}
UIImage *thumbnail = nil;