[video_player] Android: Dispose video players when app is closed (#3245)

diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md
index 080a6c0..90082d8 100644
--- a/packages/video_player/video_player/CHANGELOG.md
+++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.1
+
+* Android: Dispose video players when app is closed.
+
 ## 1.0.0
 
 * Announce 1.0.0.
diff --git a/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java b/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java
index b17509d..0c5854f 100644
--- a/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java
+++ b/packages/video_player/video_player/android/src/main/java/io/flutter/plugins/videoplayer/VideoPlayerPlugin.java
@@ -6,9 +6,9 @@
 
 import android.content.Context;
 import android.os.Build;
-import android.util.Log;
 import android.util.LongSparseArray;
 import io.flutter.FlutterInjector;
+import io.flutter.Log;
 import io.flutter.embedding.engine.plugins.FlutterPlugin;
 import io.flutter.plugin.common.BinaryMessenger;
 import io.flutter.plugin.common.EventChannel;
@@ -92,6 +92,7 @@
     }
     flutterState.stopListening(binding.getBinaryMessenger());
     flutterState = null;
+    initialize();
   }
 
   private void disposeAllPlayers() {
diff --git a/packages/video_player/video_player/example/android/app/build.gradle b/packages/video_player/video_player/example/android/app/build.gradle
index 13fabc7..fc0673a 100644
--- a/packages/video_player/video_player/example/android/app/build.gradle
+++ b/packages/video_player/video_player/example/android/app/build.gradle
@@ -64,4 +64,6 @@
     testImplementation 'junit:junit:4.12'
     androidTestImplementation 'androidx.test:runner:1.1.1'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+    testImplementation 'org.robolectric:robolectric:3.8'
+    testImplementation 'org.mockito:mockito-core:3.5.13'
 }
diff --git a/packages/video_player/video_player/example/android/app/src/test/java/io/flutter/plugins/videoplayerexample/FlutterActivityTest.java b/packages/video_player/video_player/example/android/app/src/test/java/io/flutter/plugins/videoplayerexample/FlutterActivityTest.java
new file mode 100644
index 0000000..0286237
--- /dev/null
+++ b/packages/video_player/video_player/example/android/app/src/test/java/io/flutter/plugins/videoplayerexample/FlutterActivityTest.java
@@ -0,0 +1,46 @@
+package io.flutter.plugins.videoplayerexample;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import io.flutter.embedding.engine.FlutterEngine;
+import io.flutter.embedding.engine.FlutterEngineCache;
+import io.flutter.embedding.engine.FlutterJNI;
+import io.flutter.embedding.engine.loader.FlutterLoader;
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.plugins.videoplayer.VideoPlayerPlugin;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class FlutterActivityTest {
+
+  @Test
+  public void disposeAllPlayers() {
+    VideoPlayerPlugin videoPlayerPlugin = spy(new VideoPlayerPlugin());
+    FlutterLoader flutterLoader = mock(FlutterLoader.class);
+    FlutterJNI flutterJNI = mock(FlutterJNI.class);
+    ArgumentCaptor<FlutterPlugin.FlutterPluginBinding> pluginBindingCaptor =
+        ArgumentCaptor.forClass(FlutterPlugin.FlutterPluginBinding.class);
+
+    when(flutterJNI.isAttached()).thenReturn(true);
+    FlutterEngine engine =
+        spy(new FlutterEngine(RuntimeEnvironment.application, flutterLoader, flutterJNI));
+    FlutterEngineCache.getInstance().put("my_flutter_engine", engine);
+
+    engine.getPlugins().add(videoPlayerPlugin);
+    verify(videoPlayerPlugin, times(1)).onAttachedToEngine(pluginBindingCaptor.capture());
+
+    engine.destroy();
+    verify(videoPlayerPlugin, times(1)).onDetachedFromEngine(pluginBindingCaptor.capture());
+    verify(videoPlayerPlugin, times(1)).initialize();
+  }
+}
diff --git a/packages/video_player/video_player/pubspec.yaml b/packages/video_player/video_player/pubspec.yaml
index 72fbedc..69be8b2 100644
--- a/packages/video_player/video_player/pubspec.yaml
+++ b/packages/video_player/video_player/pubspec.yaml
@@ -1,7 +1,7 @@
 name: video_player
 description: Flutter plugin for displaying inline video with other Flutter
   widgets on Android, iOS, and web.
-version: 1.0.0
+version: 1.0.1
 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player
 
 flutter: