Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 1 addition & 19 deletions ReactWindows/ReactNative/Modules/Image/BitmapImageHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,7 @@ public static IObservable<ImageStatusEventData> GetStreamLoadObservable(this Bit
.Merge(image.GetFailedObservable(), Scheduler.Default)
.StartWith(new ImageStatusEventData(ImageLoadStatus.OnLoadStart));
}

public static IObservable<ImageStatusEventData> GetUriLoadObservable(this BitmapImage image)
{
return Observable.Merge(
Scheduler.Default,
image.GetDownloadingObservable(),
image.GetOpenedObservable(),
image.GetFailedObservable());
}


private static IObservable<ImageStatusEventData> GetOpenedObservable(this BitmapImage image)
Copy link
Contributor Author

@rozele rozele Nov 23, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IObservable [](start = 23, length = 11)

Clean up any other unused code. #Closed

{
return Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(
Expand Down Expand Up @@ -101,14 +92,5 @@ private static IObservable<ImageStatusEventData> GetFailedObservable(this Bitmap
throw new InvalidOperationException(pattern.EventArgs.ErrorMessage);
});
}

private static IObservable<ImageStatusEventData> GetDownloadingObservable(this BitmapImage image)
{
return Observable.FromEventPattern<DownloadProgressEventHandler, DownloadProgressEventArgs>(
h => image.DownloadProgress += h,
h => image.DownloadProgress -= h)
.Take(1)
.Select(_ => new ImageStatusEventData(ImageLoadStatus.OnLoadStart));
}
}
}
51 changes: 27 additions & 24 deletions ReactWindows/ReactNative/Modules/Image/ImageLoaderModule.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
using Newtonsoft.Json.Linq;
using Microsoft.Toolkit.Uwp.UI;
using Newtonsoft.Json.Linq;
using ReactNative.Bridge;
using System;
using System.Reactive.Linq;
using Windows.UI.Xaml.Media.Imaging;

namespace ReactNative.Modules.Image
{
Expand All @@ -23,7 +22,26 @@ public override string Name
[ReactMethod]
public void prefetchImage(string uriString, IPromise promise)
{
promise.Reject(ErrorPrefetchFailure, "Prefetch is not yet implemented.");
if (string.IsNullOrEmpty(uriString))
{
promise.Reject(ErrorInvalidUri, "Cannot prefetch an image for an empty URI.");
return;
}

DispatcherHelpers.RunOnDispatcher(async () =>
{
try
{
// TODO: enable prefetch cancellation
var uri = new Uri(uriString);
await ImageCache.Instance.PreCacheAsync(uri, true, true).ConfigureAwait(false);
promise.Resolve(true);
}
catch (Exception ex)
{
promise.Reject(ErrorPrefetchFailure, ex.Message);
}
});
}

[ReactMethod]
Expand All @@ -39,27 +57,12 @@ public void getSize(string uriString, IPromise promise)
{
try
{
var bitmapImage = new BitmapImage();
var loadQuery = bitmapImage.GetStreamLoadObservable()
.Where(status => status.LoadStatus == ImageLoadStatus.OnLoadEnd)
.FirstAsync()
.Replay(1);

using (loadQuery.Connect())
var bitmapImage = await ImageCache.Instance.GetFromCacheAsync(new Uri(uriString), true);
promise.Resolve(new JObject
{
using (var stream = await BitmapImageHelpers.GetStreamAsync(uriString))
{
await bitmapImage.SetSourceAsync(stream);
}

await loadQuery;

promise.Resolve(new JObject
{
{ "width", bitmapImage.PixelWidth },
{ "height", bitmapImage.PixelHeight },
});
}
{ "width", bitmapImage.PixelWidth },
{ "height", bitmapImage.PixelHeight },
});
}
catch (Exception ex)
{
Expand Down
40 changes: 25 additions & 15 deletions ReactWindows/ReactNative/Views/Image/ReactImageManager.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Newtonsoft.Json.Linq;
using Microsoft.Toolkit.Uwp.UI;
using Newtonsoft.Json.Linq;
using ReactNative.Collections;
using ReactNative.Modules.Image;
using ReactNative.UIManager;
Expand Down Expand Up @@ -254,7 +255,7 @@ private void OnImageFailed(Border view)
ReactImageLoadEvent.OnLoadEnd));
}

private void OnImageStatusUpdate(Border view, ImageStatusEventData status)
private void OnImageStatusUpdate(Border view, ImageLoadStatus status, ImageMetadata metadata)
{
var eventDispatcher = view.GetReactContext()
.GetNativeModule<UIManagerModule>()
Expand All @@ -263,10 +264,10 @@ private void OnImageStatusUpdate(Border view, ImageStatusEventData status)
eventDispatcher.DispatchEvent(
new ReactImageLoadEvent(
view.GetTag(),
(int)status.LoadStatus,
status.Metadata.Uri,
status.Metadata.Width,
status.Metadata.Height));
(int)status,
metadata.Uri,
metadata.Width,
metadata.Height));
}

/// <summary>
Expand All @@ -286,28 +287,37 @@ private async void SetUriFromSingleSource(Border view, string source)
_disposables.Add(tag, disposable);
}

var image = new BitmapImage();
if (BitmapImageHelpers.IsBase64Uri(source))
{
var image = new BitmapImage();

disposable.Disposable = image.GetStreamLoadObservable().Subscribe(
status => OnImageStatusUpdate(view, status),
status => OnImageStatusUpdate(view, status.LoadStatus, status.Metadata),
_ => OnImageFailed(view));

using (var stream = await BitmapImageHelpers.GetStreamAsync(source))
{
await image.SetSourceAsync(stream);
}

imageBrush.ImageSource = image;
}
else
{
disposable.Disposable = image.GetUriLoadObservable().Subscribe(
status => OnImageStatusUpdate(view, status),
_ => OnImageFailed(view));

image.UriSource = new Uri(source);
OnImageStatusUpdate(view, ImageLoadStatus.OnLoadStart, default(ImageMetadata));
try
{
var image = await ImageCache.Instance.GetFromCacheAsync(new Uri(source), true);
var metadata = new ImageMetadata(source, image.PixelWidth, image.PixelHeight);
OnImageStatusUpdate(view, ImageLoadStatus.OnLoad, metadata);
imageBrush.ImageSource = image;
OnImageStatusUpdate(view, ImageLoadStatus.OnLoadEnd, metadata);
}
catch
{
OnImageFailed(view);
}
}

imageBrush.ImageSource = image;
}

/// <summary>
Expand Down
1 change: 1 addition & 0 deletions ReactWindows/ReactNative/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"dependencies": {
"Facebook.CSSLayout": "2.0.1-pre",
"Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2",
"Microsoft.Toolkit.Uwp.UI": "1.2.0",
"Newtonsoft.Json": "9.0.1",
Copy link
Contributor Author

@rozele rozele Nov 23, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not needed. #Closed

"PCLStorage": "1.0.2",
"System.Reactive": "3.0.0",
Expand Down