mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-25 11:02:48 +02:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user