private void collectImages(File dir, LocalPackage p, int depth, Map<AndroidVersion, File> platformSkins, Multimap<LocalPackage, SystemImage> collector) { for (File f : mFop.listFiles(dir)) { // Instead of just f.getName().equals, we first check f.getPath().endsWith, // because getPath() is a simpler getter whereas getName() computes a new // string on each call if (f.getPath().endsWith(SYS_IMG_NAME) && f.getName().equals(SYS_IMG_NAME)) { collector.put(p, createSysImg(p, dir, platformSkins)); } if (depth < MAX_DEPTH && mFop.isDirectory(f)) { String name = f.getName(); if (name.equals(SdkConstants.FD_DATA) || name.equals(SdkConstants.FD_SAMPLES) || name.equals(SdkConstants.FD_SKINS)) { // Not containers for system images, but have a lot of files continue; } collectImages(f, p, depth + 1, platformSkins, collector); } } }
private String getValidImagePaths() { return mSdkHandler.getSystemImageManager(new ProgressIndicatorAdapter() { // don't log anything }).getImages().stream() .map(image -> image.getPackage().getPath()) .collect(Collectors.joining("\n")); }
/** * Gets a map from all our {@link SystemImage}s to their containing {@link LocalPackage}s. */ public Multimap<LocalPackage, SystemImage> getImageMap() { if (mPackageToImage == null) { init(); } return mPackageToImage; }
private void init() { Multimap<LocalPackage, SystemImage> images = buildImageMap(); Table<IdDisplay, AndroidVersion, Multimap<IdDisplay, SystemImage>> valuesToImage = HashBasedTable.create(); Map<File, SystemImage> pathToImages = Maps.newHashMap(); for (SystemImage img : images.values()) { IdDisplay vendor = img.getAddonVendor(); IdDisplay tag = img.getTag(); AndroidVersion version = img.getAndroidVersion(); Multimap<IdDisplay, SystemImage> vendorImageMap = valuesToImage.get(tag, version); if (vendorImageMap == null) { vendorImageMap = HashMultimap.create(); valuesToImage.put(tag, version, vendorImageMap); } vendorImageMap.put(vendor, img); pathToImages.put(img.getLocation(), img); } mValuesToImage = valuesToImage; mPackageToImage = images; mPathToImage = pathToImages; }
/** * Gets (and creates if necessary) a {@link SystemImageManager} based on our local sdk packages. */ @NonNull public SystemImageManager getSystemImageManager(@NonNull ProgressIndicator progress) { if (mSystemImageManager == null) { getSdkManager(progress); mSystemImageManager = new SystemImageManager(mRepoManager, getSysImgModule().createLatestFactory(), mFop); } return mSystemImageManager; }
@NonNull private Multimap<LocalPackage, SystemImage> buildImageMap() { Multimap<LocalPackage, SystemImage> result = HashMultimap.create(); Map<AndroidVersion, File> platformSkins = Maps.newHashMap(); Collection<? extends LocalPackage> packages = mRepoManager.getPackages().getLocalPackages().values(); for (LocalPackage p : packages) { if (p.getTypeDetails() instanceof DetailsTypes.PlatformDetailsType) { File skinDir = new File(p.getLocation(), SdkConstants.FD_SKINS); if (mFop.exists(skinDir)) { platformSkins.put(((DetailsTypes.PlatformDetailsType) p.getTypeDetails()) .getAndroidVersion(), skinDir); } } } for (LocalPackage p : packages) { TypeDetails typeDetails = p.getTypeDetails(); if (typeDetails instanceof DetailsTypes.SysImgDetailsType || typeDetails instanceof DetailsTypes.PlatformDetailsType || typeDetails instanceof DetailsTypes.AddonDetailsType) { collectImages(p.getLocation(), p, 0, platformSkins, result); } } return result; }
if (imageSysDir != null) { sysImage = mSdkHandler.getSystemImageManager(progress) .getImageAt(new File(mSdkHandler.getLocation(), imageSysDir));
.getImageMap().get(imagePkg);
/** * Gets all the {@link SystemImage}s. */ @NonNull public Collection<SystemImage> getImages() { if (mPackageToImage == null) { init(); } return mPackageToImage.values(); }
@Nullable public ISystemImage getImageAt(@NonNull File imageDir) { if (mPathToImage == null) { init(); } return mPathToImage.get(imageDir); } }
/** * Lookup all the {@link SystemImage} with the given property values. */ @NonNull public Collection<SystemImage> lookup(@NonNull IdDisplay tag, @NonNull AndroidVersion version, @Nullable IdDisplay vendor) { if (mValuesToImage == null) { init(); } Multimap<IdDisplay, SystemImage> m = mValuesToImage.get(tag, version); return m == null ? ImmutableList.<SystemImage>of() : m.get(vendor); }