private static void SetUrlDrawable(Context context, ImageView imageView, string url, Drawable defaultDrawable, long cacheDurationMs, IUrlImageViewCallback callback)
        {
            Cleanup(context);

            if (imageView != null)
                pendingViews.Remove(imageView);

            if (string.IsNullOrEmpty(url))
            {
                if (imageView != null)
                    imageView.SetImageDrawable(defaultDrawable);

                return;
            }

            var cache = UrlImageCache.Instance;
            var drawable = cache.Get(url);

            if (drawable != null)
            {
                if (imageView != null)
                    imageView.SetImageRounded((BitmapDrawable)drawable);
                if (callback != null)
                    callback.OnLoaded(imageView, drawable, url, true);
                return;
            }

            var baseDir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            var filename = System.IO.Path.Combine(baseDir, GetFilenameForUrl(url));
					
            var file = new System.IO.FileInfo(filename);
            if (file.Exists)
            {
                try
                {
                    if (cacheDurationMs == CACHE_DURATION_INFINITE || DateTime.UtcNow < file.LastWriteTimeUtc.AddMilliseconds(cacheDurationMs))
                    {
                        drawable = LoadDrawableFromFile(context, filename);
                        //var fis = context.OpenFileInput(filename);
                        //drawable = LoadDrawableFromStream(context, fis);
                        //fis.Close();

                        if (imageView != null)
                            imageView.SetImageDrawable(drawable);

                        cache.Put(url, drawable);

                        if (callback != null)
                            callback.OnLoaded(imageView, drawable, url, true);

                        return;
                    }
                    else
                    {
                        //TODO: File cache expired, refreshing
                        Android.Util.Log.Debug(LOGTAG, "File Cache Expired: " + file.Name);
                    }
                }
                catch (Exception ex)
                {
                    Android.Util.Log.Debug(LOGTAG, "File Cache Exception " + ex.ToString());
                }
            }

            if (imageView != null)
                imageView.SetImageDrawable(defaultDrawable);

            if (imageView != null)
                pendingViews.Put(imageView, url);

            //Check to see if another view is already waiting for this url so we don't download it again
            var currentDownload = pendingDownloads.Get(url);
            if (currentDownload != null)
            {
                if (imageView != null)
                    currentDownload.Add(imageView);

                return;
            }

            var downloads = new List<ImageView>();
            if (imageView != null)
                downloads.Add(imageView);

            pendingDownloads.Put(url, downloads);

            var downloaderTask = new AnonymousAsyncTask<string, string, BitmapDrawable>((p) =>
            {
                try
                {
                    var client = new System.Net.WebClient();
                    var data = client.DownloadData(url);

                    System.IO.File.WriteAllBytes(filename, data);

                    return LoadDrawableFromFile(context, filename);
                }
                catch (Exception ex)
                {
                    Android.Util.Log.Debug(LOGTAG, "Download Error: " + ex.ToString());
                    return null; 
                }


            }, (bd) =>
            {
                try
                {
                    var usableResult = bd;
                    if (usableResult == null)
                        usableResult = (BitmapDrawable)defaultDrawable;

                    pendingDownloads.Remove(url);

                    cache.Put(url, usableResult);

                    foreach (var iv in downloads)
                    {
                        var pendingUrl = pendingViews.Get(iv);
                        if (!url.Equals(pendingUrl))
                            continue;
                        pendingViews.Remove(iv);

                        if (usableResult != null)
                        {
                            var fnewImage = usableResult;
                            var fimageView = iv;

                            fimageView.SetImageRounded(fnewImage);

                            if (callback != null)
                                callback.OnLoaded(fimageView, bd, url, false);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Android.Util.Log.Debug(LOGTAG, "PostExecute Error: " + ex.ToString()); 
                }

            });

            downloaderTask.Execute(new Java.Lang.Object[]{ });
        }