Skip to content

Commit 63f1f18

Browse files
committed
Update for AGP 9.0
1 parent d12a702 commit 63f1f18

7 files changed

Lines changed: 106 additions & 101 deletions

File tree

build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
subprojects {
22
group = "dev.rikka.tools.materialthemebuilder"
3-
version = "1.4.0"
3+
version = "1.6.0"
44

55
plugins.withId("java") {
66
println("- Configuring `java`")
77

88
extensions.configure<JavaPluginExtension> {
9-
sourceCompatibility = JavaVersion.VERSION_11
10-
targetCompatibility = JavaVersion.VERSION_11
9+
sourceCompatibility = JavaVersion.VERSION_17
10+
targetCompatibility = JavaVersion.VERSION_17
1111
}
1212
tasks.register("sourcesJar", type = Jar::class) {
1313
archiveClassifier.set("sources")

gradle-plugin/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ plugins {
88
dependencies {
99
compileOnly(gradleApi())
1010
compileOnly(libs.android.gradle)
11-
implementation("com.google.guava:guava:33.3.1-jre")
12-
compileOnly("androidx.annotation:annotation:1.8.2")
11+
implementation("com.google.guava:guava:33.5.0-jre")
12+
compileOnly("androidx.annotation:annotation:1.9.1")
1313
}
1414

1515
sourceSets {
Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,41 @@
11
package dev.rikka.tools.materialthemebuilder;
22

33
import org.gradle.api.DefaultTask;
4+
import org.gradle.api.file.DirectoryProperty;
5+
import org.gradle.api.provider.ListProperty;
6+
import org.gradle.api.provider.Property;
7+
import org.gradle.api.tasks.Input;
8+
import org.gradle.api.tasks.Optional;
9+
import org.gradle.api.tasks.OutputDirectory;
410
import org.gradle.api.tasks.TaskAction;
511

6-
import javax.inject.Inject;
7-
import java.io.File;
812
import java.io.IOException;
913
import java.io.PrintStream;
10-
import java.util.ArrayList;
11-
import java.util.List;
1214

13-
public class GenerateJavaTask extends DefaultTask {
15+
public abstract class GenerateJavaTask extends DefaultTask {
1416

1517
private static final String CLASSNAME = "Harmonization";
1618

17-
private final MaterialThemeBuilderExtension extension;
18-
private final File dir;
19-
private final File file;
19+
@Input
20+
@Optional
21+
public abstract Property<String> getPackageName();
2022

21-
@Inject
22-
public GenerateJavaTask(MaterialThemeBuilderExtension extension, File dir) {
23-
this.extension = extension;
24-
this.dir = dir;
25-
this.file = new File(dir, String.format("%s.java",
26-
String.join("/", (extension.getPackageName() + "." + CLASSNAME).split("\\."))));
27-
}
23+
@Input
24+
public abstract ListProperty<String> getHarmonizedAttrs();
25+
26+
@OutputDirectory
27+
public abstract DirectoryProperty getOutputDir();
2828

2929
@TaskAction
3030
public void generate() throws IOException {
31-
Util.clearDir(dir);
31+
Util.clearDir(getOutputDir().get().getAsFile());
3232

33-
if (extension.getPackageName() == null) {
33+
if (!getPackageName().isPresent()) {
3434
return;
3535
}
3636

37+
var file = getOutputDir().file(String.format("%s.java",
38+
String.join("/", (getPackageName().get() + "." + CLASSNAME).split("\\.")))).get().getAsFile();
3739
Util.createFile(file);
3840

3941
var os = new PrintStream(file);
@@ -42,28 +44,18 @@ public void generate() throws IOException {
4244
os.close();
4345
}
4446

45-
public void write(PrintStream os) {
46-
String content = "package %s;\n" +
47-
"\n" +
48-
"public final class %s {\n" +
49-
" public static final int[] HARMONIZED_COLOR_ATTRIBUTES = {%s};\n" +
50-
"}\n";
51-
52-
List<String> attrs = new ArrayList<>();
53-
54-
for (MaterialThemeBuilderExtension.ExtendedColor extendedColor : extension.getExtendedColors()) {
55-
if (!extendedColor.isHarmonize()) {
56-
continue;
57-
}
58-
59-
for (MaterialTheme.Color color : MaterialTheme.COLORS) {
60-
attrs.add("R.attr." + color.getAttributeName(extendedColor.getNameForAttribute()));
61-
}
62-
}
47+
private void write(PrintStream os) {
48+
String content = """
49+
package %s;
50+
51+
public final class %s {
52+
public static final int[] HARMONIZED_COLOR_ATTRIBUTES = {%s};
53+
}
54+
""";
6355

6456
os.printf(content,
65-
extension.getPackageName(),
57+
getPackageName().get(),
6658
CLASSNAME,
67-
String.join(", ", attrs.toArray(new String[0])));
59+
String.join(", ", getHarmonizedAttrs().get().toArray(new String[0])));
6860
}
6961
}

gradle-plugin/src/main/java/dev/rikka/tools/materialthemebuilder/GenerateResTask.java

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,44 @@
33
import dev.rikka.tools.materialthemebuilder.generator.ColorStateListGenerator;
44
import dev.rikka.tools.materialthemebuilder.generator.ValuesAllGenerator;
55
import dev.rikka.tools.materialthemebuilder.generator.ValuesV31Generator;
6+
67
import org.gradle.api.DefaultTask;
8+
import org.gradle.api.file.DirectoryProperty;
9+
import org.gradle.api.provider.Property;
10+
import org.gradle.api.tasks.Internal;
11+
import org.gradle.api.tasks.OutputDirectory;
712
import org.gradle.api.tasks.TaskAction;
813

9-
import javax.inject.Inject;
10-
import java.io.File;
1114
import java.io.IOException;
12-
import java.util.ArrayList;
13-
import java.util.List;
1415

15-
public class GenerateResTask extends DefaultTask {
16+
public abstract class GenerateResTask extends DefaultTask {
17+
@Internal
18+
public abstract Property<MaterialThemeBuilderExtension> getExtension();
1619

17-
private final File dir;
18-
private final ValuesAllGenerator valuesAllGenerator;
19-
private final ValuesV31Generator valuesV31Generator;
20-
private final List<ColorStateListGenerator> colorStateListGenerators = new ArrayList<>();
20+
@OutputDirectory
21+
public abstract DirectoryProperty getOutputDir();
2122

22-
@Inject
23-
public GenerateResTask(MaterialThemeBuilderExtension extension, File dir) {
24-
this.dir = dir;
23+
@TaskAction
24+
public void generate() throws IOException {
25+
var extension = getExtension().get();
2526

27+
Util.clearDir(getOutputDir().get().getAsFile());
2628
if (extension.isGenerateTextColors()) {
2729
for (String textColor : MaterialTheme.TEXT_COLORS) {
2830
for (String emphasis : MaterialTheme.TEXT_COLOR_EMPHASIS) {
2931
String filename = "color/"
3032
+ MaterialTheme.getColorStateListFilename(textColor, emphasis)
3133
+ ".xml";
32-
colorStateListGenerators.add(
33-
new ColorStateListGenerator(new File(dir, filename), "?" + textColor, emphasis));
34+
new ColorStateListGenerator(
35+
getOutputDir().file(filename).get().getAsFile(),
36+
"?" + textColor,
37+
emphasis
38+
).generate();
3439
}
3540
}
3641
}
3742

38-
valuesAllGenerator = new ValuesAllGenerator(new File(dir, "values/values.xml"), extension);
39-
valuesV31Generator = new ValuesV31Generator(new File(dir, "values-v31/values.xml"), extension);
43+
new ValuesAllGenerator(getOutputDir().file("values/values.xml").get().getAsFile(), extension).generate();
44+
new ValuesV31Generator(getOutputDir().file("values-v31/values.xml").get().getAsFile(), extension).generate();
4045
}
41-
42-
@TaskAction
43-
public void generate() throws IOException {
44-
Util.clearDir(dir);
45-
for (ColorStateListGenerator colorStateListGenerator : colorStateListGenerators) {
46-
colorStateListGenerator.generate();
47-
}
48-
valuesAllGenerator.generate();
49-
valuesV31Generator.generate();
50-
}
51-
52-
5346
}
54-
Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,66 @@
11
package dev.rikka.tools.materialthemebuilder;
22

3-
import com.android.build.gradle.AppExtension;
4-
import com.android.build.gradle.BaseExtension;
5-
import com.android.build.gradle.LibraryExtension;
6-
import com.android.build.gradle.api.BaseVariant;
3+
import com.android.build.api.variant.AndroidComponentsExtension;
4+
import com.android.build.api.variant.ApplicationAndroidComponentsExtension;
5+
import com.android.build.api.variant.ApplicationVariant;
6+
import com.android.build.api.variant.LibraryAndroidComponentsExtension;
7+
import com.android.build.api.variant.LibraryVariant;
8+
import com.android.build.api.variant.Variant;
9+
import com.android.build.gradle.api.AndroidBasePlugin;
710

11+
import org.gradle.api.Action;
812
import org.gradle.api.Plugin;
913
import org.gradle.api.Project;
1014
import org.gradle.api.logging.Logger;
1115
import org.gradle.api.logging.Logging;
1216

13-
import java.io.File;
14-
1517
@SuppressWarnings("unused")
1618
public class MaterialThemeBuilderPlugin implements Plugin<Project> {
1719

1820
private final Logger logger = Logging.getLogger(MaterialThemeBuilderPlugin.class);
1921

20-
private void registerTask(@SuppressWarnings("deprecation") BaseVariant variant, Project project, MaterialThemeBuilderExtension extension) {
22+
private void registerTask(Variant variant, Project project, MaterialThemeBuilderExtension extension) {
2123
var variantName = variant.getName();
2224
var variantNameCapitalized = Util.capitalize(variantName);
2325

2426
{
25-
var dir = new File(project.getLayout().getBuildDirectory().getAsFile().get(),
26-
String.format("generated/materialThemeBuilder/%s/res", variantName));
2727
var taskName = String.format("generate%sMaterialThemeBuilderRes", variantNameCapitalized);
28-
var task = project.getTasks().register(taskName,
29-
GenerateResTask.class, extension, dir);
28+
var task = project.getTasks().register(taskName, GenerateResTask.class, t -> {
29+
t.getExtension().set(extension);
30+
t.getOutputDir().set(
31+
project.getLayout().getBuildDirectory()
32+
.dir("generated/materialThemeBuilder/" + variantName + "/res"));
33+
});
3034

31-
variant.registerGeneratedResFolders(
32-
project.files(dir).builtBy(task));
35+
var res = variant.getSources().getRes();
36+
if (res != null) {
37+
res.addGeneratedSourceDirectory(task, GenerateResTask::getOutputDir);
38+
}
3339
}
3440

3541
{
36-
var dir = new File(project.getLayout().getBuildDirectory().getAsFile().get(),
37-
String.format("generated/materialThemeBuilder/%s/java", variantName));
3842
var taskName = String.format("generate%sMaterialThemeBuilderSource", variantNameCapitalized);
3943
var task = project.getTasks().register(taskName,
40-
GenerateJavaTask.class, extension, dir);
41-
42-
variant.registerJavaGeneratingTask(task, dir);
44+
GenerateJavaTask.class, t -> {
45+
t.getPackageName().set(extension.getPackageName());
46+
t.getHarmonizedAttrs().set(
47+
extension.getExtendedColors().stream()
48+
.filter(MaterialThemeBuilderExtension.ExtendedColor::isHarmonize)
49+
.flatMap(extendedColor ->
50+
MaterialTheme.COLORS.stream()
51+
.map(color -> "R.attr." +
52+
color.getAttributeName(extendedColor.getNameForAttribute()))
53+
)
54+
.toList()
55+
);
56+
t.getOutputDir().set(
57+
project.getLayout().getBuildDirectory()
58+
.dir("generated/materialThemeBuilder/" + variantName + "/java"));
59+
});
60+
var java = variant.getSources().getJava();
61+
if (java != null) {
62+
java.addGeneratedSourceDirectory(task, GenerateJavaTask::getOutputDir);
63+
}
4364
}
4465
}
4566

@@ -48,16 +69,16 @@ public void apply(Project project) {
4869
project.getPlugins().withId("com.android.base", (plugin) -> {
4970
var extension = project.getExtensions().create(
5071
MaterialThemeBuilderExtension.class, "materialThemeBuilder", MaterialThemeBuilderExtension.class);
51-
52-
var baseExtension = project.getExtensions().getByType(BaseExtension.class);
53-
54-
if (baseExtension instanceof AppExtension) {
55-
((AppExtension) baseExtension).getApplicationVariants().all(applicationVariant ->
56-
registerTask(applicationVariant, project, extension));
57-
} else if (baseExtension instanceof LibraryExtension) {
58-
((LibraryExtension) baseExtension).getLibraryVariants().all(libraryVariant ->
59-
registerTask(libraryVariant, project, extension));
60-
}
72+
project.getPlugins().withType(AndroidBasePlugin.class, basePlugin -> {
73+
var components = project.getExtensions().getByType(AndroidComponentsExtension.class);
74+
if (components instanceof ApplicationAndroidComponentsExtension componentsExtension) {
75+
componentsExtension.onVariants(components.selector().all(), (Action<ApplicationVariant>) variant ->
76+
registerTask(variant, project, extension));
77+
} else if (components instanceof LibraryAndroidComponentsExtension componentsExtension) {
78+
componentsExtension.onVariants(components.selector().all(), (Action<LibraryVariant>) variant ->
79+
registerTask(variant, project, extension));
80+
}
81+
});
6182
});
6283
}
6384
}

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dependencyResolutionManagement {
1717
}
1818
versionCatalogs {
1919
create("libs") {
20-
val agp = "8.7.0"
20+
val agp = "9.0.1"
2121

2222
library("android-gradle", "com.android.tools.build", "gradle").version(agp)
2323
}

0 commit comments

Comments
 (0)