From 907efcb4327c178c04a8531d55dcc2a848a93191 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Wed, 13 Nov 2019 14:02:28 +0100 Subject: [PATCH 01/14] Move plugin to subdir --- .../video_player/{ => video_player}/CHANGELOG.md | 0 packages/video_player/{ => video_player}/LICENSE | 0 packages/video_player/{ => video_player}/README.md | 2 +- .../{ => video_player}/android/build.gradle | 0 .../{ => video_player}/android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../{ => video_player}/android/settings.gradle | 0 .../android/src/main/AndroidManifest.xml | 0 .../plugins/videoplayer/QueuingEventSink.java | 0 .../plugins/videoplayer/VideoPlayerPlugin.java | 0 .../{ => video_player}/doc/demo_ipod.gif | Bin .../{ => video_player}/example/README.md | 0 .../{ => video_player}/example/android.iml | 0 .../example/android/app/build.gradle | 0 .../app/gradle/wrapper/gradle-wrapper.properties | 0 .../android/app/src/main/AndroidManifest.xml | 0 .../plugins/videoplayerexample/MainActivity.java | 0 .../app/src/main/res/drawable/launch_background.xml | 0 .../app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../app/src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../app/src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../android/app/src/main/res/values/styles.xml | 0 .../src/main/res/xml/network_security_config.xml | 0 .../{ => video_player}/example/android/build.gradle | 0 .../example/android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../example/android/settings.gradle | 0 .../example/assets/Butterfly-209.mp4 | Bin .../example/assets/flutter-mark-square-64.png | Bin .../example/ios/Flutter/AppFrameworkInfo.plist | 0 .../example/ios/Flutter/Debug.xcconfig | 0 .../example/ios/Flutter/Release.xcconfig | 0 .../example/ios/Runner.xcodeproj/project.pbxproj | 0 .../project.xcworkspace/contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../ios/Runner.xcworkspace/contents.xcworkspacedata | 0 .../example/ios/Runner/AppDelegate.h | 0 .../example/ios/Runner/AppDelegate.m | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../AppIcon.appiconset/Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../Assets.xcassets/LaunchImage.imageset/README.md | 0 .../ios/Runner/Base.lproj/LaunchScreen.storyboard | 0 .../example/ios/Runner/Base.lproj/Main.storyboard | 0 .../example/ios/Runner/Info.plist | 0 .../{ => video_player}/example/ios/Runner/main.m | 0 .../{ => video_player}/example/lib/main.dart | 0 .../{ => video_player}/example/pubspec.yaml | 0 .../example/video_player_example.iml | 0 .../example/video_player_example_android.iml | 0 .../{ => video_player}/ios/Assets/.gitkeep | 0 .../ios/Classes/VideoPlayerPlugin.h | 0 .../ios/Classes/VideoPlayerPlugin.m | 0 .../{ => video_player}/ios/video_player.podspec | 0 .../{ => video_player}/lib/video_player.dart | 0 .../video_player/{ => video_player}/pubspec.yaml | 2 +- .../{ => video_player}/test/video_player_test.dart | 0 .../{ => video_player}/video_player_android.iml | 0 76 files changed, 2 insertions(+), 2 deletions(-) rename packages/video_player/{ => video_player}/CHANGELOG.md (100%) rename packages/video_player/{ => video_player}/LICENSE (100%) rename packages/video_player/{ => video_player}/README.md (97%) rename packages/video_player/{ => video_player}/android/build.gradle (100%) rename packages/video_player/{ => video_player}/android/gradle.properties (100%) rename packages/video_player/{ => video_player}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/video_player/{ => video_player}/android/settings.gradle (100%) rename packages/video_player/{ => video_player}/android/src/main/AndroidManifest.xml (100%) rename packages/video_player/{ => video_player}/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java (100%) rename packages/video_player/{ => video_player}/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java (100%) rename packages/video_player/{ => video_player}/doc/demo_ipod.gif (100%) rename packages/video_player/{ => video_player}/example/README.md (100%) rename packages/video_player/{ => video_player}/example/android.iml (100%) rename packages/video_player/{ => video_player}/example/android/app/build.gradle (100%) rename packages/video_player/{ => video_player}/example/android/app/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/AndroidManifest.xml (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/MainActivity.java (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/drawable/launch_background.xml (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/values/styles.xml (100%) rename packages/video_player/{ => video_player}/example/android/app/src/main/res/xml/network_security_config.xml (100%) rename packages/video_player/{ => video_player}/example/android/build.gradle (100%) rename packages/video_player/{ => video_player}/example/android/gradle.properties (100%) rename packages/video_player/{ => video_player}/example/android/gradle/wrapper/gradle-wrapper.properties (100%) rename packages/video_player/{ => video_player}/example/android/settings.gradle (100%) rename packages/video_player/{ => video_player}/example/assets/Butterfly-209.mp4 (100%) rename packages/video_player/{ => video_player}/example/assets/flutter-mark-square-64.png (100%) rename packages/video_player/{ => video_player}/example/ios/Flutter/AppFrameworkInfo.plist (100%) rename packages/video_player/{ => video_player}/example/ios/Flutter/Debug.xcconfig (100%) rename packages/video_player/{ => video_player}/example/ios/Flutter/Release.xcconfig (100%) rename packages/video_player/{ => video_player}/example/ios/Runner.xcodeproj/project.pbxproj (100%) rename packages/video_player/{ => video_player}/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename packages/video_player/{ => video_player}/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename packages/video_player/{ => video_player}/example/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/AppDelegate.h (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/AppDelegate.m (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Base.lproj/Main.storyboard (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/Info.plist (100%) rename packages/video_player/{ => video_player}/example/ios/Runner/main.m (100%) rename packages/video_player/{ => video_player}/example/lib/main.dart (100%) rename packages/video_player/{ => video_player}/example/pubspec.yaml (100%) rename packages/video_player/{ => video_player}/example/video_player_example.iml (100%) rename packages/video_player/{ => video_player}/example/video_player_example_android.iml (100%) rename packages/video_player/{ => video_player}/ios/Assets/.gitkeep (100%) rename packages/video_player/{ => video_player}/ios/Classes/VideoPlayerPlugin.h (100%) rename packages/video_player/{ => video_player}/ios/Classes/VideoPlayerPlugin.m (100%) rename packages/video_player/{ => video_player}/ios/video_player.podspec (100%) rename packages/video_player/{ => video_player}/lib/video_player.dart (100%) rename packages/video_player/{ => video_player}/pubspec.yaml (95%) rename packages/video_player/{ => video_player}/test/video_player_test.dart (100%) rename packages/video_player/{ => video_player}/video_player_android.iml (100%) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md similarity index 100% rename from packages/video_player/CHANGELOG.md rename to packages/video_player/video_player/CHANGELOG.md diff --git a/packages/video_player/LICENSE b/packages/video_player/video_player/LICENSE similarity index 100% rename from packages/video_player/LICENSE rename to packages/video_player/video_player/LICENSE diff --git a/packages/video_player/README.md b/packages/video_player/video_player/README.md similarity index 97% rename from packages/video_player/README.md rename to packages/video_player/video_player/README.md index 6b7420600e51..eae8f6cb3a46 100644 --- a/packages/video_player/README.md +++ b/packages/video_player/video_player/README.md @@ -4,7 +4,7 @@ A Flutter plugin for iOS and Android for playing back video on a Widget surface. -![The example app running in iOS](https://github.com/flutter/plugins/blob/master/packages/video_player/doc/demo_ipod.gif?raw=true) +![The example app running in iOS](https://github.com/flutter/plugins/blob/master/packages/video_player/video_player/doc/demo_ipod.gif?raw=true) *Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback welcome](https://github.com/flutter/flutter/issues) and diff --git a/packages/video_player/android/build.gradle b/packages/video_player/video_player/android/build.gradle similarity index 100% rename from packages/video_player/android/build.gradle rename to packages/video_player/video_player/android/build.gradle diff --git a/packages/video_player/android/gradle.properties b/packages/video_player/video_player/android/gradle.properties similarity index 100% rename from packages/video_player/android/gradle.properties rename to packages/video_player/video_player/android/gradle.properties diff --git a/packages/video_player/android/gradle/wrapper/gradle-wrapper.properties b/packages/video_player/video_player/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/video_player/android/gradle/wrapper/gradle-wrapper.properties rename to packages/video_player/video_player/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/video_player/android/settings.gradle b/packages/video_player/video_player/android/settings.gradle similarity index 100% rename from packages/video_player/android/settings.gradle rename to packages/video_player/video_player/android/settings.gradle diff --git a/packages/video_player/android/src/main/AndroidManifest.xml b/packages/video_player/video_player/android/src/main/AndroidManifest.xml similarity index 100% rename from packages/video_player/android/src/main/AndroidManifest.xml rename to packages/video_player/video_player/android/src/main/AndroidManifest.xml diff --git a/packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java b/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java similarity index 100% rename from packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java rename to packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/QueuingEventSink.java diff --git a/packages/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 similarity index 100% rename from packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java rename to packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java diff --git a/packages/video_player/doc/demo_ipod.gif b/packages/video_player/video_player/doc/demo_ipod.gif similarity index 100% rename from packages/video_player/doc/demo_ipod.gif rename to packages/video_player/video_player/doc/demo_ipod.gif diff --git a/packages/video_player/example/README.md b/packages/video_player/video_player/example/README.md similarity index 100% rename from packages/video_player/example/README.md rename to packages/video_player/video_player/example/README.md diff --git a/packages/video_player/example/android.iml b/packages/video_player/video_player/example/android.iml similarity index 100% rename from packages/video_player/example/android.iml rename to packages/video_player/video_player/example/android.iml diff --git a/packages/video_player/example/android/app/build.gradle b/packages/video_player/video_player/example/android/app/build.gradle similarity index 100% rename from packages/video_player/example/android/app/build.gradle rename to packages/video_player/video_player/example/android/app/build.gradle diff --git a/packages/video_player/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/video_player/video_player/example/android/app/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/video_player/example/android/app/gradle/wrapper/gradle-wrapper.properties rename to packages/video_player/video_player/example/android/app/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/video_player/example/android/app/src/main/AndroidManifest.xml b/packages/video_player/video_player/example/android/app/src/main/AndroidManifest.xml similarity index 100% rename from packages/video_player/example/android/app/src/main/AndroidManifest.xml rename to packages/video_player/video_player/example/android/app/src/main/AndroidManifest.xml diff --git a/packages/video_player/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/MainActivity.java b/packages/video_player/video_player/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/MainActivity.java similarity index 100% rename from packages/video_player/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/MainActivity.java rename to packages/video_player/video_player/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/MainActivity.java diff --git a/packages/video_player/example/android/app/src/main/res/drawable/launch_background.xml b/packages/video_player/video_player/example/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from packages/video_player/example/android/app/src/main/res/drawable/launch_background.xml rename to packages/video_player/video_player/example/android/app/src/main/res/drawable/launch_background.xml diff --git a/packages/video_player/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/video_player/video_player/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from packages/video_player/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/video_player/video_player/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/packages/video_player/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/video_player/video_player/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from packages/video_player/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/video_player/video_player/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/packages/video_player/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/video_player/video_player/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from packages/video_player/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/video_player/video_player/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/packages/video_player/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/video_player/video_player/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from packages/video_player/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/video_player/video_player/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/packages/video_player/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/video_player/video_player/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from packages/video_player/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/video_player/video_player/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/packages/video_player/example/android/app/src/main/res/values/styles.xml b/packages/video_player/video_player/example/android/app/src/main/res/values/styles.xml similarity index 100% rename from packages/video_player/example/android/app/src/main/res/values/styles.xml rename to packages/video_player/video_player/example/android/app/src/main/res/values/styles.xml diff --git a/packages/video_player/example/android/app/src/main/res/xml/network_security_config.xml b/packages/video_player/video_player/example/android/app/src/main/res/xml/network_security_config.xml similarity index 100% rename from packages/video_player/example/android/app/src/main/res/xml/network_security_config.xml rename to packages/video_player/video_player/example/android/app/src/main/res/xml/network_security_config.xml diff --git a/packages/video_player/example/android/build.gradle b/packages/video_player/video_player/example/android/build.gradle similarity index 100% rename from packages/video_player/example/android/build.gradle rename to packages/video_player/video_player/example/android/build.gradle diff --git a/packages/video_player/example/android/gradle.properties b/packages/video_player/video_player/example/android/gradle.properties similarity index 100% rename from packages/video_player/example/android/gradle.properties rename to packages/video_player/video_player/example/android/gradle.properties diff --git a/packages/video_player/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/video_player/video_player/example/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from packages/video_player/example/android/gradle/wrapper/gradle-wrapper.properties rename to packages/video_player/video_player/example/android/gradle/wrapper/gradle-wrapper.properties diff --git a/packages/video_player/example/android/settings.gradle b/packages/video_player/video_player/example/android/settings.gradle similarity index 100% rename from packages/video_player/example/android/settings.gradle rename to packages/video_player/video_player/example/android/settings.gradle diff --git a/packages/video_player/example/assets/Butterfly-209.mp4 b/packages/video_player/video_player/example/assets/Butterfly-209.mp4 similarity index 100% rename from packages/video_player/example/assets/Butterfly-209.mp4 rename to packages/video_player/video_player/example/assets/Butterfly-209.mp4 diff --git a/packages/video_player/example/assets/flutter-mark-square-64.png b/packages/video_player/video_player/example/assets/flutter-mark-square-64.png similarity index 100% rename from packages/video_player/example/assets/flutter-mark-square-64.png rename to packages/video_player/video_player/example/assets/flutter-mark-square-64.png diff --git a/packages/video_player/example/ios/Flutter/AppFrameworkInfo.plist b/packages/video_player/video_player/example/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from packages/video_player/example/ios/Flutter/AppFrameworkInfo.plist rename to packages/video_player/video_player/example/ios/Flutter/AppFrameworkInfo.plist diff --git a/packages/video_player/example/ios/Flutter/Debug.xcconfig b/packages/video_player/video_player/example/ios/Flutter/Debug.xcconfig similarity index 100% rename from packages/video_player/example/ios/Flutter/Debug.xcconfig rename to packages/video_player/video_player/example/ios/Flutter/Debug.xcconfig diff --git a/packages/video_player/example/ios/Flutter/Release.xcconfig b/packages/video_player/video_player/example/ios/Flutter/Release.xcconfig similarity index 100% rename from packages/video_player/example/ios/Flutter/Release.xcconfig rename to packages/video_player/video_player/example/ios/Flutter/Release.xcconfig diff --git a/packages/video_player/example/ios/Runner.xcodeproj/project.pbxproj b/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from packages/video_player/example/ios/Runner.xcodeproj/project.pbxproj rename to packages/video_player/video_player/example/ios/Runner.xcodeproj/project.pbxproj diff --git a/packages/video_player/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/video_player/video_player/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/video_player/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to packages/video_player/video_player/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/packages/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/video_player/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from packages/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/video_player/video_player/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/packages/video_player/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/packages/video_player/video_player/example/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from packages/video_player/example/ios/Runner.xcworkspace/contents.xcworkspacedata rename to packages/video_player/video_player/example/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/packages/video_player/example/ios/Runner/AppDelegate.h b/packages/video_player/video_player/example/ios/Runner/AppDelegate.h similarity index 100% rename from packages/video_player/example/ios/Runner/AppDelegate.h rename to packages/video_player/video_player/example/ios/Runner/AppDelegate.h diff --git a/packages/video_player/example/ios/Runner/AppDelegate.m b/packages/video_player/video_player/example/ios/Runner/AppDelegate.m similarity index 100% rename from packages/video_player/example/ios/Runner/AppDelegate.m rename to packages/video_player/video_player/example/ios/Runner/AppDelegate.m diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from packages/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to packages/video_player/video_player/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/packages/video_player/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/video_player/video_player/example/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from packages/video_player/example/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to packages/video_player/video_player/example/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/packages/video_player/example/ios/Runner/Base.lproj/Main.storyboard b/packages/video_player/video_player/example/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from packages/video_player/example/ios/Runner/Base.lproj/Main.storyboard rename to packages/video_player/video_player/example/ios/Runner/Base.lproj/Main.storyboard diff --git a/packages/video_player/example/ios/Runner/Info.plist b/packages/video_player/video_player/example/ios/Runner/Info.plist similarity index 100% rename from packages/video_player/example/ios/Runner/Info.plist rename to packages/video_player/video_player/example/ios/Runner/Info.plist diff --git a/packages/video_player/example/ios/Runner/main.m b/packages/video_player/video_player/example/ios/Runner/main.m similarity index 100% rename from packages/video_player/example/ios/Runner/main.m rename to packages/video_player/video_player/example/ios/Runner/main.m diff --git a/packages/video_player/example/lib/main.dart b/packages/video_player/video_player/example/lib/main.dart similarity index 100% rename from packages/video_player/example/lib/main.dart rename to packages/video_player/video_player/example/lib/main.dart diff --git a/packages/video_player/example/pubspec.yaml b/packages/video_player/video_player/example/pubspec.yaml similarity index 100% rename from packages/video_player/example/pubspec.yaml rename to packages/video_player/video_player/example/pubspec.yaml diff --git a/packages/video_player/example/video_player_example.iml b/packages/video_player/video_player/example/video_player_example.iml similarity index 100% rename from packages/video_player/example/video_player_example.iml rename to packages/video_player/video_player/example/video_player_example.iml diff --git a/packages/video_player/example/video_player_example_android.iml b/packages/video_player/video_player/example/video_player_example_android.iml similarity index 100% rename from packages/video_player/example/video_player_example_android.iml rename to packages/video_player/video_player/example/video_player_example_android.iml diff --git a/packages/video_player/ios/Assets/.gitkeep b/packages/video_player/video_player/ios/Assets/.gitkeep similarity index 100% rename from packages/video_player/ios/Assets/.gitkeep rename to packages/video_player/video_player/ios/Assets/.gitkeep diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.h b/packages/video_player/video_player/ios/Classes/VideoPlayerPlugin.h similarity index 100% rename from packages/video_player/ios/Classes/VideoPlayerPlugin.h rename to packages/video_player/video_player/ios/Classes/VideoPlayerPlugin.h diff --git a/packages/video_player/ios/Classes/VideoPlayerPlugin.m b/packages/video_player/video_player/ios/Classes/VideoPlayerPlugin.m similarity index 100% rename from packages/video_player/ios/Classes/VideoPlayerPlugin.m rename to packages/video_player/video_player/ios/Classes/VideoPlayerPlugin.m diff --git a/packages/video_player/ios/video_player.podspec b/packages/video_player/video_player/ios/video_player.podspec similarity index 100% rename from packages/video_player/ios/video_player.podspec rename to packages/video_player/video_player/ios/video_player.podspec diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/video_player/lib/video_player.dart similarity index 100% rename from packages/video_player/lib/video_player.dart rename to packages/video_player/video_player/lib/video_player.dart diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml similarity index 95% rename from packages/video_player/pubspec.yaml rename to packages/video_player/video_player/pubspec.yaml index 1b0805be1764..12fe522414ea 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team version: 0.10.2+6 -homepage: https://github.com/flutter/plugins/tree/master/packages/video_player +homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player flutter: plugin: diff --git a/packages/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart similarity index 100% rename from packages/video_player/test/video_player_test.dart rename to packages/video_player/video_player/test/video_player_test.dart diff --git a/packages/video_player/video_player_android.iml b/packages/video_player/video_player/video_player_android.iml similarity index 100% rename from packages/video_player/video_player_android.iml rename to packages/video_player/video_player/video_player_android.iml From 074afdb71726d8fd69bd8a25fff1dc78dcf6457b Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Wed, 13 Nov 2019 16:04:25 +0100 Subject: [PATCH 02/14] Add video_player_platform_interface --- .../CHANGELOG.md | 3 + .../video_player_platform_interface/LICENSE | 27 +++ .../video_player_platform_interface/README.md | 26 +++ .../lib/method_channel_video_player.dart | 96 ++++++++ .../lib/video_player_platform_interface.dart | 99 ++++++++ .../pubspec.yaml | 21 ++ .../method_channel_video_player_test.dart | 221 ++++++++++++++++++ script/build_all_plugins_app.sh | 11 +- 8 files changed, 503 insertions(+), 1 deletion(-) create mode 100644 packages/video_player/video_player_platform_interface/CHANGELOG.md create mode 100644 packages/video_player/video_player_platform_interface/LICENSE create mode 100644 packages/video_player/video_player_platform_interface/README.md create mode 100644 packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart create mode 100644 packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart create mode 100644 packages/video_player/video_player_platform_interface/pubspec.yaml create mode 100644 packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart diff --git a/packages/video_player/video_player_platform_interface/CHANGELOG.md b/packages/video_player/video_player_platform_interface/CHANGELOG.md new file mode 100644 index 000000000000..0d8803f93540 --- /dev/null +++ b/packages/video_player/video_player_platform_interface/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +* Initial release. diff --git a/packages/video_player/video_player_platform_interface/LICENSE b/packages/video_player/video_player_platform_interface/LICENSE new file mode 100644 index 000000000000..c89293372cf3 --- /dev/null +++ b/packages/video_player/video_player_platform_interface/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2017 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/video_player/video_player_platform_interface/README.md b/packages/video_player/video_player_platform_interface/README.md new file mode 100644 index 000000000000..02ba8e7166fe --- /dev/null +++ b/packages/video_player/video_player_platform_interface/README.md @@ -0,0 +1,26 @@ +# video_player_platform_interface + +A common platform interface for the [`video_player`][1] plugin. + +This interface allows platform-specific implementations of the `video_player` +plugin, as well as the plugin itself, to ensure they are supporting the +same interface. + +# Usage + +To implement a new platform-specific implementation of `video_player`, extend +[`VideoPlayerPlatform`][2] with an implementation that performs the +platform-specific behavior, and when you register your plugin, set the default +`VideoPlayerPlatform` by calling +`VideoPlayerPlatform.instance = MyPlatformVideoPlayer()`. + +# Note on breaking changes + +Strongly prefer non-breaking changes (such as adding a method to the interface) +over breaking changes for this package. + +See https://flutter.dev/go/platform-interface-breaking-changes for a discussion +on why a less-clean interface is preferable to a breaking change. + +[1]: ../video_player +[2]: lib/video_player_platform_interface.dart diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart new file mode 100644 index 000000000000..06f219963ec8 --- /dev/null +++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart @@ -0,0 +1,96 @@ +// 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 'dart:async'; + +import 'package:flutter/services.dart'; + +import 'video_player_platform_interface.dart'; + +const MethodChannel _channel = MethodChannel('flutter.io/videoPlayer'); + +/// An implementation of [VideoPlayerPlatform] that uses method channels. +class MethodChannelVideoPlayer extends VideoPlayerPlatform { + @override + Future init() { + return _channel.invokeMethod('init'); + } + + @override + Future dispose(int textureId) { + return _channel.invokeMethod( + 'dispose', + {'textureId': textureId}, + ); + } + + @override + Future create(Map dataSourceDescription) async { + final Map response = + await _channel.invokeMapMethod( + 'create', + dataSourceDescription, + ); + return response['textureId']; + } + + @override + Future setLooping(int textureId, bool looping) { + return _channel.invokeMethod( + 'setLooping', + { + 'textureId': textureId, + 'looping': looping, + }, + ); + } + + @override + Future play(int textureId) { + return _channel.invokeMethod( + 'play', + {'textureId': textureId}, + ); + } + + @override + Future pause(int textureId) { + return _channel.invokeMethod( + 'pause', + {'textureId': textureId}, + ); + } + + @override + Future setVolume(int textureId, double volume) { + return _channel.invokeMethod( + 'setVolume', + { + 'textureId': textureId, + 'volume': volume, + }, + ); + } + + @override + Future seekTo(int textureId, int milliseconds) { + return _channel.invokeMethod( + 'seekTo', + { + 'textureId': textureId, + 'location': milliseconds, + }, + ); + } + + @override + Future getPosition(int textureId) async { + return Duration( + milliseconds: await _channel.invokeMethod( + 'position', + {'textureId': textureId}, + ), + ); + } +} diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart new file mode 100644 index 000000000000..025667add50e --- /dev/null +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -0,0 +1,99 @@ +// 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 'dart:async'; + +import 'package:meta/meta.dart' show required, visibleForTesting; + +import 'method_channel_video_player.dart'; + +/// The interface that implementations of video_player must implement. +/// +/// Platform implementations should extend this class rather than implement it as `video_player` +/// does not consider newly added methods to be breaking changes. Extending this class +/// (using `extends`) ensures that the subclass will get the default implementation, while +/// platform implementations that `implements` this interface will be broken by newly added +/// [VideoPlayerPlatform] methods. +abstract class VideoPlayerPlatform { + /// Only mock implementations should set this to true. + /// + /// Mockito mocks are implementing this class with `implements` which is forbidden for anything + /// other than mocks (see class docs). This property provides a backdoor for mockito mocks to + /// skip the verification that the class isn't implemented with `implements`. + @visibleForTesting + bool get isMock => false; + + /// The default instance of [VideoPlayerPlatform] to use. + /// + /// Platform-specific plugins should override this with their own + /// platform-specific class that extends [VideoPlayerPlatform] when they + /// register themselves. + /// + /// Defaults to [MethodChannelVideoPlayer]. + static VideoPlayerPlatform _instance = MethodChannelVideoPlayer(); + + static VideoPlayerPlatform get instance => _instance; + + // TODO(amirh): Extract common platform interface logic. + // https://github.com/flutter/flutter/issues/43368 + static set instance(VideoPlayerPlatform instance) { + if (!instance.isMock) { + try { + instance._verifyProvidesDefaultImplementations(); + } on NoSuchMethodError catch (_) { + throw AssertionError( + 'Platform interfaces must not be implemented with `implements`'); + } + } + _instance = instance; + } + + /// Clears all open videos. + Future init() { + throw UnimplementedError('init() has not been implemented.'); + } + + /// Clears one video. + Future dispose(int textureId) { + throw UnimplementedError('dispose() has not been implemented.'); + } + + Future create( + Map dataSourceDescription, + ) { + throw UnimplementedError('create() has not been implemented.'); + } + + Future setLooping(int textureId, bool looping) { + throw UnimplementedError('setLooping() has not been implemented.'); + } + + Future play(int textureId) { + throw UnimplementedError('play() has not been implemented.'); + } + + Future pause(int textureId) { + throw UnimplementedError('pause() has not been implemented.'); + } + + Future setVolume(int textureId, double volume) { + throw UnimplementedError('setVolume() has not been implemented.'); + } + + Future seekTo(int textureId, int milliseconds) { + throw UnimplementedError('seekTo() has not been implemented.'); + } + + Future getPosition(int textureId) { + throw UnimplementedError('getPosition() has not been implemented.'); + } + + // This method makes sure that VideoPlayer isn't implemented with `implements`. + // + // See class doc for more details on why implementing this class is forbidden. + // + // This private method is called by the instance setter, which fails if the class is + // implemented with `implements`. + void _verifyProvidesDefaultImplementations() {} +} diff --git a/packages/video_player/video_player_platform_interface/pubspec.yaml b/packages/video_player/video_player_platform_interface/pubspec.yaml new file mode 100644 index 000000000000..bf4d4c03bce3 --- /dev/null +++ b/packages/video_player/video_player_platform_interface/pubspec.yaml @@ -0,0 +1,21 @@ +name: video_player_platform_interface +description: A common platform interface for the video_player plugin. +author: Flutter Team +homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player_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.0.0 + +dependencies: + flutter: + sdk: flutter + meta: ^1.0.5 + +dev_dependencies: + flutter_test: + sdk: flutter + mockito: ^4.1.1 + +environment: + sdk: ">=2.0.0-dev.28.0 <3.0.0" + flutter: ">=1.9.1+hotfix.4 <2.0.0" diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart new file mode 100644 index 000000000000..a0982c532341 --- /dev/null +++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart @@ -0,0 +1,221 @@ +// 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:mockito/mockito.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:video_player_platform_interface/method_channel_video_player.dart'; +import 'package:video_player_platform_interface/video_player_platform_interface.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('$VideoPlayerPlatform', () { + test('$MethodChannelVideoPlayer() is the default instance', () { + expect(VideoPlayerPlatform.instance, + isInstanceOf()); + }); + + test('Cannot be implemented with `implements`', () { + expect(() { + VideoPlayerPlatform.instance = ImplementsVideoPlayerPlatform(); + }, throwsA(isInstanceOf())); + }); + + test('Can be mocked with `implements`', () { + final ImplementsVideoPlayerPlatform mock = + ImplementsVideoPlayerPlatform(); + when(mock.isMock).thenReturn(true); + VideoPlayerPlatform.instance = mock; + }); + + test('Can be extended', () { + VideoPlayerPlatform.instance = ExtendsVideoPlayerPlatform(); + }); + }); + + group('$MethodChannelVideoPlayer', () { + const MethodChannel channel = MethodChannel('flutter.io/videoPlayer'); + final List log = []; + final MethodChannelVideoPlayer player = MethodChannelVideoPlayer(); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + log.add(methodCall); + }); + }); + + tearDown(() { + log.clear(); + }); + + test('init', () async { + await player.init(); + expect( + log, + [isMethodCall('init', arguments: null)], + ); + }); + + test('dispose', () async { + await player.dispose(1); + expect( + log, + [ + isMethodCall('dispose', arguments: { + 'textureId': 1, + }) + ], + ); + }); + + test('create with asset', () async { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + log.add(methodCall); + return {'textureId': 3}; + }); + final int textureId = await player.create({ + 'asset': 'someAsset', + 'package': 'somePacket', + }); + expect( + log, + [ + isMethodCall('create', arguments: { + 'asset': 'someAsset', + 'package': 'somePacket' + }) + ], + ); + expect(textureId, 3); + }); + + test('create with network', () async { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + log.add(methodCall); + return {'textureId': 3}; + }); + final int textureId = await player.create({ + 'uri': 'someUri', + 'formatHint': 'dash', + }); + expect( + log, + [ + isMethodCall('create', arguments: { + 'uri': 'someUri', + 'formatHint': 'dash' + }) + ], + ); + expect(textureId, 3); + }); + + test('create with file', () async { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + log.add(methodCall); + return {'textureId': 3}; + }); + final int textureId = await player.create({ + 'uri': 'someUri', + }); + expect( + log, + [ + isMethodCall('create', arguments: { + 'uri': 'someUri', + }) + ], + ); + expect(textureId, 3); + }); + + test('setLooping', () async { + await player.setLooping(1, true); + expect( + log, + [ + isMethodCall('setLooping', arguments: { + 'textureId': 1, + 'looping': true, + }) + ], + ); + }); + + test('play', () async { + await player.play(1); + expect( + log, + [ + isMethodCall('play', arguments: { + 'textureId': 1, + }) + ], + ); + }); + + test('pause', () async { + await player.pause(1); + expect( + log, + [ + isMethodCall('pause', arguments: { + 'textureId': 1, + }) + ], + ); + }); + + test('setVolume', () async { + await player.setVolume(1, 0.7); + expect( + log, + [ + isMethodCall('setVolume', arguments: { + 'textureId': 1, + 'volume': 0.7, + }) + ], + ); + }); + + test('seekTo', () async { + await player.seekTo(1, 12345); + expect( + log, + [ + isMethodCall('seekTo', arguments: { + 'textureId': 1, + 'location': 12345, + }) + ], + ); + }); + + test('getPosition', () async { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + log.add(methodCall); + return 234; + }); + + final Duration position = await player.getPosition(1); + expect( + log, + [ + isMethodCall('position', arguments: { + 'textureId': 1, + }) + ], + ); + expect(position, Duration(milliseconds: 234)); + }); + }); +} + +class ImplementsVideoPlayerPlatform extends Mock + implements VideoPlayerPlatform {} + +class ExtendsVideoPlayerPlatform extends VideoPlayerPlatform {} diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index 5ba4b6e5ce02..1028ee607386 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -10,7 +10,16 @@ readonly REPO_DIR="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/common.sh" check_changed_packages > /dev/null -(cd "$REPO_DIR" && pub global run flutter_plugin_tools all-plugins-app --exclude instrumentation_adapter,url_launcher_platform_interface) +readonly EXCLUDED_PLUGINS_LIST=( + "instrumentation_adapter" + "url_launcher_platform_interface" + "google_sign_in_platform_interface" + "video_player_platform_interface" +) +# Comma-separated string of the list above +readonly EXCLUDED=$(IFS=, ; echo "${EXCLUDED_PLUGINS_LIST[*]}") + +(cd "$REPO_DIR" && pub global run flutter_plugin_tools all-plugins-app --exclude $EXCLUDED) function error() { echo "$@" 1>&2 From c80aa82bca9886d2540b4187e79c8d6456691c75 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Wed, 13 Nov 2019 20:34:59 +0100 Subject: [PATCH 03/14] Make analyzer happy --- .../lib/video_player_platform_interface.dart | 2 +- .../test/method_channel_video_player_test.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index 025667add50e..f80dd5baa4a1 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -4,7 +4,7 @@ import 'dart:async'; -import 'package:meta/meta.dart' show required, visibleForTesting; +import 'package:meta/meta.dart' show visibleForTesting; import 'method_channel_video_player.dart'; diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart index a0982c532341..16f49d4b10d6 100644 --- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart +++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart @@ -210,7 +210,7 @@ void main() { }) ], ); - expect(position, Duration(milliseconds: 234)); + expect(position, const Duration(milliseconds: 234)); }); }); } From 0c2ff58fd353b0a856d0bd029f6196f17aa108b0 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Wed, 13 Nov 2019 22:22:50 +0100 Subject: [PATCH 04/14] Improve documentation --- .../lib/video_player_platform_interface.dart | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index f80dd5baa4a1..1dfbc2087de2 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -49,7 +49,10 @@ abstract class VideoPlayerPlatform { _instance = instance; } - /// Clears all open videos. + /// Initializes the platform interface and disposes all existing players. + /// + /// This method is called when the plugin is first initialized + /// and on every full restart. Future init() { throw UnimplementedError('init() has not been implemented.'); } @@ -59,32 +62,46 @@ abstract class VideoPlayerPlatform { throw UnimplementedError('dispose() has not been implemented.'); } + /// Creates an instance of a video player. + /// + /// For network and file sources [dataSourceDescription] needs to have a + /// [uri] key. Optionally you can set a [formatHint]. + /// + /// For assets the [asset] key is mandatory. Optionally you can specify + /// the [package]. + /// TODO (cbenhagen): create a [DataSourceDescription] class Future create( Map dataSourceDescription, ) { throw UnimplementedError('create() has not been implemented.'); } + /// Sets the looping attribute of the video. Future setLooping(int textureId, bool looping) { throw UnimplementedError('setLooping() has not been implemented.'); } + /// Starts the video playback. Future play(int textureId) { throw UnimplementedError('play() has not been implemented.'); } + /// Stops the video playback. Future pause(int textureId) { throw UnimplementedError('pause() has not been implemented.'); } + /// Sets the volume to a range between 0.0 and 1.0. Future setVolume(int textureId, double volume) { throw UnimplementedError('setVolume() has not been implemented.'); } + /// Sets the video position to [milliseconds] from the start. Future seekTo(int textureId, int milliseconds) { throw UnimplementedError('seekTo() has not been implemented.'); } + /// Gets the video position as [Duration] from the start. Future getPosition(int textureId) { throw UnimplementedError('getPosition() has not been implemented.'); } From 2d54db2bfa86dc10e8d88dde88a8177a199f5d68 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Wed, 13 Nov 2019 22:56:24 +0100 Subject: [PATCH 05/14] Bump version and update changelog --- packages/video_player/video_player/CHANGELOG.md | 4 ++++ packages/video_player/video_player/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 759c955e39df..c5284a2d1c24 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.4 + +* Add platform interface. + ## 0.10.3 * Add support for the v2 Android embedding. This shouldn't impact existing diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 4f43d48a7438..6463c8bcdf34 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.3 +version: 0.10.4 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player flutter: From 68e9918c547af48cd42e30b6bebfef3c4966db99 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 00:23:45 +0100 Subject: [PATCH 06/14] Add stream of VideoEvent --- .../lib/method_channel_video_player.dart | 27 +++++++++++++++++++ .../lib/video_player_platform_interface.dart | 16 ++++++++++- .../method_channel_video_player_test.dart | 27 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart index 06f219963ec8..a4aa576af1d4 100644 --- a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart +++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart @@ -93,4 +93,31 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { ), ); } + + @override + Stream videoEventsFor(int textureId) { + return _eventChannelFor(textureId) + .receiveBroadcastStream() + .map((dynamic event) { + final Map map = event; + switch (map['event']) { + case 'initialized': + return VideoEvent.initialized; + case 'completed': + return VideoEvent.completed; + case 'bufferingUpdate': + return VideoEvent.bufferingUpdate; + case 'bufferingStart': + return VideoEvent.bufferingStart; + case 'bufferingEnd': + return VideoEvent.bufferingEnd; + default: + return VideoEvent.unknown; + } + }); + } + + EventChannel _eventChannelFor(int textureId) { + return EventChannel('flutter.io/videoPlayer/videoEvents$textureId'); + } } diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index 1dfbc2087de2..121874db6dff 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -69,13 +69,18 @@ abstract class VideoPlayerPlatform { /// /// For assets the [asset] key is mandatory. Optionally you can specify /// the [package]. - /// TODO (cbenhagen): create a [DataSourceDescription] class + /// TODO (cbenhagen): create a [DataSource] class Future create( Map dataSourceDescription, ) { throw UnimplementedError('create() has not been implemented.'); } + /// Returns a Stream of [VideoEvent]s. + Stream videoEventsFor(int textureId) { + throw UnimplementedError('videoEventsFor() has not been implemented.'); + } + /// Sets the looping attribute of the video. Future setLooping(int textureId, bool looping) { throw UnimplementedError('setLooping() has not been implemented.'); @@ -114,3 +119,12 @@ abstract class VideoPlayerPlatform { // implemented with `implements`. void _verifyProvidesDefaultImplementations() {} } + +enum VideoEvent { + initialized, + completed, + bufferingUpdate, + bufferingStart, + bufferingEnd, + unknown, +} \ No newline at end of file diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart index 16f49d4b10d6..4c388f0bc737 100644 --- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart +++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; + import 'package:mockito/mockito.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -212,6 +214,31 @@ void main() { ); expect(position, const Duration(milliseconds: 234)); }); + + test('videoEventsFor', () async { + defaultBinaryMessenger.setMockMessageHandler( + "flutter.io/videoPlayer/videoEvents123", + (ByteData message) async { + final MethodCall methodCall = + const StandardMethodCodec().decodeMethodCall(message); + if (methodCall.method == 'listen') { + defaultBinaryMessenger.handlePlatformMessage( + "flutter.io/videoPlayer/videoEvents123", + const StandardMethodCodec().encodeSuccessEnvelope( + {'event': 'initialized'}), + (ByteData data) {}); + + return const StandardMethodCodec().encodeSuccessEnvelope(null); + } else if (methodCall.method == 'cancel') { + return const StandardMethodCodec().encodeSuccessEnvelope(null); + } else { + fail('Expected listen or cancel'); + } + }, + ); + final Stream videoEvents = player.videoEventsFor(123); + expect(await videoEvents.first, VideoEvent.initialized); + }); }); } From 1ec7ca22f85a1e3c917ff05796cea3b6acb623b1 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 00:47:04 +0100 Subject: [PATCH 07/14] Ignore deprecated_member_use --- .../lib/video_player_platform_interface.dart | 2 +- .../test/method_channel_video_player_test.dart | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index 121874db6dff..b14b12e7df97 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -127,4 +127,4 @@ enum VideoEvent { bufferingStart, bufferingEnd, unknown, -} \ No newline at end of file +} diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart index 4c388f0bc737..ee321c97e9e8 100644 --- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart +++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart @@ -216,12 +216,20 @@ void main() { }); test('videoEventsFor', () async { + // TODO(cbenhagen): This has been deprecated and should be replaced + // with `ServicesBinding.instance.defaultBinaryMessenger` when it's + // available on all the versions of Flutter that we test. + // ignore: deprecated_member_use defaultBinaryMessenger.setMockMessageHandler( "flutter.io/videoPlayer/videoEvents123", (ByteData message) async { final MethodCall methodCall = const StandardMethodCodec().decodeMethodCall(message); if (methodCall.method == 'listen') { + // TODO(cbenhagen): This has been deprecated and should be replaced + // with `ServicesBinding.instance.defaultBinaryMessenger` when it's + // available on all the versions of Flutter that we test. + // ignore: deprecated_member_use defaultBinaryMessenger.handlePlatformMessage( "flutter.io/videoPlayer/videoEvents123", const StandardMethodCodec().encodeSuccessEnvelope( From 22f7a46963e6ef382e466ae2da9e7d149acbcd20 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 01:09:28 +0100 Subject: [PATCH 08/14] Improve changelog message and version --- packages/video_player/video_player/CHANGELOG.md | 4 ++-- packages/video_player/video_player/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index c5284a2d1c24..c942420433d7 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,6 +1,6 @@ -## 0.10.4 +## 0.10.3+1 -* Add platform interface. +* Update the homepage to point to the new plugin location ## 0.10.3 diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml index 6463c8bcdf34..ec3931fe0255 100644 --- a/packages/video_player/video_player/pubspec.yaml +++ b/packages/video_player/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.10.4 +version: 0.10.3+1 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player flutter: From aaec59194ef164e4cbd599019fcc9089a78431cf Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 10:37:25 +0100 Subject: [PATCH 09/14] Use DataSource class --- .../lib/method_channel_video_player.dart | 30 +++++++++++++++- .../lib/video_player_platform_interface.dart | 36 ++++++++++++++++--- .../method_channel_video_player_test.dart | 27 +++++++------- 3 files changed, 75 insertions(+), 18 deletions(-) diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart index a4aa576af1d4..c2883909a822 100644 --- a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart +++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart @@ -26,7 +26,27 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { } @override - Future create(Map dataSourceDescription) async { + Future create(DataSource dataSource) async { + Map dataSourceDescription; + + switch (dataSource.sourceType) { + case DataSourceType.asset: + dataSourceDescription = { + 'asset': dataSource.asset, + 'package': dataSource.package, + }; + break; + case DataSourceType.network: + dataSourceDescription = { + 'uri': dataSource.uri, + 'formatHint': _videoFormatStringMap[dataSource.formatHint] + }; + break; + case DataSourceType.file: + dataSourceDescription = {'uri': dataSource.uri}; + break; + } + final Map response = await _channel.invokeMapMethod( 'create', @@ -120,4 +140,12 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { EventChannel _eventChannelFor(int textureId) { return EventChannel('flutter.io/videoPlayer/videoEvents$textureId'); } + + static const Map _videoFormatStringMap = + { + FormatHint.ss: 'ss', + FormatHint.hls: 'hls', + FormatHint.dash: 'dash', + FormatHint.other: 'other', + }; } diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index b14b12e7df97..d01898fcba7f 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -4,7 +4,7 @@ import 'dart:async'; -import 'package:meta/meta.dart' show visibleForTesting; +import 'package:meta/meta.dart' show required, visibleForTesting; import 'method_channel_video_player.dart'; @@ -69,10 +69,7 @@ abstract class VideoPlayerPlatform { /// /// For assets the [asset] key is mandatory. Optionally you can specify /// the [package]. - /// TODO (cbenhagen): create a [DataSource] class - Future create( - Map dataSourceDescription, - ) { + Future create(DataSource dataSource) { throw UnimplementedError('create() has not been implemented.'); } @@ -120,6 +117,35 @@ abstract class VideoPlayerPlatform { void _verifyProvidesDefaultImplementations() {} } +class DataSource { + DataSource({ + @required this.sourceType, + this.uri, + this.formatHint, + this.asset, + this.package, + }); + + final DataSourceType sourceType; + final String uri; + final FormatHint formatHint; + final String asset; + final String package; +} + +enum DataSourceType { + asset, + network, + file, +} + +enum FormatHint { + dash, + hls, + ss, + other, +} + enum VideoEvent { initialized, completed, diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart index ee321c97e9e8..923cf9d560ba 100644 --- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart +++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart @@ -78,16 +78,17 @@ void main() { log.add(methodCall); return {'textureId': 3}; }); - final int textureId = await player.create({ - 'asset': 'someAsset', - 'package': 'somePacket', - }); + final int textureId = await player.create(DataSource( + sourceType: DataSourceType.asset, + asset: 'someAsset', + package: 'somePackage', + )); expect( log, [ isMethodCall('create', arguments: { 'asset': 'someAsset', - 'package': 'somePacket' + 'package': 'somePackage', }) ], ); @@ -99,10 +100,11 @@ void main() { log.add(methodCall); return {'textureId': 3}; }); - final int textureId = await player.create({ - 'uri': 'someUri', - 'formatHint': 'dash', - }); + final int textureId = await player.create(DataSource( + sourceType: DataSourceType.network, + uri: 'someUri', + formatHint: FormatHint.dash, + )); expect( log, [ @@ -120,9 +122,10 @@ void main() { log.add(methodCall); return {'textureId': 3}; }); - final int textureId = await player.create({ - 'uri': 'someUri', - }); + final int textureId = await player.create(DataSource( + sourceType: DataSourceType.file, + uri: 'someUri', + )); expect( log, [ From 1a12b166338055d79772f37f501293803e0c139a Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 12:05:24 +0100 Subject: [PATCH 10/14] Add duration, size and buffering to VideoEvent --- .../lib/method_channel_video_player.dart | 45 ++++++++++++++----- .../lib/video_player_platform_interface.dart | 41 +++++++++++++++-- .../method_channel_video_player_test.dart | 22 +++++++-- 3 files changed, 88 insertions(+), 20 deletions(-) diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart index c2883909a822..6c2044ad914e 100644 --- a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart +++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:ui'; import 'package:flutter/services.dart'; @@ -122,17 +123,29 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { final Map map = event; switch (map['event']) { case 'initialized': - return VideoEvent.initialized; + return VideoEvent( + eventType: VideoEventType.initialized, + duration: Duration(milliseconds: map['duration']), + size: Size(map['width']?.toDouble() ?? 0.0, + map['height']?.toDouble() ?? 0.0), + ); case 'completed': - return VideoEvent.completed; + final List values = map['values']; + + return VideoEvent( + eventType: VideoEventType.completed, + buffered: values.map(_toDurationRange).toList(), + ); case 'bufferingUpdate': - return VideoEvent.bufferingUpdate; + return VideoEvent( + eventType: VideoEventType.completed, + ); case 'bufferingStart': - return VideoEvent.bufferingStart; + return VideoEvent(eventType: VideoEventType.bufferingStart); case 'bufferingEnd': - return VideoEvent.bufferingEnd; + return VideoEvent(eventType: VideoEventType.bufferingEnd); default: - return VideoEvent.unknown; + return VideoEvent(eventType: VideoEventType.unknown); } }); } @@ -141,11 +154,19 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { return EventChannel('flutter.io/videoPlayer/videoEvents$textureId'); } - static const Map _videoFormatStringMap = - { - FormatHint.ss: 'ss', - FormatHint.hls: 'hls', - FormatHint.dash: 'dash', - FormatHint.other: 'other', + static const Map _videoFormatStringMap = + { + VideoFormat.ss: 'ss', + VideoFormat.hls: 'hls', + VideoFormat.dash: 'dash', + VideoFormat.other: 'other', }; + + DurationRange _toDurationRange(dynamic value) { + final List pair = value; + return DurationRange( + Duration(milliseconds: pair[0]), + Duration(milliseconds: pair[1]), + ); + } } diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index d01898fcba7f..ebd73854c841 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:ui'; import 'package:meta/meta.dart' show required, visibleForTesting; @@ -73,7 +74,7 @@ abstract class VideoPlayerPlatform { throw UnimplementedError('create() has not been implemented.'); } - /// Returns a Stream of [VideoEvent]s. + /// Returns a Stream of [VideoEventType]s. Stream videoEventsFor(int textureId) { throw UnimplementedError('videoEventsFor() has not been implemented.'); } @@ -128,7 +129,7 @@ class DataSource { final DataSourceType sourceType; final String uri; - final FormatHint formatHint; + final VideoFormat formatHint; final String asset; final String package; } @@ -139,14 +140,28 @@ enum DataSourceType { file, } -enum FormatHint { +enum VideoFormat { dash, hls, ss, other, } -enum VideoEvent { +class VideoEvent { + VideoEvent({ + @required this.eventType, + this.duration, + this.size, + this.buffered, + }); + + final VideoEventType eventType; + final Duration duration; + final Size size; + final List buffered; +} + +enum VideoEventType { initialized, completed, bufferingUpdate, @@ -154,3 +169,21 @@ enum VideoEvent { bufferingEnd, unknown, } + +class DurationRange { + DurationRange(this.start, this.end); + + final Duration start; + final Duration end; + + double startFraction(Duration duration) { + return start.inMilliseconds / duration.inMilliseconds; + } + + double endFraction(Duration duration) { + return end.inMilliseconds / duration.inMilliseconds; + } + + @override + String toString() => '$runtimeType(start: $start, end: $end)'; +} diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart index 923cf9d560ba..ee39b4c39e5e 100644 --- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart +++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:ui'; import 'package:mockito/mockito.dart'; import 'package:flutter/services.dart'; @@ -103,7 +104,7 @@ void main() { final int textureId = await player.create(DataSource( sourceType: DataSourceType.network, uri: 'someUri', - formatHint: FormatHint.dash, + formatHint: VideoFormat.dash, )); expect( log, @@ -235,8 +236,13 @@ void main() { // ignore: deprecated_member_use defaultBinaryMessenger.handlePlatformMessage( "flutter.io/videoPlayer/videoEvents123", - const StandardMethodCodec().encodeSuccessEnvelope( - {'event': 'initialized'}), + const StandardMethodCodec() + .encodeSuccessEnvelope({ + 'event': 'initialized', + 'duration': 98765, + 'width': 1920, + 'height': 1080, + }), (ByteData data) {}); return const StandardMethodCodec().encodeSuccessEnvelope(null); @@ -248,7 +254,15 @@ void main() { }, ); final Stream videoEvents = player.videoEventsFor(123); - expect(await videoEvents.first, VideoEvent.initialized); + expect((await videoEvents.first).eventType, VideoEventType.initialized); + expect( + (await videoEvents.first).duration, + const Duration(milliseconds: 98765), + ); + expect( + (await videoEvents.first).size, + const Size(1920, 1080), + ); }); }); } From ff08d856605b75608682315432bad7cce7da164a Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 13:30:21 +0100 Subject: [PATCH 11/14] Seek to Duration --- .../lib/method_channel_video_player.dart | 4 ++-- .../lib/video_player_platform_interface.dart | 4 ++-- .../test/method_channel_video_player_test.dart | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart index 6c2044ad914e..5c3467bb5dde 100644 --- a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart +++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart @@ -95,12 +95,12 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { } @override - Future seekTo(int textureId, int milliseconds) { + Future seekTo(int textureId, Duration position) { return _channel.invokeMethod( 'seekTo', { 'textureId': textureId, - 'location': milliseconds, + 'location': position.inMilliseconds, }, ); } diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index ebd73854c841..356f9a248744 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -99,8 +99,8 @@ abstract class VideoPlayerPlatform { throw UnimplementedError('setVolume() has not been implemented.'); } - /// Sets the video position to [milliseconds] from the start. - Future seekTo(int textureId, int milliseconds) { + /// Sets the video position to a [Duration] from the start. + Future seekTo(int textureId, Duration position) { throw UnimplementedError('seekTo() has not been implemented.'); } diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart index ee39b4c39e5e..7db8ef6fbe0f 100644 --- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart +++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart @@ -189,7 +189,7 @@ void main() { }); test('seekTo', () async { - await player.seekTo(1, 12345); + await player.seekTo(1, const Duration(milliseconds: 12345)); expect( log, [ From 05d3545dec17637f1610ea12cc35197a30ce1a5f Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 14:58:58 +0100 Subject: [PATCH 12/14] Fix buffering update --- .../lib/method_channel_video_player.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart index 5c3467bb5dde..8a96527702bc 100644 --- a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart +++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart @@ -130,14 +130,14 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { map['height']?.toDouble() ?? 0.0), ); case 'completed': - final List values = map['values']; - return VideoEvent( eventType: VideoEventType.completed, - buffered: values.map(_toDurationRange).toList(), ); case 'bufferingUpdate': + final List values = map['values']; + return VideoEvent( + buffered: values.map(_toDurationRange).toList(), eventType: VideoEventType.completed, ); case 'bufferingStart': From 5dd82a10bd614dd69b40b1d84fa2b00d90346fb0 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Thu, 14 Nov 2019 15:01:36 +0100 Subject: [PATCH 13/14] Adapt docstring --- .../lib/video_player_platform_interface.dart | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index 356f9a248744..8114abd57560 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -63,13 +63,7 @@ abstract class VideoPlayerPlatform { throw UnimplementedError('dispose() has not been implemented.'); } - /// Creates an instance of a video player. - /// - /// For network and file sources [dataSourceDescription] needs to have a - /// [uri] key. Optionally you can set a [formatHint]. - /// - /// For assets the [asset] key is mandatory. Optionally you can specify - /// the [package]. + /// Creates an instance of a video player and returns its textureId. Future create(DataSource dataSource) { throw UnimplementedError('create() has not been implemented.'); } From 4f1b1dcbd1fa1cfb2af1e37eb3e647ff12184a45 Mon Sep 17 00:00:00 2001 From: Ben Hagen Date: Fri, 15 Nov 2019 11:11:45 +0100 Subject: [PATCH 14/14] Add buildView --- .../lib/method_channel_video_player.dart | 6 ++++++ .../lib/video_player_platform_interface.dart | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart index 8a96527702bc..593c72684c1d 100644 --- a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart +++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:ui'; import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; import 'video_player_platform_interface.dart'; @@ -150,6 +151,11 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform { }); } + @override + Widget buildView(int textureId) { + return Texture(textureId: textureId); + } + EventChannel _eventChannelFor(int textureId) { return EventChannel('flutter.io/videoPlayer/videoEvents$textureId'); } diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index 8114abd57560..6c4ecaf58509 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'dart:ui'; +import 'package:flutter/widgets.dart'; import 'package:meta/meta.dart' show required, visibleForTesting; import 'method_channel_video_player.dart'; @@ -103,6 +104,11 @@ abstract class VideoPlayerPlatform { throw UnimplementedError('getPosition() has not been implemented.'); } + /// Returns a widget displaying the video with a given textureID. + Widget buildView(int textureId) { + throw UnimplementedError('buildView() has not been implemented.'); + } + // This method makes sure that VideoPlayer isn't implemented with `implements`. // // See class doc for more details on why implementing this class is forbidden.