summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/Extensions/ImageViewExtensions.cs
blob: f60acb7e7ddc59127c1921edd8db3e8033990d93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Threading.Tasks;
using Android.Graphics;
using Java.IO;
using AImageView = Android.Widget.ImageView;

namespace Xamarin.Forms.Platform.Android
{
	internal static class ImageViewExtensions
	{
		public static async void UpdateBitmap(this AImageView imageView, Image newImage, Image previousImage = null)
		{
			if (Device.IsInvokeRequired)
				throw new InvalidOperationException("Image Bitmap must not be updated from background thread");

			if (previousImage != null && Equals(previousImage.Source, newImage.Source))
				return;

			((IImageController)newImage).SetIsLoading(true);

			(imageView as IImageRendererController).SkipInvalidate();

			imageView.SetImageResource(global::Android.Resource.Color.Transparent);

			ImageSource source = newImage.Source;
			Bitmap bitmap = null;
			IImageSourceHandler handler;

			if (source != null && (handler = Internals.Registrar.Registered.GetHandler<IImageSourceHandler>(source.GetType())) != null)
			{
				try
				{
					bitmap = await handler.LoadImageAsync(source, imageView.Context);
				}
				catch (TaskCanceledException)
				{
				}
				catch (IOException ex)
				{
					Internals.Log.Warning("Xamarin.Forms.Platform.Android.ImageRenderer", "Error updating bitmap: {0}", ex);
				}
			}

			if (newImage == null || !Equals(newImage.Source, source))
			{
				bitmap?.Dispose();
				return;
			}

			if (bitmap == null && source is FileImageSource)
				imageView.SetImageResource(ResourceManager.GetDrawableByName(((FileImageSource)source).File));
			else
				imageView.SetImageBitmap(bitmap);

			bitmap?.Dispose();

			((IImageController)newImage).SetIsLoading(false);
			((IVisualElementController)newImage).NativeSizeChanged();
		}
	}
}