11package dev .rikka .tools .autoresconfig ;
22
3- import com .android .build .gradle .AppExtension ;
4- import com .android .build .gradle .api .ApplicationVariant ;
5- import com .android .builder .core .AbstractProductFlavor ;
3+ import com .android .build .api .dsl .ApplicationExtension ;
4+ import com .android .build .api .variant .AndroidComponentsExtension ;
5+ import com .android .build .api .variant .ApplicationAndroidComponentsExtension ;
6+ import com .android .build .api .variant .ApplicationVariant ;
7+
68import org .gradle .api .GradleException ;
79import org .gradle .api .Plugin ;
810import org .gradle .api .Project ;
11+ import org .gradle .api .file .Directory ;
912import org .gradle .api .logging .Logger ;
1013import org .gradle .api .logging .Logging ;
11- import org .gradle .api .tasks .SourceTask ;
1214
1315import java .io .File ;
1416import java .io .IOException ;
1517import java .nio .file .Files ;
1618import java .util .*;
17- import java .util .stream .Collectors ;
1819
1920@ SuppressWarnings ("unused" )
2021public class AutoResConfigPlugin implements Plugin <Project > {
@@ -34,7 +35,7 @@ private void collectModifiers(File dir, Collection<String> output) throws IOExce
3435 return ;
3536 }
3637
37- logger .debug ("AutoResConfig: Collect modifiers from " + dir );
38+ logger .debug ("AutoResConfig: Collect modifiers from {}" , dir );
3839
3940 try (var stream = Files .list (dir .toPath ())) {
4041 output .addAll (stream
@@ -54,19 +55,22 @@ private void collectModifiers(File dir, Collection<String> output) throws IOExce
5455 .map (java .nio .file .Path ::getFileName )
5556 .map (path -> path .toFile ().getName ().substring ("values-" .length ()))
5657 .filter (s -> s .split ("-" ).length <= 3 )
57- .collect ( Collectors . toList () ));
58+ .toList ());
5859 }
5960 }
6061
61- private Collection <String > collectModifiers (@ SuppressWarnings ( "deprecation" ) ApplicationVariant variant ) {
62+ private Collection <String > collectModifiers (ApplicationVariant variant ) {
6263 var set = new HashSet <String >();
6364 set .add ("en" );
6465
65- Set <File > resDirs = new HashSet <>();
66- variant .getSourceSets ().forEach (sourceProvider -> resDirs .addAll (sourceProvider .getResDirectories ()));
66+ Set <Directory > resDirs = new HashSet <>();
67+ var res = variant .getSources ().getRes ();
68+ if (res != null ) {
69+ res .getStatic ().get ().forEach (resDirs ::addAll );
70+ }
6771
68- for (File dir : resDirs ) {
69- Set <String > modifiers = modifierCache .get (dir .getAbsolutePath ());
72+ for (var dir : resDirs ) {
73+ Set <String > modifiers = modifierCache .get (dir .getAsFile (). getAbsolutePath ());
7074 if (modifiers != null ) {
7175 set .addAll (modifiers );
7276 }
@@ -77,20 +81,6 @@ private Collection<String> collectModifiers(@SuppressWarnings("deprecation") App
7781 return list ;
7882 }
7983
80- private boolean updateResConfig (@ SuppressWarnings ("deprecation" ) ApplicationVariant variant , Collection <String > modifiers ) {
81- var mergedFlavor = variant .getMergedFlavor ();
82-
83- //noinspection deprecation
84- if (mergedFlavor instanceof AbstractProductFlavor ) {
85- //noinspection deprecation
86- var flavor = (AbstractProductFlavor ) mergedFlavor ;
87- flavor .addResourceConfigurations (modifiers );
88- return true ;
89- } else {
90- return false ;
91- }
92- }
93-
9484 private Collection <String > convertModifiersToLocales (Collection <String > modifiers ) {
9585 var locales = new ArrayList <String >();
9686
@@ -135,7 +125,7 @@ private Collection<String> convertLocalesToDisplayLocales(Collection<String> loc
135125
136126 @ Override
137127 public void apply (Project project ) {
138- var appExtension = project .getExtensions ().findByType (AppExtension .class );
128+ var appExtension = project .getExtensions ().findByType (ApplicationExtension .class );
139129 if (appExtension == null ) throw new GradleException ("Android application extension not found" );
140130
141131 var extension = project .getExtensions ().create (
@@ -145,11 +135,10 @@ public void apply(Project project) {
145135 modifierCache .clear ();
146136
147137 appExtension .getSourceSets ().all (sourceSet -> {
148- Set <String > mainModifiers = null ;
149-
150- logger .info ("AutoResConfig: Collect locale modifiers for " + sourceSet .getName ());
138+ logger .info ("AutoResConfig: Collect locale modifiers for {}" , sourceSet .getName ());
151139
152- for (File dir : sourceSet .getRes ().getSrcDirs ()) {
140+ for (var path : sourceSet .getRes ().getDirectories ()) {
141+ var dir = project .getLayout ().getProjectDirectory ().dir (path ).getAsFile ();
153142 var absolutePath = dir .getAbsolutePath ();
154143
155144 var set = modifierCache .get (absolutePath );
@@ -163,91 +152,95 @@ public void apply(Project project) {
163152 try {
164153 collectModifiers (dir , set );
165154 } catch (IOException e ) {
166- logger .error ("AutoResConfig: Failed to collect modifiers from " + dir , e );
167- }
168-
169- if (sourceSet .getName ().equals ("main" )) {
170- mainModifiers = set ;
171- }
172- }
173-
174- if (sourceSet .getName ().equals ("main" )) {
175- if (mainModifiers != null ) {
176- var list = new ArrayList <>(mainModifiers );
177- list .sort (String .CASE_INSENSITIVE_ORDER );
178-
179- appExtension .getDefaultConfig ().resConfigs (list );
180- logger .info ("AutoResConfig: Update default resConfig " + mainModifiers );
181- } else {
182- logger .warn ("AutoResConfig: mainModifiers is null" );
155+ logger .error ("AutoResConfig: Failed to collect modifiers from {}" , dir , e );
183156 }
184157 }
185158 });
186159
187- appExtension .getApplicationVariants ().all (variant -> {
188- var variantName = variant .getName ();
189- var variantNameCapitalized = Util .capitalize (variantName );
160+ var androidComponents = project .getExtensions ().findByType (AndroidComponentsExtension .class );
161+ if (androidComponents instanceof ApplicationAndroidComponentsExtension componentsExtension ) {
162+ componentsExtension .onVariants (androidComponents .selector ().all (), variant -> {
163+ var variantName = variant .getName ();
164+ var variantNameCapitalized = Util .capitalize (variantName );
190165
191- logger .info ("AutoResConfig: Variant " + variantName );
192- logger .info ("AutoResConfig: " + extension );
166+ logger .info ("AutoResConfig: Variant {}" , variantName );
167+ logger .info ("AutoResConfig: {}" , extension );
193168
194- var modifiers = collectModifiers (variant );
169+ var modifiers = collectModifiers (variant );
195170
196- if (updateResConfig (variant , modifiers )) {
197- logger .info ("AutoResConfig: Update resConfig " + modifiers );
198- } else {
199- logger .error ("AutoResConfig: Failed to update resConfig" );
200- }
171+ variant .getAndroidResources ()
172+ .getLocaleFilters ()
173+ .addAll (modifiers );
201174
202- var locales = convertModifiersToLocales (modifiers );
203- var displayLocales = convertLocalesToDisplayLocales (locales );
204- logger .info ("AutoResConfig: Locales " + locales );
205- logger .info ("AutoResConfig: Display locales " + displayLocales );
175+ var locales = convertModifiersToLocales (modifiers );
176+ var displayLocales = convertLocalesToDisplayLocales (locales );
177+ logger .info ("AutoResConfig: Locales {}" , locales );
178+ logger .info ("AutoResConfig: Display locales {}" , displayLocales );
206179
207- if (extension .getGenerateClass ().get ()) {
208- var javaSourceDir = new File ( project .getBuildDir (),
209- String .format ("generated/auto_res_config/%s/java" , variantName ));
180+ if (extension .getGenerateClass ().get ()) {
181+ var javaSourceDir = project .getLayout (). getBuildDirectory ()
182+ . dir ( String .format ("generated/auto_res_config/%s/java" , variantName ));
210183
211- var taskName = String .format ("generate%sAutoResConfigSource" , variantNameCapitalized );
184+ var taskName = String .format ("generate%sAutoResConfigSource" , variantNameCapitalized );
212185
213- var generateJavaTask = project .getTasks ().register (taskName ,
214- GenerateJavaTask .class , extension , javaSourceDir , locales , displayLocales );
186+ var task = project .getTasks ().register (taskName ,
187+ GenerateJavaTask .class , t -> {
188+ t .getExtension ().set (extension );
189+ t .getOutputDir ().set (javaSourceDir );
190+ t .getLocales ().set (locales );
191+ t .getDisplayLocales ().set (displayLocales );
192+ });
215193
216- variant .registerJavaGeneratingTask (generateJavaTask , javaSourceDir );
194+ var java = variant .getSources ().getJava ();
195+ if (java != null ) {
196+ java .addGeneratedSourceDirectory (task , GenerateJavaTask ::getOutputDir );
197+ }
217198
218- logger .info ("AutoResConfig: register " + taskName + " " + javaSourceDir );
219- }
199+ logger .info ("AutoResConfig: register {} {}" , taskName , javaSourceDir );
200+ }
220201
221- if (extension .getGenerateRes ().get ()) {
222- var resDir = new File ( project .getBuildDir (),
223- String .format ("generated/auto_res_config/%s/res" , variantName ));
202+ if (extension .getGenerateRes ().get ()) {
203+ var resDir = project .getLayout (). getBuildDirectory ()
204+ . dir ( String .format ("generated/auto_res_config/%s/res" , variantName ));
224205
225- var taskName = String .format ("generate%sAutoResConfigRes" , variantNameCapitalized );
206+ var taskName = String .format ("generate%sAutoResConfigRes" , variantNameCapitalized );
226207
227- var generateResTask = project .getTasks ().register (taskName ,
228- GenerateResTask .class , extension , resDir , locales , displayLocales );
208+ var task = project .getTasks ().register (taskName , GenerateResTask .class , t -> {
209+ t .getExtension ().set (extension );
210+ t .getOutputDir ().set (resDir );
211+ t .getLocales ().set (locales );
212+ t .getDisplayLocales ().set (displayLocales );
213+ });
229214
230- variant .registerGeneratedResFolders (
231- project .files (resDir ).builtBy (generateResTask ));
215+ var res = variant .getSources ().getRes ();
216+ if (res != null ) {
217+ res .addGeneratedSourceDirectory (task , GenerateResTask ::getOutputDir );
218+ }
232219
233- logger .info ("AutoResConfig: register " + taskName + " " + resDir );
234- }
220+ logger .info ("AutoResConfig: register {} {}" , taskName , resDir );
221+ }
235222
236- if (extension .getGenerateLocaleConfig ().get ()) {
237- var resDir = new File ( project .getBuildDir (),
238- String .format ("generated/auto_res_config/%s/res" , variantName ));
223+ if (extension .getGenerateLocaleConfig ().get ()) {
224+ var resDir = project .getLayout (). getBuildDirectory ()
225+ . dir ( String .format ("generated/auto_res_config/%s/res" , variantName ));
239226
240- var taskName = String .format ("generate%sAutoResConfigLocaleConfigRes" , variantNameCapitalized );
227+ var taskName = String .format ("generate%sAutoResConfigLocaleConfigRes" , variantNameCapitalized );
241228
242- var generateResTask = project .getTasks ().register (taskName ,
243- GenerateLocaleConfigResTask .class , resDir , locales , displayLocales );
229+ var task = project .getTasks ().register (taskName , GenerateLocaleConfigResTask .class , t -> {
230+ t .getOutputDir ().set (resDir );
231+ t .getLocales ().set (locales );
232+ t .getDisplayLocales ().set (displayLocales );
233+ });
244234
245- variant .registerGeneratedResFolders (
246- project .files (resDir ).builtBy (generateResTask ));
235+ var res = variant .getSources ().getRes ();
236+ if (res != null ) {
237+ res .addGeneratedSourceDirectory (task , GenerateLocaleConfigResTask ::getOutputDir );
238+ }
247239
248- logger .info ("AutoResConfig: register " + taskName + " " + resDir );
249- }
250- });
240+ logger .info ("AutoResConfig: register {} {}" , taskName , resDir );
241+ }
242+ });
243+ }
251244
252245 }
253246}
0 commit comments