Skip to content

Commit 79a0141

Browse files
Return a default for unknown API levels (#90)
Context: dotnet/android#4873 Context: dotnet/android#4873 (comment) When xamarin-android is built to support .NET 5, the .NET 5 install directory contains a single `AndroidApiInfo.xml` file: <AndroidApiInfo> <Id>30</Id> <Level>30</Level> <Name>R</Name> <Version>v11.0</Version> <Stable>True</Stable> </AndroidApiInfo> `AndroidVersions`, meanwhile, is setup to read a *set* of `AndroidApiInfo.xml` files (aad97f1) to "dynamically" compute mappings between possible `$(TargetFrameworkVersion)` values, API-levels, and IDs for those API levels. When there is only one such file, if you call: int? apiLevel = androidVersions.GetApiLevelFromId (29); then `apiLevel` will always be `null`, because (at present) `AndroidVersions.KnownVersions` doesn't know about API-29 or API-30. We *could* update `AndroidVersions.KnownVersions` to contain entries for API-29 & API-30, but doing so means that we reintroduce the scenario that `AndroidVersions` was added to help defend against: a need/requirement to update `AndroidVersions.KnownVersions` *every time* a new API level was released, lest ~everything break. We *don't* want to require `AndroidVersions.KnownVersions` updates. To allow a .NET 5-like environment to work *without* updating `KnownVersions`, update the various `GetApiLevelFromId()` methods to return the incoming API level as a fallback. If `"29"` comes in, then `29` can be returned and assumed to be a valid API level.
1 parent 3974fc3 commit 79a0141

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

src/Xamarin.Android.Tools.AndroidSdk/AndroidVersions.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ static bool MatchesFrameworkVersion (AndroidVersion version, string frameworkVer
9292
public int? GetApiLevelFromId (string id)
9393
{
9494
return installedVersions.FirstOrDefault (v => MatchesId (v, id))?.ApiLevel ??
95-
KnownVersions.FirstOrDefault (v => MatchesId (v, id))?.ApiLevel;
95+
KnownVersions.FirstOrDefault (v => MatchesId (v, id))?.ApiLevel ??
96+
(int.TryParse (id, out int apiLevel) ? apiLevel : default (int?));
9697
}
9798

9899
static bool MatchesId (AndroidVersion version, string id)
@@ -105,7 +106,8 @@ static bool MatchesId (AndroidVersion version, string id)
105106
public string? GetIdFromApiLevel (int apiLevel)
106107
{
107108
return installedVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.Id ??
108-
KnownVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.Id;
109+
KnownVersions.FirstOrDefault (v => v.ApiLevel == apiLevel)?.Id ??
110+
apiLevel.ToString ();
109111
}
110112

111113
// Sometimes, e.g. when new API levels are introduced, the "API level" is a letter, not a number,
@@ -115,7 +117,8 @@ static bool MatchesId (AndroidVersion version, string id)
115117
if (int.TryParse (apiLevel, out var platform))
116118
return GetIdFromApiLevel (platform);
117119
return installedVersions.FirstOrDefault (v => MatchesId (v, apiLevel))?.Id ??
118-
KnownVersions.FirstOrDefault (v => MatchesId (v, apiLevel))?.Id;
120+
KnownVersions.FirstOrDefault (v => MatchesId (v, apiLevel))?.Id ??
121+
apiLevel;
119122
}
120123

121124
public string? GetIdFromFrameworkVersion (string frameworkVersion)

tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidVersionsTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ public void GetIdFromApiLevel ()
202202
Assert.AreEqual ("II", versions.GetIdFromApiLevel ("14"));
203203
Assert.AreEqual ("II", versions.GetIdFromApiLevel ("II"));
204204

205-
Assert.AreEqual (null, versions.GetIdFromApiLevel (-1));
206-
Assert.AreEqual (null, versions.GetIdFromApiLevel ("-1"));
207-
Assert.AreEqual (null, versions.GetIdFromApiLevel ("D"));
205+
Assert.AreEqual ("-1", versions.GetIdFromApiLevel (-1));
206+
Assert.AreEqual ("-1", versions.GetIdFromApiLevel ("-1"));
207+
Assert.AreEqual ("D", versions.GetIdFromApiLevel ("D"));
208208

209209
// via KnownVersions
210210
Assert.AreEqual ("11", versions.GetIdFromApiLevel (11));

0 commit comments

Comments
 (0)