diff --git a/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs b/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs index 7ba12c9a..5955292b 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Xml; using System.Collections.Generic; @@ -45,7 +45,7 @@ public class AndroidAppManifest if (manifest.Element ("uses-sdk") is XElement uses) usesSdk = uses; else - manifest.Add (usesSdk = new XElement ("uses-sdk")); + usesSdk = new XElement ("uses-sdk"); } public static string CanonicalizePackageName (string packageNameOrAssemblyName) @@ -71,7 +71,6 @@ public static AndroidAppManifest Create (string packageName, string appLabel, An return new AndroidAppManifest (versions, XDocument.Parse ( @" - ")) { @@ -102,6 +101,14 @@ public static AndroidAppManifest Load (XDocument doc, AndroidVersions versions) public void Write (XmlWriter writer) { + // Make sure that if the XML element does not have any attributes (i.e. minSdkVersion + // and targetSdkVersion), do NOT write it into the output. This is to avoid issues like + // https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1874249/ + if (usesSdk.HasAttributes && usesSdk.Parent == null) + manifest.Add (usesSdk); + else if (!usesSdk.HasAttributes && usesSdk.Parent != null) + usesSdk.Remove (); + doc.Save (writer); } diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs index 243224d5..5c58199a 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -172,5 +172,45 @@ public void CanGetAppTheme () Assert.AreEqual ("@android:style/Theme.Material.Light", manifest.ApplicationTheme); } + + [Test] + public void CanAddAndRemoveUsesSdk () + { + XNamespace aNS = "http://schemas.android.com/apk/res/android"; + var versions = new AndroidVersions (new AndroidVersion [0]); + var doc = XDocument.Parse (@" + + + + + "); + var manifest = AndroidAppManifest.Load (doc, versions); + + manifest.MinSdkVersion = null; + manifest.TargetSdkVersion = null; + + var sb = new StringBuilder (); + using (var writer = XmlWriter.Create (sb)) { + manifest.Write (writer); + } + + var newDoc = XDocument.Parse (sb.ToString ()); + var usesSdk = newDoc.Element ("manifest").Element ("uses-sdk"); + Assert.IsNull (usesSdk, "uses-sdk should not exist"); + + manifest.MinSdkVersion = 8; + manifest.TargetSdkVersion = 12; + + sb = new StringBuilder (); + using (var writer = XmlWriter.Create (sb)) { + manifest.Write (writer); + } + + newDoc = XDocument.Parse (sb.ToString ()); + usesSdk = newDoc.Element ("manifest").Element ("uses-sdk"); + Assert.IsNotNull (usesSdk, "uses-sdk should exist"); + Assert.AreEqual ("8", usesSdk.Attribute (aNS + "minSdkVersion").Value); + Assert.AreEqual ("12", usesSdk.Attribute (aNS + "targetSdkVersion").Value); + } } }