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
20 changes: 13 additions & 7 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
task("clean", type = Delete::class) {
delete(buildDir)
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}

subprojects {
group = "dev.rikka.tools.autoresconfig"
version = "1.2.1"
version = "1.3.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 Expand Up @@ -61,7 +61,8 @@ subprojects {
mavenLocal()
maven {
name = "ossrh"
url = uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2")
url =
uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2")
credentials(PasswordCredentials::class.java)
}
}
Expand All @@ -75,7 +76,8 @@ subprojects {
if (findProperty("signing.gnupg.keyName") != null) {
useGpgCmd()

val signingTasks = sign(extensions.getByType<PublishingExtension>().publications)
val signingTasks =
sign(extensions.getByType<PublishingExtension>().publications)
tasks.withType(AbstractPublishToMaven::class) {
dependsOn(signingTasks)
}
Expand All @@ -85,3 +87,7 @@ subprojects {
}
}
}
tasks.named<UpdateDaemonJvm>("updateDaemonJvm") {
languageVersion = JavaLanguageVersion.of(21)
vendor = JvmVendorSpec.ADOPTIUM
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
package dev.rikka.tools.autoresconfig;

import com.android.build.gradle.AppExtension;
import com.android.build.gradle.api.ApplicationVariant;
import com.android.builder.core.AbstractProductFlavor;
import com.android.build.api.dsl.ApplicationExtension;
import com.android.build.api.variant.AndroidComponentsExtension;
import com.android.build.api.variant.ApplicationAndroidComponentsExtension;
import com.android.build.api.variant.ApplicationVariant;

import org.gradle.api.GradleException;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.file.Directory;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.gradle.api.tasks.SourceTask;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.*;
import java.util.stream.Collectors;

@SuppressWarnings("unused")
public class AutoResConfigPlugin implements Plugin<Project> {
Expand All @@ -34,7 +35,7 @@ private void collectModifiers(File dir, Collection<String> output) throws IOExce
return;
}

logger.debug("AutoResConfig: Collect modifiers from " + dir);
logger.debug("AutoResConfig: Collect modifiers from {}", dir);

try (var stream = Files.list(dir.toPath())) {
output.addAll(stream
Expand All @@ -54,19 +55,22 @@ private void collectModifiers(File dir, Collection<String> output) throws IOExce
.map(java.nio.file.Path::getFileName)
.map(path -> path.toFile().getName().substring("values-".length()))
.filter(s -> s.split("-").length <= 3)
.collect(Collectors.toList()));
.toList());
}
}

private Collection<String> collectModifiers(@SuppressWarnings("deprecation") ApplicationVariant variant) {
private Collection<String> collectModifiers(ApplicationVariant variant) {
var set = new HashSet<String>();
set.add("en");

Set<File> resDirs = new HashSet<>();
variant.getSourceSets().forEach(sourceProvider -> resDirs.addAll(sourceProvider.getResDirectories()));
Set<Directory> resDirs = new HashSet<>();
var res = variant.getSources().getRes();
if (res != null) {
res.getStatic().get().forEach(resDirs::addAll);
}

for (File dir : resDirs) {
Set<String> modifiers = modifierCache.get(dir.getAbsolutePath());
for (var dir : resDirs) {
Set<String> modifiers = modifierCache.get(dir.getAsFile().getAbsolutePath());
if (modifiers != null) {
set.addAll(modifiers);
}
Expand All @@ -77,20 +81,6 @@ private Collection<String> collectModifiers(@SuppressWarnings("deprecation") App
return list;
}

private boolean updateResConfig(@SuppressWarnings("deprecation") ApplicationVariant variant, Collection<String> modifiers) {
var mergedFlavor = variant.getMergedFlavor();

//noinspection deprecation
if (mergedFlavor instanceof AbstractProductFlavor) {
//noinspection deprecation
var flavor = (AbstractProductFlavor) mergedFlavor;
flavor.addResourceConfigurations(modifiers);
return true;
} else {
return false;
}
}

private Collection<String> convertModifiersToLocales(Collection<String> modifiers) {
var locales = new ArrayList<String>();

Expand Down Expand Up @@ -135,7 +125,7 @@ private Collection<String> convertLocalesToDisplayLocales(Collection<String> loc

@Override
public void apply(Project project) {
var appExtension = project.getExtensions().findByType(AppExtension.class);
var appExtension = project.getExtensions().findByType(ApplicationExtension.class);
if (appExtension == null) throw new GradleException("Android application extension not found");

var extension = project.getExtensions().create(
Expand All @@ -145,11 +135,10 @@ public void apply(Project project) {
modifierCache.clear();

appExtension.getSourceSets().all(sourceSet -> {
Set<String> mainModifiers = null;

logger.info("AutoResConfig: Collect locale modifiers for " + sourceSet.getName());
logger.info("AutoResConfig: Collect locale modifiers for {}", sourceSet.getName());

for (File dir : sourceSet.getRes().getSrcDirs()) {
for (var path : sourceSet.getRes().getDirectories()) {
var dir = project.getLayout().getProjectDirectory().dir(path).getAsFile();
var absolutePath = dir.getAbsolutePath();

var set = modifierCache.get(absolutePath);
Expand All @@ -163,91 +152,95 @@ public void apply(Project project) {
try {
collectModifiers(dir, set);
} catch (IOException e) {
logger.error("AutoResConfig: Failed to collect modifiers from " + dir, e);
}

if (sourceSet.getName().equals("main")) {
mainModifiers = set;
}
}

if (sourceSet.getName().equals("main")) {
if (mainModifiers != null) {
var list = new ArrayList<>(mainModifiers);
list.sort(String.CASE_INSENSITIVE_ORDER);

appExtension.getDefaultConfig().resConfigs(list);
logger.info("AutoResConfig: Update default resConfig " + mainModifiers);
} else {
logger.warn("AutoResConfig: mainModifiers is null");
logger.error("AutoResConfig: Failed to collect modifiers from {}", dir, e);
}
}
});

appExtension.getApplicationVariants().all(variant -> {
var variantName = variant.getName();
var variantNameCapitalized = Util.capitalize(variantName);
var androidComponents = project.getExtensions().findByType(AndroidComponentsExtension.class);
if (androidComponents instanceof ApplicationAndroidComponentsExtension componentsExtension) {
componentsExtension.onVariants(androidComponents.selector().all(), variant -> {
var variantName = variant.getName();
var variantNameCapitalized = Util.capitalize(variantName);

logger.info("AutoResConfig: Variant " + variantName);
logger.info("AutoResConfig: " + extension);
logger.info("AutoResConfig: Variant {}", variantName);
logger.info("AutoResConfig: {}", extension);

var modifiers = collectModifiers(variant);
var modifiers = collectModifiers(variant);

if (updateResConfig(variant, modifiers)) {
logger.info("AutoResConfig: Update resConfig " + modifiers);
} else {
logger.error("AutoResConfig: Failed to update resConfig");
}
variant.getAndroidResources()
.getLocaleFilters()
.addAll(modifiers);

var locales = convertModifiersToLocales(modifiers);
var displayLocales = convertLocalesToDisplayLocales(locales);
logger.info("AutoResConfig: Locales " + locales);
logger.info("AutoResConfig: Display locales " + displayLocales);
var locales = convertModifiersToLocales(modifiers);
var displayLocales = convertLocalesToDisplayLocales(locales);
logger.info("AutoResConfig: Locales {}", locales);
logger.info("AutoResConfig: Display locales {}", displayLocales);

if (extension.getGenerateClass().get()) {
var javaSourceDir = new File(project.getBuildDir(),
String.format("generated/auto_res_config/%s/java", variantName));
if (extension.getGenerateClass().get()) {
var javaSourceDir = project.getLayout().getBuildDirectory()
.dir(String.format("generated/auto_res_config/%s/java", variantName));

var taskName = String.format("generate%sAutoResConfigSource", variantNameCapitalized);
var taskName = String.format("generate%sAutoResConfigSource", variantNameCapitalized);

var generateJavaTask = project.getTasks().register(taskName,
GenerateJavaTask.class, extension, javaSourceDir, locales, displayLocales);
var task = project.getTasks().register(taskName,
GenerateJavaTask.class, t -> {
t.getExtension().set(extension);
t.getOutputDir().set(javaSourceDir);
t.getLocales().set(locales);
t.getDisplayLocales().set(displayLocales);
});

variant.registerJavaGeneratingTask(generateJavaTask, javaSourceDir);
var java = variant.getSources().getJava();
if (java != null) {
java.addGeneratedSourceDirectory(task, GenerateJavaTask::getOutputDir);
}

logger.info("AutoResConfig: register " + taskName + " " + javaSourceDir);
}
logger.info("AutoResConfig: register {} {}", taskName, javaSourceDir);
}

if (extension.getGenerateRes().get()) {
var resDir = new File(project.getBuildDir(),
String.format("generated/auto_res_config/%s/res", variantName));
if (extension.getGenerateRes().get()) {
var resDir = project.getLayout().getBuildDirectory()
.dir(String.format("generated/auto_res_config/%s/res", variantName));

var taskName = String.format("generate%sAutoResConfigRes", variantNameCapitalized);
var taskName = String.format("generate%sAutoResConfigRes", variantNameCapitalized);

var generateResTask = project.getTasks().register(taskName,
GenerateResTask.class, extension, resDir, locales, displayLocales);
var task = project.getTasks().register(taskName, GenerateResTask.class, t -> {
t.getExtension().set(extension);
t.getOutputDir().set(resDir);
t.getLocales().set(locales);
t.getDisplayLocales().set(displayLocales);
});

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

logger.info("AutoResConfig: register " + taskName + " " + resDir);
}
logger.info("AutoResConfig: register {} {}", taskName, resDir);
}

if (extension.getGenerateLocaleConfig().get()) {
var resDir = new File(project.getBuildDir(),
String.format("generated/auto_res_config/%s/res", variantName));
if (extension.getGenerateLocaleConfig().get()) {
var resDir = project.getLayout().getBuildDirectory()
.dir(String.format("generated/auto_res_config/%s/res", variantName));

var taskName = String.format("generate%sAutoResConfigLocaleConfigRes", variantNameCapitalized);
var taskName = String.format("generate%sAutoResConfigLocaleConfigRes", variantNameCapitalized);

var generateResTask = project.getTasks().register(taskName,
GenerateLocaleConfigResTask.class, resDir, locales, displayLocales);
var task = project.getTasks().register(taskName, GenerateLocaleConfigResTask.class, t -> {
t.getOutputDir().set(resDir);
t.getLocales().set(locales);
t.getDisplayLocales().set(displayLocales);
});

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

logger.info("AutoResConfig: register " + taskName + " " + resDir);
}
});
logger.info("AutoResConfig: register {} {}", taskName, resDir);
}
});
}

}
}
Loading