Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build-tools/create-packs/Microsoft.Android.Sdk.proj
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and
<Project>
<PropertyGroup>
<AndroidNETSdkVersion>$(AndroidPackVersionLong)</AndroidNETSdkVersion>
<XamarinAndroidVersion>$(AndroidPackVersionLong)</XamarinAndroidVersion>
</PropertyGroup>
<ItemGroup>
<KnownFrameworkReference Include="Microsoft.Android"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<!--
***********************************************************************************************
Microsoft.Android.Sdk.NuGet.targets

This file contains *temporary* workarounds for NuGet in .NET 5.

***********************************************************************************************
-->

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<UsingTask TaskName="Xamarin.Android.Tasks.FixupNuGetReferences" AssemblyFile="$(_XamarinAndroidBuildTasksAssembly)" />

<PropertyGroup>
<!-- Clear $(AssetTargetFallback), so only $(PackageTargetFallback) is used. -->
<AssetTargetFallback></AssetTargetFallback>
<!--
Use $(PackageTargetFallback), even though it is deprecated.
It doesn't suffer from: https://github.com/NuGet/docs.microsoft.com-nuget/issues/1955
-->
<PackageTargetFallback>
monoandroid10.0;
monoandroid90;
monoandroid81;
monoandroid80;
monoandroid70;
monoandroid60;
monoandroid50;
$(PackageTargetFallback);
</PackageTargetFallback>
</PropertyGroup>

<Target Name="_FixupNuGetReferences" AfterTargets="ResolvePackageAssets">
<FixupNuGetReferences
PackageTargetFallback="$(PackageTargetFallback)"
CopyLocalItems="@(RuntimeCopyLocalItems)">
<Output TaskParameter="AssembliesToRemove" ItemName="_AssembliesToRemove" />
<Output TaskParameter="AssembliesToAdd" ItemName="Reference" />
</FixupNuGetReferences>
<ItemGroup>
<RuntimeCopyLocalItems Remove="@(_AssembliesToRemove)" />
<ResolvedCompileFileDefinitions Remove="@(_AssembliesToRemove)" />
</ItemGroup>
</Target>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<AndroidApplication Condition=" '$(AndroidApplication)' == '' And '$(OutputType)' == 'Exe' ">true</AndroidApplication>
<AndroidApplication Condition=" '$(AndroidApplication)' == '' ">false</AndroidApplication>
<SelfContained Condition=" '$(SelfContained)' == '' And '$(AndroidApplication)' == 'true' ">true</SelfContained>
<RuntimeIdentifier Condition=" '$(RuntimeIdentifier)' == '' And '$(AndroidApplication)' == 'true' ">android.21-x86</RuntimeIdentifier>
<AndroidManifest Condition=" '$(AndroidManifest)' == '' And '$(AndroidApplication)' == 'true' ">Properties\AndroidManifest.xml</AndroidManifest>
<!-- We don't ever need a `static void Main` method, so switch to Library here-->
<OutputType Condition=" '$(OutputType)' == 'Exe' ">Library</OutputType>
Expand All @@ -20,6 +21,7 @@
<Import Project="$(MSBuildThisFileDirectory)..\tools\Xamarin.Android.Common.targets" />
<Import Project="$(MSBuildThisFileDirectory)Microsoft.Android.Sdk.AssemblyResolution.targets" />
<Import Project="$(MSBuildThisFileDirectory)Microsoft.Android.Sdk.BuildOrder.targets" />
<Import Project="$(MSBuildThisFileDirectory)Microsoft.Android.Sdk.NuGet.targets" />
<Import Project="$(MSBuildThisFileDirectory)Microsoft.Android.Sdk.Tooling.targets" />

<!-- Automatically supply project capabilities for IDE use -->
Expand Down
78 changes: 78 additions & 0 deletions src/Xamarin.Android.Build.Tasks/Tasks/FixupNuGetReferences.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.Build.Framework;

namespace Xamarin.Android.Tasks
{
/// <summary>
/// This task contains *temporary* workarounds for NuGet in .NET 5.
/// </summary>
public class FixupNuGetReferences : AndroidTask
{
public override string TaskPrefix => "FNR";

[Required]
public string [] PackageTargetFallback { get; set; }

public ITaskItem [] CopyLocalItems { get; set; }

[Output]
public string [] AssembliesToAdd { get; set; }

[Output]
public ITaskItem [] AssembliesToRemove { get; set; }

public override bool RunTask ()
{
if (CopyLocalItems == null || CopyLocalItems.Length == 0)
return true;

var assembliesToAdd = new Dictionary<string, string> ();
var assembliesToRemove = new List<ITaskItem> ();
var fallbackDirectories = new HashSet<string> ();

foreach (var item in CopyLocalItems) {
var directory = Path.GetDirectoryName (item.ItemSpec);
var directoryName = Path.GetFileName (directory);
Log.LogDebugMessage ($"{directoryName} -> {item.ItemSpec}");
if (directoryName == "netstandard2.0") {
var parent = Directory.GetParent (directory);
foreach (var nugetDirectory in parent.EnumerateDirectories ()) {
var name = Path.GetFileName (nugetDirectory.Name);
foreach (var fallback in PackageTargetFallback) {
if (!string.Equals (name, fallback, StringComparison.OrdinalIgnoreCase))
continue;
var fallbackDirectory = Path.Combine (parent.FullName, fallback);
fallbackDirectories.Add (fallbackDirectory);

// Remove the netstandard assembly, if there is a platform-specific one
var path = Path.Combine (fallbackDirectory, Path.GetFileName (item.ItemSpec));
if (File.Exists (path)) {
Log.LogDebugMessage ($"Removing: {item.ItemSpec}");
assembliesToRemove.Add (item);
}
}
}
}
}

// Look for any platform-specific assemblies
foreach (var directory in fallbackDirectories) {
foreach (var assembly in Directory.GetFiles (directory, "*.dll")) {
var assemblyName = Path.GetFileName (assembly);
if (!assembliesToAdd.ContainsKey (assemblyName)) {
Log.LogDebugMessage ($"Adding: {assembly}");
assembliesToAdd.Add (assemblyName, assembly);
}
}
}

AssembliesToAdd = assembliesToAdd.Values.ToArray ();
AssembliesToRemove = assembliesToRemove.ToArray ();

return !Log.HasLoggedErrors;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,16 @@ public void DotNetBuild (string runtimeIdentifier, bool isRelease)
}
}

[Test]
[Category ("SmokeTests")]
public void DotNetBuildXamarinForms ()
{
var proj = new XamarinFormsXASdkProject (SdkVersion);
var dotnet = CreateDotNetBuilder (proj);
Assert.IsTrue (dotnet.Build (), "`dotnet build` should succeed");
Assert.IsTrue (StringAssertEx.ContainsText (dotnet.LastBuildOutput, " 0 Warning(s)"), "Should have no MSBuild warnings.");
}

[Test]
public void BuildWithLiteSdk ()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,11 @@ public static class KnownPackages
},
}
};
public static Package XamarinForms_4_5_0_617 = new Package {
Id = "Xamarin.Forms",
Version = "4.5.0.617",
TargetFramework = "MonoAndroid10.0",
};
public static Package XamarinFormsMaps_4_0_0_425677 = new Package {
Id = "Xamarin.Forms.Maps",
Version = "4.0.0.425677",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Xamarin.ProjectTools
{
Expand All @@ -16,10 +13,25 @@ public class XASdkProject : DotNetStandard
</resources>
";

readonly string default_layout_main;
readonly string default_main_activity_cs;
readonly string default_android_manifest;
readonly byte [] icon_binary_mdpi;
static readonly string default_layout_main;
static readonly string default_main_activity_cs;
static readonly string default_android_manifest;
static readonly byte [] icon_binary_mdpi;

static XASdkProject ()
{
var assembly = typeof (XASdkProject).Assembly;
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.AndroidManifest.xml")))
default_android_manifest = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.MainActivity.cs")))
default_main_activity_cs = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.LayoutMain.axml")))
default_layout_main = sr.ReadToEnd ();
using (var stream = assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.Icon.png")) {
icon_binary_mdpi = new byte [stream.Length];
stream.Read (icon_binary_mdpi, 0, (int) stream.Length);
}
}

public string PackageName { get; set; }
public string JavaPackageName { get; set; }
Expand All @@ -35,24 +47,13 @@ public XASdkProject (string sdkVersion = "", string outputType = "Exe")
GlobalPackagesFolder = Path.Combine (XABuildPaths.TopDirectory, "packages");
SetProperty (KnownProperties.OutputType, outputType);

using (var sr = new StreamReader (typeof (XamarinAndroidApplicationProject).Assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.AndroidManifest.xml")))
default_android_manifest = sr.ReadToEnd ();
using (var sr = new StreamReader (typeof (XamarinAndroidApplicationProject).Assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.MainActivity.cs")))
default_main_activity_cs = sr.ReadToEnd ();
using (var sr = new StreamReader (typeof (XamarinAndroidApplicationProject).Assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.LayoutMain.axml")))
default_layout_main = sr.ReadToEnd ();
using (var stream = typeof (XamarinAndroidCommonProject).Assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Base.Icon.png")) {
icon_binary_mdpi = new byte [stream.Length];
stream.Read (icon_binary_mdpi, 0, (int) stream.Length);
}

// Add relevant Android content to our project without writing it to the .csproj file
if (outputType == "Exe") {
Sources.Add (new BuildItem.Source ("Properties\\AndroidManifest.xml") {
TextContent = () => default_android_manifest.Replace ("${PROJECT_NAME}", ProjectName).Replace ("${PACKAGENAME}", string.Format ("{0}.{0}", ProjectName))
});
}
Sources.Add (new BuildItem.Source ($"MainActivity{Language.DefaultExtension}") { TextContent = () => ProcessSourceTemplate (default_main_activity_cs) });
Sources.Add (new BuildItem.Source ($"MainActivity{Language.DefaultExtension}") { TextContent = () => ProcessSourceTemplate (MainActivity ?? DefaultMainActivity) });
Sources.Add (new BuildItem.Source ("Resources\\layout\\Main.axml") { TextContent = () => default_layout_main });
Sources.Add (new BuildItem.Source ("Resources\\values\\Strings.xml") { TextContent = () => default_strings_xml.Replace ("${PROJECT_NAME}", ProjectName) });
Sources.Add (new BuildItem.Source ("Resources\\drawable-mdpi\\Icon.png") { BinaryContent = () => icon_binary_mdpi });
Expand All @@ -65,6 +66,10 @@ public XASdkProject (string sdkVersion = "", string outputType = "Exe")

public string IntermediateOutputPath => Path.Combine ("obj", Configuration, TargetFramework.ToLowerInvariant ());

public string DefaultMainActivity => default_main_activity_cs;

public string MainActivity { get; set; }

public override string ProcessSourceTemplate (string source)
{
return source.Replace ("${ROOT_NAMESPACE}", RootNamespace ?? ProjectName)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Xamarin.ProjectTools
{
public class XamarinFormsXASdkProject : XASdkProject
{
static readonly string default_main_activity_cs;
static readonly string colors_xml;
static readonly string styles_xml;
static readonly string Tabbar_xml;
static readonly string Toolbar_xml;
static readonly string MainPage_xaml;
static readonly string MainPage_xaml_cs;
static readonly string App_xaml;
static readonly string App_xaml_cs;

static XamarinFormsXASdkProject ()
{
var assembly = typeof (XamarinFormsXASdkProject).Assembly;
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Forms.MainActivity.cs")))
default_main_activity_cs = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Forms.colors.xml")))
colors_xml = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Forms.styles.xml")))
styles_xml = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.AndroidX.Tabbar.xml")))
Tabbar_xml = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.AndroidX.Toolbar.xml")))
Toolbar_xml = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Forms.MainPage.xaml")))
MainPage_xaml = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Forms.MainPage.xaml.cs")))
MainPage_xaml_cs = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Forms.App.xaml")))
App_xaml = sr.ReadToEnd ();
using (var sr = new StreamReader (assembly.GetManifestResourceStream ("Xamarin.ProjectTools.Resources.Forms.App.xaml.cs")))
App_xaml_cs = sr.ReadToEnd ();
}


public XamarinFormsXASdkProject (string sdkVersion = "", string outputType = "Exe")
: base (sdkVersion, outputType)
{
PackageReferences.Add (KnownPackages.XamarinForms_4_5_0_617);

// Workaround for AndroidX, see: https://github.com/xamarin/AndroidSupportComponents/pull/239
Imports.Add (new Import (() => "Directory.Build.targets") {
TextContent = () =>
@"<Project>
<PropertyGroup>
<VectorDrawableCheckBuildToolsVersionTaskBeforeTargets />
</PropertyGroup>
</Project>"
});

Sources.Add (new AndroidItem.AndroidResource ("Resources\\values\\colors.xml") {
TextContent = () => colors_xml,
});
Sources.Add (new AndroidItem.AndroidResource ("Resources\\values\\styles.xml") {
TextContent = () => styles_xml,
});
Sources.Add (new AndroidItem.AndroidResource ("Resources\\layout\\Tabbar.xml") {
TextContent = () => Tabbar_xml,
});
Sources.Add (new AndroidItem.AndroidResource ("Resources\\layout\\Toolbar.xml") {
TextContent = () => Toolbar_xml,
});
Sources.Add (new BuildItem ("EmbeddedResource", "MainPage.xaml") {
TextContent = MainPageXaml,
});
Sources.Add (new BuildItem.Source ("MainPage.xaml.cs") {
TextContent = () => ProcessSourceTemplate (MainPage_xaml_cs),
});
Sources.Add (new BuildItem ("EmbeddedResource", "App.xaml") {
TextContent = () => ProcessSourceTemplate (App_xaml),
});
Sources.Add (new BuildItem.Source ("App.xaml.cs") {
TextContent = () => ProcessSourceTemplate (App_xaml_cs),
});

MainActivity = default_main_activity_cs;
}

protected virtual string MainPageXaml () => ProcessSourceTemplate (MainPage_xaml);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public override string SaveProject ()
}
sb.AppendLine ("\t</ItemGroup>");
}
foreach (var import in Imports) {
var project = import.Project ();
if (project != "Directory.Build.props" && project != "Directory.Build.targets")
sb.AppendLine ($"\t<Import Project=\"{project}\" />");
}
return $"<Project Sdk=\"{Sdk}\">\r\n{sb.ToString ()}\r\n</Project>";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<androidx.design.widget.TabLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
app:tabIndicatorColor="@android:color/white"
app:tabGravity="fill"
app:tabMode="fixed" />
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary" />
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
<Import Project="..\..\..\..\build-tools\scripts\MSBuildReferences.projitems" />
<ItemGroup>
<Compile Remove="Resources\**\*.cs" />
<EmbeddedResource Include="Resources\AndroidX\Tabbar.xml">
<LogicalName>Xamarin.ProjectTools.Resources.AndroidX.Tabbar.xml</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Resources\AndroidX\Toolbar.xml">
<LogicalName>Xamarin.ProjectTools.Resources.AndroidX.Toolbar.xml</LogicalName>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Wear\LayoutMain.axml">
<LogicalName>Xamarin.ProjectTools.Resources.Wear.LayoutMain.axml</LogicalName>
</EmbeddedResource>
Expand Down
Loading