From 3da76546d75d6f01396389ab30642c78e909df2a Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 5 Nov 2021 00:53:02 -0700 Subject: [PATCH 1/2] [webview_flutter]Add zoom to android webview (#3325) --- .../webview_flutter/webview_flutter/AUTHORS | 2 + .../webview_flutter/CHANGELOG.md | 4 ++ .../webview_flutter_test.dart | 2 +- .../webview_flutter/example/lib/main.dart | 1 + .../webview_flutter/lib/src/webview.dart | 14 +++++ .../webview_flutter/pubspec.yaml | 4 +- .../test/webview_flutter_test.dart | 55 ++++++++++++++++++- 7 files changed, 77 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/AUTHORS b/packages/webview_flutter/webview_flutter/AUTHORS index 493a0b4ef9c2..85628e432f60 100644 --- a/packages/webview_flutter/webview_flutter/AUTHORS +++ b/packages/webview_flutter/webview_flutter/AUTHORS @@ -64,3 +64,5 @@ Aleksandr Yurkovskiy Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> +Nick Bradshaw +Antonino Di Natale diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index b499cbab6f8d..8f4826823c38 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.0 + +* Add ability to enable/disable zoom functionality. + ## 2.2.0 * Added `runJavascript` and `runJavascriptForResult` to supersede `evaluateJavascript`. diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 9279f31a1e3f..69ddcc685ff8 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -11,9 +11,9 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; import 'package:webview_flutter/platform_interface.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import 'package:integration_test/integration_test.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/packages/webview_flutter/webview_flutter/example/lib/main.dart b/packages/webview_flutter/webview_flutter/example/lib/main.dart index 2fd2087378ba..b660ce37a0b1 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/main.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview.dart b/packages/webview_flutter/webview_flutter/lib/src/webview.dart index 410a99599d4f..442999d0ff5c 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview.dart @@ -90,6 +90,7 @@ class WebView extends StatefulWidget { this.debuggingEnabled = false, this.gestureNavigationEnabled = false, this.userAgent, + this.zoomEnabled = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, @@ -268,6 +269,12 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String? userAgent; + /// A Boolean value indicating whether the WebView should support zooming + /// using its on-screen zoom controls and gestures. + /// + /// By default 'zoomEnabled' is true + final bool zoomEnabled; + /// Which restrictions apply on automatic media playback. /// /// This initial value is applied to the platform's webview upon creation. Any following @@ -359,6 +366,7 @@ WebSettings _webSettingsFromWidget(WebView widget) { gestureNavigationEnabled: widget.gestureNavigationEnabled, allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), + zoomEnabled: widget.zoomEnabled, ); } @@ -374,12 +382,14 @@ WebSettings _clearUnchangedWebSettings( assert(newValue.hasNavigationDelegate != null); assert(newValue.debuggingEnabled != null); assert(newValue.userAgent != null); + assert(newValue.zoomEnabled != null); JavascriptMode? javascriptMode; bool? hasNavigationDelegate; bool? hasProgressTracking; bool? debuggingEnabled; WebSetting userAgent = WebSetting.absent(); + bool? zoomEnabled; if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } @@ -395,6 +405,9 @@ WebSettings _clearUnchangedWebSettings( if (currentValue.userAgent != newValue.userAgent) { userAgent = newValue.userAgent; } + if (currentValue.zoomEnabled != newValue.zoomEnabled) { + zoomEnabled = newValue.zoomEnabled; + } return WebSettings( javascriptMode: javascriptMode, @@ -402,6 +415,7 @@ WebSettings _clearUnchangedWebSettings( hasProgressTracking: hasProgressTracking, debuggingEnabled: debuggingEnabled, userAgent: userAgent, + zoomEnabled: zoomEnabled, ); } diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index 95a86fa018ea..c7ac2e0200f9 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.2.0 +version: 2.3.0 environment: sdk: ">=2.14.0 <3.0.0" @@ -19,8 +19,8 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.2.0 webview_flutter_android: ^2.2.0 + webview_flutter_platform_interface: ^1.2.0 webview_flutter_wkwebview: ^2.2.0 dev_dependencies: diff --git a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart index 8d0f754a529f..e325f68dc0b7 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart @@ -10,8 +10,8 @@ import 'package:flutter/src/foundation/basic_types.dart'; import 'package:flutter/src/gestures/recognizer.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:webview_flutter/webview_flutter.dart'; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; typedef void VoidCallback(); @@ -915,6 +915,50 @@ void main() { }); }); + group('zoomEnabled', () { + testWidgets('Enable zoom', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + zoomEnabled: true, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView!; + + expect(platformWebView.zoomEnabled, isTrue); + }); + + testWidgets('defaults to true', (WidgetTester tester) async { + await tester.pumpWidget(const WebView()); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView!; + + expect(platformWebView.zoomEnabled, isTrue); + }); + + testWidgets('can be changed', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + await tester.pumpWidget(WebView(key: key)); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView!; + + await tester.pumpWidget(WebView( + key: key, + zoomEnabled: true, + )); + + expect(platformWebView.zoomEnabled, isTrue); + + await tester.pumpWidget(WebView( + key: key, + zoomEnabled: false, + )); + + expect(platformWebView.zoomEnabled, isFalse); + }); + }); + group('Custom platform implementation', () { setUpAll(() { WebView.platform = MyWebViewPlatform(); @@ -944,6 +988,7 @@ void main() { debuggingEnabled: false, userAgent: WebSetting.of(null), gestureNavigationEnabled: true, + zoomEnabled: true, ), ))); }); @@ -1011,6 +1056,7 @@ class FakePlatformWebView { params['settings']['hasNavigationDelegate'] ?? false; debuggingEnabled = params['settings']['debuggingEnabled']; userAgent = params['settings']['userAgent']; + zoomEnabled = params['settings']['zoomEnabled'] ?? true; channel = MethodChannel( 'plugins.flutter.io/webview_$id', const StandardMethodCodec()); channel.setMockMethodCallHandler(onMethodCall); @@ -1030,6 +1076,7 @@ class FakePlatformWebView { bool? hasNavigationDelegate; bool? debuggingEnabled; String? userAgent; + bool? zoomEnabled; String? lastRunJavaScriptString; @@ -1050,6 +1097,9 @@ class FakePlatformWebView { debuggingEnabled = call.arguments['debuggingEnabled']; } userAgent = call.arguments['userAgent']; + if (call.arguments['zoomEnabled'] != null) { + zoomEnabled = call.arguments['zoomEnabled']; + } break; case 'canGoBack': return Future.sync(() => currentPosition > 0); @@ -1307,7 +1357,8 @@ class MatchesWebSettings extends Matcher { _webSettings!.debuggingEnabled == webSettings.debuggingEnabled && _webSettings!.gestureNavigationEnabled == webSettings.gestureNavigationEnabled && - _webSettings!.userAgent == webSettings.userAgent; + _webSettings!.userAgent == webSettings.userAgent && + _webSettings!.zoomEnabled == webSettings.zoomEnabled; } } From b401c84200bccd2b4747c2273ea5e13802dd569f Mon Sep 17 00:00:00 2001 From: Russell Wheatley Date: Fri, 5 Nov 2021 07:58:05 +0000 Subject: [PATCH 2/2] [video_player]: initial test coverage file() constructor api (#3407) --- .../integration_test/video_player_test.dart | 24 ++++++++++++++++++- .../video_player/example/pubspec.yaml | 3 ++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart index 373538ad365e..866b5bce0a8d 100644 --- a/packages/video_player/video_player/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart @@ -3,11 +3,15 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:io'; +import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:integration_test/integration_test.dart'; +import 'package:flutter/services.dart' show rootBundle; import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:video_player/video_player.dart'; const Duration _playDuration = Duration(seconds: 1); @@ -224,5 +228,23 @@ void main() { skip: kIsWeb || // Web does not support local assets. // Extremely flaky on iOS: https://github.com/flutter/flutter/issues/86915 defaultTargetPlatform == TargetPlatform.iOS); + + testWidgets('test video player using static file() method as constructor', + (WidgetTester tester) async { + String tempDir = (await getTemporaryDirectory()).path; + ByteData bytes = await rootBundle.load('assets/Butterfly-209.mp4'); + + File file = File('$tempDir/Butterfly-209.mp4'); + await file.writeAsBytes(bytes.buffer.asInt8List()); + + VideoPlayerController fileController = VideoPlayerController.file(file); + await fileController.initialize(); + + await fileController.play(); + expect(fileController.value.isPlaying, true); + + await fileController.pause(); + expect(fileController.value.isPlaying, false); + }, skip: kIsWeb); }); } diff --git a/packages/video_player/video_player/example/pubspec.yaml b/packages/video_player/video_player/example/pubspec.yaml index 0539f3c6f56c..ce1787e2b427 100644 --- a/packages/video_player/video_player/example/pubspec.yaml +++ b/packages/video_player/video_player/example/pubspec.yaml @@ -24,8 +24,9 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - test: any + path_provider: ^2.0.6 pedantic: ^1.10.0 + test: any flutter: uses-material-design: true