package Ġcom . github . ouch adam . the mr Ċ Ċ import Ġcom . android . build . gradle . App Plugin Ċ import Ġcom . android . build . gradle . Library Plugin Ċ import Ġcom . android . build . gradle . api . Android Source Set Ċ import Ġcom . squareup . jav ap o et . Java File Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . Named Domain Object Container Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . file . Project Layout Ċ import Ġorg . gradle . api . model . ObjectFactory Ċ import Ġorg . gradle . api . tasks . Cache able Task Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Input Files Ċ import Ġorg . gradle . api . tasks . Output Directory Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġjava . io . File Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ Ċ private Ġconst Ġval ĠSOURCE _ GENERATED _ OUTPUT _ DIR Ġ= Ġ" build / generated / source / the mr " Ċ private Ġconst Ġval ĠRES _ GENERATED _ OUTPUT _ DIR Ġ= Ġ" build / generated / res / the mr " Ċ Ċ class ĠThe mr Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġproject . extensions . create (" the mr ", ĠThe mr Plugin Extension :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġproject . plugins . with Type ( App Plugin :: class . java ) Ġ{ Ġplugin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . extension . source Sets Ġ{ Ġregister Generated Sources ( it , Ġproject ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . plugins . with Type ( Library Plugin :: class . java ) Ġ{ Ġplugin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . extension . source Sets Ġ{ Ġregister Generated Sources ( it , Ġproject ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . tasks . register (" the mr Generate Themes ", ĠGenerate Task :: class . java ) Ġ{ Ġinstance Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . palette Files . set From ( project . files ( extension . source . map Ġ{ ĠfileName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" src / main / res / values /$ fileName . xml " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . combin ations . set ( extension . combin ations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . packageName . set ( read PackageName ( project )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġproject . after Evaluate Ġ{ Ġproject . tasks . get ByName (" pre Build "). depends On (" the mr Generate Themes ") Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Generated Sources ( source Sets : ĠNamed Domain Object Container < Android Source Set >, Ġproject : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmain Ġ= Ġsource Sets . get ByName (" main ") ĊĠĠĠĠĠĠĠ Ġmain . res . src Dirs ( project . file ( RES _ GENERATED _ OUTPUT _ DIR )) ĊĠĠĠĠĠĠĠ Ġmain . java . src Dirs ( project . file ( SOURCE _ GENERATED _ OUTPUT _ DIR )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread PackageName ( project : ĠProject ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproject . plugins . find Plugin ( App Plugin :: class . java )?. extension ?. default Config ?. application Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfind PackageName From Manifest ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" The Ġproject Ġdoesn 't Ġapply Ġan Ġandroid Ġplugin !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind PackageName From Manifest ( project : ĠProject ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanifest Ġ= Ġproject . file (" src / main / Android Manifest . xml ") ĊĠĠĠĠĠĠĠ Ġval Ġxml Doc Ġ= ĠDocument BuilderFactory . newInstance (). new Document Builder (). parse ( manifest ) ĊĠĠĠĠĠĠĠ Ġxml Doc . documentElement . normalize () ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxml Doc . getElementsByTagName (" manifest "). item ( 0 ). attributes . getName d Item (" package "). node Value ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠThe mr Style ( val Ġstyle : ĠStyle , Ġval Ġpalette : ĠString , Ġval Ġtheme : ĠString ) Ċ Ċ open Ġclass ĠThe mr Plugin Extension Ġ{ ĊĊĠĠĠ Ġvar Ġsource : ĠList < String > Ġ= ĠlistOf (" the mr ") ĊĠĠĠ Ġvar Ġcombinations Ġ= Ġempty Map < String , ĠList < String >>() Ċ } Ċ Ċ @ Cache able Task Ċ open Ġclass ĠGenerate Task Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġobjects : ĠObject Factory , ĊĠĠĠ Ġproject Layout : ĠProject Layout Ċ ) Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠ Ġ@ Input ĊĠĠĠ Ġval Ġcombinations Ġ= Ġobjects . map Property ( String :: class . java , ĠList :: class . java ) ĊĊĠĠĠ Ġ@ Input Files ĊĠĠĠ Ġval Ġpalette Files Ġ= Ġobjects . file Collection () ĊĊĠĠĠ Ġ@ Output Directory ĊĠĠĠ Ġval Ġgenerated Source Output Ġ= Ġproject Layout . project Directory . dir ( SOURCE _ GENERATED _ OUTPUT _ DIR ) ĊĊĠĠĠ Ġ@ Output Directory ĊĠĠĠ Ġval Ġgenerated Res Output Ġ= Ġproject Layout . project Directory . dir ( RES _ GENERATED _ OUTPUT _ DIR ) ĊĊĠĠĠ Ġval ĠpackageName Ġ= Ġobjects . property ( String :: class . java ) ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstyles Ġ= Ġparse Resource Styles ( palette Files ) ĊĠĠĠĠĠĠĠ Ġval Ġthem r Styles Ġ= Ġcreate Theme Combin ations ( styles , Ġcombinations . get () Ġas ĠMap < String , ĠList < String >>) ĊĊĠĠĠĠĠĠĠ Ġwrite Generated Styles ( create Output Styles ( the mr Styles )) ĊĠĠĠĠĠĠĠ Ġwrite Generated Source ( create The m R ( packageName . get (), Ġthem r Styles )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Generated Styles ( styles File Contents : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= Ġgenerated Res Output . dir (" values "). as File ĊĠĠĠĠĠĠĠ Ġif Ġ(! directory . exists ()) Ġdirectory . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( directory , Ġ" gen - the mr . xml "). write Text ( styles File Contents ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Generated Source ( java File : ĠJava File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= Ġgenerated Source Output . as File ĊĠĠĠĠĠĠĠ Ġif Ġ(! directory . exists ()) Ġdirectory . mkdir s () ĊĠĠĠĠĠĠĠ Ġjava File . writeTo ( directory ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Theme Combin ations ( styles : ĠMap < String , ĠStyle >, Ġcombinations : ĠMap < String , ĠList < String >> ): ĠList < The mr Style > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcombinations . entries . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtheme Style Ġ= Ġstyles . getValue ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . map Ġ{ Ġpalette Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpalette Style Ġ= Ġstyles . getValue ( palette Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe mr Style ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStyle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ"${ palette Style . name }_${ theme Style . name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġpalette Style . items . plus ( theme Style . items ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġtheme Style . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpalette Ġ= Ġpalette Style . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtheme Ġ= Ġtheme Style . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. flatten () ĊĠĠĠ Ġ} Ċ }