public AndroidVersions(IEnumerable <string> frameworkDirectories)
        {
            if (frameworkDirectories == null)
            {
                throw new ArgumentNullException(nameof(frameworkDirectories));
            }

            var dirs = new List <string> ();

            foreach (var d in frameworkDirectories)
            {
                if (!Directory.Exists(d))
                {
                    throw new ArgumentException($"`{d}` must be a directory!", nameof(frameworkDirectories));
                }

                var dp = d.TrimEnd(Path.DirectorySeparatorChar);
                var dn = Path.GetFileName(dp);
                // In "normal" use, `dp` will contain e.g. `...\MonoAndroid\v1.0`.
                // We want the `MonoAndroid` dir, not the versioned dir.
                var p = dn.StartsWith("v", StringComparison.Ordinal) ? Path.GetDirectoryName(dp) : dp;
                dirs.Add(Path.GetFullPath(p));
            }

            dirs = dirs.Distinct(StringComparer.OrdinalIgnoreCase)
                   .ToList();

            FrameworkDirectories = new ReadOnlyCollection <string> (dirs);

            var versions = dirs.SelectMany(d => Directory.EnumerateFiles(d, "AndroidApiInfo.xml", SearchOption.AllDirectories))
                           .Select(file => AndroidVersion.Load(file));

            LoadVersions(versions);
        }
 static bool MatchesId(AndroidVersion version, string id)
 {
     return(version.Id == id ||
            (version.AlternateIds?.Contains(id) ?? false) ||
            (version.ApiLevel.ToString() == id));
 }
 static bool MatchesFrameworkVersion(AndroidVersion version, string frameworkVersion)
 {
     return(version.FrameworkVersion == frameworkVersion ||
            version.OSVersion == frameworkVersion);
 }