blob: 786441cce89378d07656a6b2124254d3f2639ca6 [file] [log] [blame] [edit]
// 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.
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) {
writeFile(fileSystem.path.join(dir.path, 'lib', 'deferred_library.dart'), deferredLibrary);
final String? golden = deferredComponentsGolden;
if (golden != null) {
writeFile(fileSystem.path.join(dir.path, 'deferred_components_loading_units.yaml'), golden);
}
writeFile(fileSystem.path.join(dir.path, 'android', 'settings.gradle'), androidSettings);
writeFile(fileSystem.path.join(dir.path, 'android', 'build.gradle'), androidBuild);
writeFile(fileSystem.path.join(dir.path, 'android', 'local.properties'), androidLocalProperties);
writeFile(fileSystem.path.join(dir.path, 'android', 'gradle.properties'), androidGradleProperties);
writeFile(fileSystem.path.join(dir.path, 'android', 'key.properties'), androidKeyProperties);
writeBytesFile(fileSystem.path.join(dir.path, 'android', 'app', 'key.jks'), androidKey);
writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'build.gradle'), appBuild);
writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'AndroidManifest.xml'), appManifest);
writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'res', 'values', 'strings.xml'), appStrings);
writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'res', 'values', 'styles.xml'), appStyles);
writeFile(fileSystem.path.join(dir.path, 'android', 'app', 'src', 'main', 'res', 'drawable', 'launch_background.xml'), appLaunchBackground);
writeFile(fileSystem.path.join(dir.path, 'test_assets/asset1.txt'), asset1);
writeFile(fileSystem.path.join(dir.path, 'test_assets/asset2.txt'), asset2);
for (final DeferredComponentModule component in deferredComponents) {
component.setUpIn(dir);
}
}
}
class DeferredComponentModule {
DeferredComponentModule(this.name);
String name;
void setUpIn(Directory dir) {
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 31
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 31
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>
''');
}
}