11package 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 ;
812import org .gradle .api .Plugin ;
913import org .gradle .api .Project ;
1014import org .gradle .api .logging .Logger ;
1115import org .gradle .api .logging .Logging ;
1216
13- import java .io .File ;
14-
1517@ SuppressWarnings ("unused" )
1618public 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}
0 commit comments