From 19f7b7749cafd9eda4e273a0f36bf8fbff7479f3 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 21 Feb 2017 15:34:28 -0500 Subject: [PATCH 01/30] Update build scripts to 10.2.0 --- build.cake | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cake b/build.cake index cbae62937..c7c3b3e29 100644 --- a/build.cake +++ b/build.cake @@ -11,16 +11,16 @@ // To find new URL: https://dl-ssl.google.com/android/repository/addon.xml and search for google_play_services_*.zip\ // FROM: https://dl.google.com/android/repository/addon2-1.xml -var DOCS_URL = "https://dl-ssl.google.com/android/repository/google_play_services_v8_rc41.zip"; -var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repository_gms_v8_rc42_wear_2_0_rc6.zip"; +var DOCS_URL = "https://dl-ssl.google.com/android/repository/google_play_services_v9_rc41.zip"; +var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repository_gms_v9_rc41_wear_2_0_rc6.zip"; // We grab the previous release's api-info.xml to use as a comparison for this build's generated info to make an api-diff var BASE_API_INFO_URL = "https://github.com/xamarin/GooglePlayServicesComponents/releases/download/42.1001.0/api-info.xml"; -var PLAY_COMPONENT_VERSION = "42.1001.0.0"; -var PLAY_NUGET_VERSION = "42.1001.0"; -var PLAY_AAR_VERSION = "10.0.1"; -var VERSION_DESC = "10.0.1"; +var PLAY_COMPONENT_VERSION = "42.1020.0.0"; +var PLAY_NUGET_VERSION = "42.1020.0"; +var PLAY_AAR_VERSION = "10.2.0"; +var VERSION_DESC = "10.2.0"; var WEAR_COMPONENT_VERSION = "2.0.0.0"; var WEAR_NUGET_VERSION = "2.0.0"; From a6a88312d883feb89cb080c17caaa2242fbe2fe2 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 21 Feb 2017 15:34:41 -0500 Subject: [PATCH 02/30] Fix basement obfuscation of needed type --- basement/source/Transforms/Metadata.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/basement/source/Transforms/Metadata.xml b/basement/source/Transforms/Metadata.xml index e2bdcd62f..4d151ae87 100644 --- a/basement/source/Transforms/Metadata.xml +++ b/basement/source/Transforms/Metadata.xml @@ -24,7 +24,7 @@ - + @@ -47,6 +47,7 @@ false false false + false From 429fab9012e9d7f29b1217d604503b8da958f3b2 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 21 Feb 2017 15:34:57 -0500 Subject: [PATCH 03/30] Firebase analytics impl now depends on Tasks --- .../nuget/Xamarin.Firebase.Analytics.Impl.template.nuspec | 1 + firebase-analytics-impl/source/Firebase-Analytics-Impl.csproj | 4 ++++ firebase-analytics/source/Firebase-Analytics.csproj | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/firebase-analytics-impl/nuget/Xamarin.Firebase.Analytics.Impl.template.nuspec b/firebase-analytics-impl/nuget/Xamarin.Firebase.Analytics.Impl.template.nuspec index 21fa80c02..74f141a0a 100644 --- a/firebase-analytics-impl/nuget/Xamarin.Firebase.Analytics.Impl.template.nuspec +++ b/firebase-analytics-impl/nuget/Xamarin.Firebase.Analytics.Impl.template.nuspec @@ -18,6 +18,7 @@ + diff --git a/firebase-analytics-impl/source/Firebase-Analytics-Impl.csproj b/firebase-analytics-impl/source/Firebase-Analytics-Impl.csproj index d34968fb9..74eabda38 100644 --- a/firebase-analytics-impl/source/Firebase-Analytics-Impl.csproj +++ b/firebase-analytics-impl/source/Firebase-Analytics-Impl.csproj @@ -72,6 +72,10 @@ {B28F65D1-D8DD-45E8-9DD7-74A3BE40B4CE} Firebase-Iid + + {53F87D88-8871-41A2-9F81-B79AB02FEC24} + Tasks + diff --git a/firebase-analytics/source/Firebase-Analytics.csproj b/firebase-analytics/source/Firebase-Analytics.csproj index 38832fdbe..8017b4cd3 100644 --- a/firebase-analytics/source/Firebase-Analytics.csproj +++ b/firebase-analytics/source/Firebase-Analytics.csproj @@ -72,6 +72,10 @@ {CFB0A03A-F787-4EE9-9EA6-8A2A65E82704} Firebase-Analytics-Impl + + {53F87D88-8871-41A2-9F81-B79AB02FEC24} + Tasks + From d4d17cb6b667ab2b39032ef9033baddc6df890a8 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 21 Feb 2017 15:35:51 -0500 Subject: [PATCH 04/30] Nearby: Type changed from interface to class --- nearby/source/Additions/IPendingResultExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nearby/source/Additions/IPendingResultExtensions.cs b/nearby/source/Additions/IPendingResultExtensions.cs index 68f08cc40..5e638ae79 100644 --- a/nearby/source/Additions/IPendingResultExtensions.cs +++ b/nearby/source/Additions/IPendingResultExtensions.cs @@ -19,11 +19,11 @@ public static async Task SendConnectionRequestAsync (this IConnections { return (await api.SendConnectionRequest (apiClient, name, remoteEndpointId, payload, connectionResponseCallback, messageListener)).JavaCast (); } - public static async Task StartAdvertisingAsync (this IConnections api, GoogleApiClient apiClient, string name, Android.Gms.Nearby.Connection.AppMetadata appMetadata, long durationMillis, IConnectionsConnectionRequestListener connectionRequestListener) + public static async Task StartAdvertisingAsync (this IConnections api, GoogleApiClient apiClient, string name, Android.Gms.Nearby.Connection.AppMetadata appMetadata, long durationMillis, ConnectionsConnectionRequestListener connectionRequestListener) { return (await api.StartAdvertising (apiClient, name, appMetadata, durationMillis, connectionRequestListener)).JavaCast (); } - public static async Task StartDiscoveryAsync (this IConnections api, GoogleApiClient apiClient, string serviceId, long durationMillis, IConnectionsEndpointDiscoveryListener listener) + public static async Task StartDiscoveryAsync (this IConnections api, GoogleApiClient apiClient, string serviceId, long durationMillis, ConnectionsEndpointDiscoveryListener listener) { return (await api.StartDiscovery (apiClient, serviceId, durationMillis, listener)).JavaCast (); } From 41f1b38074fcea7932a40627a5070b38ca71e708 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 21 Feb 2017 15:35:58 -0500 Subject: [PATCH 05/30] Fix nearby sample for type change --- nearby/samples/NearbySample/MainActivity.cs | 40 +++++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/nearby/samples/NearbySample/MainActivity.cs b/nearby/samples/NearbySample/MainActivity.cs index c5fa5c9e0..cc0a35332 100644 --- a/nearby/samples/NearbySample/MainActivity.cs +++ b/nearby/samples/NearbySample/MainActivity.cs @@ -19,9 +19,7 @@ namespace NearbySample public class MainActivity : Activity, GoogleApiClient.IConnectionCallbacks, GoogleApiClient.IOnConnectionFailedListener, - IConnectionsMessageListener, - IConnectionsConnectionRequestListener, - IConnectionsEndpointDiscoveryListener + IConnectionsMessageListener { class ConnectionResponseCallback : Java.Lang.Object, IConnectionsConnectionResponseCallback @@ -160,7 +158,10 @@ async void StartAdvertising() // will construct a default name based on device model such as 'LGE Nexus 5'. string name = null; var result = await NearbyClass.Connections.StartAdvertisingAsync ( - mGoogleApiClient, name, appMetadata, TIMEOUT_ADVERTISE, this); + mGoogleApiClient, name, appMetadata, TIMEOUT_ADVERTISE, new MyConnectionRequestListener + { + ConnectionRequestHandler = OnConnectionRequest + }); Log ("startAdvertising:onResult:" + result); @@ -196,7 +197,7 @@ async void StartDiscovery () return; } - var status = await NearbyClass.Connections.StartDiscoveryAsync (mGoogleApiClient, serviceId, TIMEOUT_DISCOVER, this); + var status = await NearbyClass.Connections.StartDiscoveryAsync (mGoogleApiClient, serviceId, TIMEOUT_DISCOVER, new MyEndpointDiscoveryListener { EndpointLostHandler = OnEndpointLost, EndpointFoundHandler = OnEndpointFound }); if (status.IsSuccess) { Log("startDiscovery:onResult: SUCCESS"); @@ -268,7 +269,7 @@ async void ConnectTo (String endpointId, string endpointName) Log ("connectTo: " + status.IsSuccess); } - public void OnConnectionRequest (string endpointId, string deviceId, string endpointName, byte[] payload) + public void OnConnectionRequest (string endpointId, string endpointName, byte[] payload) { Log("onConnectionRequest:" + endpointId + ":" + endpointName); @@ -314,7 +315,7 @@ public void OnDisconnected (string endpointId) UpdateViewVisibility (NearbyConnectionState.Ready); } - public void OnEndpointFound (string endpointId, string deviceId, string serviceId, string endpointName) + public void OnEndpointFound (string endpointId, string serviceId, string endpointName) { Log ("onEndpointFound:" + endpointId + ":" + endpointName); @@ -420,6 +421,31 @@ public enum NearbyConnectionState { Discovering = 1026, Connected = 1027 } + + public class MyConnectionRequestListener : ConnectionsConnectionRequestListener + { + public Action ConnectionRequestHandler { get; set; } + + public override void OnConnectionRequest(string remoteEndpointId, string remoteEndpointName, byte[] handshakeData) + { + ConnectionRequestHandler?.Invoke(remoteEndpointId, remoteEndpointName, handshakeData); + } + } + + public class MyEndpointDiscoveryListener : ConnectionsEndpointDiscoveryListener + { + public Action EndpointFoundHandler { get; set; } + public override void OnEndpointFound(string endpointId, string serviceId, string name) + { + EndpointFoundHandler?.Invoke(endpointId, serviceId, name); + } + + public Action EndpointLostHandler { get; set; } + public override void OnEndpointLost(string endpointId) + { + EndpointLostHandler?.Invoke(endpointId); + } + } } From 52fcc61ad4747bb21636da220c1e7c3832ba5a22 Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 22 Feb 2017 14:21:20 -0500 Subject: [PATCH 06/30] Binding metadata fixes --- base/source/Transforms/Metadata.xml | 1 + basement/source/Transforms/Metadata.xml | 4 +++- instantapps/source/Transforms/Metadata.xml | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/base/source/Transforms/Metadata.xml b/base/source/Transforms/Metadata.xml index eb2438a2f..7212487d6 100644 --- a/base/source/Transforms/Metadata.xml +++ b/base/source/Transforms/Metadata.xml @@ -18,6 +18,7 @@ + diff --git a/basement/source/Transforms/Metadata.xml b/basement/source/Transforms/Metadata.xml index 4d151ae87..35b181ec6 100644 --- a/basement/source/Transforms/Metadata.xml +++ b/basement/source/Transforms/Metadata.xml @@ -51,7 +51,9 @@ - + + + diff --git a/instantapps/source/Transforms/Metadata.xml b/instantapps/source/Transforms/Metadata.xml index 9db8247c6..a8108bdf3 100644 --- a/instantapps/source/Transforms/Metadata.xml +++ b/instantapps/source/Transforms/Metadata.xml @@ -22,5 +22,20 @@ + + + + + + + + + + + + + + + From 4398a9b9684e5f1d2ba21d5f1aebaed4b1b6cacd Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 22 Feb 2017 15:45:16 -0500 Subject: [PATCH 07/30] Prerelease nuget version --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index c7c3b3e29..484601d53 100644 --- a/build.cake +++ b/build.cake @@ -18,7 +18,7 @@ var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repos var BASE_API_INFO_URL = "https://github.com/xamarin/GooglePlayServicesComponents/releases/download/42.1001.0/api-info.xml"; var PLAY_COMPONENT_VERSION = "42.1020.0.0"; -var PLAY_NUGET_VERSION = "42.1020.0"; +var PLAY_NUGET_VERSION = "42.1020.0-beta1"; var PLAY_AAR_VERSION = "10.2.0"; var VERSION_DESC = "10.2.0"; From a2db59a7f3bd8d21891fc1d7c9bef9e54ec74d43 Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 1 Mar 2017 21:56:10 -0500 Subject: [PATCH 08/30] [buildtask] Write a stamps file for incrementals --- basement/buildtasks/ProcessGoogleServicesJson.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/basement/buildtasks/ProcessGoogleServicesJson.cs b/basement/buildtasks/ProcessGoogleServicesJson.cs index 68352ddf7..5b7b95b7e 100644 --- a/basement/buildtasks/ProcessGoogleServicesJson.cs +++ b/basement/buildtasks/ProcessGoogleServicesJson.cs @@ -14,8 +14,6 @@ public class ProcessGoogleServicesJson : Task const string RESFILE_VALUES = "goog_svcs_json.xml"; const string RESFILE_XML = "global_tracker.xml"; - public string IntermediateOutputPrefix { get; set; } - [Output] public ITaskItem[] GoogleServicesGeneratedResources { get; set; } @@ -141,8 +139,18 @@ public override bool Execute () if (outputFiles.Any ()) GoogleServicesGeneratedResources = outputFiles.ToArray (); - - Log.LogMessage ("Finished ProcessGoogleServicesJson..."); + + Log.LogMessage("Writing stamp file..."); + + var stampText = string.Empty; + if (wroteXmlPath) + stampText += xmlPath + Environment.NewLine; + if (wroteValuesPath) + stampText += valuesPath + Environment.NewLine; + + File.WriteAllText(Path.Combine(IntermediateOutputPath ?? MonoAndroidResDirIntermediate, "ProcessGoogleServicesJson.stamp"), stampText.Trim()); + + Log.LogMessage ("Finished ProcessGoogleServicesJson..."); return true; } From c472018b93ac3ed640d692a038dce797ddcbc694 Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 1 Mar 2017 21:57:03 -0500 Subject: [PATCH 09/30] [buildtask] add inputs/outputs for incrementals Also add filewrites to help clean target --- .../Xamarin.GooglePlayServices.Basement.targets | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets b/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets index 63c2cb54b..d4b98b32a 100644 --- a/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets +++ b/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets @@ -37,24 +37,30 @@ + + AfterTargets="$(ProcessGoogleServicesJsonAfterTargets)" + Inputs="@(GoogleServicesJson)" + Outputs="$(IntermediateOutputPath)\ProcessGoogleServicesJson.stamp"> - + + - + + + + \ No newline at end of file From 4998789fd053713b79de57058c541e88b4ea1ee8 Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 1 Mar 2017 21:57:24 -0500 Subject: [PATCH 10/30] [buildtask] Add msbuild testing scaffolding --- .../Basement.BuildTasks.Tests.csproj | 18 +++- .../Helpers/MSBuildExtensions.cs | 50 +++++++++ .../Helpers/MSBuildTestLogger.cs | 53 +++++++++ .../buildtasks.tests/Helpers/TestsBase.cs | 102 ++++++++++++++++++ basement/buildtasks.tests/packages.config | 2 +- 5 files changed, 220 insertions(+), 5 deletions(-) create mode 100644 basement/buildtasks.tests/Helpers/MSBuildExtensions.cs create mode 100644 basement/buildtasks.tests/Helpers/MSBuildTestLogger.cs create mode 100644 basement/buildtasks.tests/Helpers/TestsBase.cs diff --git a/basement/buildtasks.tests/Basement.BuildTasks.Tests.csproj b/basement/buildtasks.tests/Basement.BuildTasks.Tests.csproj index 09cec4014..833013b37 100644 --- a/basement/buildtasks.tests/Basement.BuildTasks.Tests.csproj +++ b/basement/buildtasks.tests/Basement.BuildTasks.Tests.csproj @@ -31,14 +31,18 @@ - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + ..\..\packages\NUnit.3.0.1\lib\net45\nunit.framework.dll + + + - - - + + + + @@ -46,5 +50,11 @@ Basement-BuildTasks + + + + + + \ No newline at end of file diff --git a/basement/buildtasks.tests/Helpers/MSBuildExtensions.cs b/basement/buildtasks.tests/Helpers/MSBuildExtensions.cs new file mode 100644 index 000000000..d2c1dd0be --- /dev/null +++ b/basement/buildtasks.tests/Helpers/MSBuildExtensions.cs @@ -0,0 +1,50 @@ +// Copyright (c) 2015-2016 Xamarin Inc. + +using System.Linq; +using Microsoft.Build.Construction; + +namespace Xamarin.ContentPipeline.Tests +{ + //workaround for missing MSBuild API in Mono. Project.AddItem explodes, + //so we use ProjectRootElement, which doesn't have SetProperty/GetPropertyValue + static class MSBuildExtensions + { + public static void SetProperty(this ProjectRootElement prel, string name, string value) + { + var existing = prel.PropertyGroups.SelectMany(g => g.Properties).FirstOrDefault(p => p.Name == name); + if (existing != null) + existing.Value = value; + else + prel.AddProperty(name, value); + } + + public static string GetPropertyValue(this ProjectRootElement prel, string name) + { + var existing = prel.Properties.FirstOrDefault(p => p.Name == name); + if (existing != null) + return existing.Value; + return null; + } + + public static void RemoveItems(this ProjectRootElement prel, ProjectItemElement pel) + { + pel.Parent.RemoveChild(pel); + } + + public static void SetMetadataValue(this ProjectItemElement pel, string name, string value) + { + var existing = pel.Metadata.FirstOrDefault(p => p.Name == name); + if (existing != null) + existing.Value = value; + else + pel.AddMetadata(name, value); + } + + public static void RemoveMetadata(this ProjectItemElement pel, string name) + { + var existing = pel.Metadata.FirstOrDefault(p => p.Name == name); + if (existing != null) + pel.RemoveChild(existing); + } + } +} \ No newline at end of file diff --git a/basement/buildtasks.tests/Helpers/MSBuildTestLogger.cs b/basement/buildtasks.tests/Helpers/MSBuildTestLogger.cs new file mode 100644 index 000000000..18c739a55 --- /dev/null +++ b/basement/buildtasks.tests/Helpers/MSBuildTestLogger.cs @@ -0,0 +1,53 @@ +// Copyright (c) 2015-2016 Xamarin Inc. + +using System.Collections.Generic; +using System.Linq; +using Microsoft.Build.Framework; + +namespace Xamarin.ContentPipeline.Tests +{ + class MSBuildTestLogger : ILogger + { + IEventSource eventSource; + + public void Initialize(IEventSource eventSource) + { + this.eventSource = eventSource; + Events = new List(); + eventSource.AnyEventRaised += EventRaised; + Verbosity = LoggerVerbosity.Normal; + } + + public void Shutdown() + { + eventSource.AnyEventRaised -= EventRaised; + } + + void EventRaised(object sender, BuildEventArgs e) + { + Events.Add(e); + System.Console.WriteLine(e.Message); + } + + public List Events { get; private set; } + + public IEnumerable Errors + { + get + { + return Events.OfType(); + } + } + + public IEnumerable Warnings + { + get + { + return Events.OfType(); + } + } + + public LoggerVerbosity Verbosity { get; set; } + public string Parameters { get; set; } + } +} \ No newline at end of file diff --git a/basement/buildtasks.tests/Helpers/TestsBase.cs b/basement/buildtasks.tests/Helpers/TestsBase.cs new file mode 100644 index 000000000..2d6eec69b --- /dev/null +++ b/basement/buildtasks.tests/Helpers/TestsBase.cs @@ -0,0 +1,102 @@ +// Copyright (c) 2015-2016 Xamarin Inc. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Microsoft.Build.Evaluation; +using Microsoft.Build.Execution; +using Microsoft.Build.Framework; +using Microsoft.Build.Logging; +using NUnit.Framework; + +namespace Xamarin.ContentPipeline.Tests +{ + class TestsBase + { + string originalWorkingDir; + string tempDir; + + [OneTimeSetUp] + public void SetUp() + { + originalWorkingDir = Environment.CurrentDirectory; + tempDir = Path.GetTempFileName(); + File.Delete(tempDir); + Directory.CreateDirectory(tempDir); + Environment.CurrentDirectory = tempDir; + } + + [OneTimeTearDown] + public void TearDown() + { + Environment.CurrentDirectory = originalWorkingDir; + Directory.Delete(tempDir, true); + + //HACK: touching BuildManager causes Mono to initialize its DefaultBuildManagerand never shut it down + StopMonoBuildManager(BuildManager.DefaultBuildManager); + } + + public string TempDir { get { return tempDir; } } + + protected string GetTempPath(params string[] components) + { + return Path.Combine(tempDir, Path.Combine(components)); + } + + protected static void AssertNoMessagesOrWarnings(MSBuildTestLogger logger) + { + BuildEventArgs err = logger.Errors.FirstOrDefault(); + if (err == null) + { + err = logger.Warnings.FirstOrDefault(); + if (err == null) + { + return; + } + } + Assert.Fail(err.Message); + } + + // work around Mono's ProjectInstance.Build using a separate BuildManager and not shutting it down + // Mono's BuildManager has a non-background worker thread and doesn't shut it down automatically + protected bool BuildProject( + ProjectCollection projects, ProjectInstance project, string[] targets, IEnumerable loggers, + IEnumerable remoteLoggers, out IDictionary targetOutputs) + { + var parameters = new BuildParameters(projects) + { + Loggers = loggers, + ForwardingLoggers = remoteLoggers, + DefaultToolsVersion = projects.DefaultToolsVersion, + }; + var data = new BuildRequestData(project, targets ?? project.DefaultTargets.ToArray()); + var result = BuildManager.DefaultBuildManager.Build(parameters, data); + targetOutputs = result.ResultsByTarget; + return result.OverallResult == BuildResultCode.Success; + } + + static void StopMonoBuildManager(BuildManager buildManager) + { + try + { + const BindingFlags instanceFlags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance; + PropertyInfo nodeManagerProp = typeof(BuildManager).GetProperty("BuildNodeManager", instanceFlags); + var nodeManager = nodeManagerProp.GetValue(buildManager); + var stopMeth = nodeManager.GetType().GetMethod("Stop", instanceFlags); + stopMeth.Invoke(nodeManager, new object[0]); + } + catch + { + } + } + + protected bool BuildProject( + ProjectCollection projects, ProjectInstance project, string target, ILogger logger) + { + IDictionary targetOutputs; + return BuildProject(projects, project, new[] { target }, new[] { logger }, new ForwardingLoggerRecord[0], out targetOutputs); + } + } +} \ No newline at end of file diff --git a/basement/buildtasks.tests/packages.config b/basement/buildtasks.tests/packages.config index c714ef3a2..b183023e1 100644 --- a/basement/buildtasks.tests/packages.config +++ b/basement/buildtasks.tests/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file From c600afff6394d47362bc3be7a1c0b755948a662a Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 1 Mar 2017 21:57:32 -0500 Subject: [PATCH 11/30] [buildtask] Add msbuild tests --- basement/buildtasks.tests/BuildTaskTests.cs | 97 +++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 basement/buildtasks.tests/BuildTaskTests.cs diff --git a/basement/buildtasks.tests/BuildTaskTests.cs b/basement/buildtasks.tests/BuildTaskTests.cs new file mode 100644 index 000000000..65395ed14 --- /dev/null +++ b/basement/buildtasks.tests/BuildTaskTests.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.Build.Construction; +using Microsoft.Build.Evaluation; +using Microsoft.Build.Execution; +using NUnit.Framework; +using Xamarin.ContentPipeline.Tests; + +namespace buildtasks.tests +{ + class BuildTaskTests : TestsBase + { + public void AddCoreTargets(ProjectRootElement el) + { + //var props = Path.Combine( + // Path.GetDirectoryName(GetType().Assembly.Location), + // "..", "..", "..", "buildtasks", "bin", "Debug", "Xamarin.GooglePlayServices.Basement.props" + //); + //el.AddImport(props); + var targets = Path.Combine( + Path.GetDirectoryName(GetType().Assembly.Location), + "..", "..", "..", "buildtasks", "bin", "Debug", "Xamarin.GooglePlayServices.Basement.targets" + ); + el.AddImport(targets); + + } + + [Test] + public void Test_Skip_Due_To_Newer_Outputs_Than_Inputs() + { + var googleServicesJsonPath = Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "google-services.json"); + + var monoAndroidResDirIntermediate = Path.Combine(TempDir, "Debug"); + + Directory.CreateDirectory(monoAndroidResDirIntermediate); + + File.WriteAllText(Path.Combine(monoAndroidResDirIntermediate, "ProcessGoogleServicesJson.stamp"), "STAMPS"); + + + var engine = new ProjectCollection(); + var prel = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine); + + Console.WriteLine("TempDir: {0}", TempDir); + + prel.AddProperty("AndroidApplication", "True"); + prel.AddProperty("IntermediateOutputPath", monoAndroidResDirIntermediate); + prel.AddProperty("MonoAndroidResDirIntermediate", monoAndroidResDirIntermediate); + prel.AddProperty("_AndroidPackage", "com.xamarin.sample"); + + prel.AddItem("GoogleServicesJson", googleServicesJsonPath); + + AddCoreTargets(prel); + + var project = new ProjectInstance(prel); + var log = new MSBuildTestLogger(); + + var success = BuildProject(engine, project, "ProcessGoogleServicesJson", log); + + Assert.IsTrue(success); + Assert.IsTrue(log.Events.Any(e => e.Message.Contains("ProcessGoogleServicesJson") && e.Message.Contains("skipped"))); + } + + [Test] + public void Test_Inputs_Newer_Than_Outputs() + { + var googleServicesJsonPath = Path.Combine(TestContext.CurrentContext.TestDirectory, "..", "..", "google-services.json"); + + var monoAndroidResDirIntermediate = Path.Combine(TempDir, "Debug"); + + Directory.CreateDirectory(monoAndroidResDirIntermediate); + + var engine = new ProjectCollection(); + var prel = ProjectRootElement.Create(Path.Combine(TempDir, "project.csproj"), engine); + + Console.WriteLine("TempDir: {0}", TempDir); + + prel.AddProperty("AndroidApplication", "True"); + prel.AddProperty("IntermediateOutputPath", monoAndroidResDirIntermediate); + prel.AddProperty("MonoAndroidResDirIntermediate", monoAndroidResDirIntermediate); + prel.AddProperty("_AndroidPackage", "com.xamarin.sample"); + + prel.AddItem("GoogleServicesJson", googleServicesJsonPath); + + AddCoreTargets(prel); + + var project = new ProjectInstance(prel); + var log = new MSBuildTestLogger(); + + var success = BuildProject(engine, project, "ProcessGoogleServicesJson", log); + + Assert.IsTrue(success); + Assert.IsFalse(log.Events.Any(e => e.Message.Contains("ProcessGoogleServicesJson") && e.Message.Contains("skipped"))); + } + } +} From 45d659cd97d7481ca0fdeafdcc6ef4480b7d3281 Mon Sep 17 00:00:00 2001 From: Redth Date: Fri, 3 Mar 2017 14:11:04 -0500 Subject: [PATCH 12/30] =?UTF-8?q?Don=E2=80=99t=20process=20google=20json?= =?UTF-8?q?=20on=20design=20time=20builds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets b/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets index d4b98b32a..11c36342b 100644 --- a/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets +++ b/basement/buildtasks/Xamarin.GooglePlayServices.Basement.targets @@ -44,7 +44,7 @@ Date: Fri, 3 Mar 2017 16:00:47 -0500 Subject: [PATCH 13/30] Stable nuget version for QA --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 484601d53..c7c3b3e29 100644 --- a/build.cake +++ b/build.cake @@ -18,7 +18,7 @@ var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repos var BASE_API_INFO_URL = "https://github.com/xamarin/GooglePlayServicesComponents/releases/download/42.1001.0/api-info.xml"; var PLAY_COMPONENT_VERSION = "42.1020.0.0"; -var PLAY_NUGET_VERSION = "42.1020.0-beta1"; +var PLAY_NUGET_VERSION = "42.1020.0"; var PLAY_AAR_VERSION = "10.2.0"; var VERSION_DESC = "10.2.0"; From 201eadfbebc809fb7873a2a2f1b801d623b4a8b3 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 28 Mar 2017 08:50:51 -0400 Subject: [PATCH 14/30] Added Tasks dependency to more Games/Awareness These libs in 10.2.0 have a direct dependency on Tasks --- .../Xamarin.GooglePlayServices.Awareness.template.nuspec | 1 + awareness/source/Awareness.csproj | 4 ++++ games/nuget/Xamarin.GooglePlayServices.Games.template.nuspec | 1 + games/source/Games.csproj | 4 ++++ 4 files changed, 10 insertions(+) diff --git a/awareness/nuget/Xamarin.GooglePlayServices.Awareness.template.nuspec b/awareness/nuget/Xamarin.GooglePlayServices.Awareness.template.nuspec index 9e4f35034..5fb119dfa 100644 --- a/awareness/nuget/Xamarin.GooglePlayServices.Awareness.template.nuspec +++ b/awareness/nuget/Xamarin.GooglePlayServices.Awareness.template.nuspec @@ -21,6 +21,7 @@ + diff --git a/awareness/source/Awareness.csproj b/awareness/source/Awareness.csproj index c73c4cf7b..abc552da2 100644 --- a/awareness/source/Awareness.csproj +++ b/awareness/source/Awareness.csproj @@ -98,6 +98,10 @@ {D42D621B-0370-44F6-A58E-0749629F9F4D} Places + + {53F87D88-8871-41A2-9F81-B79AB02FEC24} + Tasks + diff --git a/games/nuget/Xamarin.GooglePlayServices.Games.template.nuspec b/games/nuget/Xamarin.GooglePlayServices.Games.template.nuspec index 74d231f9c..27f4c2035 100644 --- a/games/nuget/Xamarin.GooglePlayServices.Games.template.nuspec +++ b/games/nuget/Xamarin.GooglePlayServices.Games.template.nuspec @@ -22,6 +22,7 @@ + diff --git a/games/source/Games.csproj b/games/source/Games.csproj index f3dcf9c81..b90d72885 100644 --- a/games/source/Games.csproj +++ b/games/source/Games.csproj @@ -85,6 +85,10 @@ {6A38FACF-F0C5-4A49-8A8A-7CE6634207CE} Basement + + {53F87D88-8871-41A2-9F81-B79AB02FEC24} + Tasks + From 44526d11e7d5d0d2310391b189530131c795a49f Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 28 Mar 2017 08:53:06 -0400 Subject: [PATCH 15/30] Added a m2repository dependency diff util MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each time we update the sdk version we bind against, we have to re-evaluate the dependency chain between the native libraries so that we can mimick them in our bindings (for nuget packages and the binding projects themselves). Traditionally we’ve used an internal utility to help list the dependency graph from a maven repository. This workbook file will help determine changes in the dependency graph between versions of the native libraries. The idea is to use this workbook and manually inspect and implement the dependency graph changes. The workbook makes it much easier and quicker to figure out what those changes are. --- util/maven-repo-dependency-diff.workbook | 53 ++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 util/maven-repo-dependency-diff.workbook diff --git a/util/maven-repo-dependency-diff.workbook b/util/maven-repo-dependency-diff.workbook new file mode 100644 index 000000000..8eb3dc15e --- /dev/null +++ b/util/maven-repo-dependency-diff.workbook @@ -0,0 +1,53 @@ +--- +uti: com.xamarin.workbook +platforms: +- Console +packages: +- id: MavenNet + version: 1.0.5 +--- + +```csharp +#r "MavenNet" +using MavenNet; +``` + +```csharp +const string MAVEN_REPO = "../externals/m2repository/"; +const string OLD_VER = "10.0.1"; +const string NEW_VER = "10.2.0"; +``` + +```csharp +var repo = MavenNet.MavenRepository.OpenDirectory (MAVEN_REPO); +await repo.LoadMetadataAsync (); + +foreach (var item in repo.Metadata) { + + var oldProj = await repo.GetProjectAsync (item.GroupId, item.ArtifactId, OLD_VER); + var newProj = await repo.GetProjectAsync (item.GroupId, item.ArtifactId, NEW_VER); + + if (oldProj == null && newProj == null) + continue; + if (newProj == null) { + Console.WriteLine (item.ArtifactId + " -> Removed"); + continue; + } + if (oldProj == null) { + Console.WriteLine (item.ArtifactId + " -> Added"); + continue; + } + + var removedDeps = oldProj.Dependencies.Where (od => !newProj.Dependencies.Any (nd => nd.GroupId == od.GroupId && nd.ArtifactId == od.ArtifactId)); + var addedDeps = newProj.Dependencies.Where (od => !oldProj.Dependencies.Any (nd => nd.GroupId == od.GroupId && nd.ArtifactId == od.ArtifactId)); + + if (removedDeps.Any () || addedDeps.Any ()) + Console.WriteLine (item.ArtifactId + " dependencies changed!"); + + foreach (var rm in removedDeps) + Console.WriteLine ($"-> Removed: {rm.ArtifactId}"); + + foreach (var ad in addedDeps) + Console.WriteLine ($"-> Added: {ad.ArtifactId}"); +} +``` \ No newline at end of file From d7933987a67c774eb1b2a8e0dd9307051560f4dc Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 28 Mar 2017 15:08:05 -0400 Subject: [PATCH 16/30] Bump to 10.2.1 and wear 2.0.1 sdk versions --- build.cake | 10 +++++----- util/maven-repo-dependency-diff.workbook | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cake b/build.cake index c7c3b3e29..39ec79461 100644 --- a/build.cake +++ b/build.cake @@ -12,7 +12,7 @@ // To find new URL: https://dl-ssl.google.com/android/repository/addon.xml and search for google_play_services_*.zip\ // FROM: https://dl.google.com/android/repository/addon2-1.xml var DOCS_URL = "https://dl-ssl.google.com/android/repository/google_play_services_v9_rc41.zip"; -var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repository_gms_v9_rc41_wear_2_0_rc6.zip"; +var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repository_gms_v9_1_rc07_wear_2_0_1_rc3.zip"; // We grab the previous release's api-info.xml to use as a comparison for this build's generated info to make an api-diff var BASE_API_INFO_URL = "https://github.com/xamarin/GooglePlayServicesComponents/releases/download/42.1001.0/api-info.xml"; @@ -22,10 +22,10 @@ var PLAY_NUGET_VERSION = "42.1020.0"; var PLAY_AAR_VERSION = "10.2.0"; var VERSION_DESC = "10.2.0"; -var WEAR_COMPONENT_VERSION = "2.0.0.0"; -var WEAR_NUGET_VERSION = "2.0.0"; -var WEAR_AAR_VERSION = "2.0.0"; -var WEARABLE_SUPPORT_VERSION = "2.0.0"; +var WEAR_COMPONENT_VERSION = "2.0.1.0"; +var WEAR_NUGET_VERSION = "2.0.1"; +var WEAR_AAR_VERSION = "2.0.1"; +var WEARABLE_SUPPORT_VERSION = "2.0.1"; var FIREBASE_COMPONENT_VERSION = PLAY_COMPONENT_VERSION; var FIREBASE_NUGET_VERSION = PLAY_NUGET_VERSION; diff --git a/util/maven-repo-dependency-diff.workbook b/util/maven-repo-dependency-diff.workbook index 8eb3dc15e..ae7ad85d7 100644 --- a/util/maven-repo-dependency-diff.workbook +++ b/util/maven-repo-dependency-diff.workbook @@ -15,7 +15,7 @@ using MavenNet; ```csharp const string MAVEN_REPO = "../externals/m2repository/"; const string OLD_VER = "10.0.1"; -const string NEW_VER = "10.2.0"; +const string NEW_VER = "10.2.1"; ``` ```csharp From 885f1613e18a9584e2ee4226e5670bf4b6d318a7 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 28 Mar 2017 16:16:04 -0400 Subject: [PATCH 17/30] Fix nuget/aar versions --- build.cake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.cake b/build.cake index 39ec79461..ba89ba02a 100644 --- a/build.cake +++ b/build.cake @@ -17,10 +17,10 @@ var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repos // We grab the previous release's api-info.xml to use as a comparison for this build's generated info to make an api-diff var BASE_API_INFO_URL = "https://github.com/xamarin/GooglePlayServicesComponents/releases/download/42.1001.0/api-info.xml"; -var PLAY_COMPONENT_VERSION = "42.1020.0.0"; -var PLAY_NUGET_VERSION = "42.1020.0"; -var PLAY_AAR_VERSION = "10.2.0"; -var VERSION_DESC = "10.2.0"; +var PLAY_COMPONENT_VERSION = "42.1021.0.0"; +var PLAY_NUGET_VERSION = "42.1021.0"; +var PLAY_AAR_VERSION = "10.2.1"; +var VERSION_DESC = "10.2.1"; var WEAR_COMPONENT_VERSION = "2.0.1.0"; var WEAR_NUGET_VERSION = "2.0.1"; From 4910adbafb1ed81c7f36fe0467992c4bf9420e77 Mon Sep 17 00:00:00 2001 From: Redth Date: Thu, 30 Mar 2017 15:01:24 -0400 Subject: [PATCH 18/30] Remove unnecessary async modifier --- gcm/samples/GCMSample/MainActivity.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcm/samples/GCMSample/MainActivity.cs b/gcm/samples/GCMSample/MainActivity.cs index d8a551064..ca91c9e18 100644 --- a/gcm/samples/GCMSample/MainActivity.cs +++ b/gcm/samples/GCMSample/MainActivity.cs @@ -118,7 +118,7 @@ protected override void OnHandleIntent (Intent intent) [IntentFilter (new [] { InstanceID.IntentFilterAction })] public class MyInstanceIDListenerService : InstanceIDListenerService { - public override async void OnTokenRefresh () + public override void OnTokenRefresh () { MyRegistrationService.Register (this); } From 2b0abdd91d4f864c7f6792374cd44f440449df8b Mon Sep 17 00:00:00 2001 From: Redth Date: Thu, 30 Mar 2017 15:01:51 -0400 Subject: [PATCH 19/30] Include obfuscated type in binding This fixes some other derived classes from going missing in the binding generator. --- basement/source/Transforms/Metadata.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/basement/source/Transforms/Metadata.xml b/basement/source/Transforms/Metadata.xml index 35b181ec6..cd14331fd 100644 --- a/basement/source/Transforms/Metadata.xml +++ b/basement/source/Transforms/Metadata.xml @@ -17,6 +17,7 @@ Android.Gms.Ads.Identifier Android.Gms.Location.Places Firebase + Firebase.Iid Android.Gms.Flags.Impl @@ -24,7 +25,7 @@ - + @@ -48,6 +49,8 @@ false false false + false + false From 3e1628fd90efe78139cc2586618d635d1ae95b40 Mon Sep 17 00:00:00 2001 From: Redth Date: Thu, 30 Mar 2017 15:08:59 -0400 Subject: [PATCH 20/30] Beta version for release --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index ba89ba02a..8076b02bb 100644 --- a/build.cake +++ b/build.cake @@ -18,7 +18,7 @@ var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repos var BASE_API_INFO_URL = "https://github.com/xamarin/GooglePlayServicesComponents/releases/download/42.1001.0/api-info.xml"; var PLAY_COMPONENT_VERSION = "42.1021.0.0"; -var PLAY_NUGET_VERSION = "42.1021.0"; +var PLAY_NUGET_VERSION = "42.1021.0-beta1"; var PLAY_AAR_VERSION = "10.2.1"; var VERSION_DESC = "10.2.1"; From 3ffc927dc3ee30d55d513503af71404b1e589207 Mon Sep 17 00:00:00 2001 From: Redth Date: Mon, 3 Apr 2017 16:50:44 -0400 Subject: [PATCH 21/30] Make wear beta version for beta release --- build.cake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 8076b02bb..a83c9475d 100644 --- a/build.cake +++ b/build.cake @@ -23,7 +23,7 @@ var PLAY_AAR_VERSION = "10.2.1"; var VERSION_DESC = "10.2.1"; var WEAR_COMPONENT_VERSION = "2.0.1.0"; -var WEAR_NUGET_VERSION = "2.0.1"; +var WEAR_NUGET_VERSION = "2.0.1-beta1"; var WEAR_AAR_VERSION = "2.0.1"; var WEARABLE_SUPPORT_VERSION = "2.0.1"; From 1145b954fd5519f8c6dc12d48f3414cbaf71d7c5 Mon Sep 17 00:00:00 2001 From: Redth Date: Fri, 7 Apr 2017 09:34:12 -0400 Subject: [PATCH 22/30] Added simple xunit test solution Going to start trying to track regressions specifically against any fixes made due to issues filed. --- tests/GooglePlayServices.Tests.sln | 17 ++ .../Assets/AboutAssets.txt | 19 ++ .../GooglePlayServices.Tests.csproj | 269 ++++++++++++++++++ .../GooglePlayServices.Tests/MainActivity.cs | 143 ++++++++++ .../Properties/AndroidManifest.xml | 5 + .../Properties/AssemblyInfo.cs | 27 ++ .../Resources/AboutResources.txt | 44 +++ .../Resources/layout/Main.axml | 14 + .../Resources/mipmap-hdpi/Icon.png | Bin 0 -> 2201 bytes .../Resources/mipmap-mdpi/Icon.png | Bin 0 -> 1410 bytes .../Resources/mipmap-xhdpi/Icon.png | Bin 0 -> 3237 bytes .../Resources/mipmap-xxhdpi/Icon.png | Bin 0 -> 5414 bytes .../Resources/mipmap-xxxhdpi/Icon.png | Bin 0 -> 7825 bytes .../Resources/values/Strings.xml | 5 + tests/GooglePlayServices.Tests/Tests.cs | 33 +++ .../GooglePlayServices.Tests/packages.config | 65 +++++ 16 files changed, 641 insertions(+) create mode 100644 tests/GooglePlayServices.Tests.sln create mode 100644 tests/GooglePlayServices.Tests/Assets/AboutAssets.txt create mode 100644 tests/GooglePlayServices.Tests/GooglePlayServices.Tests.csproj create mode 100644 tests/GooglePlayServices.Tests/MainActivity.cs create mode 100644 tests/GooglePlayServices.Tests/Properties/AndroidManifest.xml create mode 100644 tests/GooglePlayServices.Tests/Properties/AssemblyInfo.cs create mode 100644 tests/GooglePlayServices.Tests/Resources/AboutResources.txt create mode 100644 tests/GooglePlayServices.Tests/Resources/layout/Main.axml create mode 100644 tests/GooglePlayServices.Tests/Resources/mipmap-hdpi/Icon.png create mode 100644 tests/GooglePlayServices.Tests/Resources/mipmap-mdpi/Icon.png create mode 100644 tests/GooglePlayServices.Tests/Resources/mipmap-xhdpi/Icon.png create mode 100644 tests/GooglePlayServices.Tests/Resources/mipmap-xxhdpi/Icon.png create mode 100644 tests/GooglePlayServices.Tests/Resources/mipmap-xxxhdpi/Icon.png create mode 100644 tests/GooglePlayServices.Tests/Resources/values/Strings.xml create mode 100644 tests/GooglePlayServices.Tests/Tests.cs create mode 100644 tests/GooglePlayServices.Tests/packages.config diff --git a/tests/GooglePlayServices.Tests.sln b/tests/GooglePlayServices.Tests.sln new file mode 100644 index 000000000..95022a670 --- /dev/null +++ b/tests/GooglePlayServices.Tests.sln @@ -0,0 +1,17 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GooglePlayServices.Tests", "GooglePlayServices.Tests\GooglePlayServices.Tests.csproj", "{CCA263F0-8DAA-44F4-B5CE-C03F92FF7FAA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CCA263F0-8DAA-44F4-B5CE-C03F92FF7FAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCA263F0-8DAA-44F4-B5CE-C03F92FF7FAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCA263F0-8DAA-44F4-B5CE-C03F92FF7FAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCA263F0-8DAA-44F4-B5CE-C03F92FF7FAA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/tests/GooglePlayServices.Tests/Assets/AboutAssets.txt b/tests/GooglePlayServices.Tests/Assets/AboutAssets.txt new file mode 100644 index 000000000..a9b0638eb --- /dev/null +++ b/tests/GooglePlayServices.Tests/Assets/AboutAssets.txt @@ -0,0 +1,19 @@ +Any raw assets you want to be deployed with your application can be placed in +this directory (and child directories) and given a Build Action of "AndroidAsset". + +These files will be deployed with your package and will be accessible using Android's +AssetManager, like this: + +public class ReadAsset : Activity +{ + protected override void OnCreate (Bundle bundle) + { + base.OnCreate (bundle); + + InputStream input = Assets.Open ("my_asset.txt"); + } +} + +Additionally, some Android functions will automatically load asset files: + +Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); diff --git a/tests/GooglePlayServices.Tests/GooglePlayServices.Tests.csproj b/tests/GooglePlayServices.Tests/GooglePlayServices.Tests.csproj new file mode 100644 index 000000000..26782b8cc --- /dev/null +++ b/tests/GooglePlayServices.Tests/GooglePlayServices.Tests.csproj @@ -0,0 +1,269 @@ + + + + + Debug + AnyCPU + {CCA263F0-8DAA-44F4-B5CE-C03F92FF7FAA} + {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + GooglePlayServices.Tests + AndroidSupport.Tests + v7.1 + True + Resources\Resource.designer.cs + Resource + Properties\AndroidManifest.xml + Resources + Assets + true + true + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + None + arm64-v8a;armeabi;armeabi-v7a;x86 + + + true + pdbonly + true + bin\Release + prompt + 4 + true + false + + + + + + + + + ..\..\packages\xunit.abstractions.2.0.1\lib\netstandard1.0\xunit.abstractions.dll + + + ..\..\packages\xunit.assert.2.2.0\lib\netstandard1.1\xunit.assert.dll + + + ..\..\packages\xunit.extensibility.core.2.2.0\lib\netstandard1.1\xunit.core.dll + + + ..\..\packages\xunit.extensibility.execution.2.2.0\lib\netstandard1.1\xunit.execution.dotnet.dll + + + + ..\packages\Xamarin.Android.Support.Compat.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll + + + ..\packages\Xamarin.Android.Support.Core.UI.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll + + + ..\packages\Xamarin.Android.Support.Core.Utils.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll + + + ..\packages\Xamarin.Android.Support.Media.Compat.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll + + + ..\packages\Xamarin.Android.Support.Fragment.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll + + + ..\packages\Xamarin.Android.Support.Vector.Drawable.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll + + + ..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll + + + ..\packages\Xamarin.Android.Support.v7.AppCompat.25.1.1\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll + + + ..\packages\xunit.runner.utility.2.2.0\lib\netstandard1.5\xunit.runner.utility.netstandard15.dll + + + ..\..\output\Xamarin.Firebase.Analytics.dll + + + ..\..\output\Xamarin.Firebase.Analytics.Impl.dll + + + ..\..\output\Xamarin.Firebase.AppIndexing.dll + + + ..\..\output\Xamarin.Firebase.Auth.dll + + + ..\..\output\Xamarin.Firebase.Common.dll + + + ..\..\output\Xamarin.Firebase.Config.dll + + + ..\..\output\Xamarin.Firebase.Crash.dll + + + ..\..\output\Xamarin.Firebase.Database.Connection.dll + + + ..\..\output\Xamarin.Firebase.Database.dll + + + ..\..\output\Xamarin.Firebase.Iid.dll + + + ..\..\output\Xamarin.Firebase.Messaging.dll + + + ..\..\output\Xamarin.Firebase.Storage.Common.dll + + + ..\..\output\Xamarin.Firebase.Storage.dll + + + ..\..\output\Xamarin.GooglePlayServices.Ads.dll + + + ..\..\output\Xamarin.GooglePlayServices.Ads.Lite.dll + + + ..\..\output\Xamarin.GooglePlayServices.Analytics.dll + + + ..\..\output\Xamarin.GooglePlayServices.Analytics.Impl.dll + + + ..\..\output\Xamarin.GooglePlayServices.AppInvite.dll + + + ..\..\output\Xamarin.GooglePlayServices.Auth.Base.dll + + + ..\..\output\Xamarin.GooglePlayServices.Auth.dll + + + ..\..\output\Xamarin.GooglePlayServices.Awareness.dll + + + ..\..\output\Xamarin.GooglePlayServices.Base.dll + + + ..\..\output\Xamarin.GooglePlayServices.Basement.dll + + + ..\..\output\Xamarin.GooglePlayServices.Cast.dll + + + ..\..\output\Xamarin.GooglePlayServices.Cast.Framework.dll + + + ..\..\output\Xamarin.GooglePlayServices.Clearcut.dll + + + ..\..\output\Xamarin.GooglePlayServices.Drive.dll + + + ..\..\output\Xamarin.GooglePlayServices.Fitness.dll + + + ..\..\output\Xamarin.GooglePlayServices.Games.dll + + + ..\..\output\Xamarin.GooglePlayServices.Gass.dll + + + ..\..\output\Xamarin.GooglePlayServices.Gcm.dll + + + ..\..\output\Xamarin.GooglePlayServices.Identity.dll + + + ..\..\output\Xamarin.GooglePlayServices.Iid.dll + + + ..\..\output\Xamarin.GooglePlayServices.InstantApps.dll + + + ..\..\output\Xamarin.GooglePlayServices.Location.dll + + + ..\..\output\Xamarin.GooglePlayServices.Maps.dll + + + ..\..\output\Xamarin.GooglePlayServices.Nearby.dll + + + ..\..\output\Xamarin.GooglePlayServices.Panorama.dll + + + ..\..\output\Xamarin.GooglePlayServices.Places.dll + + + ..\..\output\Xamarin.GooglePlayServices.Plus.dll + + + ..\..\output\Xamarin.GooglePlayServices.SafetyNet.dll + + + ..\..\output\Xamarin.GooglePlayServices.TagManager.Api.dll + + + ..\..\output\Xamarin.GooglePlayServices.TagManager.dll + + + ..\..\output\Xamarin.GooglePlayServices.TagManager.V4.Impl.dll + + + ..\..\output\Xamarin.GooglePlayServices.Tasks.dll + + + ..\..\output\Xamarin.GooglePlayServices.Vision.dll + + + ..\..\output\Xamarin.GooglePlayServices.Wallet.dll + + + ..\..\output\Xamarin.GooglePlayServices.Wearable.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/GooglePlayServices.Tests/MainActivity.cs b/tests/GooglePlayServices.Tests/MainActivity.cs new file mode 100644 index 000000000..ebf733f31 --- /dev/null +++ b/tests/GooglePlayServices.Tests/MainActivity.cs @@ -0,0 +1,143 @@ +using Android.App; +using Android.Widget; +using Android.OS; +using System.Collections.Generic; +using System.Reflection; +using Xunit; +using Xunit.Abstractions; +using System; +using Xunit.Runners; +using System.Threading.Tasks; +using Android.Support.V7.App; +using Android.Views; + +namespace GooglePlayServices.Tests +{ + [Activity(Label = "AndroidSupport.Tests", MainLauncher = true, Theme="@style/Theme.AppCompat.Light", Icon = "@mipmap/icon")] + public class MainActivity : AppCompatActivity + { + public static Activity TestParentActivity { get; set; } + + + TaskCompletionSource tcsTests = new TaskCompletionSource(); + + AssemblyRunner assemblyRunner; + + TestResultsAdapter adapter; + ListView listView; + + protected override void OnCreate(Bundle savedInstanceState) + { + base.OnCreate(savedInstanceState); + + TestParentActivity = this; + + // Set our view from the "main" layout resource + SetContentView(Resource.Layout.Main); + + listView = FindViewById(Resource.Id.listView); + + adapter = new TestResultsAdapter { Parent = this }; + listView.Adapter = adapter; + + assemblyRunner = AssemblyRunner.WithoutAppDomain(Assembly.GetExecutingAssembly().GetName().Name + ".dll"); + assemblyRunner.OnDiscoveryComplete = DiscoveryCompleteHandler;; + assemblyRunner.OnExecutionComplete = ExecutionCompleteHandler;; + assemblyRunner.OnTestFailed = TestFailedHandler;; + assemblyRunner.OnTestSkipped = TestSkippedHandler; + assemblyRunner.OnTestPassed = TestPassedHandler; + assemblyRunner.OnTestOutput = TestOutputHandler; + + Console.WriteLine("Discovering..."); + assemblyRunner.Start (); + } + + bool anyFailed = false; + + void DiscoveryCompleteHandler(DiscoveryCompleteInfo obj) + { + Console.WriteLine("Discovery Complete."); + } + + void ExecutionCompleteHandler(ExecutionCompleteInfo obj) + { + Console.WriteLine("Test Complete: Success={0}", !anyFailed); + tcsTests.TrySetResult(anyFailed); + } + + void TestFailedHandler(TestFailedInfo obj) + { + anyFailed = true; + adapter.AddResult(new TestResultInfo + { + Passed = false, + DisplayName = obj.TestDisplayName + }); + } + + void TestSkippedHandler(TestSkippedInfo obj) + { + + } + + void TestOutputHandler(TestOutputInfo obj) + { + + } + + void TestPassedHandler(TestPassedInfo obj) + { + adapter.AddResult(new TestResultInfo + { + Passed = true, + DisplayName = obj.TestDisplayName + }); + } + } + + class TestResultInfo + { + public bool Passed { get; set; } + public string DisplayName { get; set; } + } + + class TestResultsAdapter : BaseAdapter + { + public Activity Parent; + List results = new List(); + + public void AddResult(TestResultInfo info) + { + results.Add(info); + Parent.RunOnUiThread(() => NotifyDataSetChanged()); + } + + public override TestResultInfo this[int position] + { + get { return results[position]; } + } + + public override int Count + { + get { return results.Count; } + } + + public override long GetItemId(int position) + { + return position; + } + + public override View GetView(int position, View convertView, ViewGroup parent) + { + var view = convertView ?? LayoutInflater.From(Parent).Inflate(Android.Resource.Layout.TwoLineListItem, parent, false); + + var r = this[position]; + + view.FindViewById(Android.Resource.Id.Text1).Text = r.DisplayName; + view.FindViewById(Android.Resource.Id.Text2).Text = r.Passed ? "Passed" : "Failed"; + view.FindViewById(Android.Resource.Id.Text2).SetTextColor(r.Passed ? Android.Graphics.Color.Green : Android.Graphics.Color.Maroon); + + return view; + } + } +} \ No newline at end of file diff --git a/tests/GooglePlayServices.Tests/Properties/AndroidManifest.xml b/tests/GooglePlayServices.Tests/Properties/AndroidManifest.xml new file mode 100644 index 000000000..e1198d91d --- /dev/null +++ b/tests/GooglePlayServices.Tests/Properties/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/tests/GooglePlayServices.Tests/Properties/AssemblyInfo.cs b/tests/GooglePlayServices.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..dc24fbdda --- /dev/null +++ b/tests/GooglePlayServices.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using Android.App; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("AndroidSupport.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("${AuthorCopyright}")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.0")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/tests/GooglePlayServices.Tests/Resources/AboutResources.txt b/tests/GooglePlayServices.Tests/Resources/AboutResources.txt new file mode 100644 index 000000000..10f52d460 --- /dev/null +++ b/tests/GooglePlayServices.Tests/Resources/AboutResources.txt @@ -0,0 +1,44 @@ +Images, layout descriptions, binary blobs and string dictionaries can be included +in your application as resource files. Various Android APIs are designed to +operate on the resource IDs instead of dealing with images, strings or binary blobs +directly. + +For example, a sample Android app that contains a user interface layout (main.axml), +an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) +would keep its resources in the "Resources" directory of the application: + +Resources/ + drawable/ + icon.png + + layout/ + main.axml + + values/ + strings.xml + +In order to get the build system to recognize Android resources, set the build action to +"AndroidResource". The native Android APIs do not operate directly with filenames, but +instead operate on resource IDs. When you compile an Android application that uses resources, +the build system will package the resources for distribution and generate a class called "R" +(this is an Android convention) that contains the tokens for each one of the resources +included. For example, for the above Resources layout, this is what the R class would expose: + +public class R { + public class drawable { + public const int icon = 0x123; + } + + public class layout { + public const int main = 0x456; + } + + public class strings { + public const int first_string = 0xabc; + public const int second_string = 0xbcd; + } +} + +You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main +to reference the layout/main.axml file, or R.strings.first_string to reference the first +string in the dictionary file values/strings.xml. diff --git a/tests/GooglePlayServices.Tests/Resources/layout/Main.axml b/tests/GooglePlayServices.Tests/Resources/layout/Main.axml new file mode 100644 index 000000000..83219bdbf --- /dev/null +++ b/tests/GooglePlayServices.Tests/Resources/layout/Main.axml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/tests/GooglePlayServices.Tests/Resources/mipmap-hdpi/Icon.png b/tests/GooglePlayServices.Tests/Resources/mipmap-hdpi/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c804644c5e47daffed8e8573b5da99d0939bc0 GIT binary patch literal 2201 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 literal 0 HcmV?d00001 diff --git a/tests/GooglePlayServices.Tests/Resources/mipmap-xhdpi/Icon.png b/tests/GooglePlayServices.Tests/Resources/mipmap-xhdpi/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e2e57aa90f8687bdfa19d82ff6bda71535b8d5 GIT binary patch literal 3237 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 Xx9ez7Rf!D(00000NkvXXu0mjfmS|-l literal 0 HcmV?d00001 diff --git a/tests/GooglePlayServices.Tests/Resources/mipmap-xxhdpi/Icon.png b/tests/GooglePlayServices.Tests/Resources/mipmap-xxhdpi/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8d20a38d1782921964638e873ffc98d148ebda6a GIT binary patch literal 5414 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 c0$sN|hZ~f>0q(p1ua5js-$bwSo@3 + + Hello World, Click Me! + AndroidSupport.Tests + diff --git a/tests/GooglePlayServices.Tests/Tests.cs b/tests/GooglePlayServices.Tests/Tests.cs new file mode 100644 index 000000000..5eb88f7da --- /dev/null +++ b/tests/GooglePlayServices.Tests/Tests.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading.Tasks; +using Android.App; +using Android.OS; +using Android.Support.V4.App; +using Xunit; +using Xunit.Extensions; + +namespace GooglePlayServices.Tests +{ + public class Tests + { + [Fact] + public void GooglePlayServicesUtil_Exists () + { + var versionCode = Android.Gms.Common.GooglePlayServicesUtil.GooglePlayServicesVersionCode; + + Console.WriteLine("Google Play Services Version: {0}", versionCode); + + Assert.True(versionCode > 0); + } + + [Fact] + public void GoogleApiAvailability_Exists() + { + var versionCode = Android.Gms.Common.GoogleApiAvailability.GooglePlayServicesVersionCode; + + Console.WriteLine("Google Play Services Version: {0}", versionCode); + + Assert.True(versionCode > 0); + } + } +} diff --git a/tests/GooglePlayServices.Tests/packages.config b/tests/GooglePlayServices.Tests/packages.config new file mode 100644 index 000000000..895729ade --- /dev/null +++ b/tests/GooglePlayServices.Tests/packages.config @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 31fe8bbbb4b30af661809ab5c80178a2ff41e701 Mon Sep 17 00:00:00 2001 From: Redth Date: Fri, 7 Apr 2017 09:34:55 -0400 Subject: [PATCH 23/30] Switch to MSBuild MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With a fix to use CPU_COUNT=1 on !Windows as MSBuild has some issues there when you specify > 1 even though it doesn’t support parallel builds. --- build.cake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.cake b/build.cake index a83c9475d..15da71070 100644 --- a/build.cake +++ b/build.cake @@ -34,7 +34,10 @@ var FIREBASE_AAR_VERSION = PLAY_AAR_VERSION; var TARGET = Argument ("t", Argument ("target", "Default")); var CPU_COUNT = System.Environment.ProcessorCount; -var ALWAYS_MSBUILD = false; +// MSBuild in < Mono 5.0 has some issues with multi cpu count being specified causing errors +if (!IsRunningOnWindows()) + CPU_COUNT = 1; +var ALWAYS_MSBUILD = true; LogSystemInfo (); From 758d7777286d82acdefae802a459efcc80162e1a Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 26 Apr 2017 20:39:39 -0400 Subject: [PATCH 24/30] Make Play/Firebase and Wear nuget versions consistent It used to be easy to forget to keep the WEAR_NUGET_VERSION in line with the PLAY_NUGET_VERSION, especially if we were switching to a prerelease (eg: -beta1). This should help avoid this mistake from being made. --- build.cake | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/build.cake b/build.cake index 15da71070..2bf88b7c5 100644 --- a/build.cake +++ b/build.cake @@ -17,13 +17,18 @@ var M2_REPOSITORY = "https://dl-ssl.google.com/android/repository/google_m2repos // We grab the previous release's api-info.xml to use as a comparison for this build's generated info to make an api-diff var BASE_API_INFO_URL = "https://github.com/xamarin/GooglePlayServicesComponents/releases/download/42.1001.0/api-info.xml"; +// The common suffix for nuget version +// Sometimes might be "-beta1" for a prerelease, or ".1" if we have a point release for the same actual aar's +// will be blank for a stable release that has no point release fixes +var COMMON_NUGET_VERSION = ""; + var PLAY_COMPONENT_VERSION = "42.1021.0.0"; -var PLAY_NUGET_VERSION = "42.1021.0-beta1"; +var PLAY_NUGET_VERSION = "42.1021.0" + COMMON_NUGET_VERSION; var PLAY_AAR_VERSION = "10.2.1"; var VERSION_DESC = "10.2.1"; var WEAR_COMPONENT_VERSION = "2.0.1.0"; -var WEAR_NUGET_VERSION = "2.0.1-beta1"; +var WEAR_NUGET_VERSION = "2.0.1" + COMMON_NUGET_VERSION; var WEAR_AAR_VERSION = "2.0.1"; var WEARABLE_SUPPORT_VERSION = "2.0.1"; From 29ddf547f6189772491a35aebba3b2293b2ecbda Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 2 May 2017 14:19:20 -0400 Subject: [PATCH 25/30] Added type forwarder AppIndexing package We previously removed Xamarin.GooglePlayServices.AppIndexing as google no longer ships a play-services-appindexing, but instead they ship firebase-appindexing with all the old types (and more) that were previously in the old package. This caused breaks in apps where they referenced libraries depending on Xamarin.GooglePlayServices.AppIndexing from an older version wanting to upgrade their play services packages to a new version. This new package will ship an assembly with only type forwarded statements in it to allow old libraries to continue to work and see the types in their new location. --- ...lePlayServices.AppIndexing.template.nuspec | 29 ++++++ appindexing/source/AppIndexing.csproj | 90 +++++++++++++++++++ appindexing/source/Properties/AssemblyInfo.cs | 27 ++++++ appindexing/source/Transforms/EnumFields.xml | 2 + appindexing/source/Transforms/EnumMethods.xml | 2 + appindexing/source/Transforms/Metadata.xml | 2 + appindexing/source/packages.config | 4 + 7 files changed, 156 insertions(+) create mode 100644 appindexing/nuget/Xamarin.GooglePlayServices.AppIndexing.template.nuspec create mode 100644 appindexing/source/AppIndexing.csproj create mode 100644 appindexing/source/Properties/AssemblyInfo.cs create mode 100644 appindexing/source/Transforms/EnumFields.xml create mode 100644 appindexing/source/Transforms/EnumMethods.xml create mode 100644 appindexing/source/Transforms/Metadata.xml create mode 100644 appindexing/source/packages.config diff --git a/appindexing/nuget/Xamarin.GooglePlayServices.AppIndexing.template.nuspec b/appindexing/nuget/Xamarin.GooglePlayServices.AppIndexing.template.nuspec new file mode 100644 index 000000000..128e53a0d --- /dev/null +++ b/appindexing/nuget/Xamarin.GooglePlayServices.AppIndexing.template.nuspec @@ -0,0 +1,29 @@ + + + + Xamarin.GooglePlayServices.AppIndexing + Xamarin Google Play Services - AppIndexing + $version$ + Xamarin Inc. + Xamarin Inc. + true + Xamarin.Android Bindings for Google Play Services - AppIndexing $aar-version$ + + Xamarin.Android Bindings for Google Play Services - AppIndexing $aar-version$ + + NOTE: This is package only contains type forwarders to the types which now exist in Xamarin.Firebase.AppIndexing and is only available for backwards compatibility purposes. + + Copyright © Microsoft Corporation + http://components.xamarin.com/view/googleplayservices-appindexing/ + http://components.xamarin.com/license/googleplayservices-appindexing/ + https://raw.githubusercontent.com/xamarin/GooglePlayServicesComponents/master/icons/play-services-appindexing_128x128.png + + + + + + + + + + diff --git a/appindexing/source/AppIndexing.csproj b/appindexing/source/AppIndexing.csproj new file mode 100644 index 000000000..880bcce71 --- /dev/null +++ b/appindexing/source/AppIndexing.csproj @@ -0,0 +1,90 @@ + + + + + Debug + AnyCPU + {1C70BA5A-5819-4823-8BEA-0FFEEA39B1E4} + {10368E6C-D01B-4462-8E8B-01FC667A7035};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Library + Xamarin.GooglePlayServices.AppIndexing + Resources + Assets + Xamarin.GooglePlayServices.AppIndexing + v7.0 + + class-parse + 8.0.30703 + 2.0 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + None + false + + + full + true + bin\Release + prompt + 4 + false + false + + + + + + + + + + + Xamarin.Firebase.AppIndexing.dll.generated.cs + + + + + + + + + + + + + + + + {3F6BAE25-ADEB-468C-8384-AD655623C341} + Base + + + {6A38FACF-F0C5-4A49-8A8A-7CE6634207CE} + Basement + + + {8D01CC30-64F5-4AD3-B9C8-0970B0F1D562} + Firebase-AppIndexing + + + {865652D3-8D1A-4779-92FC-4C54719286B7} + Firebase-Common + + + {53F87D88-8871-41A2-9F81-B79AB02FEC24} + Tasks + + + + + + diff --git a/appindexing/source/Properties/AssemblyInfo.cs b/appindexing/source/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..80aab1eee --- /dev/null +++ b/appindexing/source/Properties/AssemblyInfo.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using Android.App; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("Xamarin.GooglePlayServices.AppIndexing")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany ("Microsoft Corporation")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright ("Copyright © Microsoft Corporation")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.0")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/appindexing/source/Transforms/EnumFields.xml b/appindexing/source/Transforms/EnumFields.xml new file mode 100644 index 000000000..75838fe72 --- /dev/null +++ b/appindexing/source/Transforms/EnumFields.xml @@ -0,0 +1,2 @@ + + diff --git a/appindexing/source/Transforms/EnumMethods.xml b/appindexing/source/Transforms/EnumMethods.xml new file mode 100644 index 000000000..733d08e22 --- /dev/null +++ b/appindexing/source/Transforms/EnumMethods.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/appindexing/source/Transforms/Metadata.xml b/appindexing/source/Transforms/Metadata.xml new file mode 100644 index 000000000..3149c78d7 --- /dev/null +++ b/appindexing/source/Transforms/Metadata.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/appindexing/source/packages.config b/appindexing/source/packages.config new file mode 100644 index 000000000..38b52b817 --- /dev/null +++ b/appindexing/source/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From b8146ace43e96d9ace3410aade50dbf8f761f053 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 2 May 2017 14:19:33 -0400 Subject: [PATCH 26/30] Added solution for type forwarders --- GooglePlayServices.TypeForwarders.sln | 59 +++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 GooglePlayServices.TypeForwarders.sln diff --git a/GooglePlayServices.TypeForwarders.sln b/GooglePlayServices.TypeForwarders.sln new file mode 100644 index 000000000..f93a991f6 --- /dev/null +++ b/GooglePlayServices.TypeForwarders.sln @@ -0,0 +1,59 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PlayServices", "PlayServices", "{AFB1EDA0-E0D2-4E95-BAEC-9781B046413E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Basement", "basement\source\Basement.csproj", "{6A38FACF-F0C5-4A49-8A8A-7CE6634207CE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Base", "base\source\Base.csproj", "{3F6BAE25-ADEB-468C-8384-AD655623C341}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tasks", "tasks\source\Tasks.csproj", "{53F87D88-8871-41A2-9F81-B79AB02FEC24}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Firebase", "Firebase", "{1EC5651F-83A6-4862-AED2-6BE5103652D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Firebase-Common", "firebase-common\source\Firebase-Common.csproj", "{865652D3-8D1A-4779-92FC-4C54719286B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Firebase-AppIndexing", "firebase-appindexing\source\Firebase-AppIndexing.csproj", "{8D01CC30-64F5-4AD3-B9C8-0970B0F1D562}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppIndexing", "appindexing\source\AppIndexing.csproj", "{1C70BA5A-5819-4823-8BEA-0FFEEA39B1E4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3F6BAE25-ADEB-468C-8384-AD655623C341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F6BAE25-ADEB-468C-8384-AD655623C341}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F6BAE25-ADEB-468C-8384-AD655623C341}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F6BAE25-ADEB-468C-8384-AD655623C341}.Release|Any CPU.Build.0 = Release|Any CPU + {53F87D88-8871-41A2-9F81-B79AB02FEC24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53F87D88-8871-41A2-9F81-B79AB02FEC24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53F87D88-8871-41A2-9F81-B79AB02FEC24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53F87D88-8871-41A2-9F81-B79AB02FEC24}.Release|Any CPU.Build.0 = Release|Any CPU + {6A38FACF-F0C5-4A49-8A8A-7CE6634207CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A38FACF-F0C5-4A49-8A8A-7CE6634207CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A38FACF-F0C5-4A49-8A8A-7CE6634207CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A38FACF-F0C5-4A49-8A8A-7CE6634207CE}.Release|Any CPU.Build.0 = Release|Any CPU + {865652D3-8D1A-4779-92FC-4C54719286B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {865652D3-8D1A-4779-92FC-4C54719286B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {865652D3-8D1A-4779-92FC-4C54719286B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {865652D3-8D1A-4779-92FC-4C54719286B7}.Release|Any CPU.Build.0 = Release|Any CPU + {8D01CC30-64F5-4AD3-B9C8-0970B0F1D562}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D01CC30-64F5-4AD3-B9C8-0970B0F1D562}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D01CC30-64F5-4AD3-B9C8-0970B0F1D562}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D01CC30-64F5-4AD3-B9C8-0970B0F1D562}.Release|Any CPU.Build.0 = Release|Any CPU + {1C70BA5A-5819-4823-8BEA-0FFEEA39B1E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C70BA5A-5819-4823-8BEA-0FFEEA39B1E4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C70BA5A-5819-4823-8BEA-0FFEEA39B1E4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C70BA5A-5819-4823-8BEA-0FFEEA39B1E4}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {6A38FACF-F0C5-4A49-8A8A-7CE6634207CE} = {AFB1EDA0-E0D2-4E95-BAEC-9781B046413E} + {3F6BAE25-ADEB-468C-8384-AD655623C341} = {AFB1EDA0-E0D2-4E95-BAEC-9781B046413E} + {53F87D88-8871-41A2-9F81-B79AB02FEC24} = {AFB1EDA0-E0D2-4E95-BAEC-9781B046413E} + {865652D3-8D1A-4779-92FC-4C54719286B7} = {1EC5651F-83A6-4862-AED2-6BE5103652D0} + {8D01CC30-64F5-4AD3-B9C8-0970B0F1D562} = {1EC5651F-83A6-4862-AED2-6BE5103652D0} + {1C70BA5A-5819-4823-8BEA-0FFEEA39B1E4} = {AFB1EDA0-E0D2-4E95-BAEC-9781B046413E} + EndGlobalSection +EndGlobal From c5b4f792560554d2db964b6695d4fca9d506b8d5 Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 2 May 2017 14:20:00 -0400 Subject: [PATCH 27/30] Added support for building type forwarders sln --- build.cake | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/build.cake b/build.cake index 2bf88b7c5..985bb93ce 100644 --- a/build.cake +++ b/build.cake @@ -1,6 +1,7 @@ #tool nuget:?package=ILRepack&version=2.0.10 #tool nuget:?package=XamarinComponent #tool nuget:?package=Cake.MonoApiTools +#tool nuget:?package=Microsoft.DotNet.BuildTools.GenAPI&version=1.0.0-beta-00081 #addin nuget:?package=Cake.Json #addin nuget:?package=Cake.XCode @@ -37,6 +38,7 @@ var FIREBASE_NUGET_VERSION = PLAY_NUGET_VERSION; var FIREBASE_AAR_VERSION = PLAY_AAR_VERSION; var TARGET = Argument ("t", Argument ("target", "Default")); +var BUILD_CONFIG = Argument ("config", "Release"); var CPU_COUNT = System.Environment.ProcessorCount; // MSBuild in < Mono 5.0 has some issues with multi cpu count being specified causing errors @@ -141,6 +143,17 @@ if (IsRunningOnWindows ()) var MONO_PATH = "/Library/Frameworks/Mono.framework/Versions/Current"; +var MSCORLIB_PATH = "/Library/Frameworks/Xamarin.Android.framework/Libraries/mono/2.1/"; +if (IsRunningOnWindows ()) { + + var DOTNETDIR = new DirectoryPath (Environment.GetFolderPath (Environment.SpecialFolder.Windows)).Combine ("Microsoft.NET/"); + + if (DirectoryExists (DOTNETDIR.Combine ("Framework64"))) + MSCORLIB_PATH = MakeAbsolute (DOTNETDIR.Combine("Framework64/v4.0.30319/")).FullPath; + else + MSCORLIB_PATH = MakeAbsolute (DOTNETDIR.Combine("Framework/v4.0.30319/")).FullPath; +} + var buildsOnWinMac = BuildPlatforms.Windows | BuildPlatforms.Mac; var buildSpec = new BuildSpec { @@ -667,7 +680,42 @@ Task ("nuget-setup").IsDependentOn ("buildtasks").Does (() => { Task ("nuget").IsDependentOn ("nuget-setup").IsDependentOn ("nuget-base").IsDependentOn ("libs"); -Task ("libs").IsDependentOn ("nuget-setup").IsDependentOn ("libs-base"); +Task ("libs").IsDependentOn ("nuget-setup").IsDependentOn ("genapi").IsDependentOn ("libs-base"); + +Task ("genapi").IsDependentOn ("libs-base").IsDependentOn ("externals").Does (() => { + + var GenApiToolPath = GetFiles ("./tools/**/GenAPI.exe").FirstOrDefault (); + + // For some reason GenAPI.exe can't handle absolute paths on mac/unix properly, so always make them relative + // GenAPI.exe -libPath:$(MONOANDROID) -out:Some.generated.cs -w:TypeForwards ./relative/path/to/Assembly.dll + var libDirPrefix = IsRunningOnWindows () ? "output/" : ""; + + var libs = new FilePath [] { + "./" + libDirPrefix + "Xamarin.Firebase.AppIndexing.dll", + }; + + foreach (var lib in libs) { + var genName = lib.GetFilename () + ".generated.cs"; + + var libPath = IsRunningOnWindows () ? MakeAbsolute (lib).FullPath : lib.FullPath; + var monoDroidPath = IsRunningOnWindows () ? "\"" + MONODROID_PATH + "\"" : MONODROID_PATH; + + Information ("GenAPI: {0}", lib.FullPath); + + StartProcess (GenApiToolPath, new ProcessSettings { + Arguments = string.Format("-libPath:{0} -out:{1}{2} -w:TypeForwards {3}", + monoDroidPath + "," + MSCORLIB_PATH, + IsRunningOnWindows () ? "" : "./", + genName, + libPath), + WorkingDirectory = "./output/", + }); + } + + DotNetBuild ("./GooglePlayServices.TypeForwarders.sln", c => c.Configuration = BUILD_CONFIG); + + CopyFile ("./appindexing/source/bin/" + BUILD_CONFIG + "/Xamarin.GooglePlayServices.AppIndexing.dll", "./output/Xamarin.GooglePlayServices.AppIndexing.dll"); +}); Task ("buildtasks").Does (() => { From e4b34189e25e65c1aeec1386d6425686da00f41e Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 2 May 2017 14:20:09 -0400 Subject: [PATCH 28/30] Add AppIndexing nuspec to the build script --- build.cake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.cake b/build.cake index 985bb93ce..caad418e7 100644 --- a/build.cake +++ b/build.cake @@ -307,6 +307,9 @@ var buildSpec = new BuildSpec { // These are empty packages that depend on others new NuGetInfo { NuSpec = "./firebase-core/nuget/Xamarin.Firebase.Core.nuspec", Version = PLAY_NUGET_VERSION, RequireLicenseAcceptance = true }, new NuGetInfo { NuSpec = "./firebase-ads/nuget/Xamarin.Firebase.Ads.nuspec", Version = PLAY_NUGET_VERSION, RequireLicenseAcceptance = true }, + + // Type forwarder packages for backwards compatibility + new NuGetInfo { NuSpec = "./appindexing/nuget/Xamarin.GooglePlayServices.AppIndexing.nuspec", Version = PLAY_NUGET_VERSION, RequireLicenseAcceptance = true }, }, Components = new [] { From 13bba4a7bc98977aa3c8ef12150c013aa701363a Mon Sep 17 00:00:00 2001 From: Redth Date: Tue, 2 May 2017 16:13:18 -0400 Subject: [PATCH 29/30] Add extra nuspec templates to processing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Aar listing is currently used to loop through items to process nuspec template files for, however with the typeforwarded lib, we don’t have an aar to extract, so there’s no aar info listing for it and it wouldn’t be processed. This adds the processing to other arbitrary files. --- build.cake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build.cake b/build.cake index caad418e7..b7ea79a82 100644 --- a/build.cake +++ b/build.cake @@ -679,6 +679,16 @@ Task ("nuget-setup").IsDependentOn ("buildtasks").Does (() => { xOrig.Save (MakeAbsolute (targetsFile).FullPath); } } + + var extraNuspecTemplates = new [] { + new FilePath ("./appindexing/nuget/Xamarin.GooglePlayServices.AppIndexing.template.nuspec"), + }; + + foreach (var nuspec in extraNuspecTemplates) { + var nuspecTxt = FileReadText (nuspec).Replace ("$aar-version$", VERSION_DESC); + var newNuspec = nuspec.FullPath.Replace (".template.nuspec", ".nuspec"); + FileWriteText (newNuspec, nuspecTxt); + } }); Task ("nuget").IsDependentOn ("nuget-setup").IsDependentOn ("nuget-base").IsDependentOn ("libs"); From 406bbe8d9f3db9678e049200bf48f78ff27a59ee Mon Sep 17 00:00:00 2001 From: Redth Date: Wed, 3 May 2017 12:56:31 -0400 Subject: [PATCH 30/30] Add dependencies to Firebase.AppIndexing nuspec --- .../nuget/Xamarin.Firebase.AppIndexing.template.nuspec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/firebase-appindexing/nuget/Xamarin.Firebase.AppIndexing.template.nuspec b/firebase-appindexing/nuget/Xamarin.Firebase.AppIndexing.template.nuspec index d093dcd7d..ff01102de 100644 --- a/firebase-appindexing/nuget/Xamarin.Firebase.AppIndexing.template.nuspec +++ b/firebase-appindexing/nuget/Xamarin.Firebase.AppIndexing.template.nuspec @@ -18,6 +18,8 @@ + +