package com.simpligility.maven.plugins.android.phase01generatesources;
import com.android.builder.core.DefaultManifestParser;
import com.android.builder.symbols.RGeneration;
import com.android.builder.symbols.SymbolIo;
import com.android.builder.symbols.SymbolTable;
import com.android.utils.ILogger;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* Generates R classes containing appropriate resource values for dependent libraries.
*
* @author William Ferguson - william.ferguson@xandar.com.au
*/
final class ResourceClassGenerator
{
private final GenerateSourcesMojo mojo;
private final File targetDirectory;
private final File genDirectory;
private final Log log;
private final ILogger androidUtilsLog;
ResourceClassGenerator( final GenerateSourcesMojo mojo, final File targetDirectory,
final File genDirectory )
{
this.mojo = mojo;
this.targetDirectory = targetDirectory;
this.genDirectory = genDirectory;
this.log = mojo.getLog();
this.androidUtilsLog = new MavenILogger( log );
}
/**
* see {@link com.android.builder.core.AndroidBuilder#processResources(com.android.builder.internal.aapt.Aapt,
* com.android.builder.internal.aapt.AaptPackageConfig.Builder, boolean)}
*
* @param libraries
* @throws MojoExecutionException
*/
public void generateLibraryRs( final Set<Artifact> libraries ) throws MojoExecutionException
{
// list of all the symbol tables
final List<SymbolTable> symbolTables = new ArrayList<>( libraries.size() );
// For each dependency, load its symbol file.
for ( final Artifact lib : libraries )
{
final File unpackedLibDirectory = mojo.getUnpackedLibFolder( lib );
final File rFile = new File( unpackedLibDirectory, "R.txt" );
if ( rFile.isFile() )
{
final File libManifestFile = new File( unpackedLibDirectory, "AndroidManifest.xml" );
final String packageName = new DefaultManifestParser( libManifestFile ).getPackage();
log.info( "Reading R for " + packageName + " at " + rFile );
SymbolTable libSymbols = SymbolIo.read( rFile );
libSymbols = libSymbols.rename( packageName, libSymbols.getTableName() );
symbolTables.add( libSymbols );
}
}
if ( symbolTables.isEmpty() )
{
return;
}
// load the full resources values from the R.txt calculated for the project.
final File projectR = new File( targetDirectory, "R.txt" );
final SymbolTable mainSymbols = SymbolIo.read( projectR );
// now loop on all the package name, merge all the symbols to write, and write them
RGeneration.generateRForLibraries( mainSymbols, symbolTables, genDirectory.getAbsoluteFile(), false );
}
}