Skip to content
This repository has been archived by the owner on Jul 5, 2024. It is now read-only.

Commit

Permalink
Merge pull request #717 from mrakhra/feature/mrakhra/FixingUpiOSCrashes
Browse files Browse the repository at this point in the history
Bugfix iOS crashes from memory issues
  • Loading branch information
jamesmontemagno authored Jul 5, 2019
2 parents 9a7d77c + e10809c commit 16bd9b4
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 37 deletions.
66 changes: 33 additions & 33 deletions src/Media.Plugin/iOS/ECLImagePickerViewController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using System.Threading.Tasks;
using CoreGraphics;
using Plugin.Media.Abstractions;
using System.Linq;

namespace Plugin.Media
{
Expand Down Expand Up @@ -139,30 +140,13 @@ public static ELCImagePickerViewController Create(StoreCameraMediaOptions option
_options = options ?? new StoreCameraMediaOptions();
}

void SelectedAssets(List<ALAsset> assets)
{
var results = new List<MediaFile>();
foreach (var asset in assets)
{
var obj = asset.AssetType;
if (obj == default(ALAssetType))
continue;

var rep = asset.DefaultRepresentation;
if (rep != null)
{
var mediaFile = GetPictureMediaFile(asset);
if (mediaFile != null)
{
results.Add(mediaFile);
}
}
}

_TaskCompletionSource.TrySetResult(results);
void SelectedMediaFiles(List<MediaFile> mediaFiles)
{
_TaskCompletionSource.TrySetResult(mediaFiles);
}

private MediaFile GetPictureMediaFile(ALAsset asset)
private MediaFile GetPictureMediaFile(ALAsset asset, long index = 0)
{
var rep = asset.DefaultRepresentation;
if (rep == null)
Expand All @@ -172,9 +156,13 @@ private MediaFile GetPictureMediaFile(ALAsset asset)

var path = MediaPickerDelegate.GetOutputPath(MediaImplementation.TypeImage,
_options.Directory ?? "temp",
_options.Name);
_options.Name, index);

var image = new UIImage(cgImage, 1.0f, (UIImageOrientation)rep.Orientation);
cgImage?.Dispose();
cgImage = null;
rep?.Dispose();
rep = null;

var percent = 1.0f;
if (_options.PhotoSize != PhotoSize.Full)
Expand Down Expand Up @@ -257,6 +245,8 @@ private MediaFile GetPictureMediaFile(ALAsset asset)
if (!savedImage)
image.AsJPEG(quality).Save(path, true);

image?.Dispose();
image = null;

string aPath = null;
//try to get the album path's url
Expand Down Expand Up @@ -577,8 +567,11 @@ private void AssetSelected(NSIndexPath targetIndexPath, bool selected)
if (ImmediateReturn)
{
var asset = AssetForIndexPath(targetIndexPath);
var obj = new List<ALAsset> { asset };
Parent.SelectedAssets(obj);
var mediaFile = Parent?.GetPictureMediaFile(asset);
asset?.Dispose();
asset = null;
var selectedMediaFile = new List<MediaFile>() { mediaFile };
Parent?.SelectedMediaFiles(selectedMediaFile);
}
}

Expand Down Expand Up @@ -621,18 +614,25 @@ private void PhotoEnumerator(ALAsset result, nint index, ref bool stop)

private void DoneClicked(object sender = null, EventArgs e = null)
{
var selected = new List<ALAsset>();
var parent = Parent;
var selectedItemsIndex = CollectionView.GetIndexPathsForSelectedItems();
var selectedItemsCount = selectedItemsIndex.Length;
var selectedMediaFiles = new MediaFile[selectedItemsCount];

foreach (var selectedIndexPath in CollectionView.GetIndexPathsForSelectedItems())
Parallel.For(0, selectedItemsCount, selectedIndex =>
{
selected.Add(AssetForIndexPath(selectedIndexPath));
}
var alAsset = AssetForIndexPath(selectedItemsIndex[selectedIndex]);
var mediaFile = parent?.GetPictureMediaFile(alAsset, selectedIndex);
if (mediaFile != null)
{
selectedMediaFiles[selectedIndex] = mediaFile;
}

var parent = Parent;
if (parent != null)
{
parent.SelectedAssets(selected);
}
alAsset?.Dispose();
alAsset = null;
});

parent?.SelectedMediaFiles(selectedMediaFiles.ToList());
}

class ELCAssetCell : UICollectionViewCell
Expand Down
26 changes: 22 additions & 4 deletions src/Media.Plugin/iOS/MediaPickerDelegate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,7 @@ private async Task<MediaFile> GetPictureMediaFile(NSDictionary info)

imageData.Save(path, true);
imageData.Dispose();

}


Expand Down Expand Up @@ -474,6 +475,7 @@ internal static bool SaveImageWithMetadata(UIImage image, float quality, NSDicti
{
var finalQuality = quality;
var imageData = image.AsJPEG(finalQuality);

//continue to move down quality , rare instances
while (imageData == null && finalQuality > 0)
{
Expand Down Expand Up @@ -540,7 +542,10 @@ internal static bool SaveImageWithMetadata(UIImage image, float quality, NSDicti
if (success)
{
imageWithExif.Save(path, true);
imageWithExif.Dispose();
imageWithExif = null;
}

return success;

}
Expand Down Expand Up @@ -610,18 +615,29 @@ private static string GetUniquePath(string type, string path, string name)
return Path.Combine(path, nname);
}

internal static string GetOutputPath(string type, string path, string name)
internal static string GetOutputPath(string type, string path, string name, long index = 0)
{
path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), path);
Directory.CreateDirectory(path);

var epoch = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
var postpendName = index == 0 ? string.Empty : $"{index}";
postpendName += Math.Abs(epoch);
if (string.IsNullOrWhiteSpace(name))
{
var timestamp = DateTime.Now.ToString("yyyMMdd_HHmmss", CultureInfo.InvariantCulture);
if (type == MediaImplementation.TypeImage)
name = "IMG_" + timestamp + ".jpg";
name = $"IMG_{postpendName}.jpg";
else
name = "VID_" + timestamp + ".mp4";
name = $"VID_{postpendName}.mp4";
}
else
{
var namePart = name.Split(".");
name = $"{namePart[0]}_{postpendName}";
if(namePart.Length > 1)
{
name = name + namePart[1];
}
}

return Path.Combine(path, GetUniquePath(type, path, name));
Expand Down Expand Up @@ -761,6 +777,8 @@ public static Stream RotateImage(UIImage image, int compressionQuality)
imageData.AsStream().CopyTo(stream);
stream.Position = 0;
imageData.Dispose();
image.Dispose();
image = null;
return stream;

}
Expand Down

0 comments on commit 16bd9b4

Please sign in to comment.