using System.Threading; using System.Threading.Tasks; namespace Xamarin.Forms.Platform.Tizen { public class ImageRenderer : ViewRenderer { public ImageRenderer() { RegisterPropertyHandler(Image.SourceProperty, UpdateSource); RegisterPropertyHandler(Image.AspectProperty, UpdateAspect); RegisterPropertyHandler(Image.IsOpaqueProperty, UpdateIsOpaque); } protected override void OnElementChanged(ElementChangedEventArgs e) { if (Control == null) { var image = new Native.Image(Forms.Context.MainWindow); SetNativeControl(image); } base.OnElementChanged(e); } protected override void UpdateLayout() { base.UpdateLayout(); base.UpdateOpacityLayer(); } async void UpdateSource() { ImageSource source = Element.Source; ((IImageController)Element).SetIsLoading(true); if (Control != null) { bool success = await Control.LoadFromImageSourceAsync(source); if (!IsDisposed && success) ((IVisualElementController)Element).NativeSizeChanged(); } if (!IsDisposed) ((IImageController)Element).SetIsLoading(false); } void UpdateAspect() { Control.Aspect = Element.Aspect; } void UpdateIsOpaque() { Control.IsOpaque = Element.IsOpaque; } } public interface IImageSourceHandler : IRegisterable { Task LoadImageAsync(Native.Image image, ImageSource imageSource, CancellationToken cancelationToken = default(CancellationToken)); } public sealed class FileImageSourceHandler : IImageSourceHandler { public Task LoadImageAsync(Native.Image image, ImageSource imageSource, CancellationToken cancelationToken = default(CancellationToken)) { var filesource = imageSource as FileImageSource; if (filesource != null) { string file = filesource.File; if (!string.IsNullOrEmpty(file)) return image.LoadAsync(ResourcePath.GetPath(file), cancelationToken); } return Task.FromResult(false); } } public sealed class StreamImageSourceHandler : IImageSourceHandler { public async Task LoadImageAsync(Native.Image image, ImageSource imageSource, CancellationToken cancelationToken = default(CancellationToken)) { var streamsource = imageSource as StreamImageSource; if (streamsource != null && streamsource.Stream != null) { using (var streamImage = await ((IStreamImageSource)streamsource).GetStreamAsync(cancelationToken)) { if (streamImage != null) return await image.LoadAsync(streamImage, cancelationToken); } } return false; } } public sealed class UriImageSourceHandler : IImageSourceHandler { public Task LoadImageAsync(Native.Image image, ImageSource imageSource, CancellationToken cancelationToken = default(CancellationToken)) { var urisource = imageSource as UriImageSource; if (urisource != null && urisource.Uri != null) { return image.LoadAsync(urisource.Uri, cancelationToken); } return Task.FromResult(false); } } }