summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/Renderers/FormsWebChromeClient.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers/FormsWebChromeClient.cs')
-rw-r--r--Xamarin.Forms.Platform.Android/Renderers/FormsWebChromeClient.cs74
1 files changed, 74 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/Renderers/FormsWebChromeClient.cs b/Xamarin.Forms.Platform.Android/Renderers/FormsWebChromeClient.cs
new file mode 100644
index 00000000..5d885774
--- /dev/null
+++ b/Xamarin.Forms.Platform.Android/Renderers/FormsWebChromeClient.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using Android.App;
+using Android.Content;
+using Android.Webkit;
+using Object = Java.Lang.Object;
+
+namespace Xamarin.Forms.Platform.Android
+{
+ public class FormsWebChromeClient : WebChromeClient
+ {
+ IStartActivityForResult _context;
+ List<int> _requestCodes;
+
+ public override bool OnShowFileChooser(global::Android.Webkit.WebView webView, IValueCallback filePathCallback, FileChooserParams fileChooserParams)
+ {
+ base.OnShowFileChooser(webView, filePathCallback, fileChooserParams);
+ return ChooseFile(filePathCallback, fileChooserParams.CreateIntent(), fileChooserParams.Title);
+ }
+
+ public void UnregisterCallbacks()
+ {
+ if (_requestCodes == null || _requestCodes.Count == 0 || _context == null)
+ return;
+
+ foreach (int requestCode in _requestCodes)
+ _context.UnregisterActivityResultCallback(requestCode);
+
+ _requestCodes = null;
+ }
+
+ protected bool ChooseFile(IValueCallback filePathCallback, Intent intent, string title)
+ {
+ Action<Result, Intent> callback = (resultCode, intentData) =>
+ {
+ if (filePathCallback == null)
+ return;
+
+ Object result = ParseResult(resultCode, intentData);
+ filePathCallback.OnReceiveValue(result);
+ };
+
+ _requestCodes = _requestCodes ?? new List<int>();
+
+ int newRequestCode = _context.RegisterActivityResultCallback(callback);
+
+ _requestCodes.Add(newRequestCode);
+
+ _context.StartActivityForResult(Intent.CreateChooser(intent, title), newRequestCode);
+
+ return true;
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ UnregisterCallbacks();
+ base.Dispose(disposing);
+ }
+
+ protected virtual Object ParseResult(Result resultCode, Intent data)
+ {
+ return FileChooserParams.ParseResult((int)resultCode, data);
+ }
+
+ internal void SetContext(IStartActivityForResult startActivityForResult)
+ {
+ if (startActivityForResult == null)
+ throw new ArgumentNullException(nameof(startActivityForResult));
+
+ _context = startActivityForResult;
+ }
+ }
+} \ No newline at end of file