[video_player_platform_interface] Bump version for NNBD stable (#3578)

diff --git a/packages/video_player/video_player_platform_interface/CHANGELOG.md b/packages/video_player/video_player_platform_interface/CHANGELOG.md
index 7b223f4..d0c59bd 100644
--- a/packages/video_player/video_player_platform_interface/CHANGELOG.md
+++ b/packages/video_player/video_player_platform_interface/CHANGELOG.md
@@ -1,27 +1,15 @@
-## 4.0.0-nullsafety.1
+## 4.0.0
 
+* **Breaking Changes**:
+  * Migrate to null-safety
+  * Update to latest Pigeon. This includes a breaking change to how the test logic is exposed.
 * Add note about the `mixWithOthers` option being ignored on the web.
-
-## 4.0.0-nullsafety.0
-
-* Update to latest Pigeon.
-  This includes a breaking change to how the test logic is exposed.
-
-## 3.0.0-nullsafety.3
-
+* Make DataSource's `uri` parameter nullable.
 * `messages.dart` sets Dart `2.12`.
 
-## 3.0.0-nullsafety.2
+## 3.0.0
 
-* Bump Dart SDK to support null safety.
-
-## 3.0.0-nullsafety.1
-
-* Make DataSource's `uri` parameter nullable.
-
-## 3.0.0-nullsafety
-
-* Migrate to null safety.
+* Version 3 only was published as nullsafety "previews".
 
 ## 2.2.1
 
diff --git a/packages/video_player/video_player_platform_interface/lib/messages.dart b/packages/video_player/video_player_platform_interface/lib/messages.dart
index 3f2d78e..dc5237f 100644
--- a/packages/video_player/video_player_platform_interface/lib/messages.dart
+++ b/packages/video_player/video_player_platform_interface/lib/messages.dart
@@ -1,4 +1,4 @@
-// Autogenerated from Pigeon (v0.1.19), do not edit directly.
+// Autogenerated from Pigeon (v0.1.21), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import
 // @dart = 2.12
@@ -18,7 +18,7 @@
 
   static TextureMessage decode(Object message) {
     final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
-    return TextureMessage()..textureId = pigeonMap['textureId'] as int;
+    return TextureMessage()..textureId = pigeonMap['textureId'] as int?;
   }
 }
 
@@ -40,10 +40,10 @@
   static CreateMessage decode(Object message) {
     final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
     return CreateMessage()
-      ..asset = pigeonMap['asset'] as String
-      ..uri = pigeonMap['uri'] as String
-      ..packageName = pigeonMap['packageName'] as String
-      ..formatHint = pigeonMap['formatHint'] as String;
+      ..asset = pigeonMap['asset'] as String?
+      ..uri = pigeonMap['uri'] as String?
+      ..packageName = pigeonMap['packageName'] as String?
+      ..formatHint = pigeonMap['formatHint'] as String?;
   }
 }
 
@@ -61,8 +61,8 @@
   static LoopingMessage decode(Object message) {
     final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
     return LoopingMessage()
-      ..textureId = pigeonMap['textureId'] as int
-      ..isLooping = pigeonMap['isLooping'] as bool;
+      ..textureId = pigeonMap['textureId'] as int?
+      ..isLooping = pigeonMap['isLooping'] as bool?;
   }
 }
 
@@ -80,8 +80,8 @@
   static VolumeMessage decode(Object message) {
     final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
     return VolumeMessage()
-      ..textureId = pigeonMap['textureId'] as int
-      ..volume = pigeonMap['volume'] as double;
+      ..textureId = pigeonMap['textureId'] as int?
+      ..volume = pigeonMap['volume'] as double?;
   }
 }
 
@@ -99,8 +99,8 @@
   static PlaybackSpeedMessage decode(Object message) {
     final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
     return PlaybackSpeedMessage()
-      ..textureId = pigeonMap['textureId'] as int
-      ..speed = pigeonMap['speed'] as double;
+      ..textureId = pigeonMap['textureId'] as int?
+      ..speed = pigeonMap['speed'] as double?;
   }
 }
 
@@ -118,8 +118,8 @@
   static PositionMessage decode(Object message) {
     final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
     return PositionMessage()
-      ..textureId = pigeonMap['textureId'] as int
-      ..position = pigeonMap['position'] as int;
+      ..textureId = pigeonMap['textureId'] as int?
+      ..position = pigeonMap['position'] as int?;
   }
 }
 
@@ -135,7 +135,7 @@
   static MixWithOthersMessage decode(Object message) {
     final Map<Object?, Object?> pigeonMap = message as Map<Object?, Object?>;
     return MixWithOthersMessage()
-      ..mixWithOthers = pigeonMap['mixWithOthers'] as bool;
+      ..mixWithOthers = pigeonMap['mixWithOthers'] as bool?;
   }
 }
 
diff --git a/packages/video_player/video_player_platform_interface/lib/test.dart b/packages/video_player/video_player_platform_interface/lib/test.dart
index 538e952..457a838 100644
--- a/packages/video_player/video_player_platform_interface/lib/test.dart
+++ b/packages/video_player/video_player_platform_interface/lib/test.dart
@@ -1,4 +1,4 @@
-// Autogenerated from Pigeon (v0.1.19), do not edit directly.
+// Autogenerated from Pigeon (v0.1.21), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import
 // @dart = 2.12
diff --git a/packages/video_player/video_player_platform_interface/pubspec.yaml b/packages/video_player/video_player_platform_interface/pubspec.yaml
index ed16ea1..c85f483 100644
--- a/packages/video_player/video_player_platform_interface/pubspec.yaml
+++ b/packages/video_player/video_player_platform_interface/pubspec.yaml
@@ -3,19 +3,18 @@
 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: 4.0.0-nullsafety.1
+version: 4.0.0
 
 dependencies:
   flutter:
     sdk: flutter
-  meta: ^1.3.0-nullsafety.3
+  meta: ^1.3.0
   flutter_test:
     sdk: flutter
 
 dev_dependencies:
-  mockito: ^4.1.1
-  pedantic: ^1.10.0-nullsafety.1
+  pedantic: ^1.10.0
 
 environment:
-  sdk: ">=2.12.0-0 <3.0.0"
-  flutter: ">=1.10.0"
+  sdk: ">=2.12.0-259.9.beta <3.0.0"
+  flutter: ">=1.20.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
index 669fd28..fae4b74 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,14 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(egarciad): Remove once Mockito is migrated to null safety.
-// @dart = 2.9
-
 import 'dart:ui';
 
 import 'package:flutter/services.dart';
 import 'package:flutter_test/flutter_test.dart';
-import 'package:mockito/mockito.dart';
 import 'package:video_player_platform_interface/messages.dart';
 import 'package:video_player_platform_interface/method_channel_video_player.dart';
 import 'package:video_player_platform_interface/test.dart';
@@ -17,13 +13,13 @@
 
 class _ApiLogger implements TestHostVideoPlayerApi {
   final List<String> log = [];
-  TextureMessage textureMessage;
-  CreateMessage createMessage;
-  PositionMessage positionMessage;
-  LoopingMessage loopingMessage;
-  VolumeMessage volumeMessage;
-  PlaybackSpeedMessage playbackSpeedMessage;
-  MixWithOthersMessage mixWithOthersMessage;
+  TextureMessage? textureMessage;
+  CreateMessage? createMessage;
+  PositionMessage? positionMessage;
+  LoopingMessage? loopingMessage;
+  VolumeMessage? volumeMessage;
+  PlaybackSpeedMessage? playbackSpeedMessage;
+  MixWithOthersMessage? mixWithOthersMessage;
 
   @override
   TextureMessage create(CreateMessage arg) {
@@ -101,28 +97,11 @@
       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', () {
     final MethodChannelVideoPlayer player = MethodChannelVideoPlayer();
-    _ApiLogger log;
+    late _ApiLogger log;
 
     setUp(() {
       log = _ApiLogger();
@@ -140,108 +119,108 @@
     test('dispose', () async {
       await player.dispose(1);
       expect(log.log.last, 'dispose');
-      expect(log.textureMessage.textureId, 1);
+      expect(log.textureMessage?.textureId, 1);
     });
 
     test('create with asset', () async {
-      final int textureId = await player.create(DataSource(
+      final int? textureId = await player.create(DataSource(
         sourceType: DataSourceType.asset,
         asset: 'someAsset',
         package: 'somePackage',
       ));
       expect(log.log.last, 'create');
-      expect(log.createMessage.asset, 'someAsset');
-      expect(log.createMessage.packageName, 'somePackage');
+      expect(log.createMessage?.asset, 'someAsset');
+      expect(log.createMessage?.packageName, 'somePackage');
       expect(textureId, 3);
     });
 
     test('create with network', () async {
-      final int textureId = await player.create(DataSource(
+      final int? textureId = await player.create(DataSource(
         sourceType: DataSourceType.network,
         uri: 'someUri',
         formatHint: VideoFormat.dash,
       ));
       expect(log.log.last, 'create');
-      expect(log.createMessage.uri, 'someUri');
-      expect(log.createMessage.formatHint, 'dash');
+      expect(log.createMessage?.uri, 'someUri');
+      expect(log.createMessage?.formatHint, 'dash');
       expect(textureId, 3);
     });
 
     test('create with file', () async {
-      final int textureId = await player.create(DataSource(
+      final int? textureId = await player.create(DataSource(
         sourceType: DataSourceType.file,
         uri: 'someUri',
       ));
       expect(log.log.last, 'create');
-      expect(log.createMessage.uri, 'someUri');
+      expect(log.createMessage?.uri, 'someUri');
       expect(textureId, 3);
     });
 
     test('setLooping', () async {
       await player.setLooping(1, true);
       expect(log.log.last, 'setLooping');
-      expect(log.loopingMessage.textureId, 1);
-      expect(log.loopingMessage.isLooping, true);
+      expect(log.loopingMessage?.textureId, 1);
+      expect(log.loopingMessage?.isLooping, true);
     });
 
     test('play', () async {
       await player.play(1);
       expect(log.log.last, 'play');
-      expect(log.textureMessage.textureId, 1);
+      expect(log.textureMessage?.textureId, 1);
     });
 
     test('pause', () async {
       await player.pause(1);
       expect(log.log.last, 'pause');
-      expect(log.textureMessage.textureId, 1);
+      expect(log.textureMessage?.textureId, 1);
     });
 
     test('setMixWithOthers', () async {
       await player.setMixWithOthers(true);
       expect(log.log.last, 'setMixWithOthers');
-      expect(log.mixWithOthersMessage.mixWithOthers, true);
+      expect(log.mixWithOthersMessage?.mixWithOthers, true);
 
       await player.setMixWithOthers(false);
       expect(log.log.last, 'setMixWithOthers');
-      expect(log.mixWithOthersMessage.mixWithOthers, false);
+      expect(log.mixWithOthersMessage?.mixWithOthers, false);
     });
 
     test('setVolume', () async {
       await player.setVolume(1, 0.7);
       expect(log.log.last, 'setVolume');
-      expect(log.volumeMessage.textureId, 1);
-      expect(log.volumeMessage.volume, 0.7);
+      expect(log.volumeMessage?.textureId, 1);
+      expect(log.volumeMessage?.volume, 0.7);
     });
 
     test('setPlaybackSpeed', () async {
       await player.setPlaybackSpeed(1, 1.5);
       expect(log.log.last, 'setPlaybackSpeed');
-      expect(log.playbackSpeedMessage.textureId, 1);
-      expect(log.playbackSpeedMessage.speed, 1.5);
+      expect(log.playbackSpeedMessage?.textureId, 1);
+      expect(log.playbackSpeedMessage?.speed, 1.5);
     });
 
     test('seekTo', () async {
       await player.seekTo(1, const Duration(milliseconds: 12345));
       expect(log.log.last, 'seekTo');
-      expect(log.positionMessage.textureId, 1);
-      expect(log.positionMessage.position, 12345);
+      expect(log.positionMessage?.textureId, 1);
+      expect(log.positionMessage?.position, 12345);
     });
 
     test('getPosition', () async {
       final Duration position = await player.getPosition(1);
       expect(log.log.last, 'position');
-      expect(log.textureMessage.textureId, 1);
+      expect(log.textureMessage?.textureId, 1);
       expect(position, const Duration(milliseconds: 234));
     });
 
     test('videoEventsFor', () async {
-      ServicesBinding.instance.defaultBinaryMessenger.setMockMessageHandler(
+      ServicesBinding.instance?.defaultBinaryMessenger.setMockMessageHandler(
         "flutter.io/videoPlayer/videoEvents123",
-        (ByteData message) async {
+        (ByteData? message) async {
           final MethodCall methodCall =
               const StandardMethodCodec().decodeMethodCall(message);
           if (methodCall.method == 'listen') {
-            await ServicesBinding.instance.defaultBinaryMessenger
+            await ServicesBinding.instance?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
@@ -251,18 +230,18 @@
                       'width': 1920,
                       'height': 1080,
                     }),
-                    (ByteData data) {});
+                    (ByteData? data) {});
 
-            await ServicesBinding.instance.defaultBinaryMessenger
+            await ServicesBinding.instance?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
                         .encodeSuccessEnvelope(<String, dynamic>{
                       'event': 'completed',
                     }),
-                    (ByteData data) {});
+                    (ByteData? data) {});
 
-            await ServicesBinding.instance.defaultBinaryMessenger
+            await ServicesBinding.instance?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
@@ -273,25 +252,25 @@
                         <int>[1235, 4000],
                       ],
                     }),
-                    (ByteData data) {});
+                    (ByteData? data) {});
 
-            await ServicesBinding.instance.defaultBinaryMessenger
+            await ServicesBinding.instance?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
                         .encodeSuccessEnvelope(<String, dynamic>{
                       'event': 'bufferingStart',
                     }),
-                    (ByteData data) {});
+                    (ByteData? data) {});
 
-            await ServicesBinding.instance.defaultBinaryMessenger
+            await ServicesBinding.instance?.defaultBinaryMessenger
                 .handlePlatformMessage(
                     "flutter.io/videoPlayer/videoEvents123",
                     const StandardMethodCodec()
                         .encodeSuccessEnvelope(<String, dynamic>{
                       'event': 'bufferingEnd',
                     }),
-                    (ByteData data) {});
+                    (ByteData? data) {});
 
             return const StandardMethodCodec().encodeSuccessEnvelope(null);
           } else if (methodCall.method == 'cancel') {
@@ -328,8 +307,3 @@
     });
   });
 }
-
-class ImplementsVideoPlayerPlatform extends Mock
-    implements VideoPlayerPlatform {}
-
-class ExtendsVideoPlayerPlatform extends VideoPlayerPlatform {}