diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart index 0bb41c27ec3..8c89e5df4a3 100644 --- a/packages/flutter_tools/lib/src/application_package.dart +++ b/packages/flutter_tools/lib/src/application_package.dart @@ -10,6 +10,7 @@ import 'package:xml/xml.dart' as xml; import 'android/android_sdk.dart'; import 'android/gradle.dart'; +import 'base/context.dart'; import 'base/file_system.dart'; import 'base/os.dart' show os; import 'base/process.dart'; @@ -20,6 +21,37 @@ import 'ios/plist_utils.dart' as plist; import 'project.dart'; import 'tester/flutter_tester.dart'; +class ApplicationPackageFactory { + static ApplicationPackageFactory get instance => context[ApplicationPackageFactory]; + + Future getPackageForPlatform( + TargetPlatform platform, + {File applicationBinary}) async { + switch (platform) { + case TargetPlatform.android_arm: + case TargetPlatform.android_arm64: + case TargetPlatform.android_x64: + case TargetPlatform.android_x86: + return applicationBinary == null + ? await AndroidApk.fromAndroidProject((await FlutterProject.current()).android) + : AndroidApk.fromApk(applicationBinary); + case TargetPlatform.ios: + return applicationBinary == null + ? IOSApp.fromIosProject((await FlutterProject.current()).ios) + : IOSApp.fromPrebuiltApp(applicationBinary); + case TargetPlatform.tester: + return FlutterTesterApp.fromCurrentDirectory(); + case TargetPlatform.darwin_x64: + case TargetPlatform.linux_x64: + case TargetPlatform.windows_x64: + case TargetPlatform.fuchsia: + return null; + } + assert(platform != null); + return null; + } +} + abstract class ApplicationPackage { ApplicationPackage({ @required this.id }) : assert(id != null); @@ -277,33 +309,6 @@ class PrebuiltIOSApp extends IOSApp { String get _bundlePath => bundleDir.path; } -Future getApplicationPackageForPlatform( - TargetPlatform platform, - {File applicationBinary}) async { - switch (platform) { - case TargetPlatform.android_arm: - case TargetPlatform.android_arm64: - case TargetPlatform.android_x64: - case TargetPlatform.android_x86: - return applicationBinary == null - ? await AndroidApk.fromAndroidProject((await FlutterProject.current()).android) - : AndroidApk.fromApk(applicationBinary); - case TargetPlatform.ios: - return applicationBinary == null - ? IOSApp.fromIosProject((await FlutterProject.current()).ios) - : IOSApp.fromPrebuiltApp(applicationBinary); - case TargetPlatform.tester: - return FlutterTesterApp.fromCurrentDirectory(); - case TargetPlatform.darwin_x64: - case TargetPlatform.linux_x64: - case TargetPlatform.windows_x64: - case TargetPlatform.fuchsia: - return null; - } - assert(platform != null); - return null; -} - class ApplicationPackageStore { ApplicationPackageStore({ this.android, this.iOS }); diff --git a/packages/flutter_tools/lib/src/context_runner.dart b/packages/flutter_tools/lib/src/context_runner.dart index 99d4c1fa41e..260d29256b3 100644 --- a/packages/flutter_tools/lib/src/context_runner.dart +++ b/packages/flutter_tools/lib/src/context_runner.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'android/android_sdk.dart'; import 'android/android_studio.dart'; import 'android/android_workflow.dart'; +import 'application_package.dart'; import 'artifacts.dart'; import 'asset.dart'; import 'base/build.dart'; @@ -54,6 +55,7 @@ Future runInContext( AndroidWorkflow: () => AndroidWorkflow(), AndroidValidator: () => AndroidValidator(), AndroidLicenseValidator: () => AndroidLicenseValidator(), + ApplicationPackageFactory: () => ApplicationPackageFactory(), Artifacts: () => CachedArtifacts(), AssetBundleFactory: () => AssetBundleFactory.defaultInstance, BotDetector: () => const BotDetector(), diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 50eb8ff7527..82f5a0f07b9 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -269,7 +269,7 @@ class FlutterDevice { printStatus('Launching ${getDisplayPath(hotRunner.mainPath)} on ${device.name} in $modeName mode...'); final TargetPlatform targetPlatform = await device.targetPlatform; - package = await getApplicationPackageForPlatform( + package = await ApplicationPackageFactory.instance.getPackageForPlatform( targetPlatform, applicationBinary: hotRunner.applicationBinary ); @@ -319,7 +319,7 @@ class FlutterDevice { bool shouldBuild = true, }) async { final TargetPlatform targetPlatform = await device.targetPlatform; - package = await getApplicationPackageForPlatform( + package = await ApplicationPackageFactory.instance.getPackageForPlatform( targetPlatform, applicationBinary: coldRunner.applicationBinary );