[flutter_releases] Flutter Dev 2.2.0-10.1.pre Framework Cherrypicks (#80459)

* [flutter_tools] fix null check in crash reporter (#80382)
* roll engine cherrypicks
* Roll engine with dart_style cp

Co-authored-by: Jonah Williams <jonahwilliams@google.com>
diff --git a/bin/internal/engine.version b/bin/internal/engine.version
index abde1fe..9b55168 100644
--- a/bin/internal/engine.version
+++ b/bin/internal/engine.version
@@ -1 +1 @@
-56b13559807bf4cb83d16c659757d6ae4f209490
+d2a2e93510ad6cfc3d62a90d903b7056e4da8264
diff --git a/packages/flutter_tools/lib/src/base/bot_detector.dart b/packages/flutter_tools/lib/src/base/bot_detector.dart
index 94d39c0..8ae9301 100644
--- a/packages/flutter_tools/lib/src/base/bot_detector.dart
+++ b/packages/flutter_tools/lib/src/base/bot_detector.dart
@@ -30,9 +30,6 @@
   final PersistentToolState _persistentToolState;
 
   Future<bool> get isRunningOnBot async {
-    if (_persistentToolState.isRunningOnBot != null) {
-      return _persistentToolState.isRunningOnBot;
-    }
     if (
       // Explicitly stated to not be a bot.
       _platform.environment['BOT'] == 'false'
@@ -45,6 +42,10 @@
       return _persistentToolState.isRunningOnBot = false;
     }
 
+    if (_persistentToolState.isRunningOnBot != null) {
+      return _persistentToolState.isRunningOnBot;
+    }
+
     return _persistentToolState.isRunningOnBot = _platform.environment['BOT'] == 'true'
 
       // https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables
diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart
index b19bb2c..0204ba5 100644
--- a/packages/flutter_tools/lib/src/commands/update_packages.dart
+++ b/packages/flutter_tools/lib/src/commands/update_packages.dart
@@ -125,6 +125,12 @@
         help: 'Use cached packages instead of accessing the network.',
         defaultsTo: false,
         negatable: false,
+      )
+      ..addFlag(
+        'crash',
+        help: 'For Flutter CLI testing only, forces this command to throw an unhandled exception.',
+        defaultsTo: false,
+        negatable: false,
       );
   }
 
@@ -179,6 +185,11 @@
     final bool isVerifyOnly = boolArg('verify-only');
     final bool isConsumerOnly = boolArg('consumer-only');
     final bool offline = boolArg('offline');
+    final bool crash = boolArg('crash');
+
+    if (crash) {
+      throw StateError('test crash please ignore.');
+    }
 
     if (upgrade && offline) {
       throwToolExit(
diff --git a/packages/flutter_tools/lib/src/globals_null_migrated.dart b/packages/flutter_tools/lib/src/globals_null_migrated.dart
index 78dcc07..2ebd640 100644
--- a/packages/flutter_tools/lib/src/globals_null_migrated.dart
+++ b/packages/flutter_tools/lib/src/globals_null_migrated.dart
@@ -26,7 +26,7 @@
 
 Cache get cache => context.get<Cache>()!;
 Config get config => context.get<Config>()!;
-HttpClientFactory get httpClientFactory => context.get<HttpClientFactory>()!;
+HttpClientFactory? get httpClientFactory => context.get<HttpClientFactory>();
 Logger get logger => context.get<Logger>()!;
 OperatingSystemUtils get os => context.get<OperatingSystemUtils>()!;
 Signals get signals => context.get<Signals>() ?? LocalSignals.instance;
diff --git a/packages/flutter_tools/test/general.shard/base/bot_detector_test.dart b/packages/flutter_tools/test/general.shard/base/bot_detector_test.dart
index cab0c9e..c158485 100644
--- a/packages/flutter_tools/test/general.shard/base/bot_detector_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/bot_detector_test.dart
@@ -47,6 +47,24 @@
         expect(persistentToolState.isRunningOnBot, isFalse);
       });
 
+      testWithoutContext('does not cache BOT environment variable', () async {
+        fakePlatform.environment['BOT'] = 'true';
+
+        final BotDetector botDetector = BotDetector(
+          platform: fakePlatform,
+          httpClientFactory: () => FakeHttpClient.any(),
+          persistentToolState: persistentToolState,
+        );
+
+        expect(await botDetector.isRunningOnBot, isTrue);
+        expect(persistentToolState.isRunningOnBot, isTrue);
+
+        fakePlatform.environment['BOT'] = 'false';
+
+        expect(await botDetector.isRunningOnBot, isFalse);
+        expect(persistentToolState.isRunningOnBot, isFalse);
+      });
+
       testWithoutContext('returns false unconditionally if FLUTTER_HOST is set', () async {
         fakePlatform.environment['FLUTTER_HOST'] = 'foo';
         fakePlatform.environment['TRAVIS'] = 'true';
diff --git a/packages/flutter_tools/test/integration.shard/command_output_test.dart b/packages/flutter_tools/test/integration.shard/command_output_test.dart
index 4a89046..685b855 100644
--- a/packages/flutter_tools/test/integration.shard/command_output_test.dart
+++ b/packages/flutter_tools/test/integration.shard/command_output_test.dart
@@ -221,4 +221,22 @@
     expect(result.exitCode, isNot(0));
     expect(result.stderr, contains('Could not find an option named "release"'));
   });
+
+  testWithoutContext('flutter can report crashes', () async {
+    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
+    final ProcessResult result = await processManager.run(<String>[
+      flutterBin,
+      ...getLocalEngineArguments(),
+      'update-packages',
+      '--crash',
+    ], environment: <String, String>{
+      'BOT': 'false',
+    });
+
+    expect(result.exitCode, isNot(0));
+    expect(result.stderr, contains(
+      'Oops; flutter has exited unexpectedly: "Bad state: test crash please ignore.".\n'
+      'A crash report has been written to',
+    ));
+  });
 }