// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // @dart = 2.8 import 'package:file/file.dart'; import '../test_utils.dart'; abstract class DeferredComponentsConfig { String get deferredLibrary; String get deferredComponentsGolden; String get androidSettings; String get androidBuild; String get androidLocalProperties; String get androidGradleProperties; String get androidKeyProperties; List<int> get androidKey; String get appBuild; String get appManifest; String get appStrings; String get appStyles; String get appLaunchBackground; String get asset1; String get asset2; List<DeferredComponentModule> get deferredComponents; void setUpIn(Directory dir) { if (deferredLibrary != null) { writeFile(fileSystem.path.join(dir.path, 'lib', 'deferred_library.dart'), deferredLibrary); } if (deferredComponentsGolden != null) { writeFile(fileSystem.path.join(dir.path, 'deferred_components_loading_units.yaml'), deferredComponentsGolden); } if (androidSettings != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'settings.gradle'), androidSettings); } if (androidBuild != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'build.gradle'), androidBuild); } if (androidLocalProperties != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'local.properties'), androidLocalProperties); } if (androidGradleProperties != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'gradle.properties'), androidGradleProperties); } if (androidKeyProperties != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'key.properties'), androidKeyProperties); } if (androidKey != null) { writeBytesFile(fileSystem.path.join(dir.path, 'android', 'app', 'key.jks'), androidKey); } if (appBuild != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'build.gradle'), appBuild); } if (appManifest != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'AndroidManifest.xml'), appManifest); } if (appStrings != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'res', 'values', 'strings.xml'), appStrings); } if (appStyles != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'res', 'values', 'styles.xml'), appStyles); } if (appLaunchBackground != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'res', 'drawable', 'launch_background.xml'), appLaunchBackground); } if (asset1 != null) { writeFile(fileSystem.path.join(dir.path, 'test_assets/asset1.txt'), asset1); } if (asset2 != null) { writeFile(fileSystem.path.join(dir.path, 'test_assets/asset2.txt'), asset2); } if (deferredComponents != null) { for (final DeferredComponentModule component in deferredComponents) { component.setUpIn(dir); } } } } class DeferredComponentModule { DeferredComponentModule(this.name); String name; void setUpIn(Directory dir) { if (name != null) { writeFile(fileSystem.path.join(dir.path, 'android', name, 'build.gradle'), r''' def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } apply plugin: "com.android.dynamic-feature" android { compileSdkVersion 30 sourceSets { applicationVariants.all { variant -> main.assets.srcDirs += "${project.buildDir}/intermediates/flutter/${variant.name}/deferred_assets" main.jniLibs.srcDirs += "${project.buildDir}/intermediates/flutter/${variant.name}/deferred_libs" } } defaultConfig { minSdkVersion 16 targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } } dependencies { implementation project(":app") } '''); writeFile(fileSystem.path.join(dir.path, 'android', name, 'src', 'main', 'AndroidManifest.xml'), ''' <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dist="http://schemas.android.com/apk/distribution" package="com.example.$name"> <dist:module dist:instant="false" dist:title="@string/component1Name"> <dist:delivery> <dist:on-demand /> </dist:delivery> <dist:fusing dist:include="true" /> </dist:module> </manifest> '''); } } }