Skip to content
This repository was archived by the owner on Jul 13, 2026. It is now read-only.

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

2 files changed

Lines changed: 9 additions & 6 deletions

File tree

‎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
publicint?GetApiLevelFromId(stringid)
9393
{
9494
returninstalledVersions.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,outintapiLevel)?apiLevel:default(int?));
9697
}
9798

9899
staticboolMatchesId(AndroidVersionversion,stringid)
@@ -105,7 +106,8 @@ static bool MatchesId (AndroidVersion version, string id)
105106
publicstring?GetIdFromApiLevel(intapiLevel)
106107
{
107108
returninstalledVersions.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,outvarplatform))
116118
returnGetIdFromApiLevel(platform);
117119
returninstalledVersions.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
publicstring?GetIdFromFrameworkVersion(stringframeworkVersion)

‎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)