Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
subprojects {
group = "dev.rikka.tools.materialthemebuilder"
version = "1.4.0"
version = "1.6.0"

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

extensions.configure<JavaPluginExtension> {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
tasks.register("sourcesJar", type = Jar::class) {
archiveClassifier.set("sources")
Expand Down
4 changes: 2 additions & 2 deletions gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ plugins {
dependencies {
compileOnly(gradleApi())
compileOnly(libs.android.gradle)
implementation("com.google.guava:guava:33.3.1-jre")
compileOnly("androidx.annotation:annotation:1.8.2")
implementation("com.google.guava:guava:33.5.0-jre")
compileOnly("androidx.annotation:annotation:1.9.1")
}

sourceSets {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@
package dev.rikka.tools.materialthemebuilder;

import org.gradle.api.DefaultTask;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Property;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;

import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

public class GenerateJavaTask extends DefaultTask {
public abstract class GenerateJavaTask extends DefaultTask {

private static final String CLASSNAME = "Harmonization";

private final MaterialThemeBuilderExtension extension;
private final File dir;
private final File file;
@Input
@Optional
public abstract Property<String> getPackageName();

@Inject
public GenerateJavaTask(MaterialThemeBuilderExtension extension, File dir) {
this.extension = extension;
this.dir = dir;
this.file = new File(dir, String.format("%s.java",
String.join("/", (extension.getPackageName() + "." + CLASSNAME).split("\\."))));
}
@Input
public abstract ListProperty<String> getHarmonizedAttrs();

@OutputDirectory
public abstract DirectoryProperty getOutputDir();

@TaskAction
public void generate() throws IOException {
Util.clearDir(dir);
Util.clearDir(getOutputDir().get().getAsFile());

if (extension.getPackageName() == null) {
if (!getPackageName().isPresent()) {
return;
}

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

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

public void write(PrintStream os) {
String content = "package %s;\n" +
"\n" +
"public final class %s {\n" +
" public static final int[] HARMONIZED_COLOR_ATTRIBUTES = {%s};\n" +
"}\n";

List<String> attrs = new ArrayList<>();

for (MaterialThemeBuilderExtension.ExtendedColor extendedColor : extension.getExtendedColors()) {
if (!extendedColor.isHarmonize()) {
continue;
}

for (MaterialTheme.Color color : MaterialTheme.COLORS) {
attrs.add("R.attr." + color.getAttributeName(extendedColor.getNameForAttribute()));
}
}
private void write(PrintStream os) {
String content = """
package %s;

public final class %s {
public static final int[] HARMONIZED_COLOR_ATTRIBUTES = {%s};
}
""";

os.printf(content,
extension.getPackageName(),
getPackageName().get(),
CLASSNAME,
String.join(", ", attrs.toArray(new String[0])));
String.join(", ", getHarmonizedAttrs().get().toArray(new String[0])));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,52 +3,44 @@
import dev.rikka.tools.materialthemebuilder.generator.ColorStateListGenerator;
import dev.rikka.tools.materialthemebuilder.generator.ValuesAllGenerator;
import dev.rikka.tools.materialthemebuilder.generator.ValuesV31Generator;

import org.gradle.api.DefaultTask;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.provider.Property;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;

import javax.inject.Inject;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class GenerateResTask extends DefaultTask {
public abstract class GenerateResTask extends DefaultTask {
@Internal
public abstract Property<MaterialThemeBuilderExtension> getExtension();

private final File dir;
private final ValuesAllGenerator valuesAllGenerator;
private final ValuesV31Generator valuesV31Generator;
private final List<ColorStateListGenerator> colorStateListGenerators = new ArrayList<>();
@OutputDirectory
public abstract DirectoryProperty getOutputDir();

@Inject
public GenerateResTask(MaterialThemeBuilderExtension extension, File dir) {
this.dir = dir;
@TaskAction
public void generate() throws IOException {
var extension = getExtension().get();

Util.clearDir(getOutputDir().get().getAsFile());
if (extension.isGenerateTextColors()) {
for (String textColor : MaterialTheme.TEXT_COLORS) {
for (String emphasis : MaterialTheme.TEXT_COLOR_EMPHASIS) {
String filename = "color/"
+ MaterialTheme.getColorStateListFilename(textColor, emphasis)
+ ".xml";
colorStateListGenerators.add(
new ColorStateListGenerator(new File(dir, filename), "?" + textColor, emphasis));
new ColorStateListGenerator(
getOutputDir().file(filename).get().getAsFile(),
"?" + textColor,
emphasis
).generate();
}
}
}

valuesAllGenerator = new ValuesAllGenerator(new File(dir, "values/values.xml"), extension);
valuesV31Generator = new ValuesV31Generator(new File(dir, "values-v31/values.xml"), extension);
new ValuesAllGenerator(getOutputDir().file("values/values.xml").get().getAsFile(), extension).generate();
new ValuesV31Generator(getOutputDir().file("values-v31/values.xml").get().getAsFile(), extension).generate();
}

@TaskAction
public void generate() throws IOException {
Util.clearDir(dir);
for (ColorStateListGenerator colorStateListGenerator : colorStateListGenerators) {
colorStateListGenerator.generate();
}
valuesAllGenerator.generate();
valuesV31Generator.generate();
}


}

Original file line number Diff line number Diff line change
@@ -1,45 +1,66 @@
package dev.rikka.tools.materialthemebuilder;

import com.android.build.gradle.AppExtension;
import com.android.build.gradle.BaseExtension;
import com.android.build.gradle.LibraryExtension;
import com.android.build.gradle.api.BaseVariant;
import com.android.build.api.variant.AndroidComponentsExtension;
import com.android.build.api.variant.ApplicationAndroidComponentsExtension;
import com.android.build.api.variant.ApplicationVariant;
import com.android.build.api.variant.LibraryAndroidComponentsExtension;
import com.android.build.api.variant.LibraryVariant;
import com.android.build.api.variant.Variant;
import com.android.build.gradle.api.AndroidBasePlugin;

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;

import java.io.File;

@SuppressWarnings("unused")
public class MaterialThemeBuilderPlugin implements Plugin<Project> {

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

private void registerTask(@SuppressWarnings("deprecation") BaseVariant variant, Project project, MaterialThemeBuilderExtension extension) {
private void registerTask(Variant variant, Project project, MaterialThemeBuilderExtension extension) {
var variantName = variant.getName();
var variantNameCapitalized = Util.capitalize(variantName);

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

variant.registerGeneratedResFolders(
project.files(dir).builtBy(task));
var res = variant.getSources().getRes();
if (res != null) {
res.addGeneratedSourceDirectory(task, GenerateResTask::getOutputDir);
}
}

{
var dir = new File(project.getLayout().getBuildDirectory().getAsFile().get(),
String.format("generated/materialThemeBuilder/%s/java", variantName));
var taskName = String.format("generate%sMaterialThemeBuilderSource", variantNameCapitalized);
var task = project.getTasks().register(taskName,
GenerateJavaTask.class, extension, dir);

variant.registerJavaGeneratingTask(task, dir);
GenerateJavaTask.class, t -> {
t.getPackageName().set(extension.getPackageName());
t.getHarmonizedAttrs().set(
extension.getExtendedColors().stream()
.filter(MaterialThemeBuilderExtension.ExtendedColor::isHarmonize)
.flatMap(extendedColor ->
MaterialTheme.COLORS.stream()
.map(color -> "R.attr." +
color.getAttributeName(extendedColor.getNameForAttribute()))
)
.toList()
);
t.getOutputDir().set(
project.getLayout().getBuildDirectory()
.dir("generated/materialThemeBuilder/" + variantName + "/java"));
});
var java = variant.getSources().getJava();
if (java != null) {
java.addGeneratedSourceDirectory(task, GenerateJavaTask::getOutputDir);
}
}
}

Expand All @@ -48,16 +69,16 @@ public void apply(Project project) {
project.getPlugins().withId("com.android.base", (plugin) -> {
var extension = project.getExtensions().create(
MaterialThemeBuilderExtension.class, "materialThemeBuilder", MaterialThemeBuilderExtension.class);

var baseExtension = project.getExtensions().getByType(BaseExtension.class);

if (baseExtension instanceof AppExtension) {
((AppExtension) baseExtension).getApplicationVariants().all(applicationVariant ->
registerTask(applicationVariant, project, extension));
} else if (baseExtension instanceof LibraryExtension) {
((LibraryExtension) baseExtension).getLibraryVariants().all(libraryVariant ->
registerTask(libraryVariant, project, extension));
}
project.getPlugins().withType(AndroidBasePlugin.class, basePlugin -> {
var components = project.getExtensions().getByType(AndroidComponentsExtension.class);
if (components instanceof ApplicationAndroidComponentsExtension componentsExtension) {
componentsExtension.onVariants(components.selector().all(), (Action<ApplicationVariant>) variant ->
registerTask(variant, project, extension));
} else if (components instanceof LibraryAndroidComponentsExtension componentsExtension) {
componentsExtension.onVariants(components.selector().all(), (Action<LibraryVariant>) variant ->
registerTask(variant, project, extension));
}
});
});
}
}
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ dependencyResolutionManagement {
}
versionCatalogs {
create("libs") {
val agp = "8.7.0"
val agp = "9.0.1"

library("android-gradle", "com.android.tools.build", "gradle").version(agp)
}
Expand Down