[video_player] Add platform interface (#2273)

* Move plugin to subdir

* Add video_player_platform_interface

* Make analyzer happy

* Improve documentation

* Bump version and update changelog

* Add stream of VideoEvent

* Ignore deprecated_member_use

* Improve changelog message and version

* Use DataSource class

* Add duration, size and buffering to VideoEvent

* Seek to Duration

* Fix buffering update

* Adapt docstring

* Add buildView
diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md
similarity index 98%
rename from packages/video_player/CHANGELOG.md
rename to packages/video_player/video_player/CHANGELOG.md
index fa84c90..1bac34f 100644
--- a/packages/video_player/CHANGELOG.md
+++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.10.3+2
+
+* Update the homepage to point to the new plugin location
+
 ## 0.10.3+1
 
 * Dispose `FLTVideoPlayer` in `onTextureUnregistered` callback on iOS.
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 6b74206..eae8f6c 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/VideoPlayer.java b/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java
similarity index 100%
rename from packages/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.java
rename to packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayer.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
Binary files differ
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/EmbeddingV1Activity.java b/packages/video_player/video_player/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/EmbeddingV1Activity.java
similarity index 100%
rename from packages/video_player/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/EmbeddingV1Activity.java
rename to packages/video_player/video_player/example/android/app/src/main/java/io/flutter/plugins/videoplayerexample/EmbeddingV1Activity.java
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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
Binary files differ
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/test_driver/video_player_e2e.dart b/packages/video_player/video_player/example/test_driver/video_player_e2e.dart
similarity index 100%
rename from packages/video_player/example/test_driver/video_player_e2e.dart
rename to packages/video_player/video_player/example/test_driver/video_player_e2e.dart
diff --git a/packages/video_player/example/test_driver/video_player_e2e_test.dart b/packages/video_player/video_player/example/test_driver/video_player_e2e_test.dart
similarity index 100%
rename from packages/video_player/example/test_driver/video_player_e2e_test.dart
rename to packages/video_player/video_player/example/test_driver/video_player_e2e_test.dart
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 92%
rename from packages/video_player/pubspec.yaml
rename to packages/video_player/video_player/pubspec.yaml
index 516b6f7..32d1e98 100644
--- a/packages/video_player/pubspec.yaml
+++ b/packages/video_player/video_player/pubspec.yaml
@@ -2,8 +2,8 @@
 description: Flutter plugin for displaying inline video with other Flutter
   widgets on Android and iOS.
 author: Flutter Team <flutter-dev@googlegroups.com>
-version: 0.10.3+1
-homepage: https://github.com/flutter/plugins/tree/master/packages/video_player
+version: 0.10.3+2
+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
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 0000000..0d8803f
--- /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/LICENSE b/packages/video_player/video_player_platform_interface/LICENSE
similarity index 100%
copy from packages/video_player/LICENSE
copy to packages/video_player/video_player_platform_interface/LICENSE
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 0000000..02ba8e7
--- /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 0000000..593c726
--- /dev/null
+++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart
@@ -0,0 +1,178 @@
+// 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 'dart:ui';
+
+import 'package:flutter/services.dart';
+import 'package:flutter/widgets.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<void> init() {
+    return _channel.invokeMethod<void>('init');
+  }
+
+  @override
+  Future<void> dispose(int textureId) {
+    return _channel.invokeMethod<void>(
+      'dispose',
+      <String, dynamic>{'textureId': textureId},
+    );
+  }
+
+  @override
+  Future<int> create(DataSource dataSource) async {
+    Map<String, dynamic> dataSourceDescription;
+
+    switch (dataSource.sourceType) {
+      case DataSourceType.asset:
+        dataSourceDescription = <String, dynamic>{
+          'asset': dataSource.asset,
+          'package': dataSource.package,
+        };
+        break;
+      case DataSourceType.network:
+        dataSourceDescription = <String, dynamic>{
+          'uri': dataSource.uri,
+          'formatHint': _videoFormatStringMap[dataSource.formatHint]
+        };
+        break;
+      case DataSourceType.file:
+        dataSourceDescription = <String, dynamic>{'uri': dataSource.uri};
+        break;
+    }
+
+    final Map<String, dynamic> response =
+        await _channel.invokeMapMethod<String, dynamic>(
+      'create',
+      dataSourceDescription,
+    );
+    return response['textureId'];
+  }
+
+  @override
+  Future<void> setLooping(int textureId, bool looping) {
+    return _channel.invokeMethod<void>(
+      'setLooping',
+      <String, dynamic>{
+        'textureId': textureId,
+        'looping': looping,
+      },
+    );
+  }
+
+  @override
+  Future<void> play(int textureId) {
+    return _channel.invokeMethod<void>(
+      'play',
+      <String, dynamic>{'textureId': textureId},
+    );
+  }
+
+  @override
+  Future<void> pause(int textureId) {
+    return _channel.invokeMethod<void>(
+      'pause',
+      <String, dynamic>{'textureId': textureId},
+    );
+  }
+
+  @override
+  Future<void> setVolume(int textureId, double volume) {
+    return _channel.invokeMethod<void>(
+      'setVolume',
+      <String, dynamic>{
+        'textureId': textureId,
+        'volume': volume,
+      },
+    );
+  }
+
+  @override
+  Future<void> seekTo(int textureId, Duration position) {
+    return _channel.invokeMethod<void>(
+      'seekTo',
+      <String, dynamic>{
+        'textureId': textureId,
+        'location': position.inMilliseconds,
+      },
+    );
+  }
+
+  @override
+  Future<Duration> getPosition(int textureId) async {
+    return Duration(
+      milliseconds: await _channel.invokeMethod<int>(
+        'position',
+        <String, dynamic>{'textureId': textureId},
+      ),
+    );
+  }
+
+  @override
+  Stream<VideoEvent> videoEventsFor(int textureId) {
+    return _eventChannelFor(textureId)
+        .receiveBroadcastStream()
+        .map((dynamic event) {
+      final Map<dynamic, dynamic> map = event;
+      switch (map['event']) {
+        case '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(
+            eventType: VideoEventType.completed,
+          );
+        case 'bufferingUpdate':
+          final List<dynamic> values = map['values'];
+
+          return VideoEvent(
+            buffered: values.map<DurationRange>(_toDurationRange).toList(),
+            eventType: VideoEventType.completed,
+          );
+        case 'bufferingStart':
+          return VideoEvent(eventType: VideoEventType.bufferingStart);
+        case 'bufferingEnd':
+          return VideoEvent(eventType: VideoEventType.bufferingEnd);
+        default:
+          return VideoEvent(eventType: VideoEventType.unknown);
+      }
+    });
+  }
+
+  @override
+  Widget buildView(int textureId) {
+    return Texture(textureId: textureId);
+  }
+
+  EventChannel _eventChannelFor(int textureId) {
+    return EventChannel('flutter.io/videoPlayer/videoEvents$textureId');
+  }
+
+  static const Map<VideoFormat, String> _videoFormatStringMap =
+      <VideoFormat, String>{
+    VideoFormat.ss: 'ss',
+    VideoFormat.hls: 'hls',
+    VideoFormat.dash: 'dash',
+    VideoFormat.other: 'other',
+  };
+
+  DurationRange _toDurationRange(dynamic value) {
+    final List<dynamic> 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
new file mode 100644
index 0000000..6c4ecaf
--- /dev/null
+++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart
@@ -0,0 +1,189 @@
+// 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 'dart:ui';
+
+import 'package:flutter/widgets.dart';
+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;
+  }
+
+  /// 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<void> init() {
+    throw UnimplementedError('init() has not been implemented.');
+  }
+
+  /// Clears one video.
+  Future<void> dispose(int textureId) {
+    throw UnimplementedError('dispose() has not been implemented.');
+  }
+
+  /// Creates an instance of a video player and returns its textureId.
+  Future<int> create(DataSource dataSource) {
+    throw UnimplementedError('create() has not been implemented.');
+  }
+
+  /// Returns a Stream of [VideoEventType]s.
+  Stream<VideoEvent> videoEventsFor(int textureId) {
+    throw UnimplementedError('videoEventsFor() has not been implemented.');
+  }
+
+  /// Sets the looping attribute of the video.
+  Future<void> setLooping(int textureId, bool looping) {
+    throw UnimplementedError('setLooping() has not been implemented.');
+  }
+
+  /// Starts the video playback.
+  Future<void> play(int textureId) {
+    throw UnimplementedError('play() has not been implemented.');
+  }
+
+  /// Stops the video playback.
+  Future<void> pause(int textureId) {
+    throw UnimplementedError('pause() has not been implemented.');
+  }
+
+  /// Sets the volume to a range between 0.0 and 1.0.
+  Future<void> setVolume(int textureId, double volume) {
+    throw UnimplementedError('setVolume() has not been implemented.');
+  }
+
+  /// Sets the video position to a [Duration] from the start.
+  Future<void> seekTo(int textureId, Duration position) {
+    throw UnimplementedError('seekTo() has not been implemented.');
+  }
+
+  /// Gets the video position as [Duration] from the start.
+  Future<Duration> getPosition(int textureId) {
+    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.
+  //
+  // This private method is called by the instance setter, which fails if the class is
+  // implemented with `implements`.
+  void _verifyProvidesDefaultImplementations() {}
+}
+
+class DataSource {
+  DataSource({
+    @required this.sourceType,
+    this.uri,
+    this.formatHint,
+    this.asset,
+    this.package,
+  });
+
+  final DataSourceType sourceType;
+  final String uri;
+  final VideoFormat formatHint;
+  final String asset;
+  final String package;
+}
+
+enum DataSourceType {
+  asset,
+  network,
+  file,
+}
+
+enum VideoFormat {
+  dash,
+  hls,
+  ss,
+  other,
+}
+
+class VideoEvent {
+  VideoEvent({
+    @required this.eventType,
+    this.duration,
+    this.size,
+    this.buffered,
+  });
+
+  final VideoEventType eventType;
+  final Duration duration;
+  final Size size;
+  final List<DurationRange> buffered;
+}
+
+enum VideoEventType {
+  initialized,
+  completed,
+  bufferingUpdate,
+  bufferingStart,
+  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/pubspec.yaml b/packages/video_player/video_player_platform_interface/pubspec.yaml
new file mode 100644
index 0000000..bf4d4c0
--- /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 <flutter-dev@googlegroups.com>
+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 0000000..7db8ef6
--- /dev/null
+++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
@@ -0,0 +1,273 @@
+// 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 'dart:ui';
+
+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<MethodChannelVideoPlayer>());
+    });
+
+    test('Cannot be implemented with `implements`', () {
+      expect(() {
+        VideoPlayerPlatform.instance = ImplementsVideoPlayerPlatform();
+      }, throwsA(isInstanceOf<AssertionError>()));
+    });
+
+    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<MethodCall> log = <MethodCall>[];
+    final MethodChannelVideoPlayer player = MethodChannelVideoPlayer();
+
+    setUp(() {
+      channel.setMockMethodCallHandler((MethodCall methodCall) async {
+        log.add(methodCall);
+      });
+    });
+
+    tearDown(() {
+      log.clear();
+    });
+
+    test('init', () async {
+      await player.init();
+      expect(
+        log,
+        <Matcher>[isMethodCall('init', arguments: null)],
+      );
+    });
+
+    test('dispose', () async {
+      await player.dispose(1);
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('dispose', arguments: <String, Object>{
+            'textureId': 1,
+          })
+        ],
+      );
+    });
+
+    test('create with asset', () async {
+      channel.setMockMethodCallHandler((MethodCall methodCall) async {
+        log.add(methodCall);
+        return <String, dynamic>{'textureId': 3};
+      });
+      final int textureId = await player.create(DataSource(
+        sourceType: DataSourceType.asset,
+        asset: 'someAsset',
+        package: 'somePackage',
+      ));
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('create', arguments: <String, Object>{
+            'asset': 'someAsset',
+            'package': 'somePackage',
+          })
+        ],
+      );
+      expect(textureId, 3);
+    });
+
+    test('create with network', () async {
+      channel.setMockMethodCallHandler((MethodCall methodCall) async {
+        log.add(methodCall);
+        return <String, dynamic>{'textureId': 3};
+      });
+      final int textureId = await player.create(DataSource(
+        sourceType: DataSourceType.network,
+        uri: 'someUri',
+        formatHint: VideoFormat.dash,
+      ));
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('create', arguments: <String, Object>{
+            'uri': 'someUri',
+            'formatHint': 'dash'
+          })
+        ],
+      );
+      expect(textureId, 3);
+    });
+
+    test('create with file', () async {
+      channel.setMockMethodCallHandler((MethodCall methodCall) async {
+        log.add(methodCall);
+        return <String, dynamic>{'textureId': 3};
+      });
+      final int textureId = await player.create(DataSource(
+        sourceType: DataSourceType.file,
+        uri: 'someUri',
+      ));
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('create', arguments: <String, Object>{
+            'uri': 'someUri',
+          })
+        ],
+      );
+      expect(textureId, 3);
+    });
+
+    test('setLooping', () async {
+      await player.setLooping(1, true);
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('setLooping', arguments: <String, Object>{
+            'textureId': 1,
+            'looping': true,
+          })
+        ],
+      );
+    });
+
+    test('play', () async {
+      await player.play(1);
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('play', arguments: <String, Object>{
+            'textureId': 1,
+          })
+        ],
+      );
+    });
+
+    test('pause', () async {
+      await player.pause(1);
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('pause', arguments: <String, Object>{
+            'textureId': 1,
+          })
+        ],
+      );
+    });
+
+    test('setVolume', () async {
+      await player.setVolume(1, 0.7);
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('setVolume', arguments: <String, Object>{
+            'textureId': 1,
+            'volume': 0.7,
+          })
+        ],
+      );
+    });
+
+    test('seekTo', () async {
+      await player.seekTo(1, const Duration(milliseconds: 12345));
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('seekTo', arguments: <String, Object>{
+            '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,
+        <Matcher>[
+          isMethodCall('position', arguments: <String, Object>{
+            'textureId': 1,
+          })
+        ],
+      );
+      expect(position, const Duration(milliseconds: 234));
+    });
+
+    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(<String, dynamic>{
+                  'event': 'initialized',
+                  'duration': 98765,
+                  'width': 1920,
+                  'height': 1080,
+                }),
+                (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<VideoEvent> videoEvents = player.videoEventsFor(123);
+      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),
+      );
+    });
+  });
+}
+
+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 cdcb02a..1028ee6 100755
--- a/script/build_all_plugins_app.sh
+++ b/script/build_all_plugins_app.sh
@@ -14,6 +14,7 @@
   "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[*]}")