Browse Source

merge codes

Ha Duy Hung 6 years ago
parent
commit
cf249cf11b

+ 10 - 1
android/src/main/java/com/flutter_webview_plugin/FlutterWebviewPlugin.java

@@ -99,6 +99,7 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         boolean allowFileURLs = call.argument("allowFileURLs");
         boolean useWideViewPort = call.argument("useWideViewPort");
         String invalidUrlRegex = call.argument("invalidUrlRegex");
+        boolean geolocationEnabled = call.argument("geolocationEnabled");
 
         if (webViewManager == null || webViewManager.closed == true) {
             webViewManager = new WebviewManager(activity);
@@ -122,7 +123,8 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
                 appCacheEnabled,
                 allowFileURLs,
                 useWideViewPort,
-                invalidUrlRegex
+                invalidUrlRegex,
+                geolocationEnabled
         );
         result.success(null);
     }
@@ -151,6 +153,7 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         if (webViewManager != null) {
             webViewManager.stopLoading(call, result);
         }
+        result.success(null);
     }
 
     private void close(MethodCall call, MethodChannel.Result result) {
@@ -167,6 +170,7 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         if (webViewManager != null) {
             webViewManager.back(call, result);
         }
+        result.success(null);
     }
 
     /**
@@ -176,6 +180,7 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         if (webViewManager != null) {
             webViewManager.forward(call, result);
         }
+        result.success(null);
     }
 
     /**
@@ -185,6 +190,7 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         if (webViewManager != null) {
             webViewManager.reload(call, result);
         }
+        result.success(null);
     }
 
     private void reloadUrl(MethodCall call, MethodChannel.Result result) {
@@ -192,6 +198,7 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
             String url = call.argument("url");
             webViewManager.reloadUrl(url);
         }
+        result.success(null);
     }
 
     private void eval(MethodCall call, final MethodChannel.Result result) {
@@ -212,12 +219,14 @@ public class FlutterWebviewPlugin implements MethodCallHandler, PluginRegistry.A
         if (webViewManager != null) {
             webViewManager.hide(call, result);
         }
+        result.success(null);
     }
 
     private void show(MethodCall call, final MethodChannel.Result result) {
         if (webViewManager != null) {
             webViewManager.show(call, result);
         }
+        result.success(null);
     }
 
     private void cleanCookies(MethodCall call, final MethodChannel.Result result) {

+ 15 - 3
android/src/main/java/com/flutter_webview_plugin/WebviewManager.java

@@ -9,6 +9,7 @@ import android.view.KeyEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.CookieManager;
+import android.webkit.GeolocationPermissions;
 import android.webkit.ValueCallback;
 import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
@@ -205,7 +206,8 @@ class WebviewManager {
             boolean appCacheEnabled,
             boolean allowFileURLs,
             boolean useWideViewPort,
-            String invalidUrlRegex
+            String invalidUrlRegex,
+            boolean geolocationEnabled
     ) {
         webView.getSettings().setJavaScriptEnabled(withJavascript);
         webView.getSettings().setBuiltInZoomControls(withZoom);
@@ -224,6 +226,16 @@ class WebviewManager {
 
         webViewClient.updateInvalidUrlRegex(invalidUrlRegex);
 
+        if (geolocationEnabled) {
+            webView.getSettings().setGeolocationEnabled(true);
+            webView.setWebChromeClient(new WebChromeClient() {
+                @Override
+                public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
+                    callback.invoke(origin, true, false);
+                }
+            });
+        }
+
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
         }
@@ -233,7 +245,7 @@ class WebviewManager {
         }
 
         if (hidden) {
-            webView.setVisibility(View.INVISIBLE);
+            webView.setVisibility(View.GONE);
         }
 
         if (clearCookies) {
@@ -330,7 +342,7 @@ class WebviewManager {
     }
     void hide(MethodCall call, MethodChannel.Result result) {
         if (webView != null) {
-            webView.setVisibility(View.INVISIBLE);
+            webView.setVisibility(View.GONE);
         }
     }
     void show(MethodCall call, MethodChannel.Result result) {

+ 11 - 1
ios/Classes/FlutterWebviewPlugin.m

@@ -3,7 +3,7 @@
 static NSString *const CHANNEL_NAME = @"flutter_webview_plugin";
 
 // UIWebViewDelegate
-@interface FlutterWebviewPlugin() <WKNavigationDelegate, UIScrollViewDelegate> {
+@interface FlutterWebviewPlugin() <WKNavigationDelegate, UIScrollViewDelegate, WKUIDelegate> {
     BOOL _enableAppScheme;
     BOOL _enableZoom;
     NSString* _invalidUrlRegex;
@@ -108,6 +108,7 @@ static NSString *const CHANNEL_NAME = @"flutter_webview_plugin";
     }
 
     self.webview = [[WKWebView alloc] initWithFrame:rc];
+    self.webview.UIDelegate = self;
     self.webview.navigationDelegate = self;
     self.webview.scrollView.delegate = self;
     self.webview.hidden = [hidden boolValue];
@@ -293,6 +294,15 @@ static NSString *const CHANNEL_NAME = @"flutter_webview_plugin";
     }
 }
 
+- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
+    forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
+
+    if (!navigationAction.targetFrame.isMainFrame) {
+        [webView loadRequest:navigationAction.request];
+    }
+
+    return nil;
+}
 
 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
     [channel invokeMethod:@"onState" arguments:@{@"type": @"startLoad", @"url": webView.URL.absoluteString}];

+ 2 - 0
lib/src/base.dart

@@ -115,6 +115,7 @@ class FlutterWebviewPlugin {
     bool allowFileURLs,
     bool useWideViewPort,
     String invalidUrlRegex,
+    bool geolocationEnabled,
   }) async {
     final args = <String, dynamic>{
       'url': url,
@@ -133,6 +134,7 @@ class FlutterWebviewPlugin {
       'allowFileURLs': allowFileURLs ?? false,
       'useWideViewPort': useWideViewPort ?? false,
       'invalidUrlRegex': invalidUrlRegex,
+      'geolocationEnabled': geolocationEnabled ?? false,
     };
 
     if (headers != null) {

+ 13 - 0
lib/src/webview_scaffold.dart

@@ -31,6 +31,7 @@ class WebviewScaffold extends StatefulWidget {
     this.initialChild,
     this.allowFileURLs,
     this.invalidUrlRegex,
+    this.geolocationEnabled
   }) : super(key: key);
 
   final PreferredSizeWidget appBar;
@@ -54,6 +55,7 @@ class WebviewScaffold extends StatefulWidget {
   final Widget initialChild;
   final bool allowFileURLs;
   final String invalidUrlRegex;
+  final bool geolocationEnabled;
 
   @override
   _WebviewScaffoldState createState() => _WebviewScaffoldState();
@@ -65,11 +67,19 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
   Timer _resizeTimer;
   StreamSubscription<WebViewStateChanged> _onStateChanged;
 
+  var _onDestroy;
+
   @override
   void initState() {
     super.initState();
     webviewReference.close();
 
+    _onDestroy = webviewReference.onDestroy.listen((_) {
+      if (mounted) {
+        Navigator.of(context).pop();
+      }
+    });
+
     if (widget.hidden) {
       _onStateChanged = webviewReference.onStateChanged.listen((WebViewStateChanged state) {
         if (state.type == WebViewState.finishLoad) {
@@ -82,6 +92,7 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
   @override
   void dispose() {
     super.dispose();
+    _onDestroy?.cancel();
     _resizeTimer?.cancel();
     webviewReference.close();
     if (widget.hidden) {
@@ -94,6 +105,7 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
   Widget build(BuildContext context) {
     return Scaffold(
       appBar: widget.appBar,
+      resizeToAvoidBottomInset: false,
       persistentFooterButtons: widget.persistentFooterButtons,
       bottomNavigationBar: widget.bottomNavigationBar,
       body: _WebviewPlaceholder(
@@ -118,6 +130,7 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
               appCacheEnabled: widget.appCacheEnabled,
               allowFileURLs: widget.allowFileURLs,
               invalidUrlRegex: widget.invalidUrlRegex,
+              geolocationEnabled: widget.geolocationEnabled
             );
           } else {
             if (_rect != value) {

+ 1 - 1
pubspec.yaml

@@ -7,7 +7,7 @@ authors:
 - Simon Lightfoot <simon@devangels.london>
 - Rafal Wachol <gorudonu@gmail.com>
 homepage: https://github.com/dart-flitter/flutter_webview_plugin
-version: 0.3.0+2
+version: 0.3.1
 maintainer: Simon Lightfoot (@slightfoot)
 
 environment: