[android_intent] Migrate to nnbd (#3328)

diff --git a/packages/android_intent/CHANGELOG.md b/packages/android_intent/CHANGELOG.md
index f353498..65c991c 100644
--- a/packages/android_intent/CHANGELOG.md
+++ b/packages/android_intent/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.0-nullsafety
+
+* Migrate to null safety.
+
 ## 0.3.7+8
 
 * Update Flutter SDK constraint.
diff --git a/packages/android_intent/lib/android_intent.dart b/packages/android_intent/lib/android_intent.dart
index 9d70197..0ab2d7b 100644
--- a/packages/android_intent/lib/android_intent.dart
+++ b/packages/android_intent/lib/android_intent.dart
@@ -36,7 +36,7 @@
     this.arguments,
     this.package,
     this.componentName,
-    Platform platform,
+    Platform? platform,
     this.type,
   })  : assert(action != null || componentName != null,
             'action or component (or both) must be specified'),
@@ -47,8 +47,8 @@
   /// app code, it may break without warning.
   @visibleForTesting
   AndroidIntent.private({
-    @required Platform platform,
-    @required MethodChannel channel,
+    required Platform platform,
+    required MethodChannel channel,
     this.action,
     this.flags,
     this.category,
@@ -66,47 +66,47 @@
   /// includes constants like `ACTION_VIEW`.
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#intent-structure.
-  final String action;
+  final String? action;
 
   /// Constants that can be set on an intent to tweak how it is finally handled.
   /// Some of the constants are mirrored to Dart via [Flag].
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#setFlags(int).
-  final List<int> flags;
+  final List<int>? flags;
 
   /// An optional additional constant qualifying the given [action].
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#intent-structure.
-  final String category;
+  final String? category;
 
   /// The Uri that the [action] is pointed towards.
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#intent-structure.
-  final String data;
+  final String? data;
 
   /// The equivalent of `extras`, a generic `Bundle` of data that the Intent can
   /// carry. This is a slot for extraneous data that the listener may use.
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#intent-structure.
-  final Map<String, dynamic> arguments;
+  final Map<String, dynamic>? arguments;
 
   /// Sets the [data] to only resolve within this given package.
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#setPackage(java.lang.String).
-  final String package;
+  final String? package;
 
   /// Set the exact `ComponentName` that should handle the intent. If this is
   /// set [package] should also be non-null.
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#setComponent(android.content.ComponentName).
-  final String componentName;
+  final String? componentName;
   final MethodChannel _channel;
   final Platform _platform;
 
   /// Set an explicit MIME data type.
   ///
   /// See https://developer.android.com/reference/android/content/Intent.html#intent-structure.
-  final String type;
+  final String? type;
 
   bool _isPowerOfTwo(int x) {
     /* First x in the below expression is for the case when x is 0 */
@@ -146,17 +146,18 @@
       return false;
     }
 
-    return await _channel.invokeMethod<bool>(
+    final result = await _channel.invokeMethod<bool>(
       'canResolveActivity',
       _buildArguments(),
     );
+    return result!;
   }
 
   /// Constructs the map of arguments which is passed to the plugin.
   Map<String, dynamic> _buildArguments() {
     return {
       if (action != null) 'action': action,
-      if (flags != null) 'flags': convertFlags(flags),
+      if (flags != null) 'flags': convertFlags(flags!),
       if (category != null) 'category': category,
       if (data != null) 'data': data,
       if (arguments != null) 'arguments': arguments,
diff --git a/packages/android_intent/pubspec.yaml b/packages/android_intent/pubspec.yaml
index 1b63371..aec7ad0 100644
--- a/packages/android_intent/pubspec.yaml
+++ b/packages/android_intent/pubspec.yaml
@@ -1,10 +1,7 @@
 name: android_intent
 description: Flutter plugin for launching Android Intents. Not supported on iOS.
 homepage: https://github.com/flutter/plugins/tree/master/packages/android_intent
-# 0.3.y+z is compatible with 1.0.0, if you land a breaking change bump
-# the version to 2.0.0.
-# See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0
-version: 0.3.7+8
+version: 2.0.0-nullsafety
 
 flutter:
   plugin:
@@ -16,15 +13,15 @@
 dependencies:
   flutter:
     sdk: flutter
-  platform: ">=2.0.0 <4.0.0"
-  meta: ^1.0.5
+  platform: ^3.0.0-nullsafety.4
+  meta: ^1.3.0-nullsafety.6
 dev_dependencies:
-  test: ^1.3.0
-  mockito: ^3.0.0
+  test: ^1.16.0-nullsafety.13
+  mockito: ^4.1.3
   flutter_test:
     sdk: flutter
-  pedantic: ^1.8.0
+  pedantic: ^1.10.0-nullsafety.1
 
 environment:
-  sdk: ">=2.3.0 <3.0.0"
+  sdk: ">=2.12.0-0 <3.0.0"
   flutter: ">=1.12.13+hotfix.5"
diff --git a/packages/android_intent/test/android_intent_test.dart b/packages/android_intent/test/android_intent_test.dart
index 3116288..b0fa48e 100644
--- a/packages/android_intent/test/android_intent_test.dart
+++ b/packages/android_intent/test/android_intent_test.dart
@@ -11,9 +11,11 @@
 
 void main() {
   AndroidIntent androidIntent;
-  MockMethodChannel mockChannel;
+  late MockMethodChannel mockChannel;
   setUp(() {
     mockChannel = MockMethodChannel();
+    when(mockChannel.invokeMethod<bool>('canResolveActivity', any))
+        .thenAnswer((realInvocation) async => true);
   });
 
   group('AndroidIntent', () {
diff --git a/script/nnbd_plugins.sh b/script/nnbd_plugins.sh
index 5e671c2..0cab28a 100644
--- a/script/nnbd_plugins.sh
+++ b/script/nnbd_plugins.sh
@@ -5,6 +5,7 @@
 # null-safe is available on stable.
 
 readonly NNBD_PLUGINS_LIST=(
+  "android_intent"
   "connectivity"
   "device_info"
   "flutter_plugin_android_lifecycle"