public static async Task<Android.Net.Uri> DownloadDocument (Context ctx, Android.Net.Uri uriToDownload, string saveFilePath, IProgress<DownloadBytesProgress> progessReporter)
		{
			int receivedBytes = 0;
			int totalBytes = 0;

			using (var assetFileDescriptor = ctx.ContentResolver.OpenAssetFileDescriptor (uriToDownload, "r"))
			using (var fileOutputStream = new Java.IO.FileOutputStream (saveFilePath))
			using (var inputStream = assetFileDescriptor.CreateInputStream ()) {
				var buffer = new byte [BufferSize];
				totalBytes = (int)assetFileDescriptor.Length;

				for (;;) {
					var bytesRead = await inputStream.ReadAsync (buffer, 0, buffer.Length);
					if (bytesRead == 0) {
						await Task.Yield();
						break;
					}
					await fileOutputStream.WriteAsync (buffer, 0, buffer.Length);

					receivedBytes += bytesRead;
					if (progessReporter != null) {
						var args = new DownloadBytesProgress (uriToDownload.ToString (), saveFilePath, receivedBytes, totalBytes);
						progessReporter.Report(args);
					}
				}
				inputStream.Close ();
				fileOutputStream.Close ();
			}
			var file = new Java.IO.File (saveFilePath);
			var docUri = Android.Net.Uri.FromFile (file);
			return docUri;
		}
        private async Task <string> SaveFileToFolder(Android.Net.Uri uri, string fileName)
        {
            Android.Net.Uri docUri = Android.Provider.DocumentsContract.BuildDocumentUriUsingTree(uri,
                                                                                                  Android.Provider.DocumentsContract.GetTreeDocumentId(uri));

            string fileFolder = SAFFileUtil.GetPath(this, docUri);

            Java.IO.File destFolder = new Java.IO.File(fileFolder);
            Java.IO.File file       = new Java.IO.File(destFolder, fileName);
            Java.IO.File tempFile   = new Java.IO.File(TempFilePath);
            destFolder.Mkdirs();
            if (!file.Exists())
            {
                file.CreateNewFile();
            }

            Java.IO.FileInputStream  fileInput  = new Java.IO.FileInputStream(tempFile);
            Java.IO.FileOutputStream fileOutput = new Java.IO.FileOutputStream(file, false);

            while (true)
            {
                byte[] data = new byte[1024];
                int    read = await fileInput.ReadAsync(data, 0, data.Length);

                if (read <= 0)
                {
                    break;
                }
                await fileOutput.WriteAsync(data, 0, read);
            }
            fileInput.Close();
            fileOutput.Close();

            return(file.AbsolutePath);
        }
        public static async Task <Android.Net.Uri> DownloadDocument(Context ctx, Android.Net.Uri uriToDownload, string saveFilePath, IProgress <DownloadBytesProgress> progessReporter)
        {
            int receivedBytes = 0;
            int totalBytes    = 0;

            using (var assetFileDescriptor = ctx.ContentResolver.OpenAssetFileDescriptor(uriToDownload, "r"))
                using (var fileOutputStream = new Java.IO.FileOutputStream(saveFilePath))
                    using (var inputStream = assetFileDescriptor.CreateInputStream()) {
                        var buffer = new byte [BufferSize];
                        totalBytes = (int)assetFileDescriptor.Length;

                        for (;;)
                        {
                            var bytesRead = await inputStream.ReadAsync(buffer, 0, buffer.Length);

                            if (bytesRead == 0)
                            {
                                await Task.Yield();

                                break;
                            }
                            await fileOutputStream.WriteAsync(buffer, 0, buffer.Length);

                            receivedBytes += bytesRead;
                            if (progessReporter != null)
                            {
                                var args = new DownloadBytesProgress(uriToDownload.ToString(), saveFilePath, receivedBytes, totalBytes);
                                progessReporter.Report(args);
                            }
                        }
                        inputStream.Close();
                        fileOutputStream.Close();
                    }
            var file   = new Java.IO.File(saveFilePath);
            var docUri = Android.Net.Uri.FromFile(file);

            return(docUri);
        }