package org.robolectric.internal;
import org.robolectric.annotation.Config;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.res.Fs;
import org.robolectric.res.FsFile;
import org.robolectric.res.ResourcePath;
import org.robolectric.util.Logger;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.ListIterator;
public class BuckManifestFactory implements ManifestFactory {
private static final String BUCK_ROBOLECTRIC_RES_DIRECTORIES = "buck.robolectric_res_directories";
private static final String BUCK_ROBOLECTRIC_ASSETS_DIRECTORIES = "buck.robolectric_assets_directories";
private static final String BUCK_ROBOLECTRIC_MANIFEST = "buck.robolectric_manifest";
@Override
public ManifestIdentifier identify(Config config) {
String buckManifest = System.getProperty(BUCK_ROBOLECTRIC_MANIFEST);
FsFile manifestFile = Fs.fileFromPath(buckManifest);
return new ManifestIdentifier(manifestFile, null, null, config.packageName(), null);
}
@Override
public AndroidManifest create(ManifestIdentifier manifestIdentifier) {
String buckResDirs = System.getProperty(BUCK_ROBOLECTRIC_RES_DIRECTORIES);
String buckAssetsDirs = System.getProperty(BUCK_ROBOLECTRIC_ASSETS_DIRECTORIES);
String packageName = manifestIdentifier.getPackageName();
FsFile manifestFile = manifestIdentifier.getManifestFile();
final List<String> buckResources = buckResDirs == null ? null :
Arrays.asList(buckResDirs.split(File.pathSeparator));
final List<String> buckAssets = buckAssetsDirs == null ? null :
Arrays.asList(buckAssetsDirs.split(File.pathSeparator));
final FsFile resDir = (buckResources == null || buckResources.isEmpty()) ? null :
Fs.fileFromPath(buckResources.get(buckResources.size() - 1));
final FsFile assetsDir = (buckAssets == null || buckAssets.isEmpty()) ? null :
Fs.fileFromPath(buckAssets.get(buckAssets.size() - 1));
Logger.debug("Robolectric assets directory: " + (assetsDir == null ? null : assetsDir.getPath()));
Logger.debug(" Robolectric res directory: " + (resDir == null ? null : resDir.getPath()));
Logger.debug(" Robolectric manifest path: " + manifestFile.getPath());
Logger.debug(" Robolectric package name: " + packageName);
return new AndroidManifest(manifestFile, resDir, assetsDir, packageName) {
@Override
public List<ResourcePath> getIncludedResourcePaths() {
Collection<ResourcePath> resourcePaths = new LinkedHashSet<>(); // Needs stable ordering and no duplicates
resourcePaths.add(super.getResourcePath());
// Add all the buck resource folders, no duplicates as they are being added to a set.
if (buckResources != null) {
ListIterator<String> it = buckResources.listIterator(buckResources.size());
while (it.hasPrevious()) {
resourcePaths.add(new ResourcePath(
getRClass(),
Fs.fileFromPath(it.previous()),
getAssetsDirectory()));
}
}
return new ArrayList<>(resourcePaths);
}
};
}
public static boolean isBuck() {
return System.getProperty(BUCK_ROBOLECTRIC_MANIFEST) != null;
}
}