From 5f6e47dd033c59546dc405e870ebf3c8fb1bbcb3 Mon Sep 17 00:00:00 2001 From: Daniel Roek Date: Fri, 18 Sep 2020 10:23:24 +0200 Subject: [PATCH 01/32] Fixed issue (#48670) --- .../video_player/video_player/CHANGELOG.md | 5 +++++ .../ios/Runner.xcodeproj/project.pbxproj | 19 ++++--------------- .../video_player/example/lib/main.dart | 2 +- .../ios/Classes/FLTVideoPlayerPlugin.m | 7 ++++++- .../video_player/video_player/pubspec.yaml | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 35f50419f823..12d673170a44 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.10.12+3 + +* Added isDurationIndefinite to support indefinite streams +* Raised video_player_platform_interface in video_player to 2.1.1. + ## 0.10.12+2 * Fix `setMixWithOthers` test. diff --git a/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj b/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj index 9f0a7ef189b9..73756e9358a5 100644 --- a/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,10 +9,6 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -28,8 +24,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -41,13 +35,11 @@ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 20721C28387E1F78689EC502 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -63,8 +55,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, B0F5C77B94E32FB72444AE9F /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -92,9 +82,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, @@ -229,7 +217,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 929A04F81CC936396BFCB39E /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -237,9 +225,12 @@ files = ( ); inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../Flutter/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -315,7 +306,6 @@ /* Begin XCBuildConfiguration section */ 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -372,7 +362,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; diff --git a/packages/video_player/video_player/example/lib/main.dart b/packages/video_player/video_player/example/lib/main.dart index ee2fcbdc9632..8d3486e68d46 100644 --- a/packages/video_player/video_player/example/lib/main.dart +++ b/packages/video_player/video_player/example/lib/main.dart @@ -218,7 +218,7 @@ class _BumbleBeeRemoteVideoState extends State<_BumbleBeeRemoteVideo> { void initState() { super.initState(); _controller = VideoPlayerController.network( - 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', + 'https://rtmp.api.rt.com/hls/rtdru.m3u8', closedCaptionFile: _loadCaptions(), videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), ); diff --git a/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m index a834fe32b87b..a66e091690e4 100644 --- a/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m @@ -302,6 +302,10 @@ - (void)updatePlayingState { _displayLink.paused = !_isPlaying; } +- (bool)isDurationIndefinite { + return CMTIME_IS_INDEFINITE([[_player currentItem] duration]); +} + - (void)sendInitialized { if (_eventSink && !_isInitialized) { CGSize size = [self.player currentItem].presentationSize; @@ -312,8 +316,9 @@ - (void)sendInitialized { if (height == CGSizeZero.height && width == CGSizeZero.width) { return; } + // The player may be initialized but still needs to determine the duration. - if ([self duration] == 0) { + if ([self duration] == 0 && ![self isDurationIndefinite]) { return; } diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 04c7c6ba3ddb..10d4123061b4 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -20,7 +20,7 @@ flutter: dependencies: meta: ^1.0.5 - video_player_platform_interface: ^2.1.0 + video_player_platform_interface: ^2.1.1 # The design on https://flutter.dev/go/federated-plugins was to leave # this constraint as "any". We cannot do it right now as it fails pub publish # validation, so we set a ^ constraint. From eb75741b4b2e9c07a3959bd7c42f8c734f7c31aa Mon Sep 17 00:00:00 2001 From: Daniel Roek Date: Fri, 18 Sep 2020 10:24:34 +0200 Subject: [PATCH 02/32] Fixed issue (#48670) --- .../ios/Runner.xcodeproj/project.pbxproj | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj b/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj index 73756e9358a5..9f0a7ef189b9 100644 --- a/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj @@ -9,6 +9,10 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -24,6 +28,8 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -35,11 +41,13 @@ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 20721C28387E1F78689EC502 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -55,6 +63,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, B0F5C77B94E32FB72444AE9F /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -82,7 +92,9 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, @@ -217,7 +229,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; }; 929A04F81CC936396BFCB39E /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -225,12 +237,9 @@ files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../Flutter/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -306,6 +315,7 @@ /* Begin XCBuildConfiguration section */ 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -362,6 +372,7 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; From 3419209ad2dc3cd932a3f3d01729dc3d1b70deb7 Mon Sep 17 00:00:00 2001 From: Daniel Roek Date: Fri, 18 Sep 2020 10:26:03 +0200 Subject: [PATCH 03/32] Fixed issue (#48670) --- packages/video_player/video_player/example/lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/example/lib/main.dart b/packages/video_player/video_player/example/lib/main.dart index 8d3486e68d46..ee2fcbdc9632 100644 --- a/packages/video_player/video_player/example/lib/main.dart +++ b/packages/video_player/video_player/example/lib/main.dart @@ -218,7 +218,7 @@ class _BumbleBeeRemoteVideoState extends State<_BumbleBeeRemoteVideo> { void initState() { super.initState(); _controller = VideoPlayerController.network( - 'https://rtmp.api.rt.com/hls/rtdru.m3u8', + 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', closedCaptionFile: _loadCaptions(), videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), ); From 35baf458b7cca9c0ea9e0d9136cf36e233c80662 Mon Sep 17 00:00:00 2001 From: Daniel Roek Date: Fri, 18 Sep 2020 11:01:05 +0200 Subject: [PATCH 04/32] Fixed issue (#48670) --- packages/video_player/video_player/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 10d4123061b4..e53e08859115 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter plugin for displaying inline video with other Flutter # 0.10.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.10.12+2 +version: 0.10.12+3 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player flutter: From 2e3b3930a7297bea027d1b131a8fc35a99ab9552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl?= <32639467+danielroek@users.noreply.github.com> Date: Fri, 18 Sep 2020 12:27:25 +0200 Subject: [PATCH 05/32] Format FLTVideoPlayerPlugin.m --- .../video_player/ios/Classes/FLTVideoPlayerPlugin.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m index a66e091690e4..be0c7d3d84f6 100644 --- a/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player/ios/Classes/FLTVideoPlayerPlugin.m @@ -303,7 +303,7 @@ - (void)updatePlayingState { } - (bool)isDurationIndefinite { - return CMTIME_IS_INDEFINITE([[_player currentItem] duration]); + return CMTIME_IS_INDEFINITE([[_player currentItem] duration]); } - (void)sendInitialized { From 5fb82aa510ee5d45ae1657168e019015a3ce22d9 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 18 Sep 2020 15:15:13 +0200 Subject: [PATCH 06/32] Fixed ProgressIndicator on iOS --- packages/video_player/video_player/CHANGELOG.md | 5 +++++ .../video_player/video_player/lib/video_player.dart | 11 +++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 12d673170a44..bb7921bb2d71 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.10.12+4 + +* Added isDurationIndefinite to support indefinite streams +* Raised video_player_platform_interface in video_player to 2.1.1. + ## 0.10.12+3 * Added isDurationIndefinite to support indefinite streams diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 8cd05615cc43..0c2b3db821ac 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -742,27 +742,26 @@ class _VideoProgressIndicatorState extends State { Widget build(BuildContext context) { Widget progressIndicator; if (controller.value.initialized) { - final int duration = controller.value.duration.inMilliseconds; - final int position = controller.value.position.inMilliseconds; + final int duration = controller.value.duration?.inMilliseconds ?? 0; + final int position = controller.value.position?.inMilliseconds ?? 0; int maxBuffering = 0; for (DurationRange range in controller.value.buffered) { - final int end = range.end.inMilliseconds; + final int end = range.end?.inMilliseconds ?? 0; if (end > maxBuffering) { maxBuffering = end; } } - progressIndicator = Stack( fit: StackFit.passthrough, children: [ LinearProgressIndicator( - value: maxBuffering / duration, + value: duration > 0 ? maxBuffering / duration : 0, valueColor: AlwaysStoppedAnimation(colors.bufferedColor), backgroundColor: colors.backgroundColor, ), LinearProgressIndicator( - value: position / duration, + value: duration > 0 ? position / duration : 0, valueColor: AlwaysStoppedAnimation(colors.playedColor), backgroundColor: Colors.transparent, ), From 26aa11639121f448fa0f598eab51f1fc77b6cb38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl?= <32639467+danielroek@users.noreply.github.com> Date: Fri, 18 Sep 2020 15:20:38 +0200 Subject: [PATCH 07/32] Update CHANGELOG.md --- packages/video_player/video_player/CHANGELOG.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index bb7921bb2d71..12d673170a44 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,8 +1,3 @@ -## 0.10.12+4 - -* Added isDurationIndefinite to support indefinite streams -* Raised video_player_platform_interface in video_player to 2.1.1. - ## 0.10.12+3 * Added isDurationIndefinite to support indefinite streams From 57cdcf369ba4e7dcb5af935099c6b05a0c50b4cf Mon Sep 17 00:00:00 2001 From: Maurits van Beusekom Date: Tue, 8 Sep 2020 21:20:58 +0200 Subject: [PATCH 08/32] [url_launcher] Suppress deprecation warning in WebViewActivity (#3008) The url_launcher overrides the deprecated shouldOverrideUrlLoading(WebView view, String url) method to be backwards compatible with versions before Android API 24. This however currently displays the warning "WebViewActivity.java uses or overrides a deprecated API." when building for Android. This is causing some problems for developers who treat these warnings as errors as part of their build configuration. This PR addresses this issue by annotating the shouldOverrideUrlLoading(WebView view, String url) method with the @SuppressWarnings("deprecation") attribute. This PR also adds the @RequiresApi(Build.VERSION_CODES.N) annotation to the shouldOverrideUrlLoading(WebView view, WebResourceRequest request) method, which gives the Android/ Java tooling an indication this method should only by used from API 24 and higher. --- packages/url_launcher/url_launcher/CHANGELOG.md | 4 ++++ .../io/flutter/plugins/urllauncher/WebViewActivity.java | 7 +++++++ packages/url_launcher/url_launcher/pubspec.yaml | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index d20eb9117440..e7e31acfd968 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.5.3 + +* Suppress deprecation warning on the `shouldOverrideUrlLoading` method on Android. + ## 5.5.2 * Depend explicitly on the `platform_interface` package that adds the `webOnlyWindowName` parameter. diff --git a/packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java b/packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java index 52714790a25c..5624d75b22eb 100644 --- a/packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java +++ b/packages/url_launcher/url_launcher/android/src/main/java/io/flutter/plugins/urllauncher/WebViewActivity.java @@ -12,6 +12,7 @@ import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; +import androidx.annotation.RequiresApi; import java.util.HashMap; import java.util.Map; @@ -38,6 +39,11 @@ public void onReceive(Context context, Intent intent) { private final WebViewClient webViewClient = new WebViewClient() { + /* + * This method is deprecated in API 24. Still overridden to support + * earlier Android versions. + */ + @SuppressWarnings("deprecation") @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { @@ -47,6 +53,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { return super.shouldOverrideUrlLoading(view, url); } + @RequiresApi(Build.VERSION_CODES.N) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index 7fc824c74f9a..57048a2b3f98 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -2,7 +2,7 @@ name: url_launcher description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher -version: 5.5.2 +version: 5.5.3 flutter: plugin: From 95d8ed9c83b03687561aa11ccad5407413df0f44 Mon Sep 17 00:00:00 2001 From: Yash Johri Date: Wed, 9 Sep 2020 23:51:29 +0530 Subject: [PATCH 09/32] [device_info_platform_interface] Typo in doc fixed (#3006) --- .../device_info_platform_interface/CHANGELOG.md | 4 ++++ .../lib/device_info_platform_interface.dart | 8 +++----- .../device_info_platform_interface/pubspec.yaml | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/device_info/device_info_platform_interface/CHANGELOG.md b/packages/device_info/device_info_platform_interface/CHANGELOG.md index 6fadda91b380..8a7eb6c46be3 100644 --- a/packages/device_info/device_info_platform_interface/CHANGELOG.md +++ b/packages/device_info/device_info_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.1 + +- Documentation typo fixed. + ## 1.0.0 - Initial open-source release. diff --git a/packages/device_info/device_info_platform_interface/lib/device_info_platform_interface.dart b/packages/device_info/device_info_platform_interface/lib/device_info_platform_interface.dart index 253d6d036123..808b7adf9dc7 100644 --- a/packages/device_info/device_info_platform_interface/lib/device_info_platform_interface.dart +++ b/packages/device_info/device_info_platform_interface/lib/device_info_platform_interface.dart @@ -22,7 +22,7 @@ export 'model/ios_device_info.dart'; /// platform implementations that `implements` this interface will be broken by newly added /// [DeviceInfoPlatform] methods. abstract class DeviceInfoPlatform extends PlatformInterface { - /// Constructs a UrlLauncherPlatform. + /// Constructs a DeviceInfoPlatform. DeviceInfoPlatform() : super(token: _token); static final Object _token = Object(); @@ -41,14 +41,12 @@ abstract class DeviceInfoPlatform extends PlatformInterface { _instance = instance; } - // Gets the Android device information. - // ignore: public_member_api_docs + /// Gets the Android device information. Future androidInfo() { throw UnimplementedError('androidInfo() has not been implemented.'); } - // Gets the iOS device information. - // ignore: public_member_api_docs + /// Gets the iOS device information. Future iosInfo() { throw UnimplementedError('iosInfo() has not been implemented.'); } diff --git a/packages/device_info/device_info_platform_interface/pubspec.yaml b/packages/device_info/device_info_platform_interface/pubspec.yaml index 3adfb93fa27a..656e5b24c373 100644 --- a/packages/device_info/device_info_platform_interface/pubspec.yaml +++ b/packages/device_info/device_info_platform_interface/pubspec.yaml @@ -3,7 +3,7 @@ description: A common platform interface for the device_info plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/device_info # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.0 +version: 1.0.1 dependencies: flutter: From fe5e0fea3caaef839c0da020e15c81fbd1e676ea Mon Sep 17 00:00:00 2001 From: Marius Preikschat Date: Wed, 9 Sep 2020 22:00:32 +0200 Subject: [PATCH 10/32] [image_picker_for_web] Safari now can pick more video formats (3gp, mp4, possibly others...) (#3007) --- packages/image_picker/image_picker_for_web/CHANGELOG.md | 4 ++++ .../image_picker_for_web/lib/image_picker_for_web.dart | 3 +-- packages/image_picker/image_picker_for_web/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/image_picker/image_picker_for_web/CHANGELOG.md b/packages/image_picker/image_picker_for_web/CHANGELOG.md index 67320bcb3de2..604314240a1e 100644 --- a/packages/image_picker/image_picker_for_web/CHANGELOG.md +++ b/packages/image_picker/image_picker_for_web/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.1.0+2 + +* Adds Video MIME Types for the safari browser for acception + # 0.1.0+1 * Remove `android` directory. diff --git a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart index ce99dd6d5fc6..e50b4aad3c8d 100644 --- a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart +++ b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart @@ -7,8 +7,7 @@ import 'package:image_picker_platform_interface/image_picker_platform_interface. final String _kImagePickerInputsDomId = '__image_picker_web-file-input'; final String _kAcceptImageMimeType = 'image/*'; -// TODO The value below seems to not be enough for Safari (https://github.com/flutter/flutter/issues/58532) -final String _kAcceptVideoMimeType = 'video/*'; +final String _kAcceptVideoMimeType = 'video/3gpp,video/x-m4v,video/mp4,video/*'; /// The web implementation of [ImagePickerPlatform]. /// diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml index 29b9b185cb90..32e89437415e 100644 --- a/packages/image_picker/image_picker_for_web/pubspec.yaml +++ b/packages/image_picker/image_picker_for_web/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/i # 0.1.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.1.0+1 +version: 0.1.0+2 flutter: plugin: From 7d8429dd1fb2e85a1a5f2e5d1625a5f0c3cfc9b4 Mon Sep 17 00:00:00 2001 From: Vitalii Vyrodov Date: Thu, 10 Sep 2020 00:24:33 +0300 Subject: [PATCH 11/32] [google_maps_flutter] Fix typo in User Interface example (#3011) --- packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md | 4 ++++ .../google_maps_flutter/example/lib/map_ui.dart | 4 ++-- packages/google_maps_flutter/google_maps_flutter/pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md index 0476f8c9a744..32cb61c3661a 100644 --- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.32 + +* Fix typo in google_maps_flutter/example/map_ui.dart. + ## 0.5.31 * Geodesic Polyline support for iOS diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart index 051d658ddff8..f117c3a48b22 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart @@ -5,8 +5,8 @@ // ignore_for_file: public_member_api_docs import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter/services.dart' show rootBundle; +import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'page.dart'; @@ -206,7 +206,7 @@ class MapUiBodyState extends State { Widget _myLocationToggler() { return FlatButton( child: Text( - '${_myLocationButtonEnabled ? 'disable' : 'enable'} my location button'), + '${_myLocationEnabled ? 'disable' : 'enable'} my location marker'), onPressed: () { setState(() { _myLocationEnabled = !_myLocationEnabled; diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml index 9d2468ac1eaf..42033770e46e 100644 --- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter -version: 0.5.31 +version: 0.5.32 dependencies: flutter: From 8e47e8089bc6c031d52332d143c3a6001247b6ba Mon Sep 17 00:00:00 2001 From: Ziggy Crane Date: Thu, 10 Sep 2020 00:56:27 +0300 Subject: [PATCH 12/32] [in_app_purchase] Fix the bug that prevent restored subscription transactions from being completed (#2872) * Fix the bug that prevent restored subscription transactions from being completed * Update changelog * increased version * fixed removing transactions from transactionsSetter * Fixed CHANGELOGS conflicts * transactionsSetter code formating updates * fixed formating --- packages/in_app_purchase/CHANGELOG.md | 4 +++ .../ios/Classes/FIAPaymentQueueHandler.h | 3 +- .../ios/Classes/FIAPaymentQueueHandler.m | 28 ++++++++++++++++--- .../ios/Classes/InAppPurchasePlugin.m | 11 ++++---- packages/in_app_purchase/pubspec.yaml | 2 +- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index 65f7f86a16e6..d12fd807969b 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.4+6 + +* iOS: Fix the bug that prevent restored subscription transactions from being completed + ## 0.3.4+5 * Added necessary README docs for getting started with Android. diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h index ed1788186909..6f0c64bb85df 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h @@ -19,7 +19,8 @@ typedef void (^UpdatedDownloads)(NSArray *downloads); @interface FIAPaymentQueueHandler : NSObject // Unfinished transactions. -@property(nonatomic, readonly) NSDictionary *transactions; +@property(nonatomic, readonly) + NSDictionary *> *transactions; - (instancetype)initWithQueue:(nonnull SKPaymentQueue *)queue transactionsUpdated:(nullable TransactionsUpdated)transactionsUpdated diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m index 57370e16fcbb..ddf9b2736a77 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m @@ -16,7 +16,7 @@ @interface FIAPaymentQueueHandler () @property(nullable, copy, nonatomic) UpdatedDownloads updatedDownloads; @property(strong, nonatomic) - NSMutableDictionary *transactionsSetter; + NSMutableDictionary *> *transactionsSetter; @end @@ -81,7 +81,13 @@ - (void)paymentQueue:(SKPaymentQueue *)queue // will become impossible for clients to finish deferred transactions when needed. // 2. Using product identifiers can help prevent clients from purchasing the same // subscription more than once by accident. - self.transactionsSetter[transaction.payment.productIdentifier] = transaction; + NSMutableArray *transactionArray = + [self.transactionsSetter objectForKey:transaction.payment.productIdentifier]; + if (transactionArray == nil) { + transactionArray = [NSMutableArray array]; + } + [transactionArray addObject:transaction]; + self.transactionsSetter[transaction.payment.productIdentifier] = transactionArray; } } // notify dart through callbacks. @@ -92,7 +98,21 @@ - (void)paymentQueue:(SKPaymentQueue *)queue - (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions { for (SKPaymentTransaction *transaction in transactions) { - [self.transactionsSetter removeObjectForKey:transaction.payment.productIdentifier]; + NSString *productId = transaction.payment.productIdentifier; + + if ([self.transactionsSetter objectForKey:productId] == nil) { + continue; + } + + NSPredicate *predicate = [NSPredicate + predicateWithFormat:@"transactionIdentifier == %@", transaction.transactionIdentifier]; + NSArray *filteredTransactions = + [self.transactionsSetter[productId] filteredArrayUsingPredicate:predicate]; + [self.transactionsSetter[productId] removeObjectsInArray:filteredTransactions]; + + if (!self.transactionsSetter[productId] || !self.transactionsSetter[productId].count) { + [self.transactionsSetter removeObjectForKey:productId]; + } } self.transactionsRemoved(transactions); } @@ -128,7 +148,7 @@ - (BOOL)paymentQueue:(SKPaymentQueue *)queue #pragma mark - getter -- (NSDictionary *)transactions { +- (NSDictionary *> *)transactions { return [self.transactionsSetter copy]; } diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index 06fe74a613ae..62b86bf9d82e 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -204,9 +204,8 @@ - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result return; } NSString *identifier = call.arguments; - SKPaymentTransaction *transaction = - [self.paymentQueueHandler.transactions objectForKey:identifier]; - if (!transaction) { + NSMutableArray *transactions = [self.paymentQueueHandler.transactions objectForKey:identifier]; + if (!transactions) { result([FlutterError errorWithCode:@"storekit_platform_invalid_transaction" message:[NSString @@ -214,14 +213,16 @@ - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result @"exist. Note that if the transactionState is " @"purchasing, the transactionIdentifier will be " @"nil(null).", - transaction.transactionIdentifier] + identifier] details:call.arguments]); return; } @try { + for (SKPaymentTransaction *transaction in transactions) { + [self.paymentQueueHandler finishTransaction:transaction]; + } // finish transaction will throw exception if the transaction type is purchasing. Notify dart // about this exception. - [self.paymentQueueHandler finishTransaction:transaction]; } @catch (NSException *e) { result([FlutterError errorWithCode:@"storekit_finish_transaction_exception" message:e.name diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index 42bb0d8f4619..55ac120b30c6 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -1,7 +1,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.3.4+5 +version: 0.3.4+6 dependencies: async: ^2.0.8 From 45e660028bb6751c8a2df3f06bb8eabdefc5c25f Mon Sep 17 00:00:00 2001 From: "James D. Lin" Date: Wed, 9 Sep 2020 15:40:54 -0700 Subject: [PATCH 13/32] [url_launcher_web] Fix a typo in a test name and fix quote consistency (#3010) Fix a typo in a test name and fix quote consistency. --- .../url_launcher/url_launcher_web/CHANGELOG.md | 4 ++++ .../url_launcher/url_launcher_web/pubspec.yaml | 2 +- .../test/url_launcher_web_test.dart | 16 ++++++++-------- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md index 4bf47fe2c1fb..b12189336e74 100644 --- a/packages/url_launcher/url_launcher_web/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_web/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.1.3+2 + +- Fix a typo in a test name and fix some style inconsistencies. + # 0.1.3+1 - Depend explicitly on the `platform_interface` package that adds the `webOnlyWindowName` parameter. diff --git a/packages/url_launcher/url_launcher_web/pubspec.yaml b/packages/url_launcher/url_launcher_web/pubspec.yaml index 6c1285f22090..d206c0f1bbb9 100644 --- a/packages/url_launcher/url_launcher_web/pubspec.yaml +++ b/packages/url_launcher/url_launcher_web/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/u # 0.1.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.1.3+1 +version: 0.1.3+2 flutter: plugin: diff --git a/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart b/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart index 9cbaf686069f..56f23a464f1d 100644 --- a/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart +++ b/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart @@ -145,17 +145,17 @@ void main() { verify(mockWindow.open('sms:+19725551212?body=hello%20there', '')); }); - test('setting oOnlyLinkTarget as _self opens the url in the same tab', + test('setting webOnlyLinkTarget as _self opens the url in the same tab', () { - plugin.openNewWindow("https://www.google.com", - webOnlyWindowName: "_self"); + plugin.openNewWindow('https://www.google.com', + webOnlyWindowName: '_self'); verify(mockWindow.open('https://www.google.com', '_self')); }); test('setting webOnlyLinkTarget as _blank opens the url in a new tab', () { - plugin.openNewWindow("https://www.google.com", - webOnlyWindowName: "_blank"); + plugin.openNewWindow('https://www.google.com', + webOnlyWindowName: '_blank'); verify(mockWindow.open('https://www.google.com', '_blank')); }); @@ -197,9 +197,9 @@ void main() { test( 'mailto urls should use _blank if webOnlyWindowName is set as _blank', () { - plugin.openNewWindow("mailto:name@mydomain.com", - webOnlyWindowName: "_blank"); - verify(mockWindow.open("mailto:name@mydomain.com", "_blank")); + plugin.openNewWindow('mailto:name@mydomain.com', + webOnlyWindowName: '_blank'); + verify(mockWindow.open('mailto:name@mydomain.com', '_blank')); }); }); }); From d584424fb8855813367a7a617f50000cb035a2d5 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 11 Sep 2020 09:58:24 -0700 Subject: [PATCH 14/32] [in_app_purchase] Fix typo on `simulatesAskToBuyInSandBox` (#3016) --- packages/in_app_purchase/CHANGELOG.md | 4 ++++ packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m | 2 +- .../in_app_purchase/ios/Tests/InAppPurchasePluginTest.m | 6 +++--- packages/in_app_purchase/pubspec.yaml | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index d12fd807969b..ade5dbe57bc1 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.4+7 + +* iOS: Fix typo of the `simulatesAskToBuyInSandbox` key. + ## 0.3.4+6 * iOS: Fix the bug that prevent restored subscription transactions from being completed diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index 62b86bf9d82e..dcf27147eb1d 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -180,7 +180,7 @@ - (void)addPayment:(FlutterMethodCall *)call result:(FlutterResult)result { payment.quantity = (quantity != nil) ? quantity.integerValue : 1; if (@available(iOS 8.3, *)) { payment.simulatesAskToBuyInSandbox = - [[paymentMap objectForKey:@"simulatesAskToBuyInSandBox"] boolValue]; + [[paymentMap objectForKey:@"simulatesAskToBuyInSandbox"] boolValue]; } if (![self.paymentQueueHandler addPayment:payment]) { diff --git a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m index f1290b074ad9..9c654b0e9c4c 100644 --- a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m +++ b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m @@ -81,7 +81,7 @@ - (void)testAddPaymentFailure { arguments:@{ @"productIdentifier" : @"123", @"quantity" : @(1), - @"simulatesAskToBuyInSandBox" : @YES, + @"simulatesAskToBuyInSandbox" : @YES, }]; SKPaymentQueueStub* queue = [SKPaymentQueueStub new]; queue.testState = SKPaymentTransactionStateFailed; @@ -118,7 +118,7 @@ - (void)testAddPaymentWithSameProductIDWillFail { arguments:@{ @"productIdentifier" : @"123", @"quantity" : @(1), - @"simulatesAskToBuyInSandBox" : @YES, + @"simulatesAskToBuyInSandbox" : @YES, }]; SKPaymentQueueStub* queue = [SKPaymentQueueStub new]; queue.testState = SKPaymentTransactionStatePurchased; @@ -163,7 +163,7 @@ - (void)testAddPaymentSuccessWithMockQueue { arguments:@{ @"productIdentifier" : @"123", @"quantity" : @(1), - @"simulatesAskToBuyInSandBox" : @YES, + @"simulatesAskToBuyInSandbox" : @YES, }]; SKPaymentQueueStub* queue = [SKPaymentQueueStub new]; queue.testState = SKPaymentTransactionStatePurchased; diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index 55ac120b30c6..e831d902c91f 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -1,7 +1,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.3.4+6 +version: 0.3.4+7 dependencies: async: ^2.0.8 From 4e26841d26d8cbdeb62de262805420341119dcb1 Mon Sep 17 00:00:00 2001 From: David Iglesias Date: Fri, 11 Sep 2020 12:23:43 -0700 Subject: [PATCH 15/32] [google_maps_flutter_web] Allow Markers with icon:null (#2998) --- .../google_maps_flutter_web/CHANGELOG.md | 4 +++ .../lib/src/convert.dart | 31 ++++++++++--------- .../google_maps_flutter_web/pubspec.yaml | 2 +- .../test/test_driver/markers_integration.dart | 12 +++++++ 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md index 1c4272849c05..0121042b1a02 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0+2 + +* Fix crash when converting Markers with icon explicitly set to null. [Issue](https://github.com/flutter/flutter/issues/64938). + ## 0.1.0+1 * Port e2e tests to use the new integration_test package. diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart index 2eeaa0202995..0ec00871e676 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart @@ -379,22 +379,25 @@ gmaps.MarkerOptions _markerOptionsFromMarker( Marker marker, gmaps.Marker currentMarker, ) { - final iconConfig = marker.icon.toJson() as List; + final iconConfig = marker.icon?.toJson() as List; gmaps.Icon icon; - if (iconConfig[0] == 'fromAssetImage') { - // iconConfig[2] contains the DPIs of the screen, but that information is - // already encoded in the iconConfig[1] - - icon = gmaps.Icon() - ..url = ui.webOnlyAssetManager.getAssetUrl(iconConfig[1]); - - // iconConfig[3] may contain the [width, height] of the image, if passed! - if (iconConfig.length >= 4 && iconConfig[3] != null) { - final size = gmaps.Size(iconConfig[3][0], iconConfig[3][1]); - icon - ..size = size - ..scaledSize = size; + if (iconConfig != null) { + if (iconConfig[0] == 'fromAssetImage') { + assert(iconConfig.length >= 2); + // iconConfig[2] contains the DPIs of the screen, but that information is + // already encoded in the iconConfig[1] + + icon = gmaps.Icon() + ..url = ui.webOnlyAssetManager.getAssetUrl(iconConfig[1]); + + // iconConfig[3] may contain the [width, height] of the image, if passed! + if (iconConfig.length >= 4 && iconConfig[3] != null) { + final size = gmaps.Size(iconConfig[3][0], iconConfig[3][1]); + icon + ..size = size + ..scaledSize = size; + } } } return gmaps.MarkerOptions() diff --git a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml index e916f7aa6590..5a879c2b39b0 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml @@ -1,7 +1,7 @@ name: google_maps_flutter_web description: Web platform implementation of google_maps_flutter homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter -version: 0.1.0+1 +version: 0.1.0+2 flutter: plugin: diff --git a/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart b/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart index f447535668b9..76ddf017985c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/test/test_driver/markers_integration.dart @@ -98,5 +98,17 @@ void main() { expect(controller.markers[MarkerId('1')].infoWindowShown, isFalse); }); + + // https://github.com/flutter/flutter/issues/64938 + testWidgets('markers with icon:null work', (WidgetTester tester) async { + final markers = { + Marker(markerId: MarkerId('1'), icon: null), + }; + + controller.addMarkers(markers); + + expect(controller.markers.length, 1); + expect(controller.markers[MarkerId('1')].marker.icon, isNull); + }); }); } From 6b63ca2b4ac1d1cfefbddf6e704402f7cfe937d6 Mon Sep 17 00:00:00 2001 From: kinex Date: Fri, 11 Sep 2020 22:29:00 +0300 Subject: [PATCH 16/32] [in_app_purchase] Removed maintaining own cache of transactions (#2911) * - Removed maintaining own cache of transactions, it is better to use SKPaymentQueue.transactions where needed - Removed unnecessary and broken payment validation from addPayment - Refactored finishTransaction for finishing transactions properly - Fixed: restoreTransactions did not call result(nil) causing the call never complete * - Updated changelog * - Fixed call to finishTransaction: parameter must be transactionIdentifier, not productIdentifier * - review fixes: verify in addPayment there are no pending transactions for the same product * - reverted accidental change * - fixed formatting issues * - fixed formatting issues * - fixed test (removed obsolete references to old transactions cache) * - removed obsolete test testAddPaymentWithSameProductIDWillFail - fixed sk_methodchannel_apis_test * - removed testDuplicateTransactionsWillTriggerAnError Co-authored-by: LHLL --- packages/in_app_purchase/CHANGELOG.md | 6 +++ .../ios/Classes/FIAPaymentQueueHandler.h | 4 -- .../ios/Classes/FIAPaymentQueueHandler.m | 49 ++----------------- .../ios/Classes/InAppPurchasePlugin.m | 41 +++++++--------- .../ios/Tests/InAppPurchasePluginTest.m | 45 ----------------- .../ios/Tests/PaymentQueueTest.m | 22 --------- .../sk_payment_queue_wrapper.dart | 2 +- .../sk_methodchannel_apis_test.dart | 2 +- 8 files changed, 29 insertions(+), 142 deletions(-) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index ade5dbe57bc1..fe601c2d5728 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.3.4+8 + +* [iOS] Fixed: purchase dialog not showing always. +* [iOS] Fixed: completing purchases could fail. +* [iOS] Fixed: restorePurchases caused hang (call never returned). + ## 0.3.4+7 * iOS: Fix typo of the `simulatesAskToBuyInSandbox` key. diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h index 6f0c64bb85df..54898d170304 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.h @@ -18,10 +18,6 @@ typedef void (^UpdatedDownloads)(NSArray *downloads); @interface FIAPaymentQueueHandler : NSObject -// Unfinished transactions. -@property(nonatomic, readonly) - NSDictionary *> *transactions; - - (instancetype)initWithQueue:(nonnull SKPaymentQueue *)queue transactionsUpdated:(nullable TransactionsUpdated)transactionsUpdated transactionRemoved:(nullable TransactionsRemoved)transactionsRemoved diff --git a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m index ddf9b2736a77..ecbd237c90ce 100644 --- a/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m +++ b/packages/in_app_purchase/ios/Classes/FIAPaymentQueueHandler.m @@ -15,9 +15,6 @@ @interface FIAPaymentQueueHandler () @property(nullable, copy, nonatomic) ShouldAddStorePayment shouldAddStorePayment; @property(nullable, copy, nonatomic) UpdatedDownloads updatedDownloads; -@property(strong, nonatomic) - NSMutableDictionary *> *transactionsSetter; - @end @implementation FIAPaymentQueueHandler @@ -39,7 +36,6 @@ - (instancetype)initWithQueue:(nonnull SKPaymentQueue *)queue _paymentQueueRestoreCompletedTransactionsFinished = restoreCompletedTransactionsFinished; _shouldAddStorePayment = shouldAddStorePayment; _updatedDownloads = updatedDownloads; - _transactionsSetter = [NSMutableDictionary dictionary]; } return self; } @@ -49,8 +45,10 @@ - (void)startObservingPaymentQueue { } - (BOOL)addPayment:(SKPayment *)payment { - if (self.transactionsSetter[payment.productIdentifier]) { - return NO; + for (SKPaymentTransaction *transaction in self.queue.transactions) { + if ([transaction.payment.productIdentifier isEqualToString:payment.productIdentifier]) { + return NO; + } } [self.queue addPayment:payment]; return YES; @@ -74,22 +72,6 @@ - (void)restoreTransactions:(nullable NSString *)applicationName { // state of transactions and finish as appropriate. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { - for (SKPaymentTransaction *transaction in transactions) { - if (transaction.transactionState != SKPaymentTransactionStatePurchasing) { - // Use product identifier instead of transaction identifier for few reasons: - // 1. Only transactions with purchased state and failed state will have a transaction id, it - // will become impossible for clients to finish deferred transactions when needed. - // 2. Using product identifiers can help prevent clients from purchasing the same - // subscription more than once by accident. - NSMutableArray *transactionArray = - [self.transactionsSetter objectForKey:transaction.payment.productIdentifier]; - if (transactionArray == nil) { - transactionArray = [NSMutableArray array]; - } - [transactionArray addObject:transaction]; - self.transactionsSetter[transaction.payment.productIdentifier] = transactionArray; - } - } // notify dart through callbacks. self.transactionsUpdated(transactions); } @@ -97,23 +79,6 @@ - (void)paymentQueue:(SKPaymentQueue *)queue // Sent when transactions are removed from the queue (via finishTransaction:). - (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions { - for (SKPaymentTransaction *transaction in transactions) { - NSString *productId = transaction.payment.productIdentifier; - - if ([self.transactionsSetter objectForKey:productId] == nil) { - continue; - } - - NSPredicate *predicate = [NSPredicate - predicateWithFormat:@"transactionIdentifier == %@", transaction.transactionIdentifier]; - NSArray *filteredTransactions = - [self.transactionsSetter[productId] filteredArrayUsingPredicate:predicate]; - [self.transactionsSetter[productId] removeObjectsInArray:filteredTransactions]; - - if (!self.transactionsSetter[productId] || !self.transactionsSetter[productId].count) { - [self.transactionsSetter removeObjectForKey:productId]; - } - } self.transactionsRemoved(transactions); } @@ -146,10 +111,4 @@ - (BOOL)paymentQueue:(SKPaymentQueue *)queue return self.queue.transactions; } -#pragma mark - getter - -- (NSDictionary *> *)transactions { - return [self.transactionsSetter copy]; -} - @end diff --git a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m index dcf27147eb1d..156ce0c33e8f 100644 --- a/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m +++ b/packages/in_app_purchase/ios/Classes/InAppPurchasePlugin.m @@ -203,32 +203,24 @@ - (void)finishTransaction:(FlutterMethodCall *)call result:(FlutterResult)result details:call.arguments]); return; } - NSString *identifier = call.arguments; - NSMutableArray *transactions = [self.paymentQueueHandler.transactions objectForKey:identifier]; - if (!transactions) { - result([FlutterError - errorWithCode:@"storekit_platform_invalid_transaction" - message:[NSString - stringWithFormat:@"The transaction with transactionIdentifer:%@ does not " - @"exist. Note that if the transactionState is " - @"purchasing, the transactionIdentifier will be " - @"nil(null).", - identifier] - details:call.arguments]); - return; - } - @try { - for (SKPaymentTransaction *transaction in transactions) { - [self.paymentQueueHandler finishTransaction:transaction]; + NSString *transactionIdentifier = call.arguments; + + NSArray *pendingTransactions = + [self.paymentQueueHandler getUnfinishedTransactions]; + + for (SKPaymentTransaction *transaction in pendingTransactions) { + if ([transaction.transactionIdentifier isEqualToString:transactionIdentifier]) { + @try { + [self.paymentQueueHandler finishTransaction:transaction]; + } @catch (NSException *e) { + result([FlutterError errorWithCode:@"storekit_finish_transaction_exception" + message:e.name + details:e.description]); + return; + } } - // finish transaction will throw exception if the transaction type is purchasing. Notify dart - // about this exception. - } @catch (NSException *e) { - result([FlutterError errorWithCode:@"storekit_finish_transaction_exception" - message:e.name - details:e.description]); - return; } + result(nil); } @@ -241,6 +233,7 @@ - (void)restoreTransactions:(FlutterMethodCall *)call result:(FlutterResult)resu return; } [self.paymentQueueHandler restoreTransactions:call.arguments]; + result(nil); } - (void)retrieveReceiptData:(FlutterMethodCall *)call result:(FlutterResult)result { diff --git a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m index 9c654b0e9c4c..369e0ead0ba7 100644 --- a/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m +++ b/packages/in_app_purchase/ios/Tests/InAppPurchasePluginTest.m @@ -110,51 +110,6 @@ - (void)testAddPaymentFailure { XCTAssertEqual(transactionForUpdateBlock.transactionState, SKPaymentTransactionStateFailed); } -- (void)testAddPaymentWithSameProductIDWillFail { - XCTestExpectation* expectation = - [self expectationWithDescription:@"result should return expected error"]; - FlutterMethodCall* call = - [FlutterMethodCall methodCallWithMethodName:@"-[InAppPurchasePlugin addPayment:result:]" - arguments:@{ - @"productIdentifier" : @"123", - @"quantity" : @(1), - @"simulatesAskToBuyInSandbox" : @YES, - }]; - SKPaymentQueueStub* queue = [SKPaymentQueueStub new]; - queue.testState = SKPaymentTransactionStatePurchased; - self.plugin.paymentQueueHandler = [[FIAPaymentQueueHandler alloc] initWithQueue:queue - transactionsUpdated:^(NSArray* _Nonnull transactions) { - } - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil - shouldAddStorePayment:^BOOL(SKPayment* _Nonnull payment, SKProduct* _Nonnull product) { - return YES; - } - updatedDownloads:nil]; - [queue addTransactionObserver:self.plugin.paymentQueueHandler]; - - FlutterResult addDuplicatePaymentBlock = ^(id r) { - XCTAssertNil(r); - [self.plugin - handleMethodCall:call - result:^(id result) { - XCTAssertNotNil(result); - XCTAssertTrue([result isKindOfClass:[FlutterError class]]); - FlutterError* error = (FlutterError*)result; - XCTAssertEqualObjects(error.code, @"storekit_duplicate_product_object"); - XCTAssertEqualObjects( - error.message, - @"There is a pending transaction for the same product identifier. Please " - @"either wait for it to be finished or finish it manually using " - @"`completePurchase` to avoid edge cases."); - [expectation fulfill]; - }]; - }; - [self.plugin handleMethodCall:call result:addDuplicatePaymentBlock]; - [self waitForExpectations:@[ expectation ] timeout:5]; -} - - (void)testAddPaymentSuccessWithMockQueue { XCTestExpectation* expectation = [self expectationWithDescription:@"result should return success state"]; diff --git a/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m index 8f5b66496f69..07b6bbb42a65 100644 --- a/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m +++ b/packages/in_app_purchase/ios/Tests/PaymentQueueTest.m @@ -69,26 +69,6 @@ - (void)testTransactionPurchased { XCTAssertEqual(tran.transactionIdentifier, @"fakeID"); } -- (void)testDuplicateTransactionsWillTriggerAnError { - SKPaymentQueueStub *queue = [[SKPaymentQueueStub alloc] init]; - queue.testState = SKPaymentTransactionStatePurchased; - FIAPaymentQueueHandler *handler = [[FIAPaymentQueueHandler alloc] initWithQueue:queue - transactionsUpdated:^(NSArray *_Nonnull transactions) { - } - transactionRemoved:nil - restoreTransactionFailed:nil - restoreCompletedTransactionsFinished:nil - shouldAddStorePayment:^BOOL(SKPayment *_Nonnull payment, SKProduct *_Nonnull product) { - return YES; - } - updatedDownloads:nil]; - [queue addTransactionObserver:handler]; - SKPayment *payment = - [SKPayment paymentWithProduct:[[SKProductStub alloc] initWithMap:self.productResponseMap]]; - XCTAssertTrue([handler addPayment:payment]); - XCTAssertFalse([handler addPayment:payment]); -} - - (void)testTransactionFailed { XCTestExpectation *expectation = [self expectationWithDescription:@"expect to get failed transcation."]; @@ -208,13 +188,11 @@ - (void)testFinishTransaction { queue.testState = SKPaymentTransactionStateDeferred; __block FIAPaymentQueueHandler *handler = [[FIAPaymentQueueHandler alloc] initWithQueue:queue transactionsUpdated:^(NSArray *_Nonnull transactions) { - XCTAssertEqual(handler.transactions.count, 1); XCTAssertEqual(transactions.count, 1); SKPaymentTransaction *transaction = transactions[0]; [handler finishTransaction:transaction]; } transactionRemoved:^(NSArray *_Nonnull transactions) { - XCTAssertEqual(handler.transactions.count, 0); XCTAssertEqual(transactions.count, 1); [expectation fulfill]; } diff --git a/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart index 33d9281d3ce0..7f20736afbf8 100644 --- a/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart +++ b/packages/in_app_purchase/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart @@ -105,7 +105,7 @@ class SKPaymentQueueWrapper { SKPaymentTransactionWrapper transaction) async { await channel.invokeMethod( '-[InAppPurchasePlugin finishTransaction:result:]', - transaction.payment.productIdentifier); + transaction.transactionIdentifier); } /// Restore previously purchased transactions. diff --git a/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart b/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart index c8da68ab823a..3a08d9e8e45d 100644 --- a/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart +++ b/packages/in_app_purchase/test/store_kit_wrappers/sk_methodchannel_apis_test.dart @@ -110,7 +110,7 @@ void main() { queue.setTransactionObserver(observer); await queue.finishTransaction(dummyTransaction); expect(fakeIOSPlatform.transactionsFinished.first, - equals(dummyTransaction.payment.productIdentifier)); + equals(dummyTransaction.transactionIdentifier)); }); test('should restore transaction', () async { From 27322a58e74e045a54b677e2a737a39f7461ba34 Mon Sep 17 00:00:00 2001 From: Jia Hao Date: Sat, 12 Sep 2020 10:25:01 +0800 Subject: [PATCH 17/32] [integration_test] Recommend tests to be in `integration_test/`, fix example (#2986) * [integration_test] Recommend tests to be in `integration_test/`, fix example In this way, there is a clear distinction between integration tests that run on a device (in `integration_test/`, and widget tests that run with the flutter tester in `test/`. Fix flutter/flutter#64690 --- .cirrus.yml | 2 +- packages/integration_test/README.md | 91 +++++++++++-------- packages/integration_test/example/README.md | 22 +++-- .../_example_test_io.dart} | 0 .../_example_test_web.dart} | 0 .../_extended_test_io.dart} | 0 .../_extended_test_web.dart} | 0 .../example_test.dart} | 4 +- .../extended_test.dart} | 7 +- .../failure_test.dart} | 0 .../test_driver/example_integration_test.dart | 5 - .../test_driver/integration_test_driver.dart | 3 + ... => integration_test_extended_driver.dart} | 2 - ...t => integration_test_failure_driver.dart} | 4 +- 14 files changed, 79 insertions(+), 61 deletions(-) rename packages/integration_test/example/{test_driver/example_integration_io.dart => integration_test/_example_test_io.dart} (100%) rename packages/integration_test/example/{test_driver/example_integration_web.dart => integration_test/_example_test_web.dart} (100%) rename packages/integration_test/example/{test_driver/example_integration_io_extended.dart => integration_test/_extended_test_io.dart} (100%) rename packages/integration_test/example/{test_driver/example_integration_web_extended.dart => integration_test/_extended_test_web.dart} (100%) rename packages/integration_test/example/{test_driver/example_integration.dart => integration_test/example_test.dart} (82%) rename packages/integration_test/example/{test_driver/example_integration_extended.dart => integration_test/extended_test.dart} (67%) rename packages/integration_test/example/{test_driver/failure.dart => integration_test/failure_test.dart} (100%) delete mode 100644 packages/integration_test/example/test_driver/example_integration_test.dart create mode 100644 packages/integration_test/example/test_driver/integration_test_driver.dart rename packages/integration_test/example/test_driver/{example_integration_extended_test.dart => integration_test_extended_driver.dart} (94%) rename packages/integration_test/example/test_driver/{failure_test.dart => integration_test_failure_driver.dart} (96%) diff --git a/.cirrus.yml b/.cirrus.yml index d5a1ac82f6d5..25396ea3faf4 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -59,7 +59,7 @@ task: - ./chromedriver/chromedriver --port=4444 & test_script: - cd $INTEGRATION_TEST_PATH/example/ - - flutter drive -v --target=test_driver/example_integration.dart -d web-server --release --browser-name=chrome + - flutter drive -v --driver=test_driver/integration_test_driver.dart --target=integration_test/example_test.dart -d web-server --release --browser-name=chrome - name: build-apks+java-test+firebase-test-lab env: matrix: diff --git a/packages/integration_test/README.md b/packages/integration_test/README.md index a48210beacf8..a6b1726475e2 100644 --- a/packages/integration_test/README.md +++ b/packages/integration_test/README.md @@ -7,11 +7,12 @@ and native Android instrumentation testing. ## Usage Add a dependency on the `integration_test` and `flutter_test` package in the -`dev_dependencies` section of pubspec.yaml. For plugins, do this in the -pubspec.yaml of the example app. +`dev_dependencies` section of `pubspec.yaml`. For plugins, do this in the +`pubspec.yaml` of the example app. -Invoke `IntegrationTestWidgetsFlutterBinding.ensureInitialized()` at the start -of a test file, e.g. +Create a `integration_test/` directory for your package. In this directory, +create a `_test.dart`, using the following as a starting point to make +assertions. ```dart import 'package:flutter_test/flutter_test.dart'; @@ -19,66 +20,82 @@ import 'package:integration_test/integration_test.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + testWidgets("failing test example", (WidgetTester tester) async { expect(2 + 2, equals(5)); }); } ``` -## Test locations +### Driver Entrypoint -It is recommended to put integration_test tests in the `test/` folder of the app -or package. For example apps, if the integration_test test references example -app code, it should go in `example/test/`. It is also acceptable to put -integration_test tests in `test_driver/` folder so that they're alongside the -runner app (see below). +An accompanying driver script will be needed that can be shared across all +integration tests. Create a `integration_test_driver.dart` in the `test_driver/` +directory with the following contents: -## Using Flutter Driver to Run Tests +```dart +import 'package:integration_test/integration_test_driver.dart'; -`IntegrationTestWidgetsTestBinding` supports launching the on-device tests with -`flutter drive`. Note that the tests don't use the `FlutterDriver` API, they -use `testWidgets` instead. +Future main() => integrationDriver(); +``` -Put the a file named `_integration_test.dart` in the app' -`test_driver` directory: +You can also use different driver scripts to customize the behavior of the app +under test. For example, `FlutterDriver` can also be parameterized with +different [options](https://api.flutter.dev/flutter/flutter_driver/FlutterDriver/connect.html). +See the [extended driver](https://github.com/flutter/plugins/tree/master/packages/integration_test/example/test_driver/integration_test_extended_driver.dart) for an example. -```dart -import 'dart:async'; +### Package Structure -import 'package:integration_test/integration_test_driver.dart'; +Your package should have a structure that looks like this: -Future main() async => integrationDriver(); +``` +lib/ + ... +integration_test/ + foo_test.dart + bar_test.dart +test/ + # Other unit tests go here. +test_driver/ + integration_test_driver.dart ``` -To run a example app test with Flutter driver: +[Example](https://github.com/flutter/plugins/tree/master/packages/integration_test/example) -```sh -cd example -flutter drive test/_integration.dart -``` +## Using Flutter Driver to Run Tests + +These tests can be launched with the `flutter drive` command. -To test plugin APIs using Flutter driver: +To run the `integration_test/foo_test.dart` test with the +`test_driver/integration_test_driver.dart` driver, use the following command: ```sh -cd example -flutter drive --driver=test_driver/_test.dart test/_integration_test.dart +flutter drive \ + --driver=test_driver/integration_test_driver.dart \ + --target=integration_test/foo_test.dart ``` -You can run tests on web in release or profile mode. +### Web + +Make sure you have [enabled web support](https://flutter.dev/docs/get-started/web#set-up) +then [download and run](https://flutter.dev/docs/cookbook/testing/integration/introduction#6b-web) +the web driver in another process. -First you need to make sure you have downloaded the driver for the browser. +Use following command to execute the tests: ```sh -cd example -flutter drive -v --target=test_driver/dart -d web-server --release --browser-name=chrome +flutter drive \ + --driver=test_driver/integration_test_driver.dart \ + --target=integration_test/foo_test.dart \ + -d web-server ``` -## Android device testing +## Android Device Testing Create an instrumentation test file in your application's **android/app/src/androidTest/java/com/example/myapp/** directory (replacing com, example, and myapp with values from your app's package name). You can name -this test file MainActivityTest.java or another name of your choice. +this test file `MainActivityTest.java` or another name of your choice. ```java package com.example.myapp; @@ -96,7 +113,7 @@ public class MainActivityTest { ``` Update your application's **myapp/android/app/build.gradle** to make sure it -uses androidx's version of AndroidJUnitRunner and has androidx libraries as a +uses androidx's version of `AndroidJUnitRunner` and has androidx libraries as a dependency. ```gradle @@ -160,7 +177,7 @@ You can pass additional parameters on the command line, such as the devices you want to test on. See [gcloud firebase test android run](https://cloud.google.com/sdk/gcloud/reference/firebase/test/android/run). -## iOS device testing +## iOS Device Testing You need to change `iOS/Podfile` to avoid test target statically linking to the plugins. One way is to link all of the plugins dynamically: @@ -189,4 +206,4 @@ change the code. You can change `RunnerTests.m` to the name of your choice. INTEGRATION_TEST_IOS_RUNNER(RunnerTests) ``` -Now you can start RunnerTests to kick out integration tests! +Now you can start RunnerTests to kick-off integration tests! diff --git a/packages/integration_test/example/README.md b/packages/integration_test/example/README.md index 7c61fbf5c8de..7e6317fcf96f 100644 --- a/packages/integration_test/example/README.md +++ b/packages/integration_test/example/README.md @@ -2,15 +2,21 @@ Demonstrates how to use the `package:integration_test`. -## Getting Started +To run `integration_test/example_test.dart`, -This project is a starting point for a Flutter application. +Android / iOS: -A few resources to get you started if this is your first Flutter project: +```sh +flutter drive \ + --driver=test_driver/integration_test_driver.dart \ + --target=integration_test/example_test.dart +``` -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) +Web: -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +```sh +flutter drive \ + --driver=test_driver/integration_test_driver.dart \ + --target=integration_test/example_test.dart \ + -d web-server +``` diff --git a/packages/integration_test/example/test_driver/example_integration_io.dart b/packages/integration_test/example/integration_test/_example_test_io.dart similarity index 100% rename from packages/integration_test/example/test_driver/example_integration_io.dart rename to packages/integration_test/example/integration_test/_example_test_io.dart diff --git a/packages/integration_test/example/test_driver/example_integration_web.dart b/packages/integration_test/example/integration_test/_example_test_web.dart similarity index 100% rename from packages/integration_test/example/test_driver/example_integration_web.dart rename to packages/integration_test/example/integration_test/_example_test_web.dart diff --git a/packages/integration_test/example/test_driver/example_integration_io_extended.dart b/packages/integration_test/example/integration_test/_extended_test_io.dart similarity index 100% rename from packages/integration_test/example/test_driver/example_integration_io_extended.dart rename to packages/integration_test/example/integration_test/_extended_test_io.dart diff --git a/packages/integration_test/example/test_driver/example_integration_web_extended.dart b/packages/integration_test/example/integration_test/_extended_test_web.dart similarity index 100% rename from packages/integration_test/example/test_driver/example_integration_web_extended.dart rename to packages/integration_test/example/integration_test/_extended_test_web.dart diff --git a/packages/integration_test/example/test_driver/example_integration.dart b/packages/integration_test/example/integration_test/example_test.dart similarity index 82% rename from packages/integration_test/example/test_driver/example_integration.dart rename to packages/integration_test/example/integration_test/example_test.dart index 3ee993b911b9..918aec8777de 100644 --- a/packages/integration_test/example/test_driver/example_integration.dart +++ b/packages/integration_test/example/integration_test/example_test.dart @@ -7,8 +7,8 @@ import 'package:integration_test/integration_test.dart'; -import 'example_integration_io.dart' - if (dart.library.html) 'example_integration_web.dart' as tests; +import '_example_test_io.dart' if (dart.library.html) '_example_test_web.dart' + as tests; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/packages/integration_test/example/test_driver/example_integration_extended.dart b/packages/integration_test/example/integration_test/extended_test.dart similarity index 67% rename from packages/integration_test/example/test_driver/example_integration_extended.dart rename to packages/integration_test/example/integration_test/extended_test.dart index 79ed2762165e..23d69a8f9438 100644 --- a/packages/integration_test/example/test_driver/example_integration_extended.dart +++ b/packages/integration_test/example/integration_test/extended_test.dart @@ -1,6 +1,7 @@ // This is a Flutter widget test can take a screenshot. // -// NOTE: Screenshots are only supported on Web for now. +// NOTE: Screenshots are only supported on Web for now. For Web, this needs to +// be executed with the `test_driver/integration_test_extended_driver.dart`. // // To perform an interaction with a widget in your test, use the WidgetTester // utility that Flutter provides. For example, you can send tap and scroll @@ -9,8 +10,8 @@ import 'package:integration_test/integration_test.dart'; -import 'example_integration_io_extended.dart' - if (dart.library.html) 'example_integration_web_extended.dart' as tests; +import '_extended_test_io.dart' if (dart.library.html) '_extended_test_web.dart' + as tests; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/packages/integration_test/example/test_driver/failure.dart b/packages/integration_test/example/integration_test/failure_test.dart similarity index 100% rename from packages/integration_test/example/test_driver/failure.dart rename to packages/integration_test/example/integration_test/failure_test.dart diff --git a/packages/integration_test/example/test_driver/example_integration_test.dart b/packages/integration_test/example/test_driver/example_integration_test.dart deleted file mode 100644 index 10acaa69a42e..000000000000 --- a/packages/integration_test/example/test_driver/example_integration_test.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'dart:async'; - -import 'package:integration_test/integration_test_driver.dart'; - -Future main() async => integrationDriver(); diff --git a/packages/integration_test/example/test_driver/integration_test_driver.dart b/packages/integration_test/example/test_driver/integration_test_driver.dart new file mode 100644 index 000000000000..b38629cca97b --- /dev/null +++ b/packages/integration_test/example/test_driver/integration_test_driver.dart @@ -0,0 +1,3 @@ +import 'package:integration_test/integration_test_driver.dart'; + +Future main() => integrationDriver(); diff --git a/packages/integration_test/example/test_driver/example_integration_extended_test.dart b/packages/integration_test/example/test_driver/integration_test_extended_driver.dart similarity index 94% rename from packages/integration_test/example/test_driver/example_integration_extended_test.dart rename to packages/integration_test/example/test_driver/integration_test_extended_driver.dart index 1428a5092a78..056ba4bad722 100644 --- a/packages/integration_test/example/test_driver/example_integration_extended_test.dart +++ b/packages/integration_test/example/test_driver/integration_test_extended_driver.dart @@ -1,5 +1,3 @@ -import 'dart:async'; - import 'package:flutter_driver/flutter_driver.dart'; import 'package:integration_test/integration_test_driver_extended.dart'; diff --git a/packages/integration_test/example/test_driver/failure_test.dart b/packages/integration_test/example/test_driver/integration_test_failure_driver.dart similarity index 96% rename from packages/integration_test/example/test_driver/failure_test.dart rename to packages/integration_test/example/test_driver/integration_test_failure_driver.dart index bd9302f39409..0b60e471d711 100644 --- a/packages/integration_test/example/test_driver/failure_test.dart +++ b/packages/integration_test/example/test_driver/integration_test_failure_driver.dart @@ -1,7 +1,5 @@ -import 'dart:async'; - -import 'package:integration_test/common.dart' as common; import 'package:flutter_driver/flutter_driver.dart'; +import 'package:integration_test/common.dart' as common; import 'package:test/test.dart'; Future main() async { From 269a71619a3f682b905008e5279f483b4e8bca3e Mon Sep 17 00:00:00 2001 From: Jia Hao Date: Sun, 13 Sep 2020 00:58:50 +0800 Subject: [PATCH 18/32] Fix formatting (#3023) A new version of the formatter or something might have rolled in, causing CI to break --- .../example/linux/flutter/generated_plugin_registrant.cc | 4 +--- .../shared_preferences_linux/example/linux/my_application.cc | 2 +- .../example/linux/flutter/generated_plugin_registrant.cc | 3 ++- .../url_launcher/url_launcher/example/linux/my_application.cc | 2 +- .../example/linux/flutter/generated_plugin_registrant.cc | 3 ++- .../url_launcher_linux/example/linux/my_application.cc | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/shared_preferences/shared_preferences_linux/example/linux/flutter/generated_plugin_registrant.cc b/packages/shared_preferences/shared_preferences_linux/example/linux/flutter/generated_plugin_registrant.cc index d38195aa0412..890de29bbab1 100644 --- a/packages/shared_preferences/shared_preferences_linux/example/linux/flutter/generated_plugin_registrant.cc +++ b/packages/shared_preferences/shared_preferences_linux/example/linux/flutter/generated_plugin_registrant.cc @@ -4,6 +4,4 @@ #include "generated_plugin_registrant.h" - -void fl_register_plugins(FlPluginRegistry* registry) { -} +void fl_register_plugins(FlPluginRegistry* registry) {} diff --git a/packages/shared_preferences/shared_preferences_linux/example/linux/my_application.cc b/packages/shared_preferences/shared_preferences_linux/example/linux/my_application.cc index c2357f17ea9c..f079e19eb396 100644 --- a/packages/shared_preferences/shared_preferences_linux/example/linux/my_application.cc +++ b/packages/shared_preferences/shared_preferences_linux/example/linux/my_application.cc @@ -14,7 +14,7 @@ G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) static void my_application_activate(GApplication* application) { GtkWindow* window = GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); gtk_header_bar_set_title(header_bar, "example"); gtk_header_bar_set_show_close_button(header_bar, TRUE); diff --git a/packages/url_launcher/url_launcher/example/linux/flutter/generated_plugin_registrant.cc b/packages/url_launcher/url_launcher/example/linux/flutter/generated_plugin_registrant.cc index 026851fa2f96..36185a63f2fd 100644 --- a/packages/url_launcher/url_launcher/example/linux/flutter/generated_plugin_registrant.cc +++ b/packages/url_launcher/url_launcher/example/linux/flutter/generated_plugin_registrant.cc @@ -8,6 +8,7 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + fl_plugin_registry_get_registrar_for_plugin(registry, + "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); } diff --git a/packages/url_launcher/url_launcher/example/linux/my_application.cc b/packages/url_launcher/url_launcher/example/linux/my_application.cc index c2357f17ea9c..f079e19eb396 100644 --- a/packages/url_launcher/url_launcher/example/linux/my_application.cc +++ b/packages/url_launcher/url_launcher/example/linux/my_application.cc @@ -14,7 +14,7 @@ G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) static void my_application_activate(GApplication* application) { GtkWindow* window = GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); gtk_header_bar_set_title(header_bar, "example"); gtk_header_bar_set_show_close_button(header_bar, TRUE); diff --git a/packages/url_launcher/url_launcher_linux/example/linux/flutter/generated_plugin_registrant.cc b/packages/url_launcher/url_launcher_linux/example/linux/flutter/generated_plugin_registrant.cc index 026851fa2f96..36185a63f2fd 100644 --- a/packages/url_launcher/url_launcher_linux/example/linux/flutter/generated_plugin_registrant.cc +++ b/packages/url_launcher/url_launcher_linux/example/linux/flutter/generated_plugin_registrant.cc @@ -8,6 +8,7 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + fl_plugin_registry_get_registrar_for_plugin(registry, + "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); } diff --git a/packages/url_launcher/url_launcher_linux/example/linux/my_application.cc b/packages/url_launcher/url_launcher_linux/example/linux/my_application.cc index c2357f17ea9c..f079e19eb396 100644 --- a/packages/url_launcher/url_launcher_linux/example/linux/my_application.cc +++ b/packages/url_launcher/url_launcher_linux/example/linux/my_application.cc @@ -14,7 +14,7 @@ G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) static void my_application_activate(GApplication* application) { GtkWindow* window = GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); gtk_header_bar_set_title(header_bar, "example"); gtk_header_bar_set_show_close_button(header_bar, TRUE); From b6c33d7f5829d8f7e95b5f5fb16b901b9b1533f6 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Sat, 12 Sep 2020 14:14:08 -0400 Subject: [PATCH 19/32] Add url_launcher_windows (#3015) Adds a federated Windows implementation of url_launcher (not yet endorsed). Since this is the first C++ plugin, this also adds a .clang-format file to the repo root for formatting C++ plugins. Part of flutter/flutter#41721 (will need follow-up to endorse it in url_launcher) --- .clang-format | 1 + .../url_launcher_windows/.gitignore | 3 + .../url_launcher_windows/.metadata | 10 ++ .../url_launcher_windows/CHANGELOG.md | 3 + .../url_launcher/url_launcher_windows/LICENSE | 25 +++ .../url_launcher_windows/README.md | 31 ++++ .../url_launcher_windows/example/.gitignore | 41 +++++ .../url_launcher_windows/example/.metadata | 10 ++ .../url_launcher_windows/example/README.md | 3 + .../example/lib/main.dart | 93 +++++++++++ .../url_launcher_windows/example/pubspec.yaml | 19 +++ .../example/test_driver/url_launcher_e2e.dart | 20 +++ .../test_driver/url_launcher_e2e_test.dart | 17 ++ .../lib/url_launcher_windows.dart | 3 + .../url_launcher_windows/pubspec.yaml | 21 +++ .../url_launcher_windows/windows/.gitignore | 17 ++ .../windows/CMakeLists.txt | 22 +++ .../url_launcher_plugin.h | 26 +++ .../windows/url_launcher_plugin.cpp | 148 ++++++++++++++++++ 19 files changed, 513 insertions(+) create mode 100644 .clang-format create mode 100644 packages/url_launcher/url_launcher_windows/.gitignore create mode 100644 packages/url_launcher/url_launcher_windows/.metadata create mode 100644 packages/url_launcher/url_launcher_windows/CHANGELOG.md create mode 100644 packages/url_launcher/url_launcher_windows/LICENSE create mode 100644 packages/url_launcher/url_launcher_windows/README.md create mode 100644 packages/url_launcher/url_launcher_windows/example/.gitignore create mode 100644 packages/url_launcher/url_launcher_windows/example/.metadata create mode 100644 packages/url_launcher/url_launcher_windows/example/README.md create mode 100644 packages/url_launcher/url_launcher_windows/example/lib/main.dart create mode 100644 packages/url_launcher/url_launcher_windows/example/pubspec.yaml create mode 100644 packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e.dart create mode 100644 packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e_test.dart create mode 100644 packages/url_launcher/url_launcher_windows/lib/url_launcher_windows.dart create mode 100644 packages/url_launcher/url_launcher_windows/pubspec.yaml create mode 100644 packages/url_launcher/url_launcher_windows/windows/.gitignore create mode 100644 packages/url_launcher/url_launcher_windows/windows/CMakeLists.txt create mode 100644 packages/url_launcher/url_launcher_windows/windows/include/url_launcher_windows/url_launcher_plugin.h create mode 100644 packages/url_launcher/url_launcher_windows/windows/url_launcher_plugin.cpp diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000000..f6cb8ad931f5 --- /dev/null +++ b/.clang-format @@ -0,0 +1 @@ +BasedOnStyle: Google diff --git a/packages/url_launcher/url_launcher_windows/.gitignore b/packages/url_launcher/url_launcher_windows/.gitignore new file mode 100644 index 000000000000..53e92cc4181f --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/.gitignore @@ -0,0 +1,3 @@ +.packages +.flutter-plugins +pubspec.lock diff --git a/packages/url_launcher/url_launcher_windows/.metadata b/packages/url_launcher/url_launcher_windows/.metadata new file mode 100644 index 000000000000..720a4596c087 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 6d1c244b79f3a2747281f718297ce248bd5ad099 + channel: master + +project_type: plugin diff --git a/packages/url_launcher/url_launcher_windows/CHANGELOG.md b/packages/url_launcher/url_launcher_windows/CHANGELOG.md new file mode 100644 index 000000000000..dd3395afab0a --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* Initial Windows implementation of `url_launcher`. diff --git a/packages/url_launcher/url_launcher_windows/LICENSE b/packages/url_launcher/url_launcher_windows/LICENSE new file mode 100644 index 000000000000..507569823f1b --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/LICENSE @@ -0,0 +1,25 @@ +Copyright 2019 The Chromium Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/url_launcher/url_launcher_windows/README.md b/packages/url_launcher/url_launcher_windows/README.md new file mode 100644 index 000000000000..685adc59a1a4 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/README.md @@ -0,0 +1,31 @@ +# url_launcher_windows + +The Windows implementation of [`url_launcher`][1]. + +## Backward compatible 1.0.0 version is coming +The plugin has reached a stable API, we guarantee that version `1.0.0` will be backward compatible with `0.0.y+z`. If you use +url_launcher_windows directly, rather than as an implementation detail +of `url_launcher`, please use `url_launcher_windows: '>=0.0.y+x <2.0.0'` +as your dependency constraint to allow a smoother ecosystem migration. +For more details see: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 + +## Usage + +### Import the package + +This package has not yet been endorsed. Once it is you only need to add +`url_launcher` as a dependency in your `pubspec.yaml`, but for now you +need to include both `url_launcher` and `url_launcher_windows`. + +This is what the above means to your `pubspec.yaml`: + +```yaml +... +dependencies: + ... + url_launcher: ^5.5.3 + url_launcher_windows: ^0.0.1 + ... +``` + +[1]: ../url_launcher/url_launcher diff --git a/packages/url_launcher/url_launcher_windows/example/.gitignore b/packages/url_launcher/url_launcher_windows/example/.gitignore new file mode 100644 index 000000000000..9d532b18a01f --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/example/.gitignore @@ -0,0 +1,41 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json diff --git a/packages/url_launcher/url_launcher_windows/example/.metadata b/packages/url_launcher/url_launcher_windows/example/.metadata new file mode 100644 index 000000000000..82cce8b18642 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/example/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 6d1c244b79f3a2747281f718297ce248bd5ad099 + channel: master + +project_type: app diff --git a/packages/url_launcher/url_launcher_windows/example/README.md b/packages/url_launcher/url_launcher_windows/example/README.md new file mode 100644 index 000000000000..e444852697b9 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/example/README.md @@ -0,0 +1,3 @@ +# url_launcher_windows_example + +Demonstrates the url_launcher_windows plugin. diff --git a/packages/url_launcher/url_launcher_windows/example/lib/main.dart b/packages/url_launcher/url_launcher_windows/example/lib/main.dart new file mode 100644 index 000000000000..db59af1e5b95 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/example/lib/main.dart @@ -0,0 +1,93 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: public_member_api_docs + +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'URL Launcher', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: MyHomePage(title: 'URL Launcher'), + ); + } +} + +class MyHomePage extends StatefulWidget { + MyHomePage({Key key, this.title}) : super(key: key); + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + Future _launched; + + Future _launchInBrowser(String url) async { + if (await UrlLauncherPlatform.instance.canLaunch(url)) { + await UrlLauncherPlatform.instance.launch( + url, + useSafariVC: false, + useWebView: false, + enableJavaScript: false, + enableDomStorage: false, + universalLinksOnly: false, + headers: {}, + ); + } else { + throw 'Could not launch $url'; + } + } + + Widget _launchStatus(BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return const Text(''); + } + } + + @override + Widget build(BuildContext context) { + const String toLaunch = 'https://www.cylog.org/headers/'; + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: ListView( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Padding( + padding: EdgeInsets.all(16.0), + child: Text(toLaunch), + ), + RaisedButton( + onPressed: () => setState(() { + _launched = _launchInBrowser(toLaunch); + }), + child: const Text('Launch in browser'), + ), + const Padding(padding: EdgeInsets.all(16.0)), + FutureBuilder(future: _launched, builder: _launchStatus), + ], + ), + ], + ), + ); + } +} diff --git a/packages/url_launcher/url_launcher_windows/example/pubspec.yaml b/packages/url_launcher/url_launcher_windows/example/pubspec.yaml new file mode 100644 index 000000000000..8d6c22057bc2 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/example/pubspec.yaml @@ -0,0 +1,19 @@ +name: url_launcher_example +description: Demonstrates the Windows implementation of the url_launcher plugin. + +dependencies: + flutter: + sdk: flutter + url_launcher_platform_interface: any + url_launcher_windows: + path: ../ + +dev_dependencies: + integration_test: + path: ../../../integration_test + flutter_driver: + sdk: flutter + pedantic: ^1.8.0 + +flutter: + uses-material-design: true diff --git a/packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e.dart b/packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e.dart new file mode 100644 index 000000000000..7a33e00fec0a --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e.dart @@ -0,0 +1,20 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + test('canLaunch', () async { + UrlLauncherPlatform launcher = UrlLauncherPlatform.instance; + + expect(await launcher.canLaunch('randomstring'), false); + + // Generally all devices should have some default browser. + expect(await launcher.canLaunch('http://flutter.dev'), true); + }); +} diff --git a/packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e_test.dart b/packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e_test.dart new file mode 100644 index 000000000000..7a2c21338786 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/example/test_driver/url_launcher_e2e_test.dart @@ -0,0 +1,17 @@ +// Copyright 2019, the Chromium project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter_driver/flutter_driver.dart'; + +Future main() async { + final FlutterDriver driver = await FlutterDriver.connect(); + final String data = + await driver.requestData(null, timeout: const Duration(minutes: 1)); + await driver.close(); + final Map result = jsonDecode(data); + exit(result['result'] == 'true' ? 0 : 1); +} diff --git a/packages/url_launcher/url_launcher_windows/lib/url_launcher_windows.dart b/packages/url_launcher/url_launcher_windows/lib/url_launcher_windows.dart new file mode 100644 index 000000000000..83435f981838 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/lib/url_launcher_windows.dart @@ -0,0 +1,3 @@ +// The url_launcher_platform_interface defaults to MethodChannelUrlLauncher +// as its instance, which is all the Windows implementation needs. This file +// is here to silence warnings when publishing to pub. diff --git a/packages/url_launcher/url_launcher_windows/pubspec.yaml b/packages/url_launcher/url_launcher_windows/pubspec.yaml new file mode 100644 index 000000000000..8a0beb70163a --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/pubspec.yaml @@ -0,0 +1,21 @@ +name: url_launcher_windows +description: Windows implementation of the url_launcher plugin. +# 0.0.y+z is compatible with 1.0.0, if you land a breaking change bump +# the version to 2.0.0. +# See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 +version: 0.0.1 +homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_windows + +flutter: + plugin: + platforms: + windows: + pluginClass: UrlLauncherPlugin + +environment: + sdk: ">=2.1.0 <3.0.0" + flutter: ">=1.12.8 <2.0.0" + +dependencies: + flutter: + sdk: flutter diff --git a/packages/url_launcher/url_launcher_windows/windows/.gitignore b/packages/url_launcher/url_launcher_windows/windows/.gitignore new file mode 100644 index 000000000000..b3eb2be169a5 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/packages/url_launcher/url_launcher_windows/windows/CMakeLists.txt b/packages/url_launcher/url_launcher_windows/windows/CMakeLists.txt new file mode 100644 index 000000000000..57d87e3f6f85 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/windows/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.10) +set(PROJECT_NAME "url_launcher_windows") +project(${PROJECT_NAME} LANGUAGES CXX) + +set(PLUGIN_NAME "${PROJECT_NAME}_plugin") + +add_library(${PLUGIN_NAME} SHARED + "url_launcher_plugin.cpp" +) +apply_standard_settings(${PLUGIN_NAME}) +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin) + +# List of absolute paths to libraries that should be bundled with the plugin +set(file_chooser_bundled_libraries + "" + PARENT_SCOPE +) diff --git a/packages/url_launcher/url_launcher_windows/windows/include/url_launcher_windows/url_launcher_plugin.h b/packages/url_launcher/url_launcher_windows/windows/include/url_launcher_windows/url_launcher_plugin.h new file mode 100644 index 000000000000..cdd018a0924e --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/windows/include/url_launcher_windows/url_launcher_plugin.h @@ -0,0 +1,26 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef PACKAGES_URL_LAUNCHER_URL_LAUNCHER_WINDOWS_WINDOWS_INCLUDE_URL_LAUNCHER_WINDOWS_URL_LAUNCHER_PLUGIN_H_ +#define PACKAGES_URL_LAUNCHER_URL_LAUNCHER_WINDOWS_WINDOWS_INCLUDE_URL_LAUNCHER_WINDOWS_URL_LAUNCHER_PLUGIN_H_ + +#include + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport) +#else +#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +FLUTTER_PLUGIN_EXPORT void UrlLauncherPluginRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar); + +#if defined(__cplusplus) +} // extern "C" +#endif + +#endif // PACKAGES_URL_LAUNCHER_URL_LAUNCHER_WINDOWS_WINDOWS_INCLUDE_URL_LAUNCHER_WINDOWS_URL_LAUNCHER_PLUGIN_H_ diff --git a/packages/url_launcher/url_launcher_windows/windows/url_launcher_plugin.cpp b/packages/url_launcher/url_launcher_windows/windows/url_launcher_plugin.cpp new file mode 100644 index 000000000000..dfb406385787 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/windows/url_launcher_plugin.cpp @@ -0,0 +1,148 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "include/url_launcher_windows/url_launcher_plugin.h" + +#include +#include +#include +#include + +#include +#include +#include + +namespace { + +using flutter::EncodableMap; +using flutter::EncodableValue; + +// Converts the given UTF-8 string to UTF-16. +std::wstring Utf16FromUtf8(const std::string& utf8_string) { + if (utf8_string.empty()) { + return std::wstring(); + } + int target_length = + ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, utf8_string.data(), + static_cast(utf8_string.length()), nullptr, 0); + if (target_length == 0) { + return std::wstring(); + } + std::wstring utf16_string; + utf16_string.resize(target_length); + int converted_length = + ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, utf8_string.data(), + static_cast(utf8_string.length()), + utf16_string.data(), target_length); + if (converted_length == 0) { + return std::wstring(); + } + return utf16_string; +} + +// Returns the URL argument from |method_call| if it is present, otherwise +// returns an empty string. +std::string GetUrlArgument(const flutter::MethodCall<>& method_call) { + std::string url; + const auto* arguments = std::get_if(method_call.arguments()); + if (arguments) { + auto url_it = arguments->find(EncodableValue("url")); + if (url_it != arguments->end()) { + url = std::get(url_it->second); + } + } + return url; +} + +class UrlLauncherPlugin : public flutter::Plugin { + public: + static void RegisterWithRegistrar(flutter::PluginRegistrar* registrar); + + virtual ~UrlLauncherPlugin(); + + private: + UrlLauncherPlugin(); + + // Called when a method is called on plugin channel; + void HandleMethodCall(const flutter::MethodCall<>& method_call, + std::unique_ptr> result); +}; + +// static +void UrlLauncherPlugin::RegisterWithRegistrar( + flutter::PluginRegistrar* registrar) { + auto channel = std::make_unique>( + registrar->messenger(), "plugins.flutter.io/url_launcher", + &flutter::StandardMethodCodec::GetInstance()); + + // Uses new instead of make_unique due to private constructor. + std::unique_ptr plugin(new UrlLauncherPlugin()); + + channel->SetMethodCallHandler( + [plugin_pointer = plugin.get()](const auto& call, auto result) { + plugin_pointer->HandleMethodCall(call, std::move(result)); + }); + + registrar->AddPlugin(std::move(plugin)); +} + +UrlLauncherPlugin::UrlLauncherPlugin() = default; + +UrlLauncherPlugin::~UrlLauncherPlugin() = default; + +void UrlLauncherPlugin::HandleMethodCall( + const flutter::MethodCall<>& method_call, + std::unique_ptr> result) { + if (method_call.method_name().compare("launch") == 0) { + std::string url = GetUrlArgument(method_call); + if (url.empty()) { + result->Error("argument_error", "No URL provided"); + return; + } + std::wstring url_wide = Utf16FromUtf8(url); + + int status = static_cast(reinterpret_cast( + ::ShellExecute(nullptr, TEXT("open"), url_wide.c_str(), nullptr, + nullptr, SW_SHOWNORMAL))); + + if (status <= 32) { + std::ostringstream error_message; + error_message << "Failed to open " << url << ": ShellExecute error code " + << status; + result->Error("open_error", error_message.str()); + return; + } + result->Success(EncodableValue(true)); + } else if (method_call.method_name().compare("canLaunch") == 0) { + std::string url = GetUrlArgument(method_call); + if (url.empty()) { + result->Error("argument_error", "No URL provided"); + return; + } + + bool can_launch = false; + size_t separator_location = url.find(":"); + if (separator_location != std::string::npos) { + std::wstring scheme = Utf16FromUtf8(url.substr(0, separator_location)); + HKEY key = nullptr; + if (::RegOpenKeyEx(HKEY_CLASSES_ROOT, scheme.c_str(), 0, KEY_QUERY_VALUE, + &key) == ERROR_SUCCESS) { + can_launch = ::RegQueryValueEx(key, L"URL Protocol", nullptr, nullptr, + nullptr, nullptr) == ERROR_SUCCESS; + ::RegCloseKey(key); + } + } + result->Success(EncodableValue(can_launch)); + } else { + result->NotImplemented(); + } +} + +} // namespace + +void UrlLauncherPluginRegisterWithRegistrar( + FlutterDesktopPluginRegistrarRef registrar) { + UrlLauncherPlugin::RegisterWithRegistrar( + flutter::PluginRegistrarManager::GetInstance() + ->GetRegistrar(registrar)); +} From d1543cf48a436f06cea81a1e5698ec6c0adf52e7 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Sat, 12 Sep 2020 12:17:34 -0700 Subject: [PATCH 20/32] [in_app_purchase]fix version (#3022) --- packages/in_app_purchase/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index e831d902c91f..52abe9680329 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -1,7 +1,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.3.4+7 +version: 0.3.4+8 dependencies: async: ^2.0.8 From 5589616502911e76a0a99ebf778c23dc63eed123 Mon Sep 17 00:00:00 2001 From: Hamdi Kahloun <32666446+hamdikahloun@users.noreply.github.com> Date: Mon, 14 Sep 2020 18:16:35 +0100 Subject: [PATCH 21/32] [android_alarm_manager] Android Code Inspection and Clean up (#3020) -Werror and code cleanup for Java code. --- packages/android_alarm_manager/CHANGELOG.md | 4 ++ .../android/build.gradle | 5 ++ .../androidalarmmanager/AlarmService.java | 21 +++--- .../AndroidAlarmManagerPlugin.java | 68 ++++++++++--------- .../FlutterBackgroundExecutor.java | 9 +-- packages/android_alarm_manager/pubspec.yaml | 2 +- 6 files changed, 58 insertions(+), 51 deletions(-) diff --git a/packages/android_alarm_manager/CHANGELOG.md b/packages/android_alarm_manager/CHANGELOG.md index faa2c731873d..22c3d822ec04 100644 --- a/packages/android_alarm_manager/CHANGELOG.md +++ b/packages/android_alarm_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.5+13 + +* Android Code Inspection and Clean up. + ## 0.4.5+12 * Update package:e2e reference to use the local version in the flutter/plugins diff --git a/packages/android_alarm_manager/android/build.gradle b/packages/android_alarm_manager/android/build.gradle index 04d09f62d936..8a59fed74438 100644 --- a/packages/android_alarm_manager/android/build.gradle +++ b/packages/android_alarm_manager/android/build.gradle @@ -1,5 +1,6 @@ group 'io.flutter.plugins.androidalarmmanager' version '1.0-SNAPSHOT' +def args = ["-Xlint:deprecation","-Xlint:unchecked","-Werror"] buildscript { repositories { @@ -19,6 +20,10 @@ rootProject.allprojects { } } +project.getTasks().withType(JavaCompile){ + options.compilerArgs.addAll(args) +} + apply plugin: 'com.android.library' android { diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java index fb6e7f85b317..107d76738fe3 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AlarmService.java @@ -17,7 +17,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -76,9 +75,8 @@ public static void startBackgroundIsolate(Context context, long callbackHandle) synchronized (alarmQueue) { // Handle all the alarm events received before the Dart isolate was // initialized, then clear the queue. - Iterator i = alarmQueue.iterator(); - while (i.hasNext()) { - flutterBackgroundExecutor.executeDartCallbackInBackgroundIsolate(i.next(), null); + for (Intent intent : alarmQueue) { + flutterBackgroundExecutor.executeDartCallbackInBackgroundIsolate(intent, null); } alarmQueue.clear(); } @@ -231,7 +229,7 @@ public static void cancel(Context context, int requestCode) { } private static String getPersistentAlarmKey(int requestCode) { - return "android_alarm_manager/persistent_alarm_" + Integer.toString(requestCode); + return "android_alarm_manager/persistent_alarm_" + requestCode; } private static void addPersistentAlarm( @@ -276,13 +274,14 @@ private static void addPersistentAlarm( } private static void clearPersistentAlarm(Context context, int requestCode) { + String request = String.valueOf(requestCode); SharedPreferences p = context.getSharedPreferences(SHARED_PREFERENCES_KEY, 0); synchronized (persistentAlarmsLock) { Set persistentAlarms = p.getStringSet(PERSISTENT_ALARMS_SET_KEY, null); - if ((persistentAlarms == null) || !persistentAlarms.contains(requestCode)) { + if ((persistentAlarms == null) || !persistentAlarms.contains(request)) { return; } - persistentAlarms.remove(requestCode); + persistentAlarms.remove(request); String key = getPersistentAlarmKey(requestCode); p.edit().remove(key).putStringSet(PERSISTENT_ALARMS_SET_KEY, persistentAlarms).apply(); @@ -301,14 +300,12 @@ public static void reschedulePersistentAlarms(Context context) { return; } - Iterator it = persistentAlarms.iterator(); - while (it.hasNext()) { - int requestCode = Integer.parseInt(it.next()); + for (String persistentAlarm : persistentAlarms) { + int requestCode = Integer.parseInt(persistentAlarm); String key = getPersistentAlarmKey(requestCode); String json = p.getString(key, null); if (json == null) { - Log.e( - TAG, "Data for alarm request code " + Integer.toString(requestCode) + " is invalid."); + Log.e(TAG, "Data for alarm request code " + requestCode + " is invalid."); continue; } try { diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java index 2f3f5f9f2925..5a135f95e631 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/AndroidAlarmManagerPlugin.java @@ -107,37 +107,43 @@ public void onMethodCall(MethodCall call, Result result) { String method = call.method; Object arguments = call.arguments; try { - if (method.equals("AlarmService.start")) { - // This message is sent when the Dart side of this plugin is told to initialize. - long callbackHandle = ((JSONArray) arguments).getLong(0); - // In response, this (native) side of the plugin needs to spin up a background - // Dart isolate by using the given callbackHandle, and then setup a background - // method channel to communicate with the new background isolate. Once completed, - // this onMethodCall() method will receive messages from both the primary and background - // method channels. - AlarmService.setCallbackDispatcher(context, callbackHandle); - AlarmService.startBackgroundIsolate(context, callbackHandle); - result.success(true); - } else if (method.equals("Alarm.periodic")) { - // This message indicates that the Flutter app would like to schedule a periodic - // task. - PeriodicRequest periodicRequest = PeriodicRequest.fromJson((JSONArray) arguments); - AlarmService.setPeriodic(context, periodicRequest); - result.success(true); - } else if (method.equals("Alarm.oneShotAt")) { - // This message indicates that the Flutter app would like to schedule a one-time - // task. - OneShotRequest oneShotRequest = OneShotRequest.fromJson((JSONArray) arguments); - AlarmService.setOneShot(context, oneShotRequest); - result.success(true); - } else if (method.equals("Alarm.cancel")) { - // This message indicates that the Flutter app would like to cancel a previously - // scheduled task. - int requestCode = ((JSONArray) arguments).getInt(0); - AlarmService.cancel(context, requestCode); - result.success(true); - } else { - result.notImplemented(); + switch (method) { + case "AlarmService.start": + // This message is sent when the Dart side of this plugin is told to initialize. + long callbackHandle = ((JSONArray) arguments).getLong(0); + // In response, this (native) side of the plugin needs to spin up a background + // Dart isolate by using the given callbackHandle, and then setup a background + // method channel to communicate with the new background isolate. Once completed, + // this onMethodCall() method will receive messages from both the primary and background + // method channels. + AlarmService.setCallbackDispatcher(context, callbackHandle); + AlarmService.startBackgroundIsolate(context, callbackHandle); + result.success(true); + break; + case "Alarm.periodic": + // This message indicates that the Flutter app would like to schedule a periodic + // task. + PeriodicRequest periodicRequest = PeriodicRequest.fromJson((JSONArray) arguments); + AlarmService.setPeriodic(context, periodicRequest); + result.success(true); + break; + case "Alarm.oneShotAt": + // This message indicates that the Flutter app would like to schedule a one-time + // task. + OneShotRequest oneShotRequest = OneShotRequest.fromJson((JSONArray) arguments); + AlarmService.setOneShot(context, oneShotRequest); + result.success(true); + break; + case "Alarm.cancel": + // This message indicates that the Flutter app would like to cancel a previously + // scheduled task. + int requestCode = ((JSONArray) arguments).getInt(0); + AlarmService.cancel(context, requestCode); + result.success(true); + break; + default: + result.notImplemented(); + break; } } catch (JSONException e) { result.error("error", "JSON error: " + e.getMessage(), null); diff --git a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/FlutterBackgroundExecutor.java b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/FlutterBackgroundExecutor.java index 4e755c315528..8d5290842e14 100644 --- a/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/FlutterBackgroundExecutor.java +++ b/packages/android_alarm_manager/android/src/main/java/io/flutter/plugins/androidalarmmanager/FlutterBackgroundExecutor.java @@ -78,7 +78,6 @@ private void onInitialized() { @Override public void onMethodCall(MethodCall call, Result result) { String method = call.method; - Object arguments = call.arguments; try { if (method.equals("AlarmService.initialized")) { // This message is sent by the background method channel as soon as the background isolate @@ -152,9 +151,9 @@ public void startBackgroundIsolate(Context context, long callbackHandle) { } Log.i(TAG, "Starting AlarmService..."); - String appBundlePath = FlutterMain.findAppBundlePath(context); + String appBundlePath = FlutterMain.findAppBundlePath(); AssetManager assets = context.getAssets(); - if (appBundlePath != null && !isRunning()) { + if (!isRunning()) { backgroundFlutterEngine = new FlutterEngine(context); // We need to create an instance of `FlutterEngine` before looking up the @@ -162,10 +161,6 @@ public void startBackgroundIsolate(Context context, long callbackHandle) { // lookup will fail. FlutterCallbackInformation flutterCallback = FlutterCallbackInformation.lookupCallbackInformation(callbackHandle); - if (flutterCallback == null) { - Log.e(TAG, "Fatal: failed to find callback"); - return; - } DartExecutor executor = backgroundFlutterEngine.getDartExecutor(); initializeMethodChannel(executor); diff --git a/packages/android_alarm_manager/pubspec.yaml b/packages/android_alarm_manager/pubspec.yaml index 8e46b8c202eb..85c6609d5780 100644 --- a/packages/android_alarm_manager/pubspec.yaml +++ b/packages/android_alarm_manager/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter plugin for accessing the Android AlarmManager service, and # 0.4.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.4.5+11 +version: 0.4.5+12 homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager dependencies: From 6004e6de4fce0a6c478a77c6ea99c6e72a5a2c62 Mon Sep 17 00:00:00 2001 From: David Iglesias Date: Mon, 14 Sep 2020 12:38:11 -0700 Subject: [PATCH 22/32] [google_sign_in_web] Ensure plugin throws PlatformExceptions (#2943) Instead of throwing JS objects, or attempting to access undefined properties. This change also migrates tests to the `integration_test` package. --- .../google_sign_in_web/CHANGELOG.md | 7 + .../google_sign_in_web/README.md | 6 +- .../lib/google_sign_in_web.dart | 27 ++- .../lib/src/generated/gapiauth2.dart | 19 +- .../google_sign_in_web/pubspec.yaml | 4 +- .../google_sign_in_web/test/README.md | 17 ++ .../google_sign_in_web/test/auth2_test.dart | 83 -------- .../test/gapi_mocks/src/auth2_init.dart | 47 ----- .../google_sign_in_web/test/lib/main.dart | 22 ++ .../google_sign_in_web/test/pubspec.yaml | 24 +++ .../google_sign_in_web/test/run_test | 17 ++ .../test/test_driver/auth2_integration.dart | 192 ++++++++++++++++++ .../test_driver/auth2_integration_test.dart | 7 + .../gapi_load_integration.dart} | 12 +- .../gapi_load_integration_test.dart | 7 + .../gapi_mocks/gapi_mocks.dart | 0 .../gapi_mocks/src/auth2_init.dart | 107 ++++++++++ .../gapi_mocks/src/gapi.dart | 0 .../gapi_mocks/src/google_user.dart | 0 .../gapi_mocks/src/test_iife.dart | 0 .../gapi_utils_integration.dart} | 16 +- .../gapi_utils_integration_test.dart | 7 + .../src/test_utils.dart} | 0 .../google_sign_in_web/test/web/index.html | 13 ++ 24 files changed, 477 insertions(+), 157 deletions(-) create mode 100644 packages/google_sign_in/google_sign_in_web/test/README.md delete mode 100644 packages/google_sign_in/google_sign_in_web/test/auth2_test.dart delete mode 100644 packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/auth2_init.dart create mode 100644 packages/google_sign_in/google_sign_in_web/test/lib/main.dart create mode 100644 packages/google_sign_in/google_sign_in_web/test/pubspec.yaml create mode 100755 packages/google_sign_in/google_sign_in_web/test/run_test create mode 100644 packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration.dart create mode 100644 packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration_test.dart rename packages/google_sign_in/google_sign_in_web/test/{gapi_load_test.dart => test_driver/gapi_load_integration.dart} (83%) create mode 100644 packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_load_integration_test.dart rename packages/google_sign_in/google_sign_in_web/test/{ => test_driver}/gapi_mocks/gapi_mocks.dart (100%) create mode 100644 packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/auth2_init.dart rename packages/google_sign_in/google_sign_in_web/test/{ => test_driver}/gapi_mocks/src/gapi.dart (100%) rename packages/google_sign_in/google_sign_in_web/test/{ => test_driver}/gapi_mocks/src/google_user.dart (100%) rename packages/google_sign_in/google_sign_in_web/test/{ => test_driver}/gapi_mocks/src/test_iife.dart (100%) rename packages/google_sign_in/google_sign_in_web/test/{gapi_utils_test.dart => test_driver/gapi_utils_integration.dart} (70%) create mode 100644 packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_utils_integration_test.dart rename packages/google_sign_in/google_sign_in_web/test/{utils.dart => test_driver/src/test_utils.dart} (100%) create mode 100644 packages/google_sign_in/google_sign_in_web/test/web/index.html diff --git a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md index 35a6934f9d4e..d71badc53bfc 100644 --- a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md +++ b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.9.2 + +* Throw PlatformExceptions from where the GMaps SDK may throw exceptions: `init()` and `signIn()`. +* Add two new JS-interop types to be able to unwrap JS errors in release mode. +* Align the fields of the thrown PlatformExceptions with the mobile version. +* Migrate tests to run with `flutter drive` + ## 0.9.1+2 * Update package:e2e reference to use the local version in the flutter/plugins diff --git a/packages/google_sign_in/google_sign_in_web/README.md b/packages/google_sign_in/google_sign_in_web/README.md index 930212c17558..7a44e998f3c3 100644 --- a/packages/google_sign_in/google_sign_in_web/README.md +++ b/packages/google_sign_in/google_sign_in_web/README.md @@ -98,11 +98,7 @@ See the [google_sign_in.dart](https://github.com/flutter/plugins/blob/master/pac Tests are a crucial to contributions to this package. All new contributions should be reasonably tested. -In order to run tests in this package, do: - -``` -flutter test --platform chrome -j1 -``` +**Check the [`test/README.md` file](https://github.com/flutter/plugins/blob/master/packages/google_sign_in/google_sign_in_web/test/README.md)** for more information on how to run tests on this package. Contributions to this package are welcome. Read the [Contributing to Flutter Plugins](https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md) guide to get started. diff --git a/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart b/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart index bb43ba100c5d..dd82852fa350 100644 --- a/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart +++ b/packages/google_sign_in/google_sign_in_web/lib/google_sign_in_web.dart @@ -105,16 +105,17 @@ class GoogleSignInPlugin extends GoogleSignInPlatform { // state of the authentication, i.e: if you logout elsewhere... isAuthInitialized.complete(); - }), allowInterop((dynamic reason) { + }), allowInterop((auth2.GoogleAuthInitFailureError reason) { // onError - throw PlatformException( - code: 'google_sign_in', - message: reason.error, - details: reason.details, - ); + isAuthInitialized.completeError(PlatformException( + code: reason.error, + message: reason.details, + details: + 'https://developers.google.com/identity/sign-in/web/reference#error_codes', + )); })); - return null; + return _isAuthInitialized; } @override @@ -128,8 +129,16 @@ class GoogleSignInPlugin extends GoogleSignInPlatform { @override Future signIn() async { await initialized; - - return gapiUserToPluginUserData(await auth2.getAuthInstance().signIn()); + try { + return gapiUserToPluginUserData(await auth2.getAuthInstance().signIn()); + } on auth2.GoogleAuthSignInError catch (reason) { + throw PlatformException( + code: reason.error, + message: 'Exception raised from GoogleAuth.signIn()', + details: + 'https://developers.google.com/identity/sign-in/web/reference#error_codes_2', + ); + } } @override diff --git a/packages/google_sign_in/google_sign_in_web/lib/src/generated/gapiauth2.dart b/packages/google_sign_in/google_sign_in_web/lib/src/generated/gapiauth2.dart index e05bedf3af1e..ed7a2816d55e 100644 --- a/packages/google_sign_in/google_sign_in_web/lib/src/generated/gapiauth2.dart +++ b/packages/google_sign_in/google_sign_in_web/lib/src/generated/gapiauth2.dart @@ -16,6 +16,23 @@ import "package:js/js_util.dart" show promiseToFuture; /// +@anonymous +@JS() +class GoogleAuthInitFailureError { + external String get error; + external set error(String value); + + external String get details; + external set details(String value); +} + +@anonymous +@JS() +class GoogleAuthSignInError { + external String get error; + external set error(String value); +} + // Module gapi.auth2 /// GoogleAuth is a singleton class that provides methods to allow the user to sign in with a Google account, /// get the user's current sign-in status, get specific data from the user's Google profile, @@ -30,7 +47,7 @@ class GoogleAuth { /// Calls the onInit function when the GoogleAuth object is fully initialized, or calls the onFailure function if /// initialization fails. external dynamic then(dynamic onInit(GoogleAuth googleAuth), - [dynamic onFailure(dynamic /*{error: string, details: string}*/ reason)]); + [dynamic onFailure(GoogleAuthInitFailureError reason)]); /// Signs out all accounts from the application. external dynamic signOut(); diff --git a/packages/google_sign_in/google_sign_in_web/pubspec.yaml b/packages/google_sign_in/google_sign_in_web/pubspec.yaml index 8b48d36fde3c..70758ac6830d 100644 --- a/packages/google_sign_in/google_sign_in_web/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in_web/pubspec.yaml @@ -2,7 +2,7 @@ name: google_sign_in_web description: Flutter plugin for Google Sign-In, a secure authentication system for signing in with a Google account on Android, iOS and Web. homepage: https://github.com/flutter/plugins/tree/master/packages/google_sign_in/google_sign_in_web -version: 0.9.1+2 +version: 0.9.2 flutter: plugin: @@ -26,6 +26,8 @@ dev_dependencies: google_sign_in: ^4.0.14 pedantic: ^1.8.0 mockito: ^4.1.1 + integration_test: + path: ../../integration_test environment: sdk: ">=2.6.0 <3.0.0" diff --git a/packages/google_sign_in/google_sign_in_web/test/README.md b/packages/google_sign_in/google_sign_in_web/test/README.md new file mode 100644 index 000000000000..7c48d024ba57 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/README.md @@ -0,0 +1,17 @@ +# Running browser_tests + +Make sure you have updated to the latest Flutter master. + +1. Check what version of Chrome is running on the machine you're running tests on. + +2. Download and install driver for that version from here: + * + +3. Start the driver using `chromedriver --port=4444` + +4. Change into the `test` directory of your clone. + +5. Run tests: `flutter drive -d web-server --browser-name=chrome --target=test_driver/TEST_NAME_integration.dart`, or (in Linux): + + * Single: `./run_test test_driver/TEST_NAME_integration.dart` + * All: `./run_test` diff --git a/packages/google_sign_in/google_sign_in_web/test/auth2_test.dart b/packages/google_sign_in/google_sign_in_web/test/auth2_test.dart deleted file mode 100644 index 40bc8a404d06..000000000000 --- a/packages/google_sign_in/google_sign_in_web/test/auth2_test.dart +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -@TestOn('browser') - -import 'package:flutter_test/flutter_test.dart'; -import 'package:google_sign_in_platform_interface/google_sign_in_platform_interface.dart'; -import 'package:google_sign_in_web/google_sign_in_web.dart'; -import 'gapi_mocks/gapi_mocks.dart' as gapi_mocks; -import 'utils.dart'; - -void main() { - GoogleSignInTokenData expectedTokenData = - GoogleSignInTokenData(idToken: '70k3n', accessToken: 'access_70k3n'); - - GoogleSignInUserData expectedUserData = GoogleSignInUserData( - displayName: 'Foo Bar', - email: 'foo@example.com', - id: '123', - photoUrl: 'http://example.com/img.jpg', - idToken: expectedTokenData.idToken, - ); - - // The pre-configured use case for the instances of the plugin in this test - gapiUrl = toBase64Url(gapi_mocks.auth2InitSuccess(expectedUserData)); - - GoogleSignInPlugin plugin; - - setUp(() { - plugin = GoogleSignInPlugin(); - }); - - test('Init requires clientId', () async { - expect(plugin.init(hostedDomain: ''), throwsAssertionError); - }); - - test('Init doesn\'t accept spaces in scopes', () async { - expect( - plugin.init( - hostedDomain: '', - clientId: '', - scopes: ['scope with spaces'], - ), - throwsAssertionError); - }); - - group('Successful .init, then', () { - setUp(() async { - await plugin.init( - hostedDomain: 'foo', - scopes: ['some', 'scope'], - clientId: '1234', - ); - await plugin.initialized; - }); - - test('signInSilently', () async { - GoogleSignInUserData actualUser = await plugin.signInSilently(); - - expect(actualUser, expectedUserData); - }); - - test('signIn', () async { - GoogleSignInUserData actualUser = await plugin.signIn(); - - expect(actualUser, expectedUserData); - }); - - test('getTokens', () async { - GoogleSignInTokenData actualToken = - await plugin.getTokens(email: expectedUserData.email); - - expect(actualToken, expectedTokenData); - }); - - test('requestScopes', () async { - bool scopeGranted = await plugin.requestScopes(['newScope']); - - expect(scopeGranted, isTrue); - }); - }); -} diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/auth2_init.dart b/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/auth2_init.dart deleted file mode 100644 index 1846033151c1..000000000000 --- a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/auth2_init.dart +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of gapi_mocks; - -// JS mock of a gapi.auth2, with a successfully identified user -String auth2InitSuccess(GoogleSignInUserData userData) => testIife(''' -${gapi()} - -var mockUser = ${googleUser(userData)}; - -function GapiAuth2() {} -GapiAuth2.prototype.init = function (initOptions) { - return { - then: (onSuccess, onError) => { - window.setTimeout(() => { - onSuccess(window.gapi.auth2); - }, 30); - }, - currentUser: { - listen: (cb) => { - window.setTimeout(() => { - cb(mockUser); - }, 30); - } - } - } -}; - -GapiAuth2.prototype.getAuthInstance = function () { - return { - signIn: () => { - return new Promise((resolve, reject) => { - window.setTimeout(() => { - resolve(mockUser); - }, 30); - }); - }, - currentUser: { - get: () => mockUser, - }, - } -}; - -window.gapi.auth2 = new GapiAuth2(); -'''); diff --git a/packages/google_sign_in/google_sign_in_web/test/lib/main.dart b/packages/google_sign_in/google_sign_in_web/test/lib/main.dart new file mode 100644 index 000000000000..10415204570c --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/lib/main.dart @@ -0,0 +1,22 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +/// App for testing +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + Widget build(BuildContext context) { + return Text('Testing... Look at the console output for results!'); + } +} diff --git a/packages/google_sign_in/google_sign_in_web/test/pubspec.yaml b/packages/google_sign_in/google_sign_in_web/test/pubspec.yaml new file mode 100644 index 000000000000..dd0354e81498 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/pubspec.yaml @@ -0,0 +1,24 @@ +name: regular_integration_tests +publish_to: none + +environment: + sdk: ">=2.2.2 <3.0.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + google_sign_in: ^4.5.3 + flutter_driver: + sdk: flutter + flutter_test: + sdk: flutter + http: ^0.12.2 + mockito: ^4.1.1 + integration_test: + path: ../../../integration_test + +dependency_overrides: + google_sign_in_web: + path: ../ diff --git a/packages/google_sign_in/google_sign_in_web/test/run_test b/packages/google_sign_in/google_sign_in_web/test/run_test new file mode 100755 index 000000000000..74a8526a0fa3 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/run_test @@ -0,0 +1,17 @@ +#!/usr/bin/bash +if pgrep -lf chromedriver > /dev/null; then + echo "chromedriver is running." + + if [ $# -eq 0 ]; then + echo "No target specified, running all tests..." + find test_driver/ -iname *_integration.dart | xargs -n1 -i -t flutter drive -d web-server --web-port=7357 --browser-name=chrome --target='{}' + else + echo "Running test target: $1..." + set -x + flutter drive -d web-server --web-port=7357 --browser-name=chrome --target=$1 + fi + + else + echo "chromedriver is not running." +fi + diff --git a/packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration.dart new file mode 100644 index 000000000000..e2f16f2aee43 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration.dart @@ -0,0 +1,192 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/services.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_sign_in_platform_interface/google_sign_in_platform_interface.dart'; +import 'package:google_sign_in_web/google_sign_in_web.dart'; +import 'gapi_mocks/gapi_mocks.dart' as gapi_mocks; +import 'src/test_utils.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + GoogleSignInTokenData expectedTokenData = + GoogleSignInTokenData(idToken: '70k3n', accessToken: 'access_70k3n'); + + GoogleSignInUserData expectedUserData = GoogleSignInUserData( + displayName: 'Foo Bar', + email: 'foo@example.com', + id: '123', + photoUrl: 'http://example.com/img.jpg', + idToken: expectedTokenData.idToken, + ); + + GoogleSignInPlugin plugin; + + group('plugin.init() throws a catchable exception', () { + setUp(() { + // The pre-configured use case for the instances of the plugin in this test + gapiUrl = toBase64Url(gapi_mocks.auth2InitError()); + plugin = GoogleSignInPlugin(); + }); + + testWidgets('init throws PlatformException', (WidgetTester tester) async { + await expectLater( + plugin.init( + hostedDomain: 'foo', + scopes: ['some', 'scope'], + clientId: '1234', + ), + throwsA(isA())); + }); + + testWidgets('init forwards error code from JS', + (WidgetTester tester) async { + try { + await plugin.init( + hostedDomain: 'foo', + scopes: ['some', 'scope'], + clientId: '1234', + ); + fail('plugin.init should have thrown an exception!'); + } catch (e) { + expect(e.code, 'idpiframe_initialization_failed'); + } + }); + }); + + group('other methods also throw catchable exceptions on init fail', () { + // This function ensures that init gets called, but for some reason, we + // ignored that it has thrown stuff... + void _discardInit() async { + try { + await plugin.init( + hostedDomain: 'foo', + scopes: ['some', 'scope'], + clientId: '1234', + ); + } catch (e) { + // Noop so we can call other stuff + } + } + + setUp(() { + gapiUrl = toBase64Url(gapi_mocks.auth2InitError()); + plugin = GoogleSignInPlugin(); + }); + + testWidgets('signInSilently throws', (WidgetTester tester) async { + await _discardInit(); + await expectLater( + plugin.signInSilently(), throwsA(isA())); + }); + + testWidgets('signIn throws', (WidgetTester tester) async { + await _discardInit(); + await expectLater(plugin.signIn(), throwsA(isA())); + }); + + testWidgets('getTokens throws', (WidgetTester tester) async { + await _discardInit(); + await expectLater(plugin.getTokens(email: 'test@example.com'), + throwsA(isA())); + }); + testWidgets('requestScopes', (WidgetTester tester) async { + await _discardInit(); + await expectLater(plugin.requestScopes(['newScope']), + throwsA(isA())); + }); + }); + + group('auth2 Init Successful', () { + setUp(() { + // The pre-configured use case for the instances of the plugin in this test + gapiUrl = toBase64Url(gapi_mocks.auth2InitSuccess(expectedUserData)); + plugin = GoogleSignInPlugin(); + }); + + testWidgets('Init requires clientId', (WidgetTester tester) async { + expect(plugin.init(hostedDomain: ''), throwsAssertionError); + }); + + testWidgets('Init doesn\'t accept spaces in scopes', + (WidgetTester tester) async { + expect( + plugin.init( + hostedDomain: '', + clientId: '', + scopes: ['scope with spaces'], + ), + throwsAssertionError); + }); + + group('Successful .init, then', () { + setUp(() async { + await plugin.init( + hostedDomain: 'foo', + scopes: ['some', 'scope'], + clientId: '1234', + ); + await plugin.initialized; + }); + + testWidgets('signInSilently', (WidgetTester tester) async { + GoogleSignInUserData actualUser = await plugin.signInSilently(); + + expect(actualUser, expectedUserData); + }); + + testWidgets('signIn', (WidgetTester tester) async { + GoogleSignInUserData actualUser = await plugin.signIn(); + + expect(actualUser, expectedUserData); + }); + + testWidgets('getTokens', (WidgetTester tester) async { + GoogleSignInTokenData actualToken = + await plugin.getTokens(email: expectedUserData.email); + + expect(actualToken, expectedTokenData); + }); + + testWidgets('requestScopes', (WidgetTester tester) async { + bool scopeGranted = await plugin.requestScopes(['newScope']); + + expect(scopeGranted, isTrue); + }); + }); + }); + + group('auth2 Init successful, but exception on signIn() method', () { + setUp(() async { + // The pre-configured use case for the instances of the plugin in this test + gapiUrl = toBase64Url(gapi_mocks.auth2SignInError()); + plugin = GoogleSignInPlugin(); + await plugin.init( + hostedDomain: 'foo', + scopes: ['some', 'scope'], + clientId: '1234', + ); + await plugin.initialized; + }); + + testWidgets('User aborts sign in flow, throws PlatformException', + (WidgetTester tester) async { + await expectLater(plugin.signIn(), throwsA(isA())); + }); + + testWidgets('User aborts sign in flow, error code is forwarded from JS', + (WidgetTester tester) async { + try { + await plugin.signIn(); + fail('plugin.signIn() should have thrown an exception!'); + } catch (e) { + expect(e.code, 'popup_closed_by_user'); + } + }); + }); +} diff --git a/packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration_test.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration_test.dart new file mode 100644 index 000000000000..39444c0daa24 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/test_driver/auth2_integration_test.dart @@ -0,0 +1,7 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:integration_test/integration_test_driver.dart'; + +Future main() async => integrationDriver(); diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_load_test.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_load_integration.dart similarity index 83% rename from packages/google_sign_in/google_sign_in_web/test/gapi_load_test.dart rename to packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_load_integration.dart index 6703beca2cad..540369cae370 100644 --- a/packages/google_sign_in/google_sign_in_web/test/gapi_load_test.dart +++ b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_load_integration.dart @@ -2,21 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -@TestOn('browser') - import 'dart:html' as html; +import 'package:integration_test/integration_test.dart'; + import 'package:flutter_test/flutter_test.dart'; import 'package:google_sign_in_platform_interface/google_sign_in_platform_interface.dart'; import 'package:google_sign_in_web/google_sign_in_web.dart'; import 'gapi_mocks/gapi_mocks.dart' as gapi_mocks; -import 'utils.dart'; +import 'src/test_utils.dart'; void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + gapiUrl = toBase64Url(gapi_mocks.auth2InitSuccess(GoogleSignInUserData())); - test('Plugin is initialized after GAPI fully loads and init is called', - () async { + testWidgets('Plugin is initialized after GAPI fully loads and init is called', + (WidgetTester tester) async { expect( html.querySelector('script[src^="data:"]'), isNull, diff --git a/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_load_integration_test.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_load_integration_test.dart new file mode 100644 index 000000000000..39444c0daa24 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_load_integration_test.dart @@ -0,0 +1,7 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:integration_test/integration_test_driver.dart'; + +Future main() async => integrationDriver(); diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/gapi_mocks.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/gapi_mocks.dart similarity index 100% rename from packages/google_sign_in/google_sign_in_web/test/gapi_mocks/gapi_mocks.dart rename to packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/gapi_mocks.dart diff --git a/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/auth2_init.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/auth2_init.dart new file mode 100644 index 000000000000..79d798ad2c85 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/auth2_init.dart @@ -0,0 +1,107 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +part of gapi_mocks; + +// JS mock of a gapi.auth2, with a successfully identified user +String auth2InitSuccess(GoogleSignInUserData userData) => testIife(''' +${gapi()} + +var mockUser = ${googleUser(userData)}; + +function GapiAuth2() {} +GapiAuth2.prototype.init = function (initOptions) { + return { + then: (onSuccess, onError) => { + window.setTimeout(() => { + onSuccess(window.gapi.auth2); + }, 30); + }, + currentUser: { + listen: (cb) => { + window.setTimeout(() => { + cb(mockUser); + }, 30); + } + } + } +}; + +GapiAuth2.prototype.getAuthInstance = function () { + return { + signIn: () => { + return new Promise((resolve, reject) => { + window.setTimeout(() => { + resolve(mockUser); + }, 30); + }); + }, + currentUser: { + get: () => mockUser, + }, + } +}; + +window.gapi.auth2 = new GapiAuth2(); +'''); + +String auth2InitError() => testIife(''' +${gapi()} + +function GapiAuth2() {} +GapiAuth2.prototype.init = function (initOptions) { + return { + then: (onSuccess, onError) => { + window.setTimeout(() => { + onError({ + error: 'idpiframe_initialization_failed', + details: 'This error was raised from a test.', + }); + }, 30); + } + } +}; + +window.gapi.auth2 = new GapiAuth2(); +'''); + +String auth2SignInError([String error = 'popup_closed_by_user']) => testIife(''' +${gapi()} + +var mockUser = null; + +function GapiAuth2() {} +GapiAuth2.prototype.init = function (initOptions) { + return { + then: (onSuccess, onError) => { + window.setTimeout(() => { + onSuccess(window.gapi.auth2); + }, 30); + }, + currentUser: { + listen: (cb) => { + window.setTimeout(() => { + cb(mockUser); + }, 30); + } + } + } +}; + +GapiAuth2.prototype.getAuthInstance = function () { + return { + signIn: () => { + return new Promise((resolve, reject) => { + window.setTimeout(() => { + reject({ + error: '${error}' + }); + }, 30); + }); + }, + } +}; + +window.gapi.auth2 = new GapiAuth2(); +'''); diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/gapi.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/gapi.dart similarity index 100% rename from packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/gapi.dart rename to packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/gapi.dart diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/google_user.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/google_user.dart similarity index 100% rename from packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/google_user.dart rename to packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/google_user.dart diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/test_iife.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/test_iife.dart similarity index 100% rename from packages/google_sign_in/google_sign_in_web/test/gapi_mocks/src/test_iife.dart rename to packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_mocks/src/test_iife.dart diff --git a/packages/google_sign_in/google_sign_in_web/test/gapi_utils_test.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_utils_integration.dart similarity index 70% rename from packages/google_sign_in/google_sign_in_web/test/gapi_utils_test.dart rename to packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_utils_integration.dart index 2dc49fc5b67a..55b942842b33 100644 --- a/packages/google_sign_in/google_sign_in_web/test/gapi_utils_test.dart +++ b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_utils_integration.dart @@ -1,10 +1,10 @@ // Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -@TestOn('browser') - import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + import 'package:google_sign_in_web/src/generated/gapiauth2.dart' as gapi; import 'package:google_sign_in_web/src/utils.dart'; import 'package:mockito/mockito.dart'; @@ -15,6 +15,7 @@ class MockBasicProfile extends Mock implements gapi.BasicProfile {} void main() { // The non-null use cases are covered by the auth2_test.dart file. + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); group('gapiUserToPluginUserData', () { var mockUser; @@ -23,21 +24,24 @@ void main() { mockUser = MockGoogleUser(); }); - test('null user -> null response', () { + testWidgets('null user -> null response', (WidgetTester tester) async { expect(gapiUserToPluginUserData(null), isNull); }); - test('not signed-in user -> null response', () { + testWidgets('not signed-in user -> null response', + (WidgetTester tester) async { when(mockUser.isSignedIn()).thenReturn(false); expect(gapiUserToPluginUserData(mockUser), isNull); }); - test('signed-in, but null profile user -> null response', () { + testWidgets('signed-in, but null profile user -> null response', + (WidgetTester tester) async { when(mockUser.isSignedIn()).thenReturn(true); expect(gapiUserToPluginUserData(mockUser), isNull); }); - test('signed-in, null userId in profile user -> null response', () { + testWidgets('signed-in, null userId in profile user -> null response', + (WidgetTester tester) async { when(mockUser.isSignedIn()).thenReturn(true); when(mockUser.getBasicProfile()).thenReturn(MockBasicProfile()); expect(gapiUserToPluginUserData(mockUser), isNull); diff --git a/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_utils_integration_test.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_utils_integration_test.dart new file mode 100644 index 000000000000..39444c0daa24 --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/test_driver/gapi_utils_integration_test.dart @@ -0,0 +1,7 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:integration_test/integration_test_driver.dart'; + +Future main() async => integrationDriver(); diff --git a/packages/google_sign_in/google_sign_in_web/test/utils.dart b/packages/google_sign_in/google_sign_in_web/test/test_driver/src/test_utils.dart similarity index 100% rename from packages/google_sign_in/google_sign_in_web/test/utils.dart rename to packages/google_sign_in/google_sign_in_web/test/test_driver/src/test_utils.dart diff --git a/packages/google_sign_in/google_sign_in_web/test/web/index.html b/packages/google_sign_in/google_sign_in_web/test/web/index.html new file mode 100644 index 000000000000..59a832b5de4c --- /dev/null +++ b/packages/google_sign_in/google_sign_in_web/test/web/index.html @@ -0,0 +1,13 @@ + + + + + Browser Tests + + + + + + From 49c9f174aa1a78df881417fce39a9e2ccf297b8b Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 14 Sep 2020 15:55:41 -0700 Subject: [PATCH 23/32] [android_alarm_manager] version fix (#3028) --- packages/android_alarm_manager/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/android_alarm_manager/pubspec.yaml b/packages/android_alarm_manager/pubspec.yaml index 85c6609d5780..90dcbf1f7819 100644 --- a/packages/android_alarm_manager/pubspec.yaml +++ b/packages/android_alarm_manager/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter plugin for accessing the Android AlarmManager service, and # 0.4.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.4.5+12 +version: 0.4.5+13 homepage: https://github.com/flutter/plugins/tree/master/packages/android_alarm_manager dependencies: From bbd7fbe83d3e1102626bafbcb8af7c79d6b5437d Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Tue, 15 Sep 2020 14:28:47 -0400 Subject: [PATCH 24/32] [url_launcher] Endorse Windows implementation (#3024) Endorses url_launcher_windows so that Windows is supported automatically. --- .../url_launcher/url_launcher/CHANGELOG.md | 4 ++++ packages/url_launcher/url_launcher/README.md | 7 +++--- .../example/test_driver/url_launcher_e2e.dart | 2 +- .../url_launcher/url_launcher/pubspec.yaml | 5 ++++- .../url_launcher_windows/CHANGELOG.md | 4 ++++ .../url_launcher_windows/README.md | 18 +++++++++++---- .../ios/url_launcher_windows.podspec | 22 +++++++++++++++++++ .../url_launcher_windows/pubspec.yaml | 2 +- 8 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 packages/url_launcher/url_launcher_windows/ios/url_launcher_windows.podspec diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index e7e31acfd968..063aa99d5d51 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.6.0 + +* Support Windows by default. + ## 5.5.3 * Suppress deprecation warning on the `shouldOverrideUrlLoading` method on Android. diff --git a/packages/url_launcher/url_launcher/README.md b/packages/url_launcher/url_launcher/README.md index 53c7fe96cde7..811dcd5b4ea1 100644 --- a/packages/url_launcher/url_launcher/README.md +++ b/packages/url_launcher/url_launcher/README.md @@ -2,7 +2,8 @@ [![pub package](https://img.shields.io/pub/v/url_launcher.svg)](https://pub.dartlang.org/packages/url_launcher) -A Flutter plugin for launching a URL in the mobile platform. Supports iOS and Android. +A Flutter plugin for launching a URL in the mobile platform. Supports +iOS, Android, web, Windows, macOS, and Linux. ## Usage To use this plugin, add `url_launcher` as a [dependency in your pubspec.yaml file](https://flutter.dev/platform-plugins/). @@ -91,8 +92,8 @@ web page using a URL following the `http` scheme. ## Browser vs In-app Handling By default, Android opens up a browser when handling URLs. You can pass -`forceWebView: true` parameter to tell the plugin to open a WebView instead. -If you do this for a URL of a page containing JavaScript, make sure to pass in +`forceWebView: true` parameter to tell the plugin to open a WebView instead. +If you do this for a URL of a page containing JavaScript, make sure to pass in `enableJavaScript: true`, or else the launch method will not work properly. On iOS, the default behavior is to open all web URLs within the app. Everything else is redirected to the app handler. diff --git a/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e.dart b/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e.dart index fe51d94aa3a9..9fb5eaa34b4c 100644 --- a/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e.dart +++ b/packages/url_launcher/url_launcher/example/test_driver/url_launcher_e2e.dart @@ -19,7 +19,7 @@ void main() { expect(await canLaunch('http://flutter.dev'), true); // SMS handling is available by default on most platforms. - if (kIsWeb || !Platform.isLinux) { + if (kIsWeb || !(Platform.isLinux || Platform.isWindows)) { expect(await canLaunch('sms:5555555555'), true); } diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index 57048a2b3f98..965a4318d0f8 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -2,7 +2,7 @@ name: url_launcher description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher -version: 5.5.3 +version: 5.6.0 flutter: plugin: @@ -18,6 +18,8 @@ flutter: default_package: url_laucher_linux macos: default_package: url_laucher_macos + windows: + default_package: url_laucher_windows dependencies: flutter: @@ -31,6 +33,7 @@ dependencies: url_launcher_web: ^0.1.3 url_launcher_linux: ^0.0.1 url_launcher_macos: ^0.0.1 + url_launcher_windows: ^0.0.1 dev_dependencies: flutter_test: diff --git a/packages/url_launcher/url_launcher_windows/CHANGELOG.md b/packages/url_launcher/url_launcher_windows/CHANGELOG.md index dd3395afab0a..7f534a7e5a38 100644 --- a/packages/url_launcher/url_launcher_windows/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_windows/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.1+1 + +* Update README to reflect endorsement. + ## 0.0.1 * Initial Windows implementation of `url_launcher`. diff --git a/packages/url_launcher/url_launcher_windows/README.md b/packages/url_launcher/url_launcher_windows/README.md index 685adc59a1a4..fb5ad6700d26 100644 --- a/packages/url_launcher/url_launcher_windows/README.md +++ b/packages/url_launcher/url_launcher_windows/README.md @@ -13,9 +13,9 @@ For more details see: https://github.com/flutter/flutter/wiki/Package-migration- ### Import the package -This package has not yet been endorsed. Once it is you only need to add -`url_launcher` as a dependency in your `pubspec.yaml`, but for now you -need to include both `url_launcher` and `url_launcher_windows`. +This package has been endorsed, meaning that you only need to add `url_launcher` +as a dependency in your `pubspec.yaml`. It will be automatically included in your app +when you depend on `package:url_launcher`. This is what the above means to your `pubspec.yaml`: @@ -23,7 +23,17 @@ This is what the above means to your `pubspec.yaml`: ... dependencies: ... - url_launcher: ^5.5.3 + url_launcher: ^5.6.0 + ... +``` + +If you wish to use the Windows package only, you can add `url_launcher_windows` as a +dependency: + +```yaml +... +dependencies: + ... url_launcher_windows: ^0.0.1 ... ``` diff --git a/packages/url_launcher/url_launcher_windows/ios/url_launcher_windows.podspec b/packages/url_launcher/url_launcher_windows/ios/url_launcher_windows.podspec new file mode 100644 index 000000000000..1c700d49f4b5 --- /dev/null +++ b/packages/url_launcher/url_launcher_windows/ios/url_launcher_windows.podspec @@ -0,0 +1,22 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# Run `pod lib lint url_launcher_windows.podspec' to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'url_launcher_windows' + s.version = '0.0.1' + s.summary = 'url_launcher_windows iOS stub' + s.description = <<-DESC + No-op implementation of the windows url_launcher plugin to avoid build issues on iOS + DESC + s.homepage = 'https://github.com/flutter/plugins' + s.license = { :type => 'BSD', :file => '../LICENSE' } + s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } + s.source = { :http => 'https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_windows' } + s.dependency 'Flutter' + s.platform = :ios, '8.0' + + # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } + s.swift_version = '5.0' +end diff --git a/packages/url_launcher/url_launcher_windows/pubspec.yaml b/packages/url_launcher/url_launcher_windows/pubspec.yaml index 8a0beb70163a..6a653b7f7665 100644 --- a/packages/url_launcher/url_launcher_windows/pubspec.yaml +++ b/packages/url_launcher/url_launcher_windows/pubspec.yaml @@ -3,7 +3,7 @@ description: Windows implementation of the url_launcher plugin. # 0.0.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.0.1 +version: 0.0.1+1 homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_windows flutter: From 9a5b73e1c62d18606c79a777e69d4ba961997489 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 16 Sep 2020 09:05:12 -0700 Subject: [PATCH 25/32] remove android folders (#3030) --- .../connectivity_macos/CHANGELOG.md | 1 + .../example/android/app/build.gradle | 58 --------------- .../gradle/wrapper/gradle-wrapper.properties | 5 -- .../android/app/src/main/AndroidManifest.xml | 30 -------- .../EmbeddingV1Activity.java | 18 ----- .../EmbeddingV1ActivityTest.java | 17 ----- .../FlutterActivityTest.java | 17 ----- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 29 -------- .../example/android/gradle.properties | 4 -- .../gradle/wrapper/gradle-wrapper.properties | 5 -- .../example/android/settings.gradle | 15 ---- .../connectivity_macos/pubspec.yaml | 2 +- packages/ios_platform_images/CHANGELOG.md | 4 ++ .../example/android/.gitignore | 8 --- .../example/android/app/build.gradle | 67 ------------------ .../android/app/src/debug/AndroidManifest.xml | 7 -- .../android/app/src/main/AndroidManifest.xml | 33 --------- .../main/res/drawable/launch_background.xml | 12 ---- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 --- .../app/src/profile/AndroidManifest.xml | 7 -- .../example/android/build.gradle | 31 -------- .../example/android/gradle.properties | 4 -- .../gradle/wrapper/gradle-wrapper.properties | 6 -- .../example/android/settings.gradle | 15 ---- packages/ios_platform_images/pubspec.yaml | 2 +- .../path_provider_macos/CHANGELOG.md | 4 ++ .../example/android/app/build.gradle | 64 ----------------- .../gradle/wrapper/gradle-wrapper.properties | 5 -- .../java/EmbeddingV1ActivityTest.java | 15 ---- .../androidTest/java/MainActivityTest.java | 13 ---- .../android/app/src/main/AndroidManifest.xml | 25 ------- .../EmbeddingV1Activity.java | 14 ---- .../pathproviderexample/MainActivity.java | 19 ----- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 29 -------- .../example/android/gradle.properties | 4 -- .../gradle/wrapper/gradle-wrapper.properties | 5 -- .../example/android/settings.gradle | 15 ---- .../path_provider_macos/pubspec.yaml | 2 +- .../url_launcher_macos/CHANGELOG.md | 4 ++ .../example/android/app/build.gradle | 60 ---------------- .../gradle/wrapper/gradle-wrapper.properties | 5 -- .../EmbeddingV1ActivityTest.java | 13 ---- .../FlutterActivityTest.java | 13 ---- .../android/app/src/main/AndroidManifest.xml | 40 ----------- .../EmbeddingV1Activity.java | 22 ------ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../example/android/build.gradle | 29 -------- .../example/android/gradle.properties | 4 -- .../gradle/wrapper/gradle-wrapper.properties | 6 -- .../example/android/settings.gradle | 15 ---- .../url_launcher_macos/pubspec.yaml | 2 +- 70 files changed, 17 insertions(+), 815 deletions(-) delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/build.gradle delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1Activity.java delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/FlutterActivityTest.java delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/connectivity/connectivity_macos/example/android/build.gradle delete mode 100644 packages/connectivity/connectivity_macos/example/android/gradle.properties delete mode 100644 packages/connectivity/connectivity_macos/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/connectivity/connectivity_macos/example/android/settings.gradle delete mode 100644 packages/ios_platform_images/example/android/.gitignore delete mode 100644 packages/ios_platform_images/example/android/app/build.gradle delete mode 100644 packages/ios_platform_images/example/android/app/src/debug/AndroidManifest.xml delete mode 100644 packages/ios_platform_images/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/ios_platform_images/example/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 packages/ios_platform_images/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/ios_platform_images/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/ios_platform_images/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/ios_platform_images/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/ios_platform_images/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/ios_platform_images/example/android/app/src/main/res/values/styles.xml delete mode 100644 packages/ios_platform_images/example/android/app/src/profile/AndroidManifest.xml delete mode 100644 packages/ios_platform_images/example/android/build.gradle delete mode 100644 packages/ios_platform_images/example/android/gradle.properties delete mode 100644 packages/ios_platform_images/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/ios_platform_images/example/android/settings.gradle delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/build.gradle delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/MainActivityTest.java delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/path_provider/path_provider_macos/example/android/build.gradle delete mode 100644 packages/path_provider/path_provider_macos/example/android/gradle.properties delete mode 100644 packages/path_provider/path_provider_macos/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/path_provider/path_provider_macos/example/android/settings.gradle delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/build.gradle delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/EmbeddingV1ActivityTest.java delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/FlutterActivityTest.java delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/main/AndroidManifest.xml delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/EmbeddingV1Activity.java delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/build.gradle delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/gradle.properties delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 packages/url_launcher/url_launcher_macos/example/android/settings.gradle diff --git a/packages/connectivity/connectivity_macos/CHANGELOG.md b/packages/connectivity/connectivity_macos/CHANGELOG.md index ac12b21b531a..c103c51b0d70 100644 --- a/packages/connectivity/connectivity_macos/CHANGELOG.md +++ b/packages/connectivity/connectivity_macos/CHANGELOG.md @@ -2,6 +2,7 @@ * Update package:e2e reference to use the local version in the flutter/plugins repository. +* Remove no-op android folder in the example app. ## 0.1.0+4 diff --git a/packages/connectivity/connectivity_macos/example/android/app/build.gradle b/packages/connectivity/connectivity_macos/example/android/app/build.gradle deleted file mode 100644 index 5d1f138bfe1a..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/app/build.gradle +++ /dev/null @@ -1,58 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.connectivityexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} diff --git a/packages/connectivity/connectivity_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/connectivity/connectivity_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/AndroidManifest.xml b/packages/connectivity/connectivity_macos/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 664b74303548..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1Activity.java b/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1Activity.java deleted file mode 100644 index fa10cd5b7f52..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1Activity.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.connectivityexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.connectivity.ConnectivityPlugin; - -public class EmbeddingV1Activity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - ConnectivityPlugin.registerWith( - registrarFor("io.flutter.plugins.connectivity.ConnectivityPlugin")); - } -} diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java b/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java deleted file mode 100644 index 048da070991e..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/EmbeddingV1ActivityTest.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.connectivityexample; - -import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.integration_test.FlutterTestRunner; -import org.junit.Rule; -import org.junit.runner.RunWith; - -@RunWith(FlutterTestRunner.class) -public class EmbeddingV1ActivityTest { - @Rule - public ActivityTestRule rule = - new ActivityTestRule<>(EmbeddingV1Activity.class); -} diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/FlutterActivityTest.java b/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/FlutterActivityTest.java deleted file mode 100644 index 0f0dcf2555f3..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/app/src/main/java/io/flutter/plugins/connectivityexample/FlutterActivityTest.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.connectivityexample; - -import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.integration_test.FlutterTestRunner; -import io.flutter.embedding.android.FlutterActivity; -import org.junit.Rule; -import org.junit.runner.RunWith; - -@RunWith(FlutterTestRunner.class) -public class FlutterActivityTest { - @Rule - public ActivityTestRule rule = new ActivityTestRule<>(FlutterActivity.class); -} diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/connectivity/connectivity_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/packages/connectivity/connectivity_macos/example/android/build.gradle b/packages/connectivity/connectivity_macos/example/android/build.gradle deleted file mode 100644 index 541636cc492a..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/connectivity/connectivity_macos/example/android/gradle.properties b/packages/connectivity/connectivity_macos/example/android/gradle.properties deleted file mode 100644 index a6738207fd15..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true -android.enableR8=true diff --git a/packages/connectivity/connectivity_macos/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/connectivity/connectivity_macos/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d1d650..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/packages/connectivity/connectivity_macos/example/android/settings.gradle b/packages/connectivity/connectivity_macos/example/android/settings.gradle deleted file mode 100644 index a159ea7cb99f..000000000000 --- a/packages/connectivity/connectivity_macos/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/connectivity/connectivity_macos/pubspec.yaml b/packages/connectivity/connectivity_macos/pubspec.yaml index 65888cfb3505..e35becb0ee35 100644 --- a/packages/connectivity/connectivity_macos/pubspec.yaml +++ b/packages/connectivity/connectivity_macos/pubspec.yaml @@ -3,7 +3,7 @@ description: macOS implementation of the connectivity plugin. # 0.1.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.1.0+4 +version: 0.1.0+5 homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity/connectivity_macos flutter: diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index d34a26253ac8..a83f22ec7571 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.2+3 + +* Remove no-op android folder in the example app. + ## 0.1.2+2 * Post-v2 Android embedding cleanups. diff --git a/packages/ios_platform_images/example/android/.gitignore b/packages/ios_platform_images/example/android/.gitignore deleted file mode 100644 index cf399e0ef46f..000000000000 --- a/packages/ios_platform_images/example/android/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java -bin/ diff --git a/packages/ios_platform_images/example/android/app/build.gradle b/packages/ios_platform_images/example/android/app/build.gradle deleted file mode 100644 index b70ac6686d86..000000000000 --- a/packages/ios_platform_images/example/android/app/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.ios_platform_images_example" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} diff --git a/packages/ios_platform_images/example/android/app/src/debug/AndroidManifest.xml b/packages/ios_platform_images/example/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 03bcd3294df0..000000000000 --- a/packages/ios_platform_images/example/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/ios_platform_images/example/android/app/src/main/AndroidManifest.xml b/packages/ios_platform_images/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 94cfab63442e..000000000000 --- a/packages/ios_platform_images/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/ios_platform_images/example/android/app/src/main/res/drawable/launch_background.xml b/packages/ios_platform_images/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88420..000000000000 --- a/packages/ios_platform_images/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/packages/ios_platform_images/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/ios_platform_images/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/packages/ios_platform_images/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/ios_platform_images/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/packages/ios_platform_images/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/ios_platform_images/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/packages/ios_platform_images/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/ios_platform_images/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/packages/ios_platform_images/example/android/app/src/main/res/values/styles.xml b/packages/ios_platform_images/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417cfbe..000000000000 --- a/packages/ios_platform_images/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/packages/ios_platform_images/example/android/app/src/profile/AndroidManifest.xml b/packages/ios_platform_images/example/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 03bcd3294df0..000000000000 --- a/packages/ios_platform_images/example/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/ios_platform_images/example/android/build.gradle b/packages/ios_platform_images/example/android/build.gradle deleted file mode 100644 index 3100ad2d5553..000000000000 --- a/packages/ios_platform_images/example/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - ext.kotlin_version = '1.3.50' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/ios_platform_images/example/android/gradle.properties b/packages/ios_platform_images/example/android/gradle.properties deleted file mode 100644 index 38c8d4544ff1..000000000000 --- a/packages/ios_platform_images/example/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.enableR8=true -android.useAndroidX=true -android.enableJetifier=true diff --git a/packages/ios_platform_images/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/ios_platform_images/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 296b146b7318..000000000000 --- a/packages/ios_platform_images/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/packages/ios_platform_images/example/android/settings.gradle b/packages/ios_platform_images/example/android/settings.gradle deleted file mode 100644 index 5a2f14fb18f6..000000000000 --- a/packages/ios_platform_images/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/ios_platform_images/pubspec.yaml b/packages/ios_platform_images/pubspec.yaml index 1a47000a0881..482097a515b8 100644 --- a/packages/ios_platform_images/pubspec.yaml +++ b/packages/ios_platform_images/pubspec.yaml @@ -1,6 +1,6 @@ name: ios_platform_images description: A plugin to share images between Flutter and iOS in add-to-app setups. -version: 0.1.2+2 +version: 0.1.2+3 homepage: https://github.com/flutter/plugins/tree/master/packages/ios_platform_images/ios_platform_images environment: diff --git a/packages/path_provider/path_provider_macos/CHANGELOG.md b/packages/path_provider/path_provider_macos/CHANGELOG.md index 037c5153dc3a..406c49f56def 100644 --- a/packages/path_provider/path_provider_macos/CHANGELOG.md +++ b/packages/path_provider/path_provider_macos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.4+4 + +* Remove no-op android folder in the example app. + ## 0.0.4+3 * Remove Android folder from `path_provider_macos`. diff --git a/packages/path_provider/path_provider_macos/example/android/app/build.gradle b/packages/path_provider/path_provider_macos/example/android/app/build.gradle deleted file mode 100644 index 0404c7203903..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/app/build.gradle +++ /dev/null @@ -1,64 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.pathproviderexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - androidTestImplementation 'androidx.test:runner:1.2.0' - androidTestImplementation 'androidx.test:rules:1.2.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} diff --git a/packages/path_provider/path_provider_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/path_provider/path_provider_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java b/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java deleted file mode 100644 index 50cb342715cb..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/EmbeddingV1ActivityTest.java +++ /dev/null @@ -1,15 +0,0 @@ - -package io.flutter.plugins.pathprovider; - -import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.integration_test.FlutterTestRunner; -import io.flutter.plugins.pathproviderexample.EmbeddingV1Activity; -import org.junit.Rule; -import org.junit.runner.RunWith; - -@RunWith(FlutterTestRunner.class) -public class EmbeddingV1ActivityTest { - @Rule - public ActivityTestRule rule = - new ActivityTestRule<>(EmbeddingV1Activity.class); -} diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/MainActivityTest.java b/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/MainActivityTest.java deleted file mode 100644 index 09e000524a69..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/app/src/androidTest/java/MainActivityTest.java +++ /dev/null @@ -1,13 +0,0 @@ - -package io.flutter.plugins.pathprovider; - -import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.integration_test.FlutterTestRunner; -import io.flutter.plugins.pathproviderexample.MainActivity; -import org.junit.Rule; -import org.junit.runner.RunWith; - -@RunWith(FlutterTestRunner.class) -public class MainActivityTest { - @Rule public ActivityTestRule rule = new ActivityTestRule<>(MainActivity.class); -} diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/AndroidManifest.xml b/packages/path_provider/path_provider_macos/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 9e03a9373e33..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java b/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java deleted file mode 100644 index a826af36a9d3..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/EmbeddingV1Activity.java +++ /dev/null @@ -1,14 +0,0 @@ - -package io.flutter.plugins.pathproviderexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class EmbeddingV1Activity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java b/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java deleted file mode 100644 index bdecc162446a..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/app/src/main/java/io/flutter/plugins/pathproviderexample/MainActivity.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.pathproviderexample; - -import dev.flutter.plugins.integration_test.IntegrationTestPlugin; -import io.flutter.embedding.android.FlutterActivity; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.plugins.pathprovider.PathProviderPlugin; - -public class MainActivity extends FlutterActivity { - // TODO(xster): Remove this once v2 of GeneratedPluginRegistrant rolls to stable. https://github.com/flutter/flutter/issues/42694 - @Override - public void configureFlutterEngine(FlutterEngine flutterEngine) { - flutterEngine.getPlugins().add(new PathProviderPlugin()); - flutterEngine.getPlugins().add(new IntegrationTestPlugin()); - } -} diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/path_provider/path_provider_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/packages/path_provider/path_provider_macos/example/android/build.gradle b/packages/path_provider/path_provider_macos/example/android/build.gradle deleted file mode 100644 index 541636cc492a..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/path_provider/path_provider_macos/example/android/gradle.properties b/packages/path_provider/path_provider_macos/example/android/gradle.properties deleted file mode 100644 index 38c8d4544ff1..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.enableR8=true -android.useAndroidX=true -android.enableJetifier=true diff --git a/packages/path_provider/path_provider_macos/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/path_provider/path_provider_macos/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index caf54fa2801c..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/packages/path_provider/path_provider_macos/example/android/settings.gradle b/packages/path_provider/path_provider_macos/example/android/settings.gradle deleted file mode 100644 index 6cb349eef1b6..000000000000 --- a/packages/path_provider/path_provider_macos/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} \ No newline at end of file diff --git a/packages/path_provider/path_provider_macos/pubspec.yaml b/packages/path_provider/path_provider_macos/pubspec.yaml index bcd45c8bd327..00ac8376fca9 100644 --- a/packages/path_provider/path_provider_macos/pubspec.yaml +++ b/packages/path_provider/path_provider_macos/pubspec.yaml @@ -3,7 +3,7 @@ description: macOS implementation of the path_provider plugin # 0.0.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.0.4+3 +version: 0.0.4+4 homepage: https://github.com/flutter/plugins/tree/master/packages/path_provider/path_provider_macos flutter: diff --git a/packages/url_launcher/url_launcher_macos/CHANGELOG.md b/packages/url_launcher/url_launcher_macos/CHANGELOG.md index 8948f50f976c..d52bf8c249e6 100644 --- a/packages/url_launcher/url_launcher_macos/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_macos/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.0.1+8 + +* Remove no-op android folder in the example app. + # 0.0.1+7 * Remove Android folder from url_launcher_web and url_launcher_macos. diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/build.gradle b/packages/url_launcher/url_launcher_macos/example/android/app/build.gradle deleted file mode 100644 index 7a6cf5df0d33..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/app/build.gradle +++ /dev/null @@ -1,60 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.plugins.urllauncherexample" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.2.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' -} diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/url_launcher/url_launcher_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a4f5ee..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/EmbeddingV1ActivityTest.java b/packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/EmbeddingV1ActivityTest.java deleted file mode 100644 index fb66478feed8..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/EmbeddingV1ActivityTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.urllauncherexample; - -import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.integration_test.FlutterTestRunner; -import org.junit.Rule; -import org.junit.runner.RunWith; - -@RunWith(FlutterTestRunner.class) -public class EmbeddingV1ActivityTest { - @Rule - public ActivityTestRule rule = - new ActivityTestRule<>(EmbeddingV1Activity.class); -} diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/FlutterActivityTest.java b/packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/FlutterActivityTest.java deleted file mode 100644 index 5b50523f7f40..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/app/src/androidTestDebug/java/io/flutter/plugins/urllauncherexample/FlutterActivityTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.flutter.plugins.urllauncherexample; - -import androidx.test.rule.ActivityTestRule; -import dev.flutter.plugins.integration_test.FlutterTestRunner; -import io.flutter.embedding.android.FlutterActivity; -import org.junit.Rule; -import org.junit.runner.RunWith; - -@RunWith(FlutterTestRunner.class) -public class FlutterActivityTest { - @Rule - public ActivityTestRule rule = new ActivityTestRule<>(FlutterActivity.class); -} diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/AndroidManifest.xml b/packages/url_launcher/url_launcher_macos/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 37035799fea8..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/EmbeddingV1Activity.java b/packages/url_launcher/url_launcher_macos/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/EmbeddingV1Activity.java deleted file mode 100644 index 39afc642ddb9..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/java/io/flutter/plugins/urllauncherexample/EmbeddingV1Activity.java +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.urllauncherexample; - -import android.os.Bundle; -import dev.flutter.plugins.integration_test.IntegrationTestPlugin; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.urllauncher.UrlLauncherPlugin; - -public class EmbeddingV1Activity extends FlutterActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - IntegrationTestPlugin.registerWith( - registrarFor("dev.flutter.plugins.integration_test.IntegrationTestPlugin")); - UrlLauncherPlugin.registerWith( - registrarFor("io.flutter.plugins.urllauncher.UrlLauncherPlugin")); - } -} diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/url_launcher/url_launcher_macos/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/packages/url_launcher/url_launcher_macos/example/android/build.gradle b/packages/url_launcher/url_launcher_macos/example/android/build.gradle deleted file mode 100644 index 6b1a639efd76..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/packages/url_launcher/url_launcher_macos/example/android/gradle.properties b/packages/url_launcher/url_launcher_macos/example/android/gradle.properties deleted file mode 100644 index a6738207fd15..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true -android.enableR8=true diff --git a/packages/url_launcher/url_launcher_macos/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/url_launcher/url_launcher_macos/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 1cedb28ea41f..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Wed Jul 31 20:16:04 BRT 2019 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/packages/url_launcher/url_launcher_macos/example/android/settings.gradle b/packages/url_launcher/url_launcher_macos/example/android/settings.gradle deleted file mode 100644 index 115da6cb4f4d..000000000000 --- a/packages/url_launcher/url_launcher_macos/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/packages/url_launcher/url_launcher_macos/pubspec.yaml b/packages/url_launcher/url_launcher_macos/pubspec.yaml index 5312921f2d72..4775f23fe36a 100644 --- a/packages/url_launcher/url_launcher_macos/pubspec.yaml +++ b/packages/url_launcher/url_launcher_macos/pubspec.yaml @@ -3,7 +3,7 @@ description: macOS implementation of the url_launcher plugin. # 0.0.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.0.1+7 +version: 0.0.1+8 homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_macos flutter: From f691799a61b7bf248b02e66d7aafdfdf90bb1a2c Mon Sep 17 00:00:00 2001 From: creativecreatorormaybenot Date: Wed, 16 Sep 2020 16:41:40 +0000 Subject: [PATCH 26/32] Update CODEOWNERS (#3034) --- CODEOWNERS | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 97f8bf388697..2d4bff36c9eb 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -4,22 +4,22 @@ # These names are just suggestions. It is fine to have your changes # reviewed by someone else. -packages/android_alarm_manager/* @bkonyi -packages/android_intent/* @mklim @matthew-carroll -packages/battery/* @amirh @matthew-carroll -packages/camera/* @bparrishMines -packages/connectivity/* @cyanglaz @matthew-carroll -packages/device_info/* @matthew-carroll -packages/espresso/* @collinjackson @adazh -packages/google_maps_flutter/* @cyanglaz -packages/google_sign_in/* @cyanglaz @mehmetf -packages/image_picker/* @cyanglaz -packages/integration_test/* @dnfield -packages/in_app_purchase/* @mklim @cyanglaz @LHLL -packages/ios_platform_images/* @gaaclarke -packages/package_info/* @cyanglaz @matthew-carroll -packages/path_provider/* @matthew-carroll -packages/shared_preferences/* @matthew-carroll -packages/url_launcher/* @mklim -packages/video_player/* @iskakaushik @cyanglaz -packages/webview_flutter/* @amirh +packages/android_alarm_manager/** @bkonyi +packages/android_intent/** @mklim @matthew-carroll +packages/battery/** @amirh @matthew-carroll +packages/camera/** @bparrishMines +packages/connectivity/** @cyanglaz @matthew-carroll +packages/device_info/** @matthew-carroll +packages/espresso/** @collinjackson @adazh +packages/google_maps_flutter/** @cyanglaz +packages/google_sign_in/** @cyanglaz @mehmetf +packages/image_picker/** @cyanglaz +packages/integration_test/** @dnfield +packages/in_app_purchase/** @mklim @cyanglaz @LHLL +packages/ios_platform_images/** @gaaclarke +packages/package_info/** @cyanglaz @matthew-carroll +packages/path_provider/** @matthew-carroll +packages/shared_preferences/** @matthew-carroll +packages/url_launcher/** @mklim +packages/video_player/** @iskakaushik @cyanglaz +packages/webview_flutter/** @amirh From 72254cf79d8d87efada8335b5f74cba4346c5f0e Mon Sep 17 00:00:00 2001 From: Hamdi Kahloun <32666446+hamdikahloun@users.noreply.github.com> Date: Thu, 17 Sep 2020 18:01:35 +0100 Subject: [PATCH 27/32] [share] MethodCallHandler.java uses unchecked or unsafe operations (#3004) --- packages/share/CHANGELOG.md | 4 ++++ packages/share/android/build.gradle | 5 +++++ .../flutter/plugins/share/MethodCallHandler.java | 14 ++++++++------ packages/share/pubspec.yaml | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/share/CHANGELOG.md b/packages/share/CHANGELOG.md index c4ee830ed34f..8037c75943df 100644 --- a/packages/share/CHANGELOG.md +++ b/packages/share/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.5+1 + +* Avoiding uses unchecked or unsafe Object Type Casting + ## 0.6.5 * Added support for sharing files diff --git a/packages/share/android/build.gradle b/packages/share/android/build.gradle index 7506f4db8261..ffa1432fa17a 100644 --- a/packages/share/android/build.gradle +++ b/packages/share/android/build.gradle @@ -1,5 +1,6 @@ group 'io.flutter.plugins.share' version '1.0-SNAPSHOT' +def args = ["-Xlint:deprecation","-Xlint:unchecked","-Werror"] buildscript { repositories { @@ -19,6 +20,10 @@ rootProject.allprojects { } } +project.getTasks().withType(JavaCompile){ + options.compilerArgs.addAll(args) +} + apply plugin: 'com.android.library' android { diff --git a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java index 02841d3a4ae2..99baabeab6b7 100644 --- a/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java +++ b/packages/share/android/src/main/java/io/flutter/plugins/share/MethodCallHandler.java @@ -25,19 +25,21 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { case "share": expectMapArguments(call); // Android does not support showing the share sheet at a particular point on screen. - share.share((String) call.argument("text"), (String) call.argument("subject")); + String text = call.argument("text"); + String subject = call.argument("subject"); + share.share(text, subject); result.success(null); break; case "shareFiles": expectMapArguments(call); + List paths = call.argument("paths"); + List mimeTypes = call.argument("mimeTypes"); + text = call.argument("text"); + subject = call.argument("subject"); // Android does not support showing the share sheet at a particular point on screen. try { - share.shareFiles( - (List) call.argument("paths"), - (List) call.argument("mimeTypes"), - (String) call.argument("text"), - (String) call.argument("subject")); + share.shareFiles(paths, mimeTypes, text, subject); result.success(null); } catch (IOException e) { result.error(e.getMessage(), null, null); diff --git a/packages/share/pubspec.yaml b/packages/share/pubspec.yaml index 918087b139ec..f9c1f4bad4e6 100644 --- a/packages/share/pubspec.yaml +++ b/packages/share/pubspec.yaml @@ -5,7 +5,7 @@ homepage: https://github.com/flutter/plugins/tree/master/packages/share # 0.6.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.6.5 +version: 0.6.5+1 flutter: plugin: From 53e0f20a581af3d803081d14db24d69d700e918b Mon Sep 17 00:00:00 2001 From: Hamdi Kahloun <32666446+hamdikahloun@users.noreply.github.com> Date: Thu, 17 Sep 2020 18:02:06 +0100 Subject: [PATCH 28/32] [camera] CameraPlugin.java uses or overrides a deprecated API (#3018) --- packages/camera/CHANGELOG.md | 4 ++++ packages/camera/android/build.gradle | 5 +++++ .../main/java/io/flutter/plugins/camera/CameraPlugin.java | 2 +- packages/camera/pubspec.yaml | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 2cf34dd55588..d405812bce6a 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.8+6 + +* Avoiding uses or overrides a deprecated API in CameraPlugin.java. + ## 0.5.8+5 * Fix compilation/availability issues on iOS. diff --git a/packages/camera/android/build.gradle b/packages/camera/android/build.gradle index 95f5a22cfb6d..3ff98a8d7f47 100644 --- a/packages/camera/android/build.gradle +++ b/packages/camera/android/build.gradle @@ -1,5 +1,6 @@ group 'io.flutter.plugins.camera' version '1.0-SNAPSHOT' +def args = ["-Xlint:deprecation","-Xlint:unchecked","-Werror"] buildscript { repositories { @@ -19,6 +20,10 @@ rootProject.allprojects { } } +project.getTasks().withType(JavaCompile){ + options.compilerArgs.addAll(args) +} + apply plugin: 'com.android.library' android { diff --git a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java index 2511898038bb..4c08b222ba77 100644 --- a/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java +++ b/packages/camera/android/src/main/java/io/flutter/plugins/camera/CameraPlugin.java @@ -70,7 +70,7 @@ public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { binding.getActivity(), flutterPluginBinding.getBinaryMessenger(), binding::addRequestPermissionsResultListener, - flutterPluginBinding.getFlutterEngine().getRenderer()); + flutterPluginBinding.getTextureRegistry()); } @Override diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index 01c7907792b2..9d1f7880df2d 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.8+5 +version: 0.5.8+6 homepage: https://github.com/flutter/plugins/tree/master/packages/camera From 15c2cb5a958849ea5a4b0d5665b171478402aaa7 Mon Sep 17 00:00:00 2001 From: Hamdi Kahloun <32666446+hamdikahloun@users.noreply.github.com> Date: Thu, 17 Sep 2020 18:02:23 +0100 Subject: [PATCH 29/32] [video_player] VideoPlayerPlugin.java uses or overrides a deprecated API (#3019) --- packages/video_player/video_player/CHANGELOG.md | 6 +++++- packages/video_player/video_player/android/build.gradle | 5 +++++ .../io/flutter/plugins/videoplayer/VideoPlayerPlugin.java | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 12d673170a44..f18e84239f6c 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,8 +1,12 @@ -## 0.10.12+3 +## 0.10.12+4 * Added isDurationIndefinite to support indefinite streams * Raised video_player_platform_interface in video_player to 2.1.1. +## 0.10.12+3 + +* Avoiding uses or overrides a deprecated API in `VideoPlayerPlugin` class. + ## 0.10.12+2 * Fix `setMixWithOthers` test. diff --git a/packages/video_player/video_player/android/build.gradle b/packages/video_player/video_player/android/build.gradle index edbb4c7acce4..12725f3f7142 100644 --- a/packages/video_player/video_player/android/build.gradle +++ b/packages/video_player/video_player/android/build.gradle @@ -1,5 +1,6 @@ group 'io.flutter.plugins.videoplayer' version '1.0-SNAPSHOT' +def args = ["-Xlint:deprecation","-Xlint:unchecked","-Werror"] buildscript { repositories { @@ -19,6 +20,10 @@ rootProject.allprojects { } } +project.getTasks().withType(JavaCompile){ + options.compilerArgs.addAll(args) +} + apply plugin: 'com.android.library' android { diff --git a/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java index a22a4f2d7ae4..77fd10a7a69b 100644 --- a/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java +++ b/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java @@ -60,7 +60,7 @@ public void onAttachedToEngine(FlutterPluginBinding binding) { binding.getBinaryMessenger(), FlutterMain::getLookupKeyForAsset, FlutterMain::getLookupKeyForAsset, - binding.getFlutterEngine().getRenderer()); + binding.getTextureRegistry()); flutterState.startListening(this, binding.getBinaryMessenger()); } From 7ceba0065f71b4903bd4ce974c65675c3acb9a9b Mon Sep 17 00:00:00 2001 From: Anniek Date: Thu, 17 Sep 2020 22:39:55 +0200 Subject: [PATCH 30/32] [image_picker] Updated docs getImage() about preference rear front not working on Android (#3037) --- packages/image_picker/image_picker/CHANGELOG.md | 4 ++++ packages/image_picker/image_picker/lib/image_picker.dart | 4 +++- packages/image_picker/image_picker/pubspec.yaml | 2 +- .../image_picker/image_picker_platform_interface/CHANGELOG.md | 4 ++++ .../lib/src/platform_interface/image_picker_platform.dart | 4 +++- .../image_picker/image_picker_platform_interface/pubspec.yaml | 2 +- 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 07447db130ca..100fe9989354 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.7+8 + +* Update documentation of getImage() about Android's disability to preference front/rear camera. + ## 0.6.7+7 * Updating documentation to use isEmpty check. diff --git a/packages/image_picker/image_picker/lib/image_picker.dart b/packages/image_picker/image_picker/lib/image_picker.dart index 7dd7e8e52469..6fe513dc25f1 100755 --- a/packages/image_picker/image_picker/lib/image_picker.dart +++ b/packages/image_picker/image_picker/lib/image_picker.dart @@ -87,7 +87,9 @@ class ImagePicker { /// /// Use `preferredCameraDevice` to specify the camera to use when the `source` is [ImageSource.camera]. /// The `preferredCameraDevice` is ignored when `source` is [ImageSource.gallery]. It is also ignored if the chosen camera is not supported on the device. - /// Defaults to [CameraDevice.rear]. + /// Defaults to [CameraDevice.rear]. Note that Android has no documented parameter for an intent to specify if + /// the front or rear camera should be opened, this function is not guaranteed + /// to work on an Android device. /// /// In Android, the MainActivity can be destroyed for various reasons. If that happens, the result will be lost /// in this call. You can then call [getLostData] when your app relaunches to retrieve the lost data. diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 91338f1e22ee..5a0dfdafe8c2 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker -version: 0.6.7+7 +version: 0.6.7+8 flutter: plugin: diff --git a/packages/image_picker/image_picker_platform_interface/CHANGELOG.md b/packages/image_picker/image_picker_platform_interface/CHANGELOG.md index 0a238bcd51bf..33c1cf8ddba7 100644 --- a/packages/image_picker/image_picker_platform_interface/CHANGELOG.md +++ b/packages/image_picker/image_picker_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.1 + +* Update documentation of getImage() about Android's disability to preference front/rear camera. + ## 1.1.0 * Introduce PickedFile type for the new API. diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart b/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart index 94be4c2f2ab1..38bf0858dd6f 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart @@ -132,7 +132,9 @@ abstract class ImagePickerPlatform extends PlatformInterface { /// /// Use `preferredCameraDevice` to specify the camera to use when the `source` is [ImageSource.camera]. /// The `preferredCameraDevice` is ignored when `source` is [ImageSource.gallery]. It is also ignored if the chosen camera is not supported on the device. - /// Defaults to [CameraDevice.rear]. + /// Defaults to [CameraDevice.rear]. Note that Android has no documented parameter for an intent to specify if + /// the front or rear camera should be opened, this function is not guaranteed + /// to work on an Android device. /// /// In Android, the MainActivity can be destroyed for various reasons. If that happens, the result will be lost /// in this call. You can then call [retrieveLostData] when your app relaunches to retrieve the lost data. diff --git a/packages/image_picker/image_picker_platform_interface/pubspec.yaml b/packages/image_picker/image_picker_platform_interface/pubspec.yaml index 946cf80c5187..2a5f9d0380d0 100644 --- a/packages/image_picker/image_picker_platform_interface/pubspec.yaml +++ b/packages/image_picker/image_picker_platform_interface/pubspec.yaml @@ -3,7 +3,7 @@ description: A common platform interface for the image_picker plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker_platform_interface # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.1.0 +version: 1.1.1 dependencies: flutter: From 2bc1f7e10e2bb2809e4399ddd06315653dd28dd1 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 18 Sep 2020 16:03:10 +0200 Subject: [PATCH 31/32] Removed unnecessary null checks --- packages/video_player/video_player/lib/video_player.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart index 0c2b3db821ac..2456740253dd 100644 --- a/packages/video_player/video_player/lib/video_player.dart +++ b/packages/video_player/video_player/lib/video_player.dart @@ -742,12 +742,12 @@ class _VideoProgressIndicatorState extends State { Widget build(BuildContext context) { Widget progressIndicator; if (controller.value.initialized) { - final int duration = controller.value.duration?.inMilliseconds ?? 0; - final int position = controller.value.position?.inMilliseconds ?? 0; + final int duration = controller.value.duration.inMilliseconds; + final int position = controller.value.position.inMilliseconds; int maxBuffering = 0; for (DurationRange range in controller.value.buffered) { - final int end = range.end?.inMilliseconds ?? 0; + final int end = range.end.inMilliseconds; if (end > maxBuffering) { maxBuffering = end; } From 46298789ed78de3ec90fad5f0b2605a13ad40211 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 18 Sep 2020 16:04:33 +0200 Subject: [PATCH 32/32] Updated version in pubspec.yaml --- packages/video_player/video_player/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index e53e08859115..f3ade7608aef 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter plugin for displaying inline video with other Flutter # 0.10.y+z is compatible with 1.0.0, if you land a breaking change bump # the version to 2.0.0. # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0 -version: 0.10.12+3 +version: 0.10.12+4 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player flutter: