Merge branch 'main-handler' into main-maui

This commit is contained in:
Rui Marinho 2021-02-11 00:48:18 +00:00
Родитель 6b51e6ca0b ac9ff81e57
Коммит fb178c77c8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: D80D8291DF7C2068
116 изменённых файлов: 1514 добавлений и 3916 удалений

Просмотреть файл

@ -7,6 +7,12 @@
"commands": [
"dotnet-cake"
]
},
"microsoft.dotnet.xharness.cli": {
"version": "1.0.0-prerelease.21109.1",
"commands": [
"xharness"
]
}
}
}

Просмотреть файл

@ -1,5 +1,5 @@
<Project>
<ItemGroup Condition="$(TargetFramework.StartsWith('Xamarin.iOS')) != true ">
<ItemGroup Condition="$(TargetFramework.StartsWith('Xamarin.iOS')) != true AND $(TargetFramework.StartsWith('net6.0-ios')) != true ">
<Compile Remove="**\*.iOS.cs" />
<None Include="**\*.iOS.cs" />
<Compile Remove="**\iOS\*.cs" />
@ -11,13 +11,13 @@
<Compile Remove="**\Mac\*.cs" />
<None Include="**\Mac\*.cs" />
</ItemGroup>
<ItemGroup Condition="$(TargetFramework.StartsWith('Xamarin.Mac')) != true And $(TargetFramework.StartsWith('Xamarin.iOS')) != true ">
<ItemGroup Condition="$(TargetFramework.StartsWith('Xamarin.Mac')) != true AND $(TargetFramework.StartsWith('Xamarin.iOS')) != true AND $(TargetFramework.StartsWith('net6.0-ios')) != true ">
<Compile Remove="**\*.MaciOS.cs" />
<None Include="**\*.MaciOS.cs" />
<Compile Remove="**\MaciOS\*.cs" />
<None Include="**\MaciOS\*.cs" />
</ItemGroup>
<ItemGroup Condition="$(TargetFramework.StartsWith('MonoAndroid')) != true ">
<ItemGroup Condition="$(TargetFramework.StartsWith('MonoAndroid')) != true AND $(TargetFramework.StartsWith('net6.0-android')) != true ">
<Compile Remove="**\*.Android.cs" />
<None Include="**\*.Android.cs" />
<Compile Remove="**\Android\*.cs" />
@ -40,6 +40,17 @@
<None Include="**\Win32\*.cs" />
</ItemGroup>
<!-- Android -->
<PropertyGroup Condition="$(TargetFramework.StartsWith('net6.0-android'))">
<DefineConstants>$(DefineConstants);MONOANDROID</DefineConstants>
</PropertyGroup>
<!-- iOS -->
<PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0-ios' ">
<DefineConstants>$(DefineConstants);IOS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith('netcoreapp')) == true ">
<UseWpf>true</UseWpf>
</PropertyGroup>
@ -47,9 +58,18 @@
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<!-- If this becomes part of the product we will remove these but for now it's useful having them all in one place -->
<ItemGroup Condition="$(TargetFramework.StartsWith('MonoAndroid')) == true ">
<ItemGroup Condition="$(TargetFramework.StartsWith('MonoAndroid')) == true OR '$(TargetPlatformIdentifier)' == 'android' OR '$(TargetFramework)' == 'net6.0-android'">
<PackageReference Include="Xamarin.AndroidX.Lifecycle.LiveData" Version="2.2.0.4" />
<PackageReference Include="Xamarin.Google.Android.Material" Version="1.2.1.1" />
<PackageReference Include="Xamarin.AndroidX.Legacy.Support.V4" Version="1.0.0.6" />
</ItemGroup>
</Project>
<PropertyGroup Condition="$(TargetFramework.StartsWith('net5.0-windows')) == true">
<TargetPlatformMinVersion>10.0.17134.0</TargetPlatformMinVersion>
<RuntimeIdentifiers>win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>
<DefineConstants>$(DefineConstants);DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;UWP_16299;UWP_18362;UWP_17134</DefineConstants>
<NoWarn>$(NoWarn);NU5104</NoWarn>
</PropertyGroup>
<ItemGroup Condition="$(TargetFramework.StartsWith('net5.0-windows')) == true">
<PackageReference Include="Microsoft.WinUI" Version="3.0.0-preview3.201113.0" />
</ItemGroup>
</Project>

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 6.5 KiB

После

Ширина:  |  Высота:  |  Размер: 6.5 KiB

56
Maui.sln Normal file
Просмотреть файл

@ -0,0 +1,56 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30926.220
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Platform.Handlers-net6", "src\Platform.Handlers\src\Xamarin.Platform.Handlers\Xamarin.Platform.Handlers-net6.csproj", "{95BA42B5-B00E-4986-B9B5-517140378452}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample-net6", "src\Platform.Handlers\samples\Sample\Sample-net6.csproj", "{31D405F0-723E-4A6C-A52B-F4CB19A8D845}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Files", "Files", "{449F6071-A74F-4309-8D7B-7038CFD1B17B}"
ProjectSection(SolutionItems) = preProject
README.md = README.md
.nuspec\Xamarin.Forms.MultiTargeting.targets = .nuspec\Xamarin.Forms.MultiTargeting.targets
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Forms.Core-net6", "src\Forms\src\Xamarin.Forms.Core\Xamarin.Forms.Core-net6.csproj", "{AF64451F-E2BD-41C2-B083-F60C26AE2A9F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Droid-net6", "src\Platform.Handlers\samples\Sample.Droid\Sample.Droid-net6.csproj", "{3AE5B968-1916-4213-97E4-F88F51BCAB23}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.iOS-net6", "src\Platform.Handlers\samples\Sample.iOS\Sample.iOS-net6.csproj", "{B8D80A2B-F636-4E27-BCAA-EA601007B7F4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{95BA42B5-B00E-4986-B9B5-517140378452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{95BA42B5-B00E-4986-B9B5-517140378452}.Debug|Any CPU.Build.0 = Debug|Any CPU
{95BA42B5-B00E-4986-B9B5-517140378452}.Release|Any CPU.ActiveCfg = Release|Any CPU
{95BA42B5-B00E-4986-B9B5-517140378452}.Release|Any CPU.Build.0 = Release|Any CPU
{31D405F0-723E-4A6C-A52B-F4CB19A8D845}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{31D405F0-723E-4A6C-A52B-F4CB19A8D845}.Debug|Any CPU.Build.0 = Debug|Any CPU
{31D405F0-723E-4A6C-A52B-F4CB19A8D845}.Release|Any CPU.ActiveCfg = Release|Any CPU
{31D405F0-723E-4A6C-A52B-F4CB19A8D845}.Release|Any CPU.Build.0 = Release|Any CPU
{AF64451F-E2BD-41C2-B083-F60C26AE2A9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AF64451F-E2BD-41C2-B083-F60C26AE2A9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AF64451F-E2BD-41C2-B083-F60C26AE2A9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF64451F-E2BD-41C2-B083-F60C26AE2A9F}.Release|Any CPU.Build.0 = Release|Any CPU
{3AE5B968-1916-4213-97E4-F88F51BCAB23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3AE5B968-1916-4213-97E4-F88F51BCAB23}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3AE5B968-1916-4213-97E4-F88F51BCAB23}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{3AE5B968-1916-4213-97E4-F88F51BCAB23}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3AE5B968-1916-4213-97E4-F88F51BCAB23}.Release|Any CPU.Build.0 = Release|Any CPU
{B8D80A2B-F636-4E27-BCAA-EA601007B7F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8D80A2B-F636-4E27-BCAA-EA601007B7F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B8D80A2B-F636-4E27-BCAA-EA601007B7F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8D80A2B-F636-4E27-BCAA-EA601007B7F4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0B8ABEAD-D2B5-4370-A187-62B5ABE4EE50}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -8,6 +8,30 @@
* Evolution of [Xamarin.Forms](https://github.com/xamarin/xamarin.forms)
* .NET 6
## Maui.sln
### SDKS required
- Install the SDKs listed here https://github.com/xamarin/net6-samples
- And/or run the following
```
dotnet tool install Cake.Tool -g
dotnet cake --target=provision
```
### Running
#### IDE
- If you have Visual Studio 16.9 P4 installed you can open `Maui.sln` and run it from there.
#### Command Line
```
dotnet build src\Platform.Handlers\samples\Sample.Droid\Sample.Droid-net6.csproj -t:Run
dotnet build src\Platform.Handlers\samples\Sample.iOS\Sample.iOS-net6.csproj -t:Run
```
## Current News
[![](Assets/poster-standup.png)](https://www.youtube.com/watch?v=5bK2ICHtMxo)

Просмотреть файл

@ -22,7 +22,7 @@ PowerShell:
#addin "nuget:?package=Cake.Android.Adb&version=3.2.0"
#addin "nuget:?package=Cake.Git&version=0.21.0"
#addin "nuget:?package=Cake.Android.SdkManager&version=3.0.2"
#addin "nuget:?package=Cake.Boots&version=1.0.2.437"
#addin "nuget:?package=Cake.Boots&version=1.0.3.556"
#addin "nuget:?package=Cake.AppleSimulator&version=0.2.0"
#addin "nuget:?package=Cake.FileHelpers&version=3.2.1"
@ -388,7 +388,7 @@ Task("provision-netsdk-local")
Information("Downloading: {0} to {1}", cabUrl, cabPath);
DownloadFile(cabUrl, cabPath);
InstallMsi(msiUrl, null, msiName);
InstallMsiOrExe(msiUrl, null, msiName);
}
int i = 0;
@ -541,7 +541,7 @@ Task("provision-uitests-uwp")
if(!DirectoryExists(driverPath))
{
try{
InstallMsi(UWP_APP_DRIVER_INSTALL_PATH, installPath);
InstallMsiOrExe(UWP_APP_DRIVER_INSTALL_PATH, installPath);
}
catch(Exception e)
{
@ -550,8 +550,41 @@ Task("provision-uitests-uwp")
}
});
void InstallMsi(string msiFile, string installTo, string fileName = "InstallFile.msi")
async Task InstallMsiWithBoots(string msiFile, string installTo = null, string fileName = "InstallFile.msi")
{
bool success = false;
try
{
await Boots(msiFile);
success = true;
}
catch (System.Exception e)
{
Information("Boots failed: {0}", e);
}
if(success)
return;
try
{
InstallMsiOrExe(msiFile, installTo, fileName, !isCIBuild);
success = true;
}
catch (System.Exception e)
{
Information("Our attempt failed: {0}", e);
}
}
void InstallMsiOrExe(string msiFile, string installTo = null, string fileName = "InstallFile.msi", bool interactive = false)
{
if(msiFile.EndsWith(".exe") && fileName == "InstallFile.msi")
fileName = "InstallFile.exe";
string installerPath = $"{System.IO.Path.GetTempPath()}{fileName}";
try
@ -559,22 +592,35 @@ void InstallMsi(string msiFile, string installTo, string fileName = "InstallFile
Information ("Installing: {0}", msiFile);
DownloadFile(msiFile, installerPath);
Information("File Downloaded To: {0}", installerPath);
int result = -1;
var argumentBuilder =
new ProcessArgumentBuilder()
.Append("/a")
.Append(installerPath)
.Append("/qn");
if(!String.IsNullOrWhiteSpace(installTo))
if(msiFile.EndsWith(".exe"))
{
Information("Installing into: {0}", installTo);
argumentBuilder = argumentBuilder.Append("TARGETDIR=\"" + installTo + "\"");
result = StartProcess(installerPath, new ProcessSettings {
Arguments = new ProcessArgumentBuilder()
.Append(@" /q")
}
);
}
else{
var argumentBuilder =
new ProcessArgumentBuilder()
.Append("/a")
.Append(installerPath);
var result = StartProcess("msiexec", new ProcessSettings {
Arguments = argumentBuilder
});
if(!interactive)
argumentBuilder = argumentBuilder.Append("/qn");
if(!String.IsNullOrWhiteSpace(installTo))
{
Information("Installing into: {0}", installTo);
argumentBuilder = argumentBuilder.Append("TARGETDIR=\"" + installTo + "\"");
}
result = StartProcess("msiexec", new ProcessSettings {
Arguments = argumentBuilder
});
}
if(result != 0)
throw new Exception("Failed to install: " + msiFile);
@ -828,30 +874,6 @@ Task("BuildForNuget")
}
});
Task("BuildPages")
.IsDependentOn("BuildTasks")
.Description("Build Xamarin.Forms.Pages")
.Does(() =>
{
try
{
var msbuildSettings = GetMSBuildSettings();
var binaryLogger = new MSBuildBinaryLogSettings {
Enabled = isCIBuild
};
msbuildSettings.BinaryLogger = binaryLogger;
binaryLogger.FileName = $"{artifactStagingDirectory}/win-pages-{configuration}.binlog";
MSBuild("./build/Xamarin.Forms.Pages.sln", msbuildSettings.WithRestore());
}
catch(Exception)
{
if(IsRunningOnWindows())
throw;
}
});
Task("BuildTasks")
.Description($"Build {BUILD_TASKS_PROJ}")
.Does(() =>
@ -891,7 +913,7 @@ Task("VSMAC")
{
StartVisualStudio();
});
Task("cg-android")
.Description("Builds Android Control Gallery")
.IsDependentOn("WriteGoogleMapsAPIKey")

Просмотреть файл

@ -9,7 +9,7 @@ Param(
)
# Restore Cake tool
& dotnet tool restore
& dotnet tool restore --configfile eng/DevopsNuget.config
# Build Cake arguments
$cakeArguments = @("$Script");

Просмотреть файл

@ -17,7 +17,7 @@ for i in "$@"; do
done
# Restore Cake tool
dotnet tool restore
dotnet tool restore --configfile eng/DevopsNuget.config
if [ $? -ne 0 ]; then
echo "An error occured while installing Cake."

Просмотреть файл

@ -5,6 +5,7 @@
<add key="dotnet-eng" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" protocolVersion="3" />
<add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" protocolVersion="3" />
<add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
<add key="xamarin" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/xamarin-impl/nuget/v3/index.json" />
</packageSources>
<activePackageSource>
<add key="All" value="(Aggregate source)" />

Просмотреть файл

@ -38,7 +38,7 @@
<!-- Auto install any missing Android SDKs -->
<PropertyGroup Condition="'$(CI)' == 'true'">
<AndroidRestoreOnBuild Condition="'$(AndroidRestoreOnBuild)' == ''">True</AndroidRestoreOnBuild>
<AndroidRestoreOnBuild Condition="'$(AndroidRestoreOnBuild)' == ''">False</AndroidRestoreOnBuild>
<AcceptAndroidSDKLicenses Condition="'$(AcceptAndroidSDKLicenses)' == ''">True</AcceptAndroidSDKLicenses>
</PropertyGroup>
</Project>

1
eng/devices/.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1 @@
tools/

199
eng/devices/android.cake Normal file
Просмотреть файл

@ -0,0 +1,199 @@
#addin nuget:?package=Cake.Android.Adb&version=3.2.0
#addin nuget:?package=Cake.Android.AvdManager&version=2.2.0
string TARGET = Argument("target", "Test");
// required
FilePath PROJECT = Argument("project", EnvironmentVariable("ANDROID_TEST_PROJECT") ?? "");
string TEST_DEVICE = Argument("device", EnvironmentVariable("ANDROID_TEST_DEVICE") ?? "android-emulator-32_30");
// optional
var BINLOG = Argument("binlog", EnvironmentVariable("ANDROID_TEST_BINLOG") ?? PROJECT + ".binlog");
var TEST_APP = Argument("app", EnvironmentVariable("ANDROID_TEST_APP") ?? "");
var TEST_APP_PACKAGE_NAME = Argument("package", EnvironmentVariable("ANDROID_TEST_APP_PACKAGE_NAME") ?? "");
var TEST_APP_INSTRUMENTATION = Argument("instrumentation", EnvironmentVariable("ANDROID_TEST_APP_INSTRUMENTATION") ?? "");
var TEST_RESULTS = Argument("results", EnvironmentVariable("ANDROID_TEST_RESULTS") ?? "");
// other
string CONFIGURATION = "Debug"; // needs to be debug so unit tests get discovered
string ANDROID_AVD = "DEVICE_TESTS_EMULATOR";
string DEVICE_NAME = "Nexus 5X";
string DEVICE_ID = "system-images;android-30;google_apis_playstore;x86";
// set up env
var ANDROID_HOME = EnvironmentVariable("ANDROID_HOME");
if (string.IsNullOrEmpty(ANDROID_HOME)) {
throw new Exception("Environment variable 'ANDROID_HOME' must be set to the Android SDK root.");
}
System.Environment.SetEnvironmentVariable("PATH",
$"{ANDROID_HOME}/tools/bin" + System.IO.Path.PathSeparator +
$"{ANDROID_HOME}/platform-tools" + System.IO.Path.PathSeparator +
$"{ANDROID_HOME}/emulator" + System.IO.Path.PathSeparator +
EnvironmentVariable("PATH"));
Information("ANDROID_HOME {0}", ANDROID_HOME);
Information("Project File: {0}", PROJECT);
Information("Build Binary Log (binlog): {0}", BINLOG);
Information("Build Configuration: {0}", CONFIGURATION);
var avdSettings = new AndroidAvdManagerToolSettings { SdkRoot = ANDROID_HOME };
var adbSettings = new AdbToolSettings { SdkRoot = ANDROID_HOME };
var emuSettings = new AndroidEmulatorToolSettings { SdkRoot = ANDROID_HOME, ArgumentCustomization = args => args.Append("-no-window") };
AndroidEmulatorProcess emulatorProcess = null;
Setup(context =>
{
// determine the device characteristics
{
var working = TEST_DEVICE.Trim().ToLower();
var emulator = true;
var arch = "x86";
var api = 30;
// version
if (working.IndexOf("_") is int idx && idx > 0) {
api = int.Parse(working.Substring(idx + 1));
working = working.Substring(0, idx);
}
var parts = working.Split("-");
// os
if (parts[0] != "android")
throw new Exception("Unexpected platform (expected: android) in device: " + TEST_DEVICE);
// device/emulator
if (parts[1] == "device")
emulator = false;
else if (parts[1] != "emulator" && parts[1] != "simulator")
throw new Exception("Unexpected device type (expected: device|emulator) in device: " + TEST_DEVICE);
// arch/bits
if (parts[2] == "32") {
if (emulator)
arch = "x86";
else
arch = "armeabi-v7a";
} else if (parts[2] == "64") {
if (emulator)
arch = "x86_64";
else
arch = "arm64-v8a";
}
DEVICE_ID = $"system-images;android-{api};google_apis_playstore;{arch}";
// we are not using a virtual device, so quit
if (!emulator)
return;
}
Information("Test Device: {0}", TEST_DEVICE);
Information("Test Device ID: {0}", DEVICE_ID);
// delete the AVD first, if it exists
Information("Deleting AVD if exists: {0}...", ANDROID_AVD);
try { AndroidAvdDelete(ANDROID_AVD, avdSettings); }
catch { }
// create the new AVD
Information("Creating AVD: {0}...", ANDROID_AVD);
AndroidAvdCreate(ANDROID_AVD, DEVICE_ID, DEVICE_NAME, force: true, settings: avdSettings);
// start the emulator
Information("Starting Emulator: {0}...", ANDROID_AVD);
emulatorProcess = AndroidEmulatorStart(ANDROID_AVD, emuSettings);
// var waited = 0;
// while (AdbShell("getprop sys.boot_completed", adbSettings).FirstOrDefault() != "1") {
// System.Threading.Thread.Sleep(1000);
// if (waited++ > 60 * 10)
// break;
// }
// Information("Waited {0} seconds for the emulator to boot up.", waited);
});
Teardown(context =>
{
// no virtual device was used
if (emulatorProcess == null)
return;
// stop and cleanup the emulator
AdbEmuKill(adbSettings);
System.Threading.Thread.Sleep(5000);
// kill the process if it has not already exited
try { emulatorProcess.Kill(); }
catch { }
// delete the AVD
try { AndroidAvdDelete(ANDROID_AVD, avdSettings); }
catch { }
});
Task("Build")
.WithCriteria(!string.IsNullOrEmpty(PROJECT.FullPath))
.Does(() =>
{
MSBuild(PROJECT.FullPath, c => {
c.Configuration = CONFIGURATION;
c.Restore = true;
c.Properties["ContinuousIntegrationBuild"] = new List<string> { "false" };
c.Targets.Clear();
c.Targets.Add("Rebuild");
c.Targets.Add("SignAndroidPackage");
c.BinaryLogger = new MSBuildBinaryLogSettings {
Enabled = true,
FileName = BINLOG,
};
});
});
Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
if (string.IsNullOrEmpty(TEST_APP)) {
if (string.IsNullOrEmpty(PROJECT.FullPath))
throw new Exception("If no app was specified, an app must be provided.");
var binDir = PROJECT.GetDirectory().Combine("bin").Combine(CONFIGURATION).FullPath;
var apps = GetFiles(binDir + "/*-Signed.apk");
if (apps.Any()) {
TEST_APP = apps.FirstOrDefault().FullPath;
} else {
apps = GetFiles(binDir + "/*.apk");
TEST_APP = apps.First().FullPath;
}
}
if (string.IsNullOrEmpty(TEST_APP_PACKAGE_NAME)) {
var appFile = (FilePath)TEST_APP;
appFile = appFile.GetFilenameWithoutExtension();
TEST_APP_PACKAGE_NAME = appFile.FullPath.Replace("-Signed", "");
}
if (string.IsNullOrEmpty(TEST_APP_INSTRUMENTATION)) {
TEST_APP_INSTRUMENTATION = TEST_APP_PACKAGE_NAME + ".TestInstrumentation";
}
if (string.IsNullOrEmpty(TEST_RESULTS)) {
TEST_RESULTS = TEST_APP + "-results";
}
Information("Test App: {0}", TEST_APP);
Information("Test App Package Name: {0}", TEST_APP_PACKAGE_NAME);
Information("Test App Instrumentation: {0}", TEST_APP_INSTRUMENTATION);
Information("Test Results Directory: {0}", TEST_RESULTS);
CleanDirectories(TEST_RESULTS);
var settings = new DotNetCoreToolSettings
{
DiagnosticOutput = true,
ArgumentCustomization = args=>args.Append("run xharness android test " +
$"--app=\"{TEST_APP}\" " +
$"--package-name=\"{TEST_APP_PACKAGE_NAME}\" " +
$"--instrumentation=\"{TEST_APP_INSTRUMENTATION}\" " +
$"--device-arch=\"x86\" " +
$"--output-directory=\"{TEST_RESULTS}\" " +
$"--verbosity=\"Debug\" ")
};
DotNetCoreTool("tool", settings);
});
RunTarget(TARGET);

76
eng/devices/ios.cake Normal file
Просмотреть файл

@ -0,0 +1,76 @@
#addin nuget:?package=Cake.AppleSimulator&version=0.2.0
string TARGET = Argument("target", "Test");
// required
FilePath PROJECT = Argument("project", EnvironmentVariable("IOS_TEST_PROJECT") ?? "");
string TEST_DEVICE = Argument("device", EnvironmentVariable("IOS_TEST_DEVICE") ?? "ios-simulator-64_14.4"); // comma separated in the form <platform>-<device|simulator>[-<32|64>][_<version>] (eg: ios-simulator-64_13.4,[...])
// optional
var BINLOG = Argument("binlog", EnvironmentVariable("IOS_TEST_BINLOG") ?? PROJECT + ".binlog");
var TEST_APP = Argument("app", EnvironmentVariable("IOS_TEST_APP") ?? "");
var TEST_RESULTS = Argument("results", EnvironmentVariable("IOS_TEST_RESULTS") ?? "");
// other
string PLATFORM = TEST_DEVICE.ToLower().Contains("simulator") ? "iPhoneSimulator" : "iPhone";
string CONFIGURATION = "Release";
Information("Project File: {0}", PROJECT);
Information("Build Binary Log (binlog): {0}", BINLOG);
Information("Build Platform: {0}", PLATFORM);
Information("Build Configuration: {0}", CONFIGURATION);
Task("Build")
.WithCriteria(!string.IsNullOrEmpty(PROJECT.FullPath))
.Does(() =>
{
MSBuild(PROJECT.FullPath, c => {
c.Configuration = CONFIGURATION;
c.Restore = true;
c.Properties["Platform"] = new List<string> { PLATFORM };
c.Properties["BuildIpa"] = new List<string> { "true" };
c.Properties["ContinuousIntegrationBuild"] = new List<string> { "false" };
c.Targets.Clear();
c.Targets.Add("Rebuild");
c.BinaryLogger = new MSBuildBinaryLogSettings {
Enabled = true,
FileName = BINLOG,
};
});
});
Task("Test")
.IsDependentOn("Build")
.Does(() =>
{
if (string.IsNullOrEmpty(TEST_APP)) {
if (string.IsNullOrEmpty(PROJECT.FullPath))
throw new Exception("If no app was specified, an app must be provided.");
var binDir = PROJECT.GetDirectory().Combine("bin").Combine(PLATFORM).Combine(CONFIGURATION).FullPath;
var apps = GetDirectories(binDir + "/*.app");
TEST_APP = apps.First().FullPath;
}
if (string.IsNullOrEmpty(TEST_RESULTS)) {
TEST_RESULTS = TEST_APP + "-results";
}
Information("Test Device: {0}", TEST_DEVICE);
Information("Test App: {0}", TEST_APP);
Information("Test Results Directory: {0}", TEST_RESULTS);
CleanDirectories(TEST_RESULTS);
var settings = new DotNetCoreToolSettings
{
DiagnosticOutput = true,
ArgumentCustomization = args=>args.Append("run xharness apple test " +
$"--app=\"{TEST_APP}\" " +
$"--targets=\"{TEST_DEVICE}\" " +
$"--output-directory=\"{TEST_RESULTS}\" " +
$"--verbosity=\"Debug\" ")
};
DotNetCoreTool("tool", settings);
});
RunTarget(TARGET);

Просмотреть файл

@ -120,4 +120,113 @@ stages:
provisionator.path : '$(System.DefaultWorkingDirectory)/eng/provisioning/provisioning.csx'
provisionator.extraArguments : '--v'
steps:
- template: common/controlgallery-android.yml
- template: common/controlgallery-android.yml
- stage: build_net6_windows
displayName: NET6 Windows
dependsOn: []
jobs:
- job: net6
workspace:
clean: all
displayName: Build NET 6 Windows
timeoutInMinutes: 120
pool:
vmImage: windows-latest
variables:
DotNetVersion: 6.0.100-preview.1.21081.5
DotNet.Cli.Telemetry.OptOut: true
Android.Msi: https://dl.internalx.com/vsts-devdiv/Xamarin.Android/public/net6/4435786/master/abea285994fb4366de7c6c5e1ae9cc9ee22145dd/Microsoft.NET.Workload.Android.11.0.200.72.msi
iOS.Msi: https://bosstoragemirror.azureedge.net/wrench/main/f01fde5cd9a7ffffcdc8d241200c35988700fa00/4449408/package/Microsoft.NET.Workload.iOS.14.3.100-ci.main.1079.msi
LogDirectory: $(Build.ArtifactStagingDirectory)\logs
steps:
- powershell: |
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1
& .\dotnet-install.ps1 -Version $(DotNetVersion) -InstallDir "$env:ProgramFiles\dotnet\" -Verbose
& dotnet --list-sdks
displayName: install .NET $(DotNetVersion)
errorActionPreference: stop
- powershell: |
& dotnet tool install --global boots
& boots $(Android.Msi)
& boots $(iOS.Msi)
displayName: install .NET workloads
errorActionPreference: stop
- powershell: |
& dotnet restore Maui.sln --configfile eng\DevopsNuget.config
& dotnet build Maui.sln -c Debug -bl:$(LogDirectory)\Debug.binlog
& dotnet build Maui.sln -c Release -bl:$(LogDirectory)\Release.binlog
displayName: build samples
errorActionPreference: stop
- task: PublishPipelineArtifact@1
displayName: publish artifacts
inputs:
artifactName: NET6-WINDOWS
targetPath: $(Build.ArtifactStagingDirectory)
condition: always()
- stage: build_net6_macOS
displayName: NET6 macOS
dependsOn: []
jobs:
- job: net6
workspace:
clean: all
displayName: Build NET 6 macOS
timeoutInMinutes: 120
pool:
vmImage: macOS-latest
variables:
DotNetVersion: 6.0.100-preview.1.21081.5
DotNet.Cli.Telemetry.OptOut: true
Android.Pkg: https://dl.internalx.com/vsts-devdiv/Xamarin.Android/public/net6/4435786/master/abea285994fb4366de7c6c5e1ae9cc9ee22145dd/Microsoft.NET.Workload.Android-11.0.200-ci.master.72.pkg
iOS.Pkg: https://bosstoragemirror.azureedge.net/wrench/main/f01fde5cd9a7ffffcdc8d241200c35988700fa00/4449408/package/notarized/Microsoft.iOS.Bundle.14.3.100-ci.main.1079.pkg
LogDirectory: $(Build.ArtifactStagingDirectory)\logs
DotNet.Root: /usr/local/share/dotnet/
DotNet.Tools: ~/.dotnet/tools
steps:
- task: UseDotNet@2
displayName: install .NET Core 3.1
inputs:
version: 3.1.x
installationPath: $(DotNet.Root)
- bash: >
export PATH="$(DotNet.Root):$(DotNet.Tools):$PATH" &&
curl -L https://dot.net/v1/dotnet-install.sh > dotnet-install.sh &&
sh dotnet-install.sh --version $(DotNetVersion) --install-dir $DOTNET_ROOT --verbose &&
dotnet --list-sdks &&
echo "##vso[task.setvariable variable=PATH]$PATH"
displayName: install .NET $(DotNetVersion)
- bash: |
dotnet tool install --global boots
boots $(Android.Pkg)
boots $(iOS.Pkg)
displayName: install .NET workloads
- bash: |
set -x
mkdir -p ~/Library/Preferences/Xamarin
rm -f ~/Library/Preferences/Xamarin/Settings.plist
/usr/libexec/PlistBuddy -c "add :AppleSdkRoot string $(dirname $(dirname $(xcode-select -p)))" ~/Library/Preferences/Xamarin/Settings.plist || true
cat ~/Library/Preferences/Xamarin/Settings.plist || true
displayName: configure vsmac xcode
- bash: |
dotnet restore Maui.sln --configfile eng/DevopsNuget.config &&
dotnet build Maui.sln -c Debug -bl:$(LogDirectory)/Debug.binlog &&
dotnet build Maui.sln -c Release -bl:$(LogDirectory)/Release.binlog
displayName: build samples
- task: PublishPipelineArtifact@1
displayName: publish artifacts
inputs:
artifactName: NET6-OSX
targetPath: $(Build.ArtifactStagingDirectory)
condition: always()

Просмотреть файл

@ -0,0 +1,34 @@
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;
#if UITEST
using Xamarin.Forms.Core.UITests;
using Xamarin.UITest;
using NUnit.Framework;
#endif
namespace Xamarin.Forms.Controls.Issues
{
#if UITEST
[Category(UITestCategories.ManualReview)]
#endif
[Preserve(AllMembers = true)]
[Issue(IssueTracker.Github, 12259, "App crash when rendering label with FormattedText", PlatformAffected.macOS)]
public class Issue12259 : TestContentPage // or TestFlyoutPage, etc ...
{
protected override void Init()
{
var label = new Label();
var fs = new FormattedString();
fs.Spans.Add(new Span { Text = "Learn more at " });
fs.Spans.Add(new Span { Text = "https://aka.ms/xamarin-quickstart ", FontAttributes = FontAttributes.Bold });
label.FormattedText = fs;
Content = label;
}
}
}

Просмотреть файл

@ -54,7 +54,7 @@ namespace Xamarin.Forms.Controls.Issues
await Task.Delay(1000);
_vm.Data.Add(Success);
_vm.IsBusy = false;
}

Просмотреть файл

@ -18,8 +18,8 @@ using Xamarin.Forms.Core.UITests;
namespace Xamarin.Forms.Controls.Issues
{
[Issue(IssueTracker.Github, 13126, "[Bug] Regression: 5.0.0-pre5 often fails to draw dynamically loaded collection view content",
PlatformAffected.iOS, issueTestNumber:1)]
[Issue(IssueTracker.Github, 13126, "[Bug] Regression: 5.0.0-pre5 often fails to draw dynamically loaded collection view content",
PlatformAffected.iOS, issueTestNumber: 1)]
#if UITEST
[NUnit.Framework.Category(UITestCategories.CollectionView)]
#endif

Просмотреть файл

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8" ?>
<controls:TestContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:controls="clr-namespace:Xamarin.Forms.Controls"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="Xamarin.Forms.Controls.Issues.Issue13437"
Title="Issue 13437">
<ContentPage.Content>
<StackLayout>
<Label
Padding="12"
BackgroundColor="Black"
TextColor="White"
Text="Tap each Button to change the CollectionView ItemsLayout. If in all cases, the ItemsLayout changes correctly, the test has passed."/>
<Button x:Name="ButtonOne"/>
<Button x:Name="ButtonTwo"/>
<Button x:Name="ButtonThree"/>
<Button x:Name="ButtonFour"/>
<CollectionView
x:Name="Collection"
ItemsSource="{Binding Items}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Label
Text="{Binding Text}"
WidthRequest="100"/>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</StackLayout>
</ContentPage.Content>
</controls:TestContentPage>

Просмотреть файл

@ -0,0 +1,95 @@
using System.Collections.Generic;
using Xamarin.Forms.CustomAttributes;
using System.Collections.ObjectModel;
#if UITEST
using Xamarin.Forms.Core.UITests;
using Xamarin.UITest;
using NUnit.Framework;
#endif
namespace Xamarin.Forms.Controls.Issues
{
[Issue(IssueTracker.Github, 13437, "[Bug] Changing ItemsLayout of CollectionView at runtime does not work on UWP",
PlatformAffected.UWP)]
public partial class Issue13437 : TestContentPage
{
public Issue13437()
{
#if APP
InitializeComponent();
ButtonOne.Text = "Set Vertical List";
ButtonOne.Command = new Command(() =>
{
SetVerticalList();
});
ButtonTwo.Text = "Set Horizontal List";
ButtonTwo.Command = new Command(() =>
{
SetHorizontalList();
});
ButtonThree.Text = "Set Grid 2 List";
ButtonThree.Command = new Command(() =>
{
SetTwoGrid();
});
ButtonFour.Text = "Set Grid 3 List";
ButtonFour.Command = new Command(() =>
{
SetThreeGrid();
});
var collection = new ObservableCollection<Issue13437Model>();
for (int i = 0; i < 42; i++)
{
collection.Add(new Issue13437Model { Text = "Label " + i.ToString() });
}
Collection.ItemsSource = collection;
BindingContext = new ViewModel10482();
#endif
}
protected override void Init()
{
}
#if APP
void SetVerticalList()
{
Collection.ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical);
}
void SetHorizontalList()
{
Collection.ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Horizontal);
}
void SetTwoGrid()
{
Collection.ItemsLayout = new GridItemsLayout(ItemsLayoutOrientation.Vertical)
{
Span = 2,
HorizontalItemSpacing = 5,
VerticalItemSpacing = 5
};
}
void SetThreeGrid()
{
Collection.ItemsLayout = new GridItemsLayout(3, ItemsLayoutOrientation.Vertical);
}
#endif
}
public class Issue13437Model
{
public string Text { get; set; }
}
}

Просмотреть файл

@ -59,7 +59,7 @@ namespace Xamarin.Forms.Controls.Issues
{
ShowsResults = true;
ItemsSource = Enumerable.Range(0, 100)
.Select(_=> "searchresult")
.Select(_ => "searchresult")
.ToList();
}
}

Просмотреть файл

@ -12,6 +12,9 @@
<Compile Include="$(MSBuildThisFileDirectory)CollectionViewGroupTypeIssue.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue11214.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue13109.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue13437.xaml.cs">
<DependentUpon>Issue13437.xaml</DependentUpon>
</Compile>
<Compile Include="$(MSBuildThisFileDirectory)Issue13126.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue13126_2.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue13551.cs" />
@ -1722,6 +1725,7 @@
<Compile Include="$(MSBuildThisFileDirectory)ShellFlyoutContentWithZeroMargin.cs" />
<Compile Include="$(MSBuildThisFileDirectory)LabelFormattedTextHtmlPadding.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue13436.xaml.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue12259.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue13476.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ShellFlyoutHeaderBehavior.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Issue8701.cs" />
@ -2670,6 +2674,10 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue13437.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="$(MSBuildThisFileDirectory)VisualGallery.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>

Просмотреть файл

@ -19,7 +19,9 @@
GalleryBuilder.NavButton("IndicatorView Gallery", () =>
new IndicatorsSample(), Navigation),
GalleryBuilder.NavButton("Indicator MaxVisible Gallery", () =>
new IndicatorsSampleMaximumVisible(), Navigation)
new IndicatorsSampleMaximumVisible(), Navigation),
GalleryBuilder.NavButton("Indicator VisualState", () =>
new IndicatorsTemplateSample(), Navigation)
}
}
};

Просмотреть файл

@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Xamarin.Forms.Controls"
mc:Ignorable="d"
x:Class="Xamarin.Forms.Controls.IndicatorsSample">
x:Class="Xamarin.Forms.Controls.GalleryPages.IndicatorsSample">
<ContentPage.Resources>
<OnPlatform x:Key="IonicsFontFamily" x:TypeArguments="x:String">
<On Platform="iOS" Value="Ionicons" />
@ -25,7 +25,7 @@
<DataTemplate>
<Frame BackgroundColor="{Binding Color}">
<Grid HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="{Binding Name}" FontSize="25"></Label>
<Label Text="{Binding Name}" FontSize="25"/>
</Grid>
</Frame>
</DataTemplate>

Просмотреть файл

@ -1,6 +1,6 @@
using Xamarin.Forms.Xaml;
namespace Xamarin.Forms.Controls
namespace Xamarin.Forms.Controls.GalleryPages
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class IndicatorsSample : ContentPage

Просмотреть файл

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Xamarin.Forms.Controls.IndicatorsSampleMaximumVisible">
x:Class="Xamarin.Forms.Controls.GalleryPages.IndicatorsSampleMaximumVisible">
<ContentPage.Resources>
<OnPlatform x:Key="IonicsFontFamily" x:TypeArguments="x:String">
<On Platform="iOS" Value="Ionicons" />

Просмотреть файл

@ -1,7 +1,7 @@
using System;
using Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.CarouselViewGalleries;
namespace Xamarin.Forms.Controls
namespace Xamarin.Forms.Controls.GalleryPages
{
public partial class IndicatorsSampleMaximumVisible : ContentPage
{

Просмотреть файл

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Xamarin.Forms.Controls.GalleryPages.IndicatorsTemplateSample">
<ContentPage.Resources>
<OnPlatform x:Key="IonicsFontFamily" x:TypeArguments="x:String">
<On Platform="iOS" Value="Ionicons" />
<On Platform="Android" Value="fonts/ionicons.ttf#" />
<On Platform="UWP" Value="Assets/Fonts/ionicons.ttf#ionicons" />
</OnPlatform>
<x:String x:Key="Indicator">&#xf30c;</x:String>
<Style x:Key="IndicatorLabelStyle" TargetType="Label">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" >
<VisualState.Setters>
<Setter Property="TextColor"
Value="Red" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Selected">
<VisualState.Setters>
<Setter Property="TextColor"
Value="LightSkyBlue" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
</ContentPage.Resources>
<Grid Margin="20,20,20,20">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<CarouselView x:Name="carousel" ItemsSource="{Binding Items}" Grid.Row="0" Grid.RowSpan="3" IndicatorView="indicators">
<CarouselView.ItemTemplate>
<DataTemplate>
<Frame BackgroundColor="{Binding Color}">
<Grid HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="{Binding Name}" FontSize="25"></Label>
</Grid>
</Frame>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
<IndicatorView x:Name="indicators" Grid.Row="1" IndicatorColor="Transparent" SelectedIndicatorColor="Transparent" HorizontalOptions="Center" >
<IndicatorView.IndicatorTemplate>
<DataTemplate>
<Label Style="{StaticResource IndicatorLabelStyle}"
Text="{StaticResource Indicator}"
FontFamily="{StaticResource IonicsFontFamily}"/>
</DataTemplate>
</IndicatorView.IndicatorTemplate>
</IndicatorView>
</Grid>
</ContentPage>

Просмотреть файл

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using Xamarin.Forms;
namespace Xamarin.Forms.Controls.GalleryPages
{
public partial class IndicatorsTemplateSample : ContentPage
{
public IndicatorsTemplateSample()
{
InitializeComponent();
BindingContext = new GalleryPages.CollectionViewGalleries.CarouselViewGalleries.CarouselItemsGalleryViewModel(false, false);
}
}
}

Просмотреть файл

@ -1,106 +0,0 @@
# Suppress: EC112
# top-most EditorConfig file
root = true
# Don't use tabs for indentation.
[*]
indent_style = space
# (Please don't specify an indent_size here; that has too many unintended consequences.)
# Code files
[*.{cs,csx,vb,vbx}]
indent_size = 4
# Code files
[*.sln]
indent_size = 4
# Xml project files
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}]
indent_size = 2
# Xml config files
[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size = 2
# JSON files
[*.json]
indent_size = 2
# XML files
[*.xml]
indent_size = 2
# Dotnet code style settings:
[*.{cs,vb}]
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
# Avoid "this." and "Me." if not necessary
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
# Use language keywords instead of framework type names for type references
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
dotnet_style_require_accessibility_modifiers = omit_if_default:warning
# Suggest more modern language features when available
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
# Naming Conventions:
# Pascal Casing
dotnet_naming_symbols.method_and_property_symbols.applicable_kinds= method,property,enum
dotnet_naming_symbols.method_and_property_symbols.applicable_accessibilities = *
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
dotnet_naming_rule.methods_and_properties_must_be_pascal_case.severity = warning
dotnet_naming_rule.methods_and_properties_must_be_pascal_case.symbols = method_and_property_symbols
dotnet_naming_rule.methods_and_properties_must_be_pascal_case.style = pascal_case_style
# Non-public members must be lower-case
dotnet_naming_symbols.non_public_symbols.applicable_kinds = field
dotnet_naming_symbols.non_public_symbols.applicable_accessibilities = private
dotnet_naming_style.all_lower_case_style.capitalization = camel_case
dotnet_naming_rule.non_public_members_must_be_lower_case.severity = warning
dotnet_naming_rule.non_public_members_must_be_lower_case.symbols = non_public_symbols
dotnet_naming_rule.non_public_members_must_be_lower_case.style = all_lower_case_style
# CSharp code style settings:
[*.cs]
# Do not prefer "var" everywhere
csharp_style_var_for_built_in_types = true:error
csharp_style_var_when_type_is_apparent = true:error
csharp_style_var_elsewhere = true:error
# Prefer method-like constructs to have a block body
csharp_style_expression_bodied_methods = true:suggestion
csharp_style_expression_bodied_constructors = true:suggestion
csharp_style_expression_bodied_operators = true:suggestion
# Prefer property-like constructs to have an expression-body
csharp_style_expression_bodied_properties = true:suggestion
csharp_style_expression_bodied_indexers = true:suggestion
csharp_style_expression_bodied_accessors = true:suggestion
# Suggest more modern language features when available
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Newline settings
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true

70
src/Essentials/other/.gitattributes поставляемый
Просмотреть файл

@ -1,70 +0,0 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
# Force bash scripts to always use lf line endings so that if a repo is accessed
# in Unix via a file share from Windows, the scripts will work.
*.sh text eol=lf
# Force the docs to always use lf line endings
docs/**/*.xml text eol=lf

Просмотреть файл

@ -1,34 +0,0 @@
Bug report best practices: [Submitting Issues](https://github.com/xamarin/Essentials/blob/main/SUBMITTING-ISSUES.md)
### Description
### Steps to Reproduce
1.
2.
3.
### Expected Behavior
### Actual Behavior
### Basic Information
- Version with issue:
- Last known good version:
- IDE:
- Platform Target Frameworks: <!-- All that apply -->
- iOS: <!-- The version of the iOS SDK you are compiling against, e.g. 11.1 -->
- Android: <!-- The version of the Android SDK you are compiling against, e.g. 7.1 -->
- UWP: <!-- The version of the UWP SDK you are compiling against, e.g. 16299 -->
- Android Support Library Version: <!-- if applicable -->
- Nuget Packages:
- Affected Devices:
### Screenshots
<!-- If the issue is a visual issue, please include screenshots showing the problem if possible -->
### Reproduction Link
<!-- Please upload or provide a link to a reproduction case -->

Просмотреть файл

@ -1,43 +0,0 @@
---
name: Bug Report
about: Create a report to help us improve
title: "[Bug] "
labels: bug
assignees: ''
---
<!-- Bug report best practices: https://github.com/xamarin/Essentials/wiki -->
### Description
### Steps to Reproduce
1.
2.
3.
### Expected Behavior
### Actual Behavior
### Basic Information
- Version with issue:
- Last known good version:
- IDE:
- Platform Target Frameworks: <!-- All that apply -->
- iOS: <!-- The version of the iOS SDK you are compiling against, e.g. 11.1 -->
- Android: <!-- The version of the Android SDK you are compiling against, e.g. 7.1 -->
- UWP: <!-- The version of the UWP SDK you are compiling against, e.g. 16299 -->
- Android Support Library Version: <!-- if applicable -->
- Nuget Packages:
- Affected Devices:
### Screenshots
<!-- If the issue is a visual issue, please include screenshots showing the problem if possible -->
### Reproduction Link
<!-- Please upload or provide a link to a reproduction case -->

Просмотреть файл

@ -1,27 +0,0 @@
---
name: Feature request
about: Suggest an idea for Essentials
title: "[Enhancement] YOUR IDEA!"
labels: feature-request
assignees: ''
---
## Summary
Please provide a brief summary of your proposal. Two to three sentences is best here.
## API Changes
Include a list of all API changes, additions, subtractions as would be required by your proposal. These APIs should be considered placeholders, so the naming is not as important as getting the concepts correct. If possible you should include some "example" code of usage of your new API. You should also provide details of the level of availability for the feature on each of the supported platforms.
e.g.
In order to facilitate the new Shiny Button api, a bool is added to the Button class. This is done as a bool because it is simpler to data bind and other reasons...
var button = new Button ();
button.MakeShiny = true; // new API
The MakeShiny API works even if the button is already visible.
## Intended Use Case
Provide a detailed example of where your proposal would be used and for what purpose.

Просмотреть файл

@ -1,39 +0,0 @@
---
name: New API Spec
about: An official specification for new APIS
title: "[Spec] "
labels: "feature-request"
assignees: ''
---
# [The feature]
Provide a concise description of the feature and the motivation for adding it to Xamarin.Essentials
# API
## [ class ]
### Properties
| API | Description |
| ------------- | ------------- |
| [name] | Gets or sets [description]. |
### Events
| API | Description |
| ------------- | ------------- |
| [name] | [API documentation/description] |
# Scenarios
# Platform Compatibility
- Target Frameworks: <!-- All that apply -->
- iOS: <!-- Support on iOS for the API -->
- Android: <!-- Support on Android for the API -->
- UWP: <!-- Support on UWP for the API -->
# Backward Compatibility
# Difficulty : [low/medium/high]

Просмотреть файл

@ -1,61 +0,0 @@
<!--
HOL' UP! JUST A SEC!
After January 31, 2021, feature related pull requests cannot be guaranteed to merge by Xamarin.Essentials.
We are in the process of merging Xamarin.Essentials into the MAUI repository for improved experience.
At this stage, MAUI will depend on Xamarin.Essentials, so we are moving it there so that they can be released together.
This repo can still be used for a time to fix any critical bugs and other issues. All new features will be postponed until the merge is complete.
Thanks for all the PRs in the past, we can't wait to have you contributing features very soon in our new and improved home!
PLEASE DELETE THE ALL THESE COMMENTS BEFORE SUBMITTING! THANKS!!!
-->
### Description of Change ###
Describe your changes here.
### Bugs Fixed ###
- Related to issue #
Provide links to issues here. Ensure that a GitHub issue was created for your feature or bug fix before sending PR.
### API Changes ###
List all API changes here (or just put None), example:
Added:
- `string Class.Property { get; set; }`
- `void Class.Method();`
Changed:
- `object Cell.OldPropertyName` => `object Cell.NewPropertyName`
If there is an entirely new API, then you can use a more verbose style:
```csharp
public static class NewClass {
public static int SomeProperty { get; set; }
public static void SomeMethod(string value);
}
```
### Behavioral Changes ###
Describe any non-bug related behavioral changes that may change how users app behaves when upgrading to this version of the codebase.
### PR Checklist ###
- [ ] Has tests (if omitted, state reason in description)
- [ ] Has samples (if omitted, state reason in description)
- [ ] Rebased on top of `main` at time of PR
- [ ] Changes adhere to coding standard
- [ ] Updated documentation ([see walkthrough](https://github.com/xamarin/Essentials/wiki/Documenting-your-code-with-mdoc))

299
src/Essentials/other/.gitignore поставляемый
Просмотреть файл

@ -1,299 +0,0 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
Output/
**/Resources/Resource.designer.cs
# Cake tools
tools/
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Tt]mp/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
appsettings.Development.json
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Typescript v1 declaration files
typings/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
**/*.DS_Store
docs/en/ns-.xml

Просмотреть файл

@ -1,17 +0,0 @@
param(
[string]$buildCorePowershellUrl = "https://opbuildstorageprod.blob.core.windows.net/opps1container/.openpublishing.buildcore.ps1",
[string]$parameters
)
# Main
$errorActionPreference = 'Stop'
# Step-1: Download buildcore script to local
echo "download build core script to local with source url: $buildCorePowershellUrl"
$repositoryRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
$buildCorePowershellDestination = "$repositoryRoot\.openpublishing.buildcore.ps1"
Invoke-WebRequest $buildCorePowershellUrl -OutFile "$buildCorePowershellDestination"
# Step-2: Run build core
echo "run build core script with parameters: $parameters"
& "$buildCorePowershellDestination" "$parameters"
exit $LASTEXITCODE

Просмотреть файл

@ -1,87 +0,0 @@
{
"docsets_to_publish": [
{
"docset_name": "XamarinEssentials",
"build_source_folder": "docs/en",
"build_output_subfolder": "XamarinEssentials",
"locale": "en-us",
"monikers": [],
"moniker_ranges": [],
"open_to_public_contributors": true,
"type_mapping": {
"Conceptual": "Content",
"ManagedReference": "Content",
"NetEnum": "Content",
"NetDelegate": "Content",
"NetNamespace": "Content",
"NetMember": "Content",
"NetType": "Content",
"RestApi": "Content"
},
"build_entry_point": "docs",
"template_folder": "_themes",
"base_path": "dotnet",
"site_name": "Docs",
"customized_tasks": {
"docset_prebuild": [
"_dependentPackages/ECMA2Yaml/tools/Run.ps1",
"_dependentPackages/CommonPlugins/tools/SplitTOC.ps1",
"_dependentPackages/CommonPlugins/tools/DiffFolder.ps1"
],
"docset_postbuild": [
"_dependentPackages/ECMA2Yaml/tools/PostBuild.ps1"
]
},
"ECMA2Yaml": {
"SourceXmlFolder": "docs/en",
"OutputYamlFolder": "docs/en/api",
"Flatten": true,
"id": "XamarinEssentials",
"SDPMode": true
},
"SplitTOC": [
"docs/en/api/XamarinEssentials/toc.yml"
],
"DiffFolder": [
"docs/en/api"
]
}
],
"notification_subscribers": [],
"branches_to_filter": [],
"skip_source_output_uploading": false,
"need_preview_pull_request": false,
"contribution_branch_mappings": {},
"need_pr_comments": false,
"dependent_repositories": [
{
"path_to_root": "_themes",
"url": "https://github.com/Microsoft/templates.docs.msft",
"branch": "master",
"branch_mapping": {}
}
],
"branch_target_mapping": {},
"need_generate_pdf_url_template": false,
"need_generate_pdf": false,
"need_generate_intellisense": false,
"dependent_packages": [
{
"id": "Microsoft.OpenPublishing.CommonPlugins",
"nuget_feed": "https://www.myget.org/F/op/api/v2",
"path_to_root": "_dependentPackages/CommonPlugins",
"target_framework": "net45",
"version": "latest"
},
{
"id": "Microsoft.DocAsCode.ECMA2Yaml",
"nuget_feed": "https://www.myget.org/F/op/api/v2",
"path_to_root": "_dependentPackages/ECMA2Yaml",
"target_framework": "net45",
"version": "latest"
}
],
"docs_build_engine": {
"name": "docfx_v3"
}
}

Просмотреть файл

@ -1,3 +0,0 @@
# Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.

Просмотреть файл

@ -1,143 +0,0 @@
# Contributing
Thanks you for your interest in contributing to Xamarin.Essentials! In this document we'll outline what you need to know about contributing and how to get started.
## Code of Conduct
Please see our [Code of Conduct](CODE_OF_CONDUCT.md).
## Prerequisite
You will need to complete a Contribution License Agreement before any pull request can be accepted. Complete the CLA at https://cla.dotnetfoundation.org/.
## Contributing Code - Best Practices
### Enums
* Always use `Unknown` at index 0 for return types that may have a value that is not known
* Always use `Default` at index 0 for option types that can use the system default option
* Follow naming guidelines for tense... `SensorSpeed` not `SensorSpeeds`
* Assign values (0,1,2,3) for all enums
### Property Names
* Include units only if one of the platforms includes it in their implementation. For instance HeadingMagneticNorth implies degrees on all platforms, but PressureInHectopascals is needed since platforms don't provide a consistent API for this.
### Units
* Use the standard units and most well accepted units when possible. For instance Hectopascals are used on UWP/Android and iOS uses Kilopascals so we have chosen Hectopascals.
### Style
* Prefer using `==` when checking for null instead of `is`
### Exceptions
We currently have different ways of indicating that nothing can be done:
- do nothing
- throw `FeatureNotSupportedException`
- throw `PlatformNotSupportedException`
- throw `FeatureNotEnabledException`
One case where we do nothing is in Android's energy saver API: if we are not Lollipop, then we just fall through:
https://github.com/xamarin/Essentials/blob/1.0.0/Xamarin.Essentials/Battery/Battery.android.cs#L12-L48
One case where we throw `FeatureNotSupportedException` is with the sensors: if there is no sensor X, then we throw.
One case (and the only case so far) where we throw `PlatformNotSupportedException` is in Android's text-to-speech API: if we try and speak, but we couldn't initialize, then we throw.
So far, I was able to determine that we throw `FeatureNotSupportedException` for:
- the sensors on all platforms if we aren't able to access the hardware
- we throw in the start and the stop (this one may be overkill, we can probably first check to see if it is started, and if not then just do nothing)
- the Android external browser if there was no browser installed
- the email API
- Android: if there is no `message/rfc822` intent handler
- iOS: (if the mail VC can't send, or if the `mailto:` doesn't have an app, or if trying to send HTML over the `mailto:` protocol
- UWP: if the `EmailManager` is not available, or if trying to send HTML
- the flashlight API on all platforms if there is no camera flash hardware
- the phone dialler
- Android / iOS: if the OS can't handle the `tel:` protocol
- UWP: the `PhoneCallManager` is missing
- the sms API
- Android: if there is no `smsto:` intent handler
- iOS: (if the message VC can't send
- UWP: if the `ChatMessageManager` is not available
- the vibration API on UWP if the `VibrationDevice` is not available or if no hardware was found
We throw a `PlatformNotSupportedException` for:
- Android when we aren't able to initialize the text-to-speech engine
We throw a `FeatureNotEnabledException` for:
- Geolocation if no providers are found
We do "nothing":
- the Vibration API on iOS and android never actually checks, it just starts it
- the Map API on Android and UWP just starts the URI, assuming that something will be there
- the Geolocation API always assumes that there is a GPS and throws a `FeatureNotEnabledException` if there was no way to get the hardware
- the KeepScreenOn feature just assumes the window flag will be honoured (probably is, but is there an api level/hardware limit?)
- the energy saver API on android pre-Lollipop
## Documentation - mdoc
This project uses [mdoc](http://www.mono-project.com/docs/tools+libraries/tools/monodoc/generating-documentation/) to document types, members, and to add small code snippets and examples. mdoc files are simple xml files and there is an msbuild target you can invoke to help generate the xml placeholders.
Read the [Documenting your code with mdoc wiki page](https://github.com/xamarin/Essentials/wiki/Documenting-your-code-with-mdoc) for more information on this process.
Every pull request which affects public types or members should include corresponding mdoc xml file changes.
### Bug Fixes
If you're looking for something to fix, please browse [open issues](https://github.com/xamarin/Essentials/issues).
Follow the style used by the [.NET Foundation](https://github.com/dotnet/runtime/blob/master/docs/coding-guidelines/coding-style.md), with two primary exceptions:
- We do not use the `private` keyword as it is the default accessibility level in C#.
- We will **not** use `_` or `s_` as a prefix for internal or private field names
- We will use `camelCaseFieldName` for naming internal or private fields in both instance and static implementations
Read and follow our [Pull Request template](https://github.com/xamarin/Essentials/blob/main/.github/PULL_REQUEST_TEMPLATE.md)
### Proposals
To propose a change or new feature, review the guidance below and then [open an issue using this template](https://github.com/xamarin/Essentials/issues/new).
#### Non-Starter Topics
The following topics should generally not be proposed for discussion as they are non-starters:
* Large renames of APIs
* Large non-backward-compatible breaking changes
* Platform-Specifics which can be accomplished without changing Xamarin.Essentials
* Avoid clutter posts like "+1" which do not serve to further the conversation
#### Guiding Principles for New Features
Any proposals for new feature work and new APIs should follow the spirit of these principles:
* APIs should be simple, direct, and generally implemented with static classes and methods whenever practical
* Usage of interfaces is to be strictly avoided - APIs should be simple and performant
* Custom UI should be entirely avoided
* UI code is only allowable in cases where the platform provides an implementation (eg: Browser, Email Composer, Phone Dialer, etc)
* New features should have native APIs available to allow implementation on a reasonable subset of the supported platforms, especially (iOS, Android, UWP)
* No new external dependencies should be added to support implementation of new feature work (there can be exceptions but they must be thoroughly considered for the value being added)
#### Proposal States
##### Open
Open proposals are still under discussion. Please leave your concrete, constructive feedback on this proposal. +1s and other clutter posts which do not add to the discussion will be removed.
##### Accepted
Accepted proposals are proposals that both the community and core Xamarin.Essentials agree should be a part of Xamarin.Essentials. These proposals are ready for implementation, but do not yet have a developer actively working on them. These proposals are available for anyone to work on, both community and the core Xamarin.Essentials team.
If you wish to start working on an accepted proposal, please reply to the thread so we can mark you as the implementor and change the title to In Progress. This helps to avoid multiple people working on the same thing. If you decide to work on this proposal publicly, feel free to post a link to the branch as well for folks to follow along.
###### What "Accepted" does mean
* Any community member is welcome to work on the idea.
* The core Xamarin.Essentials team _may_ consider working on this idea on their own, but has not done so until it is marked "In Progress" with a team member assigned as the implementor.
* Any pull request implementing the proposal will be welcomed with an API and code review.
###### What "Accepted" does not mean
* The proposal will ever be implemented, either by a community member or by the core Xamarin.Essentials team.
* The core Xamarin.Essentials team is committing to implementing a proposal, even if nobody else does. Accepted proposals simply mean that the core Xamarin.Essentials team and the community agree that this proposal should be a part of Xamarin.Essentials.
##### In Progress
Once a developer has begun work on a proposal, either from the core Xamarin.Essentials team or a community member, the proposal is marked as in progress with the implementors name and (possibly) a link to a development branch to follow along with progress.
#### Rejected
Rejected proposals will not be implemented or merged into Xamarin.Essentials. Once a proposal is rejected, the thread will be closed and the conversation is considered completed, pending considerable new information or changes.

Просмотреть файл

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
<PropertyGroup>
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)Xamarin.Essentials.ruleset</CodeAnalysisRuleSet>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
<AdditionalFiles Include="$(MSBuildThisFileDirectory)stylecop.json" InProject="false" Visible="false" />
</ItemGroup>
</Project>

Просмотреть файл

@ -1,25 +0,0 @@
Xamarin.Essentials
The MIT License (MIT)
Copyright (c) Microsoft Corporation
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Просмотреть файл

@ -1,17 +0,0 @@
The MIT License (MIT)
Copyright (c) Microsoft Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Просмотреть файл

@ -1,14 +0,0 @@
# Xamarin.Essentials Feedback
We'd love to hear your thoughts on Xamarin.Essentials. Here are a few links to help get you to the right place:
### Setup and Common Questions
* Read through our full [Getting Started with Xamarin.Essetials Guide](https://docs.microsoft.com/xamarin/essentials/get-started)
* [Frequently Asked Questions on our Wiki](https://github.com/xamarin/Essentials/wiki/FAQ-%7C-Essentials)
### Propose a Feature
* Read our [short guide](https://github.com/xamarin/Essentials/wiki/Proposing-New-Features) and then [file an issue](https://github.com/xamarin/Essentials/issues/new)
### Report an Issue
* Browse through [current open and closed issues first](https://github.com/xamarin/Essentials/issues?utf8=%E2%9C%93&q=is%3Aissue)
* [File an issue](https://github.com/xamarin/Essentials/issues/new) if it hasn't been reported

Просмотреть файл

@ -1,79 +0,0 @@
# Xamarin.Essentials
Xamarin.Essentials gives developers essential cross-platform APIs for their mobile applications.
iOS, Android, and UWP offer unique operating system and platform APIs that developers have access to, all in C# leveraging Xamarin. It is great that developers have 100% API access in C# with Xamarin, but these APIs are different per platform. This means developers have to learn three different APIs to access platform-specific features. With Xamarin.Essentials, developers have a single cross-platform API that works with any iOS, Android, or UWP application that can be accessed from shared code no matter how the user interface is created.
## Questions
Get your technical questions answered by experts on [Microsoft Q&A](https://docs.microsoft.com/answers/topics/dotnet-xamarinessentials.html?WT.mc_id=friends-0000-jamont).
## Contribution Discussion
Contributing to Xamarin.Essentials? Join our [Discord server](https://discord.com/invite/Y8828kE) and chat with the team
## Build Status
| Build Server | Type | Platform | Status |
|--------------|--------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| VSTS | Build | Windows | [![Build Status](https://dev.azure.com/devdiv/DevDiv/_apis/build/status/Xamarin/Components/Xamarin.Essentials?branchName=main)](https://dev.azure.com/xamarin/public/_build?definitionId=7&_a=summary) |
| App Center | Sample App | Android | [![Build status](https://build.appcenter.ms/v0.1/apps/7a1f46ca-ba2f-477e-aacc-ff013c7d5f7a/branches/main/badge)](https://appcenter.ms) |
| App Center | Sample App | iOS | [![Build status](https://build.appcenter.ms/v0.1/apps/43b39e9e-2b2b-482f-8afa-e9906334c85e/branches/main/badge)](https://appcenter.ms) |
## Sample App
Try out Xamarin.Essentials on your device!
* [Android Sample App](https://install.appcenter.ms/orgs/microsoft-liveplayer/apps/essentials-android/distribution_groups/public%20testers) via App Center.
## Installation
Xamarin.Essentials is available via NuGet & is included in every template:
* NuGet Official Releases: [![NuGet](https://img.shields.io/nuget/vpre/Xamarin.Essentials.svg?label=NuGet)](https://www.nuget.org/packages/Xamarin.Essentials)
* Nightly / CI Releases: https://aka.ms/xamarin-essentials-ci/index.json
Please read our [Getting Started with Xamarin.Essentials guide](https://docs.microsoft.com/xamarin/essentials/get-started?WT.mc_id=friends-0000-jamont) for full setup instructions.
## Documentation
Browse our [full documentation for Xamarin.Essentials](https://docs.microsoft.com/xamarin/essentials?WT.mc_id=friends-0000-jamont), including feature guides, on how to use each feature.
## Supported Platforms
Platform support & feature support can be found on our [documentation](https://docs.microsoft.com/xamarin/essentials/platform-feature-support?WT.mc_id=friends-0000-jamont)
## Contributing
Please read through our [Contribution Guide](CONTRIBUTING.md). We are not accepting new PRs for full features, however any [issue that is marked as `up for grabs`](https://github.com/xamarin/Essentials/issues?q=is%3Aissue+is%3Aopen+label%3A%22up+for+grabs%22) are open for community contributions. We encourage creating new issues for bugs found during usage that the team will triage. Additionally, we are open for code refactoring suggestions in PRs.
## Building Xamarin.Essentials
Xamarin.Essentials is built with the new SDK-style projects with multi-targeting enabled. This means that all code for iOS, Android, and UWP exist inside of the Xamarin.Essentials project.
## Visual Studio
A minimum version of Visual Studio 2019 16.3 or Visual Studio for Mac 2019 8.3 are required to build and compile Xamarin.Essentials.
### Workloads needed:
* Xamarin
* .NET Core
* UWP
### You will need the following SDKs
* Android 10.0, 9.0, 8.1, 8.0, 7.1, 7.0, & 6.0 SDK Installed
* UWP 10.0.16299 SDK Installed
Your can run the included `android-setup.ps1` script in **Administrator Mode** and it will automatically setup your Android environment.
## FAQ
Here are some frequently asked questions about Xamarin.Essentials, but be sure to read our full [FAQ on our Wiki](https://github.com/xamarin/Essentials/wiki#feature-faq).
## License
Please see the [License](LICENSE).

Просмотреть файл

@ -1,44 +0,0 @@
If you think you've found a bug to report, before doing anything else you should check the [Issues](https://github.com/xamarin/Essentials/issues) page to see if an issue has already been filed! This can help reduce the number of duplicate reports.
If you're ready to submit a new issue, taking the following steps helps expedite the bug triage process:
* Validate that the issue is not resolved with the latest stable, pre-release, or nightly builds.
* If you are able and time allows, create a minimized reproduction project using only the code necessary to reproduce the issue; this helps us as we then know precisely what code is being used.
* Before compressing the reproduction project, make certain to clean the solution as well as manually delete any bin/obj folders, e.g.:
[ProjectRoot]/ProjectName/bin
[ProjectRoot]/ProjectName/obj
[ProjectRoot]/ProjectName.Android/bin
[ProjectRoot]/ProjectName.Android/obj
[ProjectRoot]/ProjectName.iOS/bin
[ProjectRoot]/ProjectName.iOS/obj
[ProjectRoot]/ProjectName.UWP/bin
[ProjectRoot]/ProjectName.UWP/obj
Please make certain to remove the packages folder as well to cut down on size.
* Please make note if the issue only occurs on particular platforms, so we can run reproductions on each and compare.
* In the case of a regression, please confirm as such as well as the last working, pre-regression build you may be aware of, if possible. Providing a reproduction with the working package installed to begin with also helps, as we can then simply upgrade it and compare against the latest stable to confirm.
* In some cases, issues may only occur on specific devices, with specific versions of the OS, or when targeting specific OS versions within the project itself. Some issues also occur on devices, but not on simulators. This information is incredibly helpful.
* Please upload reproductions directly to the report as an attachment; this guarantees future access to the file.
# Android Specific Concerns #
Please let us know any issues which may stem from different versions of the support library packages (e.g. Xamarin.Android.Support.v7.AppCompat), as sometimes bugs may only occur when specific versions are used.
# iOS Specific Concerns #
To be added
# UWP-specific Concerns #
Please make note if an issue appears hardware-specific (slower machines, multiple monitors, etc.), due to the desktop component.
# Contributing #
Think you may have a bug fix, or you'd like to work on fixing one yourself? We greatly welcome PRs with fixes from the community! Check out the [Contribute page](CONTRIBUTING.md) for more info.

Просмотреть файл

@ -1,7 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<FirstParty Include="Xamarin.Essentials.dll" />
</ItemGroup>
</Project>

Просмотреть файл

@ -1,15 +0,0 @@
##Legal Notices
Microsoft and any contributors grant you a license to the Microsoft documentation and other content
in this repository under the [Creative Commons Attribution 4.0 International Public License](https://creativecommons.org/licenses/by/4.0/legalcode),
see the [LICENSE](LICENSE) file, and grant you a license to any code in the repository under the [MIT License](https://opensource.org/licenses/MIT), see the
[LICENSE-CODE](LICENSE-CODE) file.
Microsoft, Windows, Microsoft Azure and/or other Microsoft products and services referenced in the documentation
may be either trademarks or registered trademarks of Microsoft in the United States and/or other countries.
The licenses for this project do not grant you rights to use any Microsoft names, logos, or trademarks.
Microsoft's general trademark guidelines can be found at http://go.microsoft.com/fwlink/?LinkID=254653.
Privacy information can be found at https://privacy.microsoft.com/en-us/
Microsoft and any contributors reserve all others rights, whether under their respective copyrights, patents,
or trademarks, whether by implication, estoppel or otherwise.

Просмотреть файл

@ -1,211 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Rules for Xamarin.Essentials" Description="Code analysis rules for Xamarin.Essentials." ToolsVersion="15.0">
<IncludeAll Action="Warning" />
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
<Rule Id="SA0001" Action="None" />
<Rule Id="SA0002" Action="Warning" />
<Rule Id="SA1000" Action="Warning" />
<Rule Id="SA1001" Action="Warning" />
<Rule Id="SA1002" Action="Warning" />
<Rule Id="SA1003" Action="Warning" />
<Rule Id="SA1004" Action="Warning" />
<Rule Id="SA1005" Action="Warning" />
<Rule Id="SA1006" Action="Warning" />
<Rule Id="SA1007" Action="Warning" />
<Rule Id="SA1008" Action="Warning" />
<Rule Id="SA1009" Action="Warning" />
<Rule Id="SA1010" Action="Warning" />
<Rule Id="SA1011" Action="Warning" />
<Rule Id="SA1012" Action="Warning" />
<Rule Id="SA1013" Action="Warning" />
<Rule Id="SA1014" Action="Warning" />
<Rule Id="SA1015" Action="Warning" />
<Rule Id="SA1016" Action="Warning" />
<Rule Id="SA1017" Action="Warning" />
<Rule Id="SA1018" Action="Warning" />
<Rule Id="SA1019" Action="Warning" />
<Rule Id="SA1020" Action="Warning" />
<Rule Id="SA1021" Action="Warning" />
<Rule Id="SA1022" Action="Warning" />
<Rule Id="SA1023" Action="Warning" />
<Rule Id="SA1024" Action="Warning" />
<Rule Id="SA1025" Action="Warning" />
<Rule Id="SA1026" Action="Warning" />
<Rule Id="SA1027" Action="Warning" />
<Rule Id="SA1028" Action="Warning" />
<Rule Id="SA1100" Action="Warning" />
<Rule Id="SA1101" Action="None" />
<Rule Id="SA1102" Action="Warning" />
<Rule Id="SA1103" Action="Warning" />
<Rule Id="SA1104" Action="Warning" />
<Rule Id="SA1105" Action="Warning" />
<Rule Id="SA1106" Action="Warning" />
<Rule Id="SA1107" Action="Warning" />
<Rule Id="SA1108" Action="Warning" />
<Rule Id="SA1109" Action="Warning" />
<Rule Id="SA1110" Action="Warning" />
<Rule Id="SA1111" Action="Warning" />
<Rule Id="SA1112" Action="Warning" />
<Rule Id="SA1113" Action="Warning" />
<Rule Id="SA1114" Action="Warning" />
<Rule Id="SA1115" Action="Warning" />
<Rule Id="SA1116" Action="Warning" />
<Rule Id="SA1117" Action="Warning" />
<Rule Id="SA1118" Action="Warning" />
<Rule Id="SA1119" Action="Warning" />
<Rule Id="SA1120" Action="Warning" />
<Rule Id="SA1121" Action="Warning" />
<Rule Id="SA1122" Action="Warning" />
<Rule Id="SA1123" Action="Warning" />
<Rule Id="SA1124" Action="Warning" />
<Rule Id="SA1125" Action="Warning" />
<Rule Id="SA1126" Action="Warning" />
<Rule Id="SA1127" Action="Warning" />
<Rule Id="SA1128" Action="Warning" />
<Rule Id="SA1129" Action="Warning" />
<Rule Id="SA1130" Action="Warning" />
<Rule Id="SA1131" Action="Warning" />
<Rule Id="SA1132" Action="Warning" />
<Rule Id="SA1133" Action="Warning" />
<Rule Id="SA1134" Action="Warning" />
<Rule Id="SA1135" Action="Warning" />
<Rule Id="SA1136" Action="Warning" />
<Rule Id="SA1137" Action="Warning" />
<Rule Id="SA1139" Action="Warning" />
<Rule Id="SA1200" Action="Warning" />
<Rule Id="SA1201" Action="None" />
<Rule Id="SA1202" Action="None" />
<Rule Id="SA1203" Action="Warning" />
<Rule Id="SA1204" Action="Warning" />
<Rule Id="SA1205" Action="Warning" />
<Rule Id="SA1206" Action="Warning" />
<Rule Id="SA1207" Action="Warning" />
<Rule Id="SA1208" Action="Warning" />
<Rule Id="SA1209" Action="Warning" />
<Rule Id="SA1210" Action="Warning" />
<Rule Id="SA1211" Action="Warning" />
<Rule Id="SA1212" Action="Warning" />
<Rule Id="SA1213" Action="Warning" />
<Rule Id="SA1214" Action="Warning" />
<Rule Id="SA1215" Action="Warning" />
<Rule Id="SA1216" Action="Warning" />
<Rule Id="SA1217" Action="Warning" />
<Rule Id="SA1300" Action="Warning" />
<Rule Id="SA1301" Action="Warning" />
<Rule Id="SA1302" Action="Warning" />
<Rule Id="SA1303" Action="None" />
<Rule Id="SA1304" Action="Warning" />
<Rule Id="SA1305" Action="None" />
<Rule Id="SA1306" Action="Warning" />
<Rule Id="SA1307" Action="Warning" />
<Rule Id="SA1308" Action="Warning" />
<Rule Id="SA1309" Action="Warning" />
<Rule Id="SA1310" Action="Warning" />
<Rule Id="SA1311" Action="None" />
<Rule Id="SA1312" Action="Warning" />
<Rule Id="SA1313" Action="Warning" />
<Rule Id="SA1314" Action="Warning" />
<Rule Id="SA1400" Action="None" />
<Rule Id="SA1401" Action="Warning" />
<Rule Id="SA1402" Action="None" />
<Rule Id="SA1403" Action="Warning" />
<Rule Id="SA1404" Action="Warning" />
<Rule Id="SA1405" Action="Warning" />
<Rule Id="SA1406" Action="Warning" />
<Rule Id="SA1407" Action="Warning" />
<Rule Id="SA1408" Action="Warning" />
<Rule Id="SA1409" Action="Warning" />
<Rule Id="SA1410" Action="Warning" />
<Rule Id="SA1411" Action="Warning" />
<Rule Id="SA1412" Action="Warning" />
<Rule Id="SA1413" Action="None" />
<Rule Id="SA1500" Action="Warning" />
<Rule Id="SA1501" Action="Warning" />
<Rule Id="SA1502" Action="Warning" />
<Rule Id="SA1503" Action="None" />
<Rule Id="SA1504" Action="Warning" />
<Rule Id="SA1505" Action="Warning" />
<Rule Id="SA1506" Action="Warning" />
<Rule Id="SA1507" Action="Warning" />
<Rule Id="SA1508" Action="Warning" />
<Rule Id="SA1509" Action="Warning" />
<Rule Id="SA1510" Action="Warning" />
<Rule Id="SA1511" Action="Warning" />
<Rule Id="SA1512" Action="None" />
<Rule Id="SA1513" Action="None" />
<Rule Id="SA1514" Action="Warning" />
<Rule Id="SA1515" Action="Warning" />
<Rule Id="SA1516" Action="Warning" />
<Rule Id="SA1517" Action="Warning" />
<Rule Id="SA1518" Action="Warning" />
<Rule Id="SA1519" Action="Warning" />
<Rule Id="SA1520" Action="Warning" />
<Rule Id="SA1600" Action="None" />
<Rule Id="SA1601" Action="None" />
<Rule Id="SA1602" Action="None" />
<Rule Id="SA1603" Action="None" />
<Rule Id="SA1604" Action="None" />
<Rule Id="SA1605" Action="None" />
<Rule Id="SA1606" Action="None" />
<Rule Id="SA1607" Action="None" />
<Rule Id="SA1608" Action="None" />
<Rule Id="SA1609" Action="None" />
<Rule Id="SA1610" Action="None" />
<Rule Id="SA1611" Action="None" />
<Rule Id="SA1612" Action="None" />
<Rule Id="SA1613" Action="None" />
<Rule Id="SA1614" Action="None" />
<Rule Id="SA1615" Action="None" />
<Rule Id="SA1616" Action="None" />
<Rule Id="SA1617" Action="None" />
<Rule Id="SA1618" Action="None" />
<Rule Id="SA1619" Action="None" />
<Rule Id="SA1620" Action="None" />
<Rule Id="SA1621" Action="None" />
<Rule Id="SA1622" Action="None" />
<Rule Id="SA1623" Action="None" />
<Rule Id="SA1624" Action="None" />
<Rule Id="SA1625" Action="None" />
<Rule Id="SA1626" Action="Warning" />
<Rule Id="SA1627" Action="None" />
<Rule Id="SA1628" Action="None" />
<Rule Id="SA1629" Action="None" />
<Rule Id="SA1630" Action="None" />
<Rule Id="SA1631" Action="None" />
<Rule Id="SA1632" Action="None" />
<Rule Id="SA1633" Action="None" />
<Rule Id="SA1634" Action="None" />
<Rule Id="SA1635" Action="None" />
<Rule Id="SA1636" Action="None" />
<Rule Id="SA1637" Action="None" />
<Rule Id="SA1638" Action="None" />
<Rule Id="SA1639" Action="None" />
<Rule Id="SA1640" Action="None" />
<Rule Id="SA1641" Action="None" />
<Rule Id="SA1642" Action="None" />
<Rule Id="SA1643" Action="None" />
<Rule Id="SA1644" Action="None" />
<Rule Id="SA1645" Action="None" />
<Rule Id="SA1646" Action="None" />
<Rule Id="SA1647" Action="None" />
<Rule Id="SA1648" Action="None" />
<Rule Id="SA1649" Action="None" />
<Rule Id="SA1650" Action="None" />
<Rule Id="SA1651" Action="None" />
<Rule Id="SA1652" Action="None" />
<Rule Id="SX1101" Action="Warning" />
<Rule Id="SX1309" Action="None" />
<Rule Id="SX1309S" Action="None" />
<Rule Id="xUnit1026" Action="None" />
<!--
=================================================================================================================
Rules that are configured in the stylecop.json file
https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/Configuration.md
=================================================================================================================
SA1200: Using directives must be placed correctly.
settings.orderingRules.systemUsingDirectivesFirst
settings.orderingRules.usingDirectivesPlacement
=================================================================================================================
-->
</Rules>
</RuleSet>

Просмотреть файл

@ -1,519 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29505.209
MinimumVisualStudioVersion = 15.0.26124.0
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xamarin.Essentials", "Xamarin.Essentials\Xamarin.Essentials.csproj", "{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "Samples\Samples\Samples.csproj", "{B4227123-2EEB-494A-A221-C061B5659AED}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Android", "Samples\Samples.Android\Samples.Android.csproj", "{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.iOS", "Samples\Samples.iOS\Samples.iOS.csproj", "{AB6242B7-634F-4839-A991-7629D0D2C636}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.Tizen", "Samples\Samples.Tizen\Samples.Tizen.csproj", "{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.UWP", "Samples\Samples.UWP\Samples.UWP.csproj", "{5A1D97F2-6703-4278-BBF2-12C065F7E94A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Tests\Tests.csproj", "{2CE6F352-F61F-452F-9098-7800B3B06EEF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DeviceTests.Shared", "DeviceTests\DeviceTests.Shared\DeviceTests.Shared.csproj", "{D30EA5AD-6C9B-4517-9767-41C2E62946DB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTests.Android", "DeviceTests\DeviceTests.Android\DeviceTests.Android.csproj", "{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTests.iOS", "DeviceTests\DeviceTests.iOS\DeviceTests.iOS.csproj", "{EE8FC716-27FC-405B-BD27-AF17E01A6671}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceTests.UWP", "DeviceTests\DeviceTests.UWP\DeviceTests.UWP.csproj", "{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{6330A0D0-E784-42A6-B975-451E609B907B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{EE4495FA-9869-45CF-A11D-69F2218C6F62}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.Server.WebAuthenticator", "Samples\Sample.Server.WebAuthenticator\Sample.Server.WebAuthenticator.csproj", "{553D51A8-8E79-40D9-9FB3-9FC2386FF886}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples.Mac", "Samples\Samples.Mac\Samples.Mac.csproj", "{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|iPhone = Debug|iPhone
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|ARM.ActiveCfg = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|ARM.Build.0 = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|ARM64.Build.0 = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|iPhone.Build.0 = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|x64.ActiveCfg = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|x64.Build.0 = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|x86.ActiveCfg = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Debug|x86.Build.0 = Debug|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|Any CPU.Build.0 = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|ARM.ActiveCfg = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|ARM.Build.0 = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|ARM64.ActiveCfg = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|ARM64.Build.0 = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|iPhone.ActiveCfg = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|iPhone.Build.0 = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|x64.ActiveCfg = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|x64.Build.0 = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|x86.ActiveCfg = Release|Any CPU
{CD6D6AE6-83A1-41B1-BD7C-C555A77C288B}.Release|x86.Build.0 = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|ARM.Build.0 = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|ARM64.Build.0 = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|iPhone.Build.0 = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|x64.ActiveCfg = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|x64.Build.0 = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|x86.ActiveCfg = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Debug|x86.Build.0 = Debug|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|Any CPU.Build.0 = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|ARM.ActiveCfg = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|ARM.Build.0 = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|ARM64.ActiveCfg = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|ARM64.Build.0 = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|iPhone.ActiveCfg = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|iPhone.Build.0 = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|x64.ActiveCfg = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|x64.Build.0 = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|x86.ActiveCfg = Release|Any CPU
{B4227123-2EEB-494A-A221-C061B5659AED}.Release|x86.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|ARM.ActiveCfg = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|ARM.Build.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|ARM.Deploy.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|ARM64.Build.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|ARM64.Deploy.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|iPhone.Build.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|x64.Build.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|x64.Deploy.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|x86.Build.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Debug|x86.Deploy.0 = Debug|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|Any CPU.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|Any CPU.Deploy.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|ARM.ActiveCfg = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|ARM.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|ARM.Deploy.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|ARM64.ActiveCfg = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|ARM64.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|ARM64.Deploy.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|iPhone.ActiveCfg = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|iPhone.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|iPhone.Deploy.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|x64.ActiveCfg = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|x64.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|x64.Deploy.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|x86.ActiveCfg = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|x86.Build.0 = Release|Any CPU
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C}.Release|x86.Deploy.0 = Release|Any CPU
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|Any CPU.Deploy.0 = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|ARM.ActiveCfg = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|ARM.Build.0 = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|ARM.Deploy.0 = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|ARM64.ActiveCfg = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|ARM64.Build.0 = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|ARM64.Deploy.0 = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|iPhone.ActiveCfg = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|iPhone.Build.0 = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|iPhone.Deploy.0 = Debug|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|x64.ActiveCfg = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|x64.Build.0 = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|x64.Deploy.0 = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|x86.ActiveCfg = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|x86.Build.0 = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Debug|x86.Deploy.0 = Debug|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|Any CPU.Deploy.0 = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|ARM.ActiveCfg = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|ARM.Build.0 = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|ARM.Deploy.0 = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|ARM64.ActiveCfg = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|ARM64.Build.0 = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|ARM64.Deploy.0 = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|iPhone.ActiveCfg = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|iPhone.Build.0 = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|iPhone.Deploy.0 = Release|iPhone
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|x64.ActiveCfg = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|x64.Build.0 = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|x64.Deploy.0 = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|x86.ActiveCfg = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|x86.Build.0 = Release|iPhoneSimulator
{AB6242B7-634F-4839-A991-7629D0D2C636}.Release|x86.Deploy.0 = Release|iPhoneSimulator
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|Any CPU.Build.0 = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|ARM.ActiveCfg = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|ARM.Build.0 = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|ARM64.Build.0 = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|iPhone.Build.0 = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|x64.ActiveCfg = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|x64.Build.0 = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|x86.ActiveCfg = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Debug|x86.Build.0 = Debug|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|Any CPU.ActiveCfg = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|Any CPU.Build.0 = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|ARM.ActiveCfg = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|ARM.Build.0 = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|ARM64.ActiveCfg = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|ARM64.Build.0 = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|iPhone.ActiveCfg = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|iPhone.Build.0 = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|x64.ActiveCfg = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|x64.Build.0 = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|x86.ActiveCfg = Release|Any CPU
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65}.Release|x86.Build.0 = Release|Any CPU
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|Any CPU.ActiveCfg = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|Any CPU.Build.0 = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|Any CPU.Deploy.0 = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|ARM.ActiveCfg = Debug|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|ARM.Build.0 = Debug|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|ARM.Deploy.0 = Debug|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|ARM64.ActiveCfg = Debug|ARM64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|ARM64.Build.0 = Debug|ARM64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|ARM64.Deploy.0 = Debug|ARM64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|iPhone.ActiveCfg = Debug|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|iPhone.Build.0 = Debug|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|iPhone.Deploy.0 = Debug|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|iPhoneSimulator.Build.0 = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|iPhoneSimulator.Deploy.0 = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|x64.ActiveCfg = Debug|x64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|x64.Build.0 = Debug|x64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|x64.Deploy.0 = Debug|x64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|x86.ActiveCfg = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|x86.Build.0 = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Debug|x86.Deploy.0 = Debug|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|Any CPU.ActiveCfg = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|Any CPU.Build.0 = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|Any CPU.Deploy.0 = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|ARM.ActiveCfg = Release|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|ARM.Build.0 = Release|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|ARM.Deploy.0 = Release|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|ARM64.ActiveCfg = Release|ARM64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|ARM64.Build.0 = Release|ARM64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|ARM64.Deploy.0 = Release|ARM64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|iPhone.ActiveCfg = Release|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|iPhone.Build.0 = Release|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|iPhone.Deploy.0 = Release|ARM
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|iPhoneSimulator.ActiveCfg = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|iPhoneSimulator.Build.0 = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|iPhoneSimulator.Deploy.0 = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|x64.ActiveCfg = Release|x64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|x64.Build.0 = Release|x64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|x64.Deploy.0 = Release|x64
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|x86.ActiveCfg = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|x86.Build.0 = Release|x86
{5A1D97F2-6703-4278-BBF2-12C065F7E94A}.Release|x86.Deploy.0 = Release|x86
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|ARM.ActiveCfg = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|ARM.Build.0 = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|ARM64.Build.0 = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|iPhone.Build.0 = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|x64.ActiveCfg = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|x64.Build.0 = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|x86.ActiveCfg = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Debug|x86.Build.0 = Debug|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|Any CPU.Build.0 = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|ARM.ActiveCfg = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|ARM.Build.0 = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|ARM64.ActiveCfg = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|ARM64.Build.0 = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|iPhone.ActiveCfg = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|iPhone.Build.0 = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|x64.ActiveCfg = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|x64.Build.0 = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|x86.ActiveCfg = Release|Any CPU
{2CE6F352-F61F-452F-9098-7800B3B06EEF}.Release|x86.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|ARM.ActiveCfg = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|ARM.Build.0 = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|ARM64.Build.0 = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|iPhone.Build.0 = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|x64.ActiveCfg = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|x64.Build.0 = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|x86.ActiveCfg = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Debug|x86.Build.0 = Debug|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|Any CPU.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|ARM.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|ARM.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|ARM64.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|ARM64.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|iPhone.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|iPhone.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|x64.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|x64.Build.0 = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|x86.ActiveCfg = Release|Any CPU
{D30EA5AD-6C9B-4517-9767-41C2E62946DB}.Release|x86.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM.ActiveCfg = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM.Build.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM.Deploy.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM64.Build.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|ARM64.Deploy.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhone.Build.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhone.Deploy.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x64.ActiveCfg = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x64.Build.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x64.Deploy.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x86.ActiveCfg = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x86.Build.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Debug|x86.Deploy.0 = Debug|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|Any CPU.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|Any CPU.Deploy.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM.ActiveCfg = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM.Deploy.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM64.ActiveCfg = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM64.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|ARM64.Deploy.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhone.ActiveCfg = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhone.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhone.Deploy.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x64.ActiveCfg = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x64.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x64.Deploy.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x86.ActiveCfg = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x86.Build.0 = Release|Any CPU
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1}.Release|x86.Deploy.0 = Release|Any CPU
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|Any CPU.Deploy.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|ARM.ActiveCfg = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|ARM.Build.0 = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|ARM.Deploy.0 = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|ARM64.ActiveCfg = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|ARM64.Build.0 = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|ARM64.Deploy.0 = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|iPhone.ActiveCfg = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|iPhone.Build.0 = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|iPhone.Deploy.0 = Debug|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|x64.ActiveCfg = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|x64.Build.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|x64.Deploy.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|x86.ActiveCfg = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|x86.Build.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Debug|x86.Deploy.0 = Debug|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|Any CPU.Deploy.0 = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|ARM.ActiveCfg = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|ARM.Build.0 = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|ARM.Deploy.0 = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|ARM64.ActiveCfg = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|ARM64.Build.0 = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|ARM64.Deploy.0 = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|iPhone.ActiveCfg = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|iPhone.Build.0 = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|iPhone.Deploy.0 = Release|iPhone
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x64.ActiveCfg = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x64.Build.0 = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x64.Deploy.0 = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x86.ActiveCfg = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x86.Build.0 = Release|iPhoneSimulator
{EE8FC716-27FC-405B-BD27-AF17E01A6671}.Release|x86.Deploy.0 = Release|iPhoneSimulator
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|Any CPU.ActiveCfg = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|Any CPU.Build.0 = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|Any CPU.Deploy.0 = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM.ActiveCfg = Debug|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM.Build.0 = Debug|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM.Deploy.0 = Debug|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM64.ActiveCfg = Debug|ARM64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM64.Build.0 = Debug|ARM64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|ARM64.Deploy.0 = Debug|ARM64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhone.ActiveCfg = Debug|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhone.Build.0 = Debug|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhone.Deploy.0 = Debug|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhoneSimulator.Build.0 = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|iPhoneSimulator.Deploy.0 = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x64.ActiveCfg = Debug|x64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x64.Build.0 = Debug|x64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x64.Deploy.0 = Debug|x64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x86.ActiveCfg = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x86.Build.0 = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Debug|x86.Deploy.0 = Debug|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|Any CPU.ActiveCfg = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|Any CPU.Build.0 = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|Any CPU.Deploy.0 = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM.ActiveCfg = Release|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM.Build.0 = Release|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM.Deploy.0 = Release|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM64.ActiveCfg = Release|ARM64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM64.Build.0 = Release|ARM64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|ARM64.Deploy.0 = Release|ARM64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhone.ActiveCfg = Release|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhone.Build.0 = Release|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhone.Deploy.0 = Release|ARM
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhoneSimulator.ActiveCfg = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhoneSimulator.Build.0 = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|iPhoneSimulator.Deploy.0 = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x64.ActiveCfg = Release|x64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x64.Build.0 = Release|x64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x64.Deploy.0 = Release|x64
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x86.ActiveCfg = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x86.Build.0 = Release|x86
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B}.Release|x86.Deploy.0 = Release|x86
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|Any CPU.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|ARM.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|ARM.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|ARM64.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|iPhone.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|x64.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|x64.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|x86.ActiveCfg = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Debug|x86.Build.0 = Debug|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|Any CPU.ActiveCfg = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|Any CPU.Build.0 = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|ARM.ActiveCfg = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|ARM.Build.0 = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|ARM64.ActiveCfg = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|ARM64.Build.0 = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|iPhone.ActiveCfg = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|iPhone.Build.0 = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|x64.ActiveCfg = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|x64.Build.0 = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|x86.ActiveCfg = Release|Any CPU
{553D51A8-8E79-40D9-9FB3-9FC2386FF886}.Release|x86.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|ARM.ActiveCfg = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|ARM.Build.0 = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|ARM64.Build.0 = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|iPhone.Build.0 = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|x64.ActiveCfg = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|x64.Build.0 = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|x86.ActiveCfg = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Debug|x86.Build.0 = Debug|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|Any CPU.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|ARM.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|ARM.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|ARM64.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|ARM64.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|iPhone.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|iPhone.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|x64.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|x64.Build.0 = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|x86.ActiveCfg = Release|Any CPU
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{B4227123-2EEB-494A-A221-C061B5659AED} = {6330A0D0-E784-42A6-B975-451E609B907B}
{3C0CDEF3-495E-45F4-8B12-0E05EF11295C} = {6330A0D0-E784-42A6-B975-451E609B907B}
{AB6242B7-634F-4839-A991-7629D0D2C636} = {6330A0D0-E784-42A6-B975-451E609B907B}
{70574463-7D8F-47F2-9DF0-8D3EA97DFB65} = {6330A0D0-E784-42A6-B975-451E609B907B}
{5A1D97F2-6703-4278-BBF2-12C065F7E94A} = {6330A0D0-E784-42A6-B975-451E609B907B}
{2CE6F352-F61F-452F-9098-7800B3B06EEF} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{D30EA5AD-6C9B-4517-9767-41C2E62946DB} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{CB2072E0-A437-4811-AE17-16CAE0DDA1B1} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{EE8FC716-27FC-405B-BD27-AF17E01A6671} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{4BD0D88F-7E7A-4C3B-9E34-BF3717A8FF4B} = {EE4495FA-9869-45CF-A11D-69F2218C6F62}
{553D51A8-8E79-40D9-9FB3-9FC2386FF886} = {6330A0D0-E784-42A6-B975-451E609B907B}
{89899D16-4BD1-49B1-9903-9F6BB26C5DC5} = {6330A0D0-E784-42A6-B975-451E609B907B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E012047E-6826-4037-8D1A-5606CD7D345D}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -1,53 +0,0 @@
$androidSdkHome = $ENV:ANDROID_HOME
if ([string]::IsNullOrWhiteSpace($androidSdkHome))
{
if ($ENV:OS -eq "Windows_NT")
{
$androidSdkHome = "C:\Program Files (x86)\Android\android-sdk\"
}
else
{
$androidSdkHome = Resolve-Path "~/Library/Developer/Xamarin/android-sdk-macosx"
}
Write-Host "Couldn't locate ANDROID_HOME, using: $androidSdkHome"
}
Write-Host "Using Android SDK Home: $androidSdkHome"
Write-Host "Installing Global dotnet android tool..."
dotnet tool install --global --add-source https://www.myget.org/F/xam-dotnet-tools/api/v3/index.json AndroidSdk.Tool
Write-Host "Installing and/or Updating Android SDK..."
Write-Host "This may take awhile..."
android --home="$androidSdkHome" sdk download
Write-Host "Installing API 23..."
android --home="$androidSdkHome" sdk --install="platforms;android-23"
Write-Host "Installing API 24..."
android --home="$androidSdkHome" sdk --install="platforms;android-24"
Write-Host "Installing API 25..."
android --home="$androidSdkHome" sdk --install="platforms;android-25"
Write-Host "Installing API 26..."
android --home="$androidSdkHome" sdk --install="platforms;android-26"
Write-Host "Installing API 27..."
android --home="$androidSdkHome" sdk --install="platforms;android-27"
Write-Host "Installing API 28..."
android --home="$androidSdkHome" sdk --install="platforms;android-28"
Write-Host "Installing API 29..."
android --home="$androidSdkHome" sdk --install="platforms;android-29"
Write-Host "Installing API 29 Emulator Image (x86_64 - google_apis)..."
android --home="$androidSdkHome" sdk --install="system-images;android-29;google_apis;x86_64"
Write-Host "Creating XamarinEmulator virtual device..."
android --home="$androidSdkHome" emulator create XamarinEmulator "system-images;android-29;google_apis;x86_64" --device=Pixel --force
Write-Host "Done!"

Просмотреть файл

@ -1,10 +0,0 @@
#!/usr/bin/env bash
echo "Variables:"
# Updating manifest
sed -i '' "s/AC_IOS/$AC_IOS/g" $BUILD_REPOSITORY_LOCALPATH/Samples/Samples/Helpers/CommonConstants
sed -i '' "s/APP-SECRET/$APP_SECRET/g" $BUILD_REPOSITORY_LOCALPATH/Samples/Samples.iOS/Info.plist
echo "Manifest updated!"

Просмотреть файл

@ -1,215 +0,0 @@
trigger:
- main
- develop
- refs/tags/*
pr:
- main
- develop
variables:
BASE_VERSION: 1.6.0
PREVIEW_LABEL: 'ci'
BUILD_NUMBER: $[counter(format('{0}_{1}_{2}', variables['BASE_VERSION'], variables['PREVIEW_LABEL'], variables['Build.SourceBranch']), 1)]
NUGET_VERSION: $[format('{0}-{1}.{2}', variables['BASE_VERSION'], variables['PREVIEW_LABEL'], variables['BUILD_NUMBER'])]
GIT_SHA: $(Build.SourceVersion)
GIT_BRANCH_NAME: $(Build.SourceBranchName)
AREA_PATH: 'DevDiv\Xamarin SDK\Build and Tools'
resources:
repositories:
- repository: internal-templates
type: github
name: xamarin/yaml-templates
endpoint: xamarin
- repository: components
type: github
name: xamarin/XamarinComponents
endpoint: xamarin
stages:
- stage: build
displayName: Build Library
jobs:
- template: .ci/build.yml@components
parameters:
areaPath: 'DevDiv\Xamarin SDK'
masterBranchName: 'main'
preBuildSteps:
- pwsh: |
$pr = "pr." + $env:SYSTEM_PULLREQUEST_PULLREQUESTNUMBER
$nuget = $env:BASE_VERSION + "-" + $pr + "." + $env:BUILD_NUMBER
Write-Host "Preview label: $pr"
Write-Host "NuGet version: $nuget"
Write-Host "##vso[task.setvariable variable=PREVIEW_LABEL]$pr"
Write-Host "##vso[task.setvariable variable=NUGET_VERSION]$nuget"
displayName: Use a special preview label for PRs
condition: eq(variables['Build.Reason'], 'PullRequest')
- pwsh: |
$tagVersion = $env:BUILD_SOURCEBRANCHNAME
Write-Host "Tag version: $tagVersion"
Write-Host "##vso[task.setvariable variable=NUGET_VERSION]$tagVersion"
displayName: Override version for tags
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/')
- pwsh: |
Write-Host "##vso[build.updatebuildnumber]$env:NUGET_VERSION"
displayName: Update the build number with a more readable one
- ${{ if eq(variables['System.TeamProject'], 'devdiv') }}:
- stage: signing
displayName: Sign Artifacts
dependsOn: [ 'build' ]
jobs:
- template: sign-artifacts/jobs/v2.yml@internal-templates
parameters:
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/')
- stage: devicetests
displayName: Device Tests
dependsOn: []
jobs:
- job: devicetests_uwp
displayName: UWP
# skip for now
condition: false
pool:
vmImage: windows-2019
steps:
- script: 'certutil -importpfx $(Build.SourcesDirectory)\DeviceTests\DeviceTests.UWP\DeviceTests.UWP_TemporaryKey.pfx'
displayName: 'Run certutil'
- powershell: |
cd DeviceTests
.\build.ps1 --target=test-uwp-emu --settings_skipverification=true --verbosity=diagnostic
displayName: 'Run Device Tests - UWP'
- task: PublishTestResults@2
displayName: 'Publish Test Results'
inputs:
testResultsFormat: XUnit
testResultsFiles: '**/xunit-*.xml'
testRunTitle: 'Device Tests - UWP'
- template: .ci/build.yml@components
parameters:
name: devicetests_ios
runChecks: false
displayName: iOS
publishOutputSuffix: '-ios'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-ios-emu
cakeExtraArgs: --ios-device="`"iPhone 11`"" --ios-runtime="`"com.apple.CoreSimulator.SimRuntime.iOS-14-2`""
- template: .ci/build.yml@components
parameters:
name: devicetests_android_api_21
runChecks: false
displayName: Android API 21
publishOutputSuffix: '-android21'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-android-emu
cakeExtraArgs: --avd-target="`"system-images;android-21;google_apis;x86`""
preBuildSteps:
- bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-21;google_apis;x86\""
displayName: Install the Android emulators
- template: .ci/build.yml@components
parameters:
name: devicetests_android_api_22
runChecks: false
displayName: Android API 22
publishOutputSuffix: '-android22'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-android-emu
cakeExtraArgs: --avd-target="`"system-images;android-22;google_apis;x86`""
preBuildSteps:
- bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-22;google_apis;x86\""
displayName: Install the Android emulators
- template: .ci/build.yml@components
parameters:
name: devicetests_android_api_23
runChecks: false
continueOnError: true
displayName: Android API 23
publishOutputSuffix: '-android23'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-android-emu
cakeExtraArgs: --avd-target="`"system-images;android-23;google_apis;x86`""
preBuildSteps:
- bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-23;google_apis;x86\""
displayName: Install the Android emulators
- template: .ci/build.yml@components
parameters:
name: devicetests_android_api_24
runChecks: false
displayName: Android API 24
publishOutputSuffix: '-android24'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-android-emu
cakeExtraArgs: --avd-target="`"system-images;android-24;google_apis;x86`""
preBuildSteps:
- bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-24;google_apis;x86\""
displayName: Install the Android emulators
- template: .ci/build.yml@components
parameters:
name: devicetests_android_api_26
runChecks: false
displayName: Android API 26
publishOutputSuffix: '-android26'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-android-emu
cakeExtraArgs: --avd-target="`"system-images;android-26;google_apis;x86`""
preBuildSteps:
- bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-26;google_apis;x86\""
displayName: Install the Android emulators
- template: .ci/build.yml@components
parameters:
name: devicetests_android_api_29
runChecks: false
displayName: Android API 29
publishOutputSuffix: '-android29'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-android-emu
cakeExtraArgs: --avd-target="`"system-images;android-29;google_apis;x86`""
preBuildSteps:
- bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-29;google_apis;x86\""
displayName: Install the Android emulators
- template: .ci/build.yml@components
parameters:
name: devicetests_android_api_30
runChecks: false
displayName: Android API 30
publishOutputSuffix: '-android30'
windowsImage: ''
areaPath: $(AREA_PATH)
verbosity: diagnostic
cakeFile: DeviceTests/build.cake
cakeTarget: test-android-emu
cakeExtraArgs: --avd-target="`"system-images;android-30;google_apis;x86`""
preBuildSteps:
- bash: sh -c "echo \"y\" | $ANDROID_HOME/tools/bin/sdkmanager \"system-images;android-30;google_apis;x86\""
displayName: Install the Android emulators

Просмотреть файл

@ -1,91 +0,0 @@
var TARGET = Argument("t", Argument("target", "ci"));
var NUGET_VERSION = EnvironmentVariable("NUGET_VERSION") ?? "1.0.0";
var GIT_SHA = Argument("gitSha", EnvironmentVariable("GIT_SHA") ?? "");
var GIT_BRANCH_NAME = Argument("gitBranch", EnvironmentVariable("GIT_BRANCH_NAME") ?? "");
Task("prepare")
.Does(() =>
{
// Update .csproj nuget versions
XmlPoke("./Xamarin.Essentials/Xamarin.Essentials.csproj", "/Project/PropertyGroup/PackageVersion", NUGET_VERSION);
});
Task("libs")
.IsDependentOn("prepare")
.Does(() =>
{
MSBuild("./Xamarin.Essentials/Xamarin.Essentials.csproj", new MSBuildSettings()
.EnableBinaryLogger("./output/binlogs/libs.binlog")
.SetConfiguration("Release")
.WithRestore());
});
Task("nugets")
.IsDependentOn("prepare")
.IsDependentOn("libs")
.IsDependentOn("docs")
.Does(() =>
{
MSBuild("./Xamarin.Essentials/Xamarin.Essentials.csproj", new MSBuildSettings()
.EnableBinaryLogger("./output/binlogs/nugets.binlog")
.SetConfiguration("Release")
.WithRestore()
.WithProperty("PackageOutputPath", MakeAbsolute(new FilePath("./output/")).FullPath)
.WithTarget("Pack"));
});
Task("tests")
.IsDependentOn("libs")
.Does(() =>
{
var failed = 0;
foreach (var csproj in GetFiles("./Tests/**/*.csproj")) {
try {
DotNetCoreTest(csproj.FullPath, new DotNetCoreTestSettings {
Configuration = "Release",
Logger = $"trx;LogFileName={csproj.GetFilenameWithoutExtension()}.trx",
});
} catch (Exception) {
failed++;
}
}
var output = $"./output/test-results/";
EnsureDirectoryExists(output);
CopyFiles($"./tests/**/TestResults/*.trx", output);
if (failed > 0)
throw new Exception($"{failed} tests have failed.");
});
Task("samples")
.IsDependentOn("nugets")
.Does(() =>
{
MSBuild("./Xamarin.Essentials.sln", new MSBuildSettings()
.EnableBinaryLogger("./output/binlogs/samples.binlog")
.SetConfiguration("Release")
.WithRestore());
});
Task("docs")
.IsDependentOn("libs")
.WithCriteria(IsRunningOnWindows())
.Does(() =>
{
MSBuild("./Xamarin.Essentials/Xamarin.Essentials.csproj", new MSBuildSettings()
.EnableBinaryLogger("./output/binlogs/docs.binlog")
.SetConfiguration("Release")
.WithRestore()
.WithTarget("mdocupdatedocs"));
});
Task("ci")
.IsDependentOn("libs")
.IsDependentOn("nugets")
.IsDependentOn("tests")
.IsDependentOn("samples");
RunTarget(TARGET);

Просмотреть файл

@ -1,283 +0,0 @@
#addin nuget:?package=Cake.AppleSimulator&version=0.2.0
#addin nuget:?package=Cake.Android.Adb&version=3.2.0
#addin nuget:?package=Cake.Android.AvdManager&version=2.2.0
#addin nuget:?package=Cake.FileHelpers&version=3.3.0
var TARGET = Argument("target", "Default");
var IOS_SIM_NAME = Argument("ios-device", EnvironmentVariable("IOS_SIM_NAME") ?? "iPhone 11");
var IOS_SIM_RUNTIME = Argument("ios-runtime", EnvironmentVariable("IOS_SIM_RUNTIME") ?? "com.apple.CoreSimulator.SimRuntime.iOS-14-2");
var IOS_PROJ = "./DeviceTests.iOS/DeviceTests.iOS.csproj";
var IOS_BUNDLE_ID = "com.xamarin.essentials.devicetests";
var IOS_IPA_PATH = "./DeviceTests.iOS/bin/iPhoneSimulator/Release/XamarinEssentialsDeviceTestsiOS.app";
var IOS_TEST_RESULTS_PATH = MakeAbsolute((FilePath)"../output/test-results/ios");
var ANDROID_PROJ = "./DeviceTests.Android/DeviceTests.Android.csproj";
var ANDROID_APK_PATH = MakeAbsolute((FilePath)"./DeviceTests.Android/bin/Debug/com.xamarin.essentials.devicetests-Signed.apk");
var ANDROID_INSTRUMENTATION_NAME = "com.xamarin.essentials.devicetests.TestInstrumentation";
var ANDROID_TEST_RESULTS_PATH = MakeAbsolute((FilePath)"../output/test-results/android");
var ANDROID_AVD = EnvironmentVariable("ANDROID_AVD") ?? "CABOODLE";
var ANDROID_PKG_NAME = "com.xamarin.essentials.devicetests";
var ANDROID_EMU_TARGET = Argument("avd-target", EnvironmentVariable("ANDROID_EMU_TARGET") ?? "system-images;android-30;google_apis_playstore;x86");
var ANDROID_EMU_DEVICE = Argument("avd-device", EnvironmentVariable("ANDROID_EMU_DEVICE") ?? "Nexus 5X");
var UWP_PROJ = "./DeviceTests.UWP/DeviceTests.UWP.csproj";
var UWP_TEST_RESULTS_PATH = MakeAbsolute((FilePath)"../output/test-results/uwp/TestResults.xml");
var UWP_PACKAGE_ID = "ec0cc741-fd3e-485c-81be-68815c480690";
var TCP_LISTEN_TIMEOUT = 240;
var TCP_LISTEN_PORT = 63559;
var TCP_LISTEN_HOST = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName())
.AddressList.First(f => f.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
.ToString();
var OUTPUT_PATH = MakeAbsolute((DirectoryPath)"../output/");
var ANDROID_HOME = EnvironmentVariable("ANDROID_HOME");
System.Environment.SetEnvironmentVariable("PATH",
$"{ANDROID_HOME}/tools/bin" + System.IO.Path.PathSeparator +
$"{ANDROID_HOME}/platform-tools" + System.IO.Path.PathSeparator +
$"{ANDROID_HOME}/emulator" + System.IO.Path.PathSeparator +
EnvironmentVariable("PATH"));
// utils
Task DownloadTcpTextAsync(int port, FilePath filename, Action waitAction = null)
{
filename = MakeAbsolute(filename);
EnsureDirectoryExists(filename.GetDirectory());
return System.Threading.Tasks.Task.Run(() => {
var tcpListener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, port);
tcpListener.Start();
var listening = true;
System.Threading.Tasks.Task.Run(() => {
// Sleep until timeout elapses or tcp listener stopped after a successful connection
var elapsed = 0;
while(elapsed <= TCP_LISTEN_TIMEOUT && listening) {
System.Threading.Thread.Sleep(1000);
elapsed++;
Information($"Still waiting for tests... {elapsed}/{TCP_LISTEN_TIMEOUT}");
waitAction?.Invoke();
}
// If still listening, timeout elapsed, stop the listener
if (listening) {
tcpListener.Stop();
listening = false;
}
});
try {
var tcpClient = tcpListener.AcceptTcpClient();
using (var file = System.IO.File.Open(filename.FullPath, System.IO.FileMode.Create))
using (var stream = tcpClient.GetStream())
stream.CopyTo(file);
tcpClient.Close();
tcpListener.Stop();
listening = false;
} catch {
throw new Exception("Test results listener failed or timed out.");
}
});
}
// iOS tasks
Task("build-ios")
.Does(() =>
{
MSBuild(IOS_PROJ, c => {
c.Configuration = "Release";
c.Restore = true;
c.Properties["Platform"] = new List<string> { "iPhoneSimulator" };
c.Properties["BuildIpa"] = new List<string> { "true" };
c.Properties["ContinuousIntegrationBuild"] = new List<string> { "false" };
c.Targets.Clear();
c.Targets.Add("Rebuild");
c.BinaryLogger = new MSBuildBinaryLogSettings {
Enabled = true,
FileName = OUTPUT_PATH.CombineWithFilePath("binlogs/device-tests-ios-build.binlog").FullPath,
};
});
});
Task("test-ios-emu")
.IsDependentOn("build-ios")
.Does(() =>
{
// Clean up after previous runs
CleanDirectories(IOS_TEST_RESULTS_PATH.FullPath);
// Run the tests
var resultCode = StartProcess("xharness", "ios test " +
$"--app=\"{IOS_IPA_PATH}\" " +
$"--targets=\"ios-simulator-64\" " +
$"--output-directory=\"{IOS_TEST_RESULTS_PATH}\" " +
$"--verbosity=\"Debug\" ");
// Rename test result files
var resultFiles = GetFiles($"{IOS_TEST_RESULTS_PATH}/*.xml");
foreach (var resultFile in resultFiles) {
MoveFile(resultFile, resultFile.ChangeExtension("TestResults.xml"));
}
if (resultCode != 0)
throw new Exception("xharness had an error.");
});
// Android tasks
Task("build-android")
.Does(() =>
{
MSBuild(ANDROID_PROJ, c => {
c.Configuration = "Debug"; // needs to be debug so unit tests get discovered
c.Restore = true;
c.Properties["ContinuousIntegrationBuild"] = new List<string> { "false" };
c.Targets.Clear();
c.Targets.Add("Rebuild");
c.Targets.Add("SignAndroidPackage");
c.BinaryLogger = new MSBuildBinaryLogSettings {
Enabled = true,
FileName = OUTPUT_PATH.CombineWithFilePath("binlogs/device-tests-android-build.binlog").FullPath,
};
});
});
Task("test-android-emu")
.IsDependentOn("build-android")
.Does(() =>
{
// Clean up after previous runs
CleanDirectories(ANDROID_TEST_RESULTS_PATH.FullPath);
var avdSettings = new AndroidAvdManagerToolSettings { SdkRoot = ANDROID_HOME };
var adbSettings = new AdbToolSettings { SdkRoot = ANDROID_HOME };
var emuSettings = new AndroidEmulatorToolSettings { SdkRoot = ANDROID_HOME, ArgumentCustomization = args => args.Append("-no-window") };
// Delete AVD first, if it exists
Information("Deleting AVD if exists: {0}...", ANDROID_AVD);
try { AndroidAvdDelete(ANDROID_AVD, avdSettings); }
catch { }
// Create the AVD
Information("Creating AVD: {0}...", ANDROID_AVD);
AndroidAvdCreate(ANDROID_AVD, ANDROID_EMU_TARGET, ANDROID_EMU_DEVICE, force: true, settings: avdSettings);
// Start the emulator
Information("Starting Emulator: {0}...", ANDROID_AVD);
var emulatorProcess = AndroidEmulatorStart(ANDROID_AVD, emuSettings);
var waited = 0;
while (AdbShell("getprop sys.boot_completed", adbSettings).FirstOrDefault() != "1") {
System.Threading.Thread.Sleep(1000);
if (waited++ > 60 * 10)
break;
}
Information("Waited {0} seconds for the emulator to boot up.", waited);
// Run the tests
var resultCode = StartProcess("xharness", "android test " +
$"--app=\"{ANDROID_APK_PATH}\" " +
$"--package-name=\"{ANDROID_PKG_NAME}\" " +
$"--instrumentation=\"{ANDROID_INSTRUMENTATION_NAME}\" " +
$"--device-arch=\"x86\" " +
$"--output-directory=\"{ANDROID_TEST_RESULTS_PATH}\" " +
$"--verbosity=\"Debug\" ");
// Stop / cleanup the emulator
AdbEmuKill(adbSettings);
System.Threading.Thread.Sleep(5000);
// Kill the process if it has not already exited
try { emulatorProcess.Kill(); }
catch { }
if (resultCode != 0)
throw new Exception("xharness had an error.");
Information("Done Tests");
});
// UWP tasks
Task("build-uwp")
.Does(() =>
{
MSBuild(UWP_PROJ, c => {
c.Configuration = "Debug";
c.Restore = true;
c.Properties["ContinuousIntegrationBuild"] = new List<string> { "false" };
c.Properties["AppxBundlePlatforms"] = new List<string> { "x86" };
c.Properties["AppxBundle"] = new List<string> { "Always" };
c.Properties["AppxPackageSigningEnabled"] = new List<string> { "true" };
c.Targets.Clear();
c.Targets.Add("Rebuild");
c.BinaryLogger = new MSBuildBinaryLogSettings {
Enabled = true,
FileName = OUTPUT_PATH.CombineWithFilePath("binlogs/device-tests-uwp-build.binlog").FullPath,
};
});
});
Task("test-uwp-emu")
.IsDependentOn("build-uwp")
.WithCriteria(IsRunningOnWindows())
.Does(() =>
{
var uninstallPS = new Action(() => {
try {
StartProcess("powershell",
"$app = Get-AppxPackage -Name " + UWP_PACKAGE_ID + "; if ($app) { Remove-AppxPackage -Package $app.PackageFullName }");
} catch { }
});
// Try to uninstall the app if it exists from before
uninstallPS();
var certPath = GetFiles("./**/DeviceTests.UWP_TemporaryKey.pfx").First();
Information("Installing certificate: {0}", certPath);
StartProcess("certutil", "-p Microsoft -importpfx \"" + MakeAbsolute(certPath).FullPath + "\"");
// Install the appx
var dependencies = GetFiles("./**/AppPackages/**/Dependencies/x86/*.appx");
foreach (var dep in dependencies) {
Information("Installing Dependency appx: {0}", dep);
StartProcess("powershell", "Add-AppxPackage -Path \"" + MakeAbsolute(dep).FullPath + "\"");
}
var appxBundlePath = GetFiles("./**/AppPackages/**/*.msixbundle").First();
Information("Installing appx: {0}", appxBundlePath);
StartProcess("powershell", "Add-AppxPackage -Path \"" + MakeAbsolute(appxBundlePath).FullPath + "\"");
// Start the TCP Test results listener
Information("Started TCP Test Results Listener on port: {0}:{1}", TCP_LISTEN_HOST, TCP_LISTEN_PORT);
var tcpListenerTask = DownloadTcpTextAsync(TCP_LISTEN_PORT, UWP_TEST_RESULTS_PATH);
// Launch the app
Information("Running appx: {0}", appxBundlePath);
var ip = TCP_LISTEN_HOST.Replace(".", "-");
var executeCommand = $"xamarin-essentials-device-tests://{ip}_{TCP_LISTEN_PORT}";
Information("Running appx: {0}", executeCommand);
StartProcess("explorer", executeCommand);
// Wait for the test results to come back
Information("Waiting for tests...");
tcpListenerTask.Wait();
// Uninstall the app(this will terminate it too)
uninstallPS();
});
RunTarget(TARGET);

Просмотреть файл

@ -1,260 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--
============================================================
SetupMDoc
Set all the variables needed for mdoc.
This runs during the build and package phases.
============================================================
-->
<Target Name="_MDocSetup">
<PropertyGroup>
<_ManagedExeLauncher Condition=" '$(OS)' != 'Windows_NT' And Exists ('/Library/Frameworks/Mono.framework/Versions/Current/bin/mono') ">/Library/Frameworks/Mono.framework/Versions/Current/bin/mono</_ManagedExeLauncher>
<_ManagedExeLauncher Condition=" '$(OS)' != 'Windows_NT' And Exists ('/usr/local/bin/mono') ">/usr/local/bin/mono</_ManagedExeLauncher>
<_ManagedExeLauncher Condition=" '$(OS)' != 'Windows_NT' And Exists ('/usr/bin/mono') ">/usr/bin/mono</_ManagedExeLauncher>
<_ManagedExeLauncher Condition=" '$(OS)' != 'Windows_NT' And '$(_ManagedExeLauncher)' == '' ">mono</_ManagedExeLauncher>
<MDocVersion Condition=" '%(Identity)' == 'mdoc' ">@(PackageReference -> '%(Version)')</MDocVersion>
<MDocPackagePath Condition=" '%(Name)' == 'mdoc' ">@(PackageDefinitions -> '%(ResolvedPath)')</MDocPackagePath>
<MDocPackagePath Condition=" '$(MDocPackagePath)' == '' ">$(NuGetPackageRoot)\mdoc\$(MDocVersion)</MDocPackagePath>
<MDocToolPath>$(MDocPackagePath)\tools\mdoc.exe</MDocToolPath>
<MDocOutputName>$(TargetName).xml</MDocOutputName>
<MDocOutputPath>$(TargetDir)$(MDocOutputName)</MDocOutputPath>
<_ShouldGenerateDocs Condition=" '$(MDocDocumentationDirectory)' != '' and Exists('$(MDocDocumentationDirectory)\index.xml') ">true</_ShouldGenerateDocs>
</PropertyGroup>
</Target>
<!--
============================================================
MDocGenerateDocs
Generated the XML documentation file using mdoc.
This runs during the build phase.
============================================================
-->
<Target Name="MDocGenerateDocs"
AfterTargets="CoreCompile" DependsOnTargets="_MDocSetup">
<ItemGroup Condition=" '$(_ShouldGenerateDocs)' == 'true' ">
<FileWrites Include="$(MDocOutputPath)" />
</ItemGroup>
<Exec Condition=" '$(_ShouldGenerateDocs)' == 'true' "
Command="$(_ManagedExeLauncher) &quot;$(MDocToolPath)&quot; export-msxdoc --debug --out=&quot;$(MDocOutputPath)&quot; &quot;$(MDocDocumentationDirectory)&quot;" />
</Target>
<!--
============================================================
MDocAddFilesToPackage
Make sure the mdoc output goes into the final package.
This runs during the package phase.
============================================================
-->
<Target Name="MDocAddFilesToPackage"
BeforeTargets="_GetBuildOutputFilesWithTfm" DependsOnTargets="_MDocSetup">
<ItemGroup Condition=" '$(_ShouldGenerateDocs)' == 'true' ">
<BuildOutputInPackage Include="$(MDocOutputPath)" TargetFramework="$(TargetFramework)" TargetPath="$(MDocOutputName)" />
</ItemGroup>
</Target>
<!--
============================================================
MDocUpdateDocs
Update the docs in the documentation directory using the
compiled assemblies.
This runs as a separate task.
============================================================
-->
<Target Name="MDocUpdateDocs"
DependsOnTargets="_MDocSetup">
<!-- bits for resolving references on Windows -->
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
<FrameworkReferenceAssemblyPath>$(VsInstallRoot)\Common7\IDE\ReferenceAssemblies\Microsoft\Framework</FrameworkReferenceAssemblyPath>
<WindowsKitsReferenceAssemblyPath>$(MSBuildProgramFiles32)\Windows Kits\10\References\10.0.16299.0</WindowsKitsReferenceAssemblyPath>
</PropertyGroup>
<ItemGroup Condition=" '$(OS)' == 'Windows_NT' ">
<MDocReferenceAssembly Include="$(FrameworkReferenceAssemblyPath)\MonoAndroid\v1.0" />
<MDocReferenceAssembly Include="$(FrameworkReferenceAssemblyPath)\MonoAndroid\v10.0" />
<MDocReferenceAssembly Include="$(FrameworkReferenceAssemblyPath)\Xamarin.iOS\v1.0" />
<MDocReferenceAssembly Include="$(FrameworkReferenceAssemblyPath)\Xamarin.TVOS\v1.0" />
<MDocReferenceAssembly Include="$(FrameworkReferenceAssemblyPath)\Xamarin.WatchOS\v1.0" />
<MDocReferenceAssembly Include="$(FrameworkReferenceAssemblyPath)\Xamarin.Mac\v2.0" />
<MDocReferenceAssembly Include="$(WindowsKitsReferenceAssemblyPath)\Windows.Foundation.FoundationContract\5.0.0.0" />
<MDocReferenceAssembly Include="$(WindowsKitsReferenceAssemblyPath)\Windows.Foundation.UniversalApiContract\5.0.0.0" />
</ItemGroup>
<!-- the actual task -->
<PropertyGroup>
<BinConfigDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\</BinConfigDir>
<TmpDir>$(MSBuildProjectDirectory)\tmp\</TmpDir>
</PropertyGroup>
<ItemGroup>
<MDocReferenceAssembly Include="$(BinConfigDir)monoandroid10.0" />
</ItemGroup>
<PropertyGroup>
<MDocReferenceAssemblies>@(MDocReferenceAssembly -> '--lib=&quot;%(Identity)&quot;', ' ')</MDocReferenceAssemblies>
</PropertyGroup>
<RemoveDir Directories="$(TmpDir)" />
<MakeDir Directories="$(TmpDir)" />
<Copy SourceFiles="$(MDocDocumentationDirectory)\..\frameworks.xml" DestinationFolder="$(TmpDir)" />
<Copy SourceFiles="$(BinConfigDir)netstandard2.0\$(AssemblyName).dll" DestinationFolder="$(TmpDir)xamarin-essentials" />
<Copy SourceFiles="$(BinConfigDir)monoandroid10.0\$(AssemblyName).dll" DestinationFolder="$(TmpDir)xamarin-essentials-android" />
<Copy SourceFiles="$(BinConfigDir)xamarin.ios10\$(AssemblyName).dll" DestinationFolder="$(TmpDir)xamarin-essentials-ios" />
<Copy SourceFiles="$(BinConfigDir)xamarin.mac20\$(AssemblyName).dll" DestinationFolder="$(TmpDir)xamarin-essentials-macos" />
<Copy SourceFiles="$(BinConfigDir)xamarin.tvos10\$(AssemblyName).dll" DestinationFolder="$(TmpDir)xamarin-essentials-tvos" />
<Copy SourceFiles="$(BinConfigDir)xamarin.watchos10\$(AssemblyName).dll" DestinationFolder="$(TmpDir)xamarin-essentials-watchos" />
<Copy SourceFiles="$(BinConfigDir)uap10.0.16299\$(AssemblyName).dll" DestinationFolder="$(TmpDir)xamarin-essentials-uwp" />
<Exec Command="$(_ManagedExeLauncher) &quot;$(MDocToolPath)&quot; update --debug --lang=DocId --delete --frameworks=&quot;$(TmpDir)frameworks.xml&quot; --out=&quot;$(MDocDocumentationDirectory)&quot; $(MDocReferenceAssemblies)" />
<_FormatDocs DocsRoot="$(MDocDocumentationDirectory)" />
<_VerifyAllDocsAreComplete DocsRoot="$(MDocDocumentationDirectory)" />
</Target>
<!--
============================================================
MDocVerifyDocs
Makes sure all the docs are filled in.
This runs as a separate task.
============================================================
-->
<Target Name="MDocVerifyDocs"
DependsOnTargets="_MDocSetup">
<_FormatDocs DocsRoot="$(MDocDocumentationDirectory)" />
<_VerifyAllDocsAreComplete DocsRoot="$(MDocDocumentationDirectory)" />
</Target>
<!--
===================================================================================================================
_FormatDocs
Make sure the docs are all uniform after editing in various apps or tools.
===================================================================================================================
-->
<UsingTask TaskName="_FormatDocs" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup>
<DocsRoot ParameterType="System.String" />
</ParameterGroup>
<Task>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Using Namespace="System.Xml" />
<Using Namespace="System.Xml.Linq" />
<Code Type="Fragment" Language="cs"><![CDATA[
foreach (var file in Directory.EnumerateFiles(DocsRoot, "*.xml", SearchOption.AllDirectories)) {
var xdoc = XDocument.Load(file);
// special case for Android resources: don't process
if (xdoc.Root.Name == "Type") {
var nameAttr = xdoc.Root.Attribute("FullName");
if (nameAttr != null && (nameAttr.Value == "Xamarin.Essentials.Resource" || nameAttr.Value.StartsWith("Xamarin.Essentials.Resource+"))) {
File.Delete(file);
continue;
}
}
if (xdoc.Root.Name == "Overview") {
foreach (var type in xdoc.Root.Descendants("Type").ToArray()) {
var nameAttr = type.Attribute("Name");
if (nameAttr != null && (nameAttr.Value == "Resource" || nameAttr.Value.StartsWith("Resource+"))) {
type.Remove();
}
}
}
if (xdoc.Root.Name == "Framework") {
foreach (var type in xdoc.Root.Descendants("Type").ToArray()) {
var nameAttr = type.Attribute("Name");
if (nameAttr != null && (nameAttr.Value == "Xamarin.Essentials.Resource" || nameAttr.Value.StartsWith("Xamarin.Essentials.Resource/"))) {
type.Remove();
}
}
}
// the tooling can't handle the ToPlatform* that differs only on return types
if (xdoc.Root.Name == "Type") {
var typeNameAttr = xdoc.Root.Attribute("FullName");
if (typeNameAttr != null && typeNameAttr.Value.EndsWith("Extensions")) {
foreach (var member in xdoc.Root.Descendants("Member").ToArray()) {
var memberNameAttr = member.Attribute("MemberName");
if (memberNameAttr != null && memberNameAttr.Value.StartsWith("ToPlatform")) {
member.Remove();
}
}
}
}
if (xdoc.Root.Name == "Overview") {
foreach (var member in xdoc.Root.Descendants("Member").ToArray()) {
var memberNameAttr = member.Attribute("MemberName");
if (memberNameAttr != null && memberNameAttr.Value.StartsWith("ToPlatform")) {
member.Remove();
}
}
}
if (xdoc.Root.Name == "Framework") {
foreach (var type in xdoc.Root.Descendants("Type").ToArray()) {
var typeNameAttr = type.Attribute("Name");
if (typeNameAttr != null && typeNameAttr.Value.EndsWith("Extensions")) {
foreach (var member in type.Descendants("Member").ToArray()) {
var memberNameAttr = member.Attribute("Id");
if (memberNameAttr != null && memberNameAttr.Value.Contains(".ToPlatform")) {
member.Remove();
}
}
}
}
}
var settings = new XmlWriterSettings {
Encoding = new UTF8Encoding(),
Indent = true,
NewLineChars = "\n",
OmitXmlDeclaration = true,
};
using (var writer = XmlWriter.Create(file, settings)) {
xdoc.Save(writer);
writer.Flush();
}
File.AppendAllText(file, "\n");
}
]]></Code>
</Task>
</UsingTask>
<!--
===================================================================================================================
_VerifyAllDocsAreComplete
Make sure the docs are all filled in.
===================================================================================================================
-->
<UsingTask TaskName="_VerifyAllDocsAreComplete" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup>
<DocsRoot ParameterType="System.String" />
</ParameterGroup>
<Task>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Using Namespace="System.IO" />
<Using Namespace="System.Xml" />
<Using Namespace="System.Xml.Linq" />
<Code Type="Fragment" Language="cs"><![CDATA[
foreach (var file in Directory.EnumerateFiles(DocsRoot, "*.xml", SearchOption.AllDirectories)) {
var xdoc = XDocument.Load(file);
var incomplete = xdoc.Descendants("Docs").Where(x => x.Descendants().Any(d => d.Value == "To be added."));
foreach (var node in incomplete) {
if (node.Parent.Name == "Type" && xdoc.Root.Name == "Type") {
var typename = xdoc.Root.Attribute("FullName").Value;
Log.LogWarning("Missing docs for {0}.", typename);
} else if (node.Parent.Name == "Member" && xdoc.Root.Name == "Type") {
var typename = xdoc.Root.Attribute("FullName").Value;
var member = node.Parent.Attribute("MemberName").Value;
var memberType = node.Parent.Element("MemberType").Value.ToLower();
Log.LogWarning("Missing docs for {2} '{0}.{1}'.", typename, member, memberType);
} else {
Log.LogWarning("Missing docs in {0}.", file);
}
}
}
]]></Code>
</Task>
</UsingTask>
</Project>

Просмотреть файл

@ -1,13 +0,0 @@
{
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"settings": {
"layoutRules": {
"newlineAtEndOfFile": "require"
},
"orderingRules": {
"systemUsingDirectivesFirst": true,
"usingDirectivesPlacement": "outsideNamespace"
}
}
}

Просмотреть файл

@ -48,9 +48,9 @@
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>
<ItemGroup>
<None Include="..\LICENSE" PackagePath="" Pack="true" />
<None Include="..\Assets\xamarin.essentials_128x128.png" PackagePath="icon.png" Pack="true" />
<None Include="..\nugetreadme.txt" PackagePath="readme.txt" Pack="true" />
<None Include="..\..\..\..\LICENSE" PackagePath="" Pack="true" />
<None Include="..\..\..\..\Assets\xamarin.essentials_128x128.png" PackagePath="icon.png" Pack="true" />
<None Include="nugetreadme.txt" PackagePath="readme.txt" Pack="true" />
<PackageReference Include="mdoc" Version="5.7.4.10" PrivateAssets="All" />
<PackageReference Include="Xamarin.Build.TypeRedirector" Version="0.1.2-preview" PrivateAssets="all" />
<Compile Include="**\*.shared.cs" />

Просмотреть файл

@ -95,9 +95,15 @@ namespace Xamarin.Forms
var maxVisible = _indicatorView.MaximumVisible;
var position = _indicatorView.Position;
var selectedIndex = position >= maxVisible ? maxVisible - 1 : position;
Children[index].BackgroundColor = index == selectedIndex
bool isSelected = index == selectedIndex;
Children[index].BackgroundColor = isSelected
? GetColorOrDefault(_indicatorView.SelectedIndicatorColor, Color.Gray)
: GetColorOrDefault(_indicatorView.IndicatorColor, Color.Silver);
VisualStateManager.GoToState(Children[index], isSelected
? VisualStateManager.CommonStates.Selected
: VisualStateManager.CommonStates.Normal);
}
IsVisible = indicatorCount > 1 || !_indicatorView.HideSingle;

Просмотреть файл

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.1;netstandard2.0</TargetFrameworks>
<RootNamespace>Xamarin.Forms.Core</RootNamespace>
<AssemblyName>Xamarin.Forms</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Internals\Legacy\**" />
<EmbeddedResource Remove="Internals\Legacy\**" />
<None Remove="Internals\Legacy\**" />
</ItemGroup>
<ItemGroup>
<Folder Include="Xaml\Diagnostics\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Platform.Handlers\src\Xamarin.Platform.Handlers\Xamarin.Platform.Handlers-net6.csproj" />
</ItemGroup>
<PropertyGroup>
<GitInfoReportImportance>high</GitInfoReportImportance>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.microsoft.sample_droid">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

Просмотреть файл

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-android</TargetFramework>
<OutputType>Exe</OutputType>
<RootNamespace>Sample.Droid</RootNamespace>
<AssemblyName>Sample.Droid</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sample\Sample-net6.csproj" />
<PackageReference Include="Xamarin.Essentials" Version="1.6.1" />
<PackageReference Include="Xamarin.AndroidX.Browser" Version="1.3.0.4" />
</ItemGroup>
</Project>

Просмотреть файл

@ -18,7 +18,7 @@
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v11.0</TargetFrameworkVersion>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>

Просмотреть файл

@ -1,31 +0,0 @@
using AppKit;
using CoreGraphics;
using Foundation;
namespace Sample.Mac
{
[Register("AppDelegate")]
public class AppDelegate : NSApplicationDelegate
{
public AppDelegate()
{
}
public override void DidFinishLaunching(NSNotification notification)
{
var mainWindow = NSApplication.SharedApplication.KeyWindow;
if (mainWindow != null)
{
var frame = mainWindow.Frame;
frame.Size = new CGSize(1024, 768);
mainWindow.SetFrame(frame, true);
}
}
public override void WillTerminate(NSNotification notification)
{
// Insert code here to tear down your application
}
}
}

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.9 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 711 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 58 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.4 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.3 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 58 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 174 KiB

Просмотреть файл

@ -1,68 +0,0 @@
{
"images": [
{
"filename": "AppIcon-16.png",
"size": "16x16",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-16@2x.png",
"size": "16x16",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-32.png",
"size": "32x32",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-32@2x.png",
"size": "32x32",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-128.png",
"size": "128x128",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-128@2x.png",
"size": "128x128",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-256.png",
"size": "256x256",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-256@2x.png",
"size": "256x256",
"scale": "2x",
"idiom": "mac"
},
{
"filename": "AppIcon-512.png",
"size": "512x512",
"scale": "1x",
"idiom": "mac"
},
{
"filename": "AppIcon-512@2x.png",
"size": "512x512",
"scale": "2x",
"idiom": "mac"
}
],
"info": {
"version": 1,
"author": "xcode"
}
}

Просмотреть файл

@ -1,6 +0,0 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
</dict>
</plist>

Просмотреть файл

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>Sample.Mac</string>
<key>CFBundleIdentifier</key>
<string>com.companyname.Sample-Mac</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSHumanReadableCopyright</key>
<string></string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/AppIcon.appiconset</string>
</dict>
</plist>

Просмотреть файл

@ -1,13 +0,0 @@
using AppKit;
namespace Sample.Mac
{
static class MainClass
{
static void Main(string[] args)
{
NSApplication.Init();
NSApplication.Main(args);
}
}
}

Просмотреть файл

@ -1,719 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17154"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="Sample.Mac" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Sample.Mac" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About Sample.Mac" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide Sample.Mac" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit Sample.Mac" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="Ady-hI-5gd" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="Ady-hI-5gd" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="Ady-hI-5gd" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="Ady-hI-5gd" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="Ady-hI-5gd" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="Ady-hI-5gd" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="Ady-hI-5gd" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="Ady-hI-5gd" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="Ady-hI-5gd" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="Ady-hI-5gd" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="Ady-hI-5gd" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="Ady-hI-5gd" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="Ady-hI-5gd" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="Ady-hI-5gd" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="Ady-hI-5gd" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="Ady-hI-5gd" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="Ady-hI-5gd" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="Ady-hI-5gd" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="Ady-hI-5gd" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="Ady-hI-5gd" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="Ady-hI-5gd" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="Ady-hI-5gd" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="Ady-hI-5gd" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="Ady-hI-5gd" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="Ady-hI-5gd" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="Ady-hI-5gd" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="Ady-hI-5gd" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="Ady-hI-5gd" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="Ady-hI-5gd" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="Ady-hI-5gd" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="Ady-hI-5gd" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="Ady-hI-5gd" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="Ady-hI-5gd" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="Ady-hI-5gd" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="Ady-hI-5gd" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="Ady-hI-5gd" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="Ady-hI-5gd" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="Ady-hI-5gd" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="Ady-hI-5gd" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="Ady-hI-5gd" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="Ady-hI-5gd" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="Ady-hI-5gd" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="Ady-hI-5gd" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="Ady-hI-5gd" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="Ady-hI-5gd" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="Ady-hI-5gd" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="Ady-hI-5gd" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="Ady-hI-5gd" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="Ady-hI-5gd" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="Ady-hI-5gd" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="Ady-hI-5gd" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="Ady-hI-5gd" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="Ady-hI-5gd" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="Ady-hI-5gd" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="Ady-hI-5gd" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="Ady-hI-5gd" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="Ady-hI-5gd" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="Ady-hI-5gd" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="Ady-hI-5gd" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="Ady-hI-5gd" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="Ady-hI-5gd" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="Ady-hI-5gd" id="pQI-g3-MTW"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
<menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleSidebar:" target="Ady-hI-5gd" id="iwa-gc-5KM"/>
</connections>
</menuItem>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="Ady-hI-5gd" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="Ady-hI-5gd" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="Sample.Mac Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="0.0"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="Xamarin" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" visibleAtLaunch="NO" animationBehavior="default" titlebarAppearsTransparent="YES" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="1024" height="768"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<connections>
<outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
</connections>
</window>
<connections>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="250"/>
</scene>
<!--View Controller-->
<scene sceneID="hIz-AP-VOD">
<objects>
<viewController id="XfG-lQ-9wD" customClass="ViewController" sceneMemberID="viewController">
<view key="view" wantsLayer="YES" id="m2S-Jp-Qdl">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask"/>
</view>
</viewController>
<customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="655"/>
</scene>
</scenes>
</document>

Просмотреть файл

@ -1,104 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C9FD5CC4-54CC-4DF1-9113-26ECBB688BEE}</ProjectGuid>
<ProjectTypeGuids>{A3F8F2AB-B479-4A4A-A458-A89E7DC349F1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Exe</OutputType>
<RootNamespace>Sample.Mac</RootNamespace>
<AssemblyName>Sample.Mac</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<TargetFrameworkIdentifier>Xamarin.Mac</TargetFrameworkIdentifier>
<MonoMacResourcePrefix>Resources</MonoMacResourcePrefix>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<EnableCodeSigning>false</EnableCodeSigning>
<CodeSigningKey>Mac Developer</CodeSigningKey>
<CreatePackage>false</CreatePackage>
<EnablePackageSigning>false</EnablePackageSigning>
<IncludeMonoRuntime>false</IncludeMonoRuntime>
<UseSGen>true</UseSGen>
<UseRefCounting>true</UseRefCounting>
<HttpClientHandler></HttpClientHandler>
<LinkMode></LinkMode>
<XamMacArch></XamMacArch>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<DefineConstants></DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<EnableCodeSigning>false</EnableCodeSigning>
<CreatePackage>true</CreatePackage>
<EnablePackageSigning>false</EnablePackageSigning>
<IncludeMonoRuntime>true</IncludeMonoRuntime>
<UseSGen>true</UseSGen>
<UseRefCounting>true</UseRefCounting>
<CodeSignEntitlements>Entitlements.plist</CodeSignEntitlements>
<LinkMode>SdkOnly</LinkMode>
<HttpClientHandler></HttpClientHandler>
<XamMacArch></XamMacArch>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="Xamarin.Mac" />
</ItemGroup>
<ItemGroup>
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Contents.json" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-128.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-128%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-16.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-16%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-256.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-256%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-32.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-32%402x.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-512.png" />
<ImageAsset Include="Assets.xcassets\AppIcon.appiconset\AppIcon-512%402x.png" />
<ImageAsset Include="Assets.xcassets\Contents.json" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<None Include="Info.plist" />
<None Include="Entitlements.plist" />
</ItemGroup>
<ItemGroup>
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
<Compile Include="ViewController.cs" />
<Compile Include="ViewController.designer.cs">
<DependentUpon>ViewController.cs</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<InterfaceDefinition Include="Main.storyboard" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sample\Sample.csproj">
<Project>{28164E00-92FB-4EEE-927C-D0CF672A004D}</Project>
<Name>Sample</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Xamarin.Forms.Core\Xamarin.Forms.Core.csproj">
<Project>{57B8B73D-C3B5-4C42-869E-7B2F17D354AC}</Project>
<Name>Xamarin.Forms.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\src\Xamarin.Platform.Handlers\Xamarin.Platform.Handlers.csproj">
<Project>{29913989-0F70-48D8-8EDE-B1DD217F21D1}</Project>
<Name>Xamarin.Platform.Handlers</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Mac\Xamarin.Mac.CSharp.targets" />
</Project>

Просмотреть файл

@ -1,32 +0,0 @@
using System;
using AppKit;
using Foundation;
using Xamarin.Platform;
namespace Sample.Mac
{
public partial class ViewController : NSViewController
{
public ViewController(IntPtr handle) : base(handle)
{
var app = new MyApp();
IView content = app.CreateView();
View = content.ToNative();
}
public override NSObject RepresentedObject
{
get
{
return base.RepresentedObject;
}
set
{
base.RepresentedObject = value;
// Update the view, if already loaded.
}
}
}
}

Просмотреть файл

@ -1,8 +1,12 @@
using Foundation;
using UIKit;
using Xamarin.Platform;
#if !NET6_0
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
#endif
using System.Threading.Tasks;
using System.Linq;
@ -11,7 +15,11 @@ namespace Sample.iOS
// The UIApplicationDelegate for the application. This class is responsible for launching the
// User Interface of the application, as well as listening (and optionally responding) to application events from iOS.
[Register("AppDelegate")]
#if !NET6_0
public class AppDelegate : FormsApplicationDelegate, IUIApplicationDelegate
#else
public class AppDelegate : UIApplicationDelegate, IUIApplicationDelegate
#endif
{
UIWindow _window;

Просмотреть файл

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-ios</TargetFramework>
<RuntimeIdentifier>ios-x64</RuntimeIdentifier>
<OutputType>Exe</OutputType>
<RootNamespace>Sample.iOS</RootNamespace>
<AssemblyName>Sample.iOS</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Forms\src\Xamarin.Forms.Core\Xamarin.Forms.Core-net6.csproj" />
<ProjectReference Include="..\Sample\Sample-net6.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
</ItemGroup>
</Project>

Просмотреть файл

@ -33,7 +33,7 @@ namespace Sample
void RegisterLegacyRendererAgainstFormsControl()
{
#if MONOANDROID
#if MONOANDROID && !NET6_0
// register renderer with old registrar so it can get shimmed
// This will move to some extension method

Просмотреть файл

@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0-android;net6.0-ios;</TargetFrameworks>
<RootNamespace>Sample</RootNamespace>
<AssemblyName>Sample</AssemblyName>
</PropertyGroup>
<Import Project="..\..\..\..\.nuspec\Xamarin.Forms.MultiTargeting.targets" />
<ItemGroup>
<ProjectReference Include="..\..\..\Forms\src\Xamarin.Forms.Core\Xamarin.Forms.Core-net6.csproj" />
<ProjectReference Include="..\..\src\Xamarin.Platform.Handlers\Xamarin.Platform.Handlers-net6.csproj" />
</ItemGroup>
</Project>

Просмотреть файл

@ -7,10 +7,10 @@ using NativeView = UIKit.UIButton;
using NativeView = AppKit.NSButton;
#elif MONOANDROID
using NativeView = AndroidX.AppCompat.Widget.AppCompatButton;
#elif NETCOREAPP
using NativeView = System.Windows.Controls.Button;
#elif NETSTANDARD
using NativeView = System.Object;
#elif WINDOWS
using NativeView = Microsoft.UI.Xaml.Controls.Button;
#endif
namespace Xamarin.Platform.Handlers

Просмотреть файл

@ -74,7 +74,7 @@ namespace Xamarin.Platform.Handlers
handler.TypedNativeView?.UpdateThumbColor(slider, DefaultThumbColor);
}
void OnControlValueChanged(object sender, EventArgs eventArgs)
void OnControlValueChanged(object? sender, EventArgs eventArgs)
{
if (TypedNativeView == null || VirtualView == null)
return;
@ -82,12 +82,12 @@ namespace Xamarin.Platform.Handlers
VirtualView.Value = TypedNativeView.Value;
}
void OnTouchDownControlEvent(object sender, EventArgs e)
void OnTouchDownControlEvent(object? sender, EventArgs e)
{
VirtualView?.DragStarted();
}
void OnTouchUpControlEvent(object sender, EventArgs e)
void OnTouchUpControlEvent(object? sender, EventArgs e)
{
VirtualView?.DragCompleted();
}

Просмотреть файл

@ -5,8 +5,6 @@ using NativeView = UIKit.UIView;
using NativeView = AppKit.NSView;
#elif MONOANDROID
using NativeView = Android.Views.View;
#elif NETCOREAPP
using NativeView = System.Windows.FrameworkElement;
#elif NETSTANDARD
using NativeView = System.Object;
#endif

Просмотреть файл

@ -22,7 +22,7 @@ namespace Xamarin.Platform
var color = view.BackgroundColor;
if (color != null && !color.IsDefault)
if (!color.IsDefault)
nativeView.BackgroundColor = color.ToNative();
}
}

Просмотреть файл

@ -295,7 +295,7 @@ namespace Xamarin.Forms
}
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
if (obj is Color)
{

Просмотреть файл

@ -103,7 +103,7 @@ namespace Xamarin.Forms
return string.Equals(FontFamily, other.FontFamily) && FontSize.Equals(other.FontSize) && NamedSize == other.NamedSize && FontAttributes == other.FontAttributes;
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj))
{

Просмотреть файл

@ -30,7 +30,7 @@ namespace Xamarin.Forms
Y = sz.Height;
}
public override bool Equals(object o)
public override bool Equals(object? o)
{
if (!(o is Point))
return false;

Просмотреть файл

@ -65,7 +65,7 @@ namespace Xamarin.Forms
public bool Equals(Rect other) => X.Equals(other.X) && Y.Equals(other.Y) && Width.Equals(other.Width) && Height.Equals(other.Height);
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
if (obj is null)
return false;

Просмотреть файл

@ -71,8 +71,8 @@ namespace Xamarin.Forms
{
return X.Equals(other.X) && Y.Equals(other.Y) && Width.Equals(other.Width) && Height.Equals(other.Height);
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
if (obj is null)
return false;

Просмотреть файл

@ -87,7 +87,7 @@ namespace Xamarin.Forms
return _width.Equals(other._width) && _height.Equals(other._height);
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj))
return false;

Просмотреть файл

@ -59,7 +59,7 @@ namespace Xamarin.Forms
return Left.Equals(other.Left) && Top.Equals(other.Top) && Right.Equals(other.Right) && Bottom.Equals(other.Bottom);
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj))
return false;

Просмотреть файл

@ -69,7 +69,8 @@ namespace Xamarin.Platform
public TTypeRender GetHandler(Type type)
{
List<Type> types = new List<Type> { type };
Type baseType = type.BaseType;
Type? baseType = type.BaseType;
while (baseType != null)
{
@ -90,7 +91,7 @@ namespace Xamarin.Platform
public Type GetRendererType(Type type)
{
List<Type> types = new List<Type> { type };
Type baseType = type.BaseType;
Type? baseType = type.BaseType;
while (baseType != null)
{
@ -124,12 +125,16 @@ namespace Xamarin.Platform
try
{
var newObject = Activator.CreateInstance(handler);
if(newObject == null)
throw new ArgumentException($"No Handler found for type: {type}", nameof(type));
return (TTypeRender)newObject;
}
catch (Exception ex)
catch (Exception)
{
if (Debugger.IsAttached)
throw ex;
throw;
}
return default(TTypeRender);

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше