Merge pull request #546 from Microsoft/develop

Version 1.1.0
This commit is contained in:
Guillaume Perrot 2017-12-11 15:56:41 -08:00 коммит произвёл GitHub
Родитель c601cba778 7d4a023bad
Коммит b7b052adb6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
232 изменённых файлов: 2879 добавлений и 2230 удалений

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

@ -117,6 +117,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AppCenter.Rum.And
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.AppCenter.Rum.Shared", "SDK\AppCenterRum\Microsoft.AppCenter.Rum.Shared\Microsoft.AppCenter.Rum.Shared.shproj", "{8E7B80C4-D22A-4F80-A7AE-E3882E72FFB3}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.AppCenter.Crashes.Shared.Targets", "SDK\AppCenterCrashes\Microsoft.AppCenter.Crashes.Shared.Targets\Microsoft.AppCenter.Crashes.Shared.Targets.shproj", "{CAE55C79-1601-400D-86BF-03AB8CC5B8B9}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
SDK\AppCenter\Microsoft.AppCenter.Shared\Microsoft.AppCenter.Shared.projitems*{119c1730-e109-4bc9-aa89-9dca2c50bfd5}*SharedItemsImports = 4
@ -2163,6 +2165,7 @@ Global
{7E130457-B427-4043-A5A2-9484CB5809BF} = {96552695-58F3-472E-8654-52ECE3EE5CF2}
{7F7FA7ED-1386-41B5-A11E-656B7F85A8F9} = {96552695-58F3-472E-8654-52ECE3EE5CF2}
{8E7B80C4-D22A-4F80-A7AE-E3882E72FFB3} = {96552695-58F3-472E-8654-52ECE3EE5CF2}
{CAE55C79-1601-400D-86BF-03AB8CC5B8B9} = {7FAAA086-4453-4B62-AD9A-2E2ED216E3C4}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0

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

@ -7,5 +7,6 @@
public const string Info = "Info";
public const string Warning = "Warning";
public const string Error = "Error";
public const string FirebaseAnalyticsEnabledKey = "FirebaseAnalyticsEnabled";
}
}

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

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\..\packages\Xamarin.Build.Download.0.4.4\build\Xamarin.Build.Download.props" Condition="Exists('..\..\packages\Xamarin.Build.Download.0.4.4\build\Xamarin.Build.Download.props')" />
<Import Project="..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.props" Condition="Exists('..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@ -17,7 +17,7 @@
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v7.1</TargetFrameworkVersion>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
<AndroidTlsProvider>
</AndroidTlsProvider>
@ -54,40 +54,73 @@
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml" />
<Reference Include="Xamarin.Android.Support.Annotations">
<HintPath>..\..\packages\Xamarin.Android.Support.Annotations.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Annotations.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Arch.Core.Common">
<HintPath>..\..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\lib\MonoAndroid80\Xamarin.Android.Arch.Core.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Arch.Lifecycle.Common">
<HintPath>..\..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\lib\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Arch.Lifecycle.Runtime">
<HintPath>..\..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\lib\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Compat">
<HintPath>..\..\packages\Xamarin.Android.Support.Compat.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Compat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Compat.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Core.UI">
<HintPath>..\..\packages\Xamarin.Android.Support.Core.UI.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Core.UI.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Core.Utils">
<HintPath>..\..\packages\Xamarin.Android.Support.Core.Utils.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Media.Compat">
<HintPath>..\..\packages\Xamarin.Android.Support.Media.Compat.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Core.Utils.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Fragment">
<HintPath>..\..\packages\Xamarin.Android.Support.Fragment.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Fragment.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Media.Compat">
<HintPath>..\..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Media.Compat.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Transition">
<HintPath>..\..\packages\Xamarin.Android.Support.Transition.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Transition.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Transition.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Transition.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.v4">
<HintPath>..\..\packages\Xamarin.Android.Support.v4.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v4.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.v7.RecyclerView">
<HintPath>..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.v7.RecyclerView.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v7.RecyclerView.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Vector.Drawable">
<HintPath>..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Vector.Drawable.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Vector.Drawable.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Animated.Vector.Drawable">
<HintPath>..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.v7.AppCompat">
<HintPath>..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Design">
<HintPath>..\..\packages\Xamarin.Android.Support.Design.25.3.1\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll</HintPath>
<HintPath>..\..\packages\Xamarin.Android.Support.Design.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Design.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Basement">
<HintPath>..\..\packages\Xamarin.GooglePlayServices.Basement.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.GooglePlayServices.Basement.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Tasks">
<HintPath>..\..\packages\Xamarin.GooglePlayServices.Tasks.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.GooglePlayServices.Tasks.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Common">
<HintPath>..\..\packages\Xamarin.Firebase.Common.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Iid">
<HintPath>..\..\packages\Xamarin.Firebase.Iid.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Iid.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Analytics.Impl">
<HintPath>..\..\packages\Xamarin.Firebase.Analytics.Impl.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Analytics.Impl.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Analytics">
<HintPath>..\..\packages\Xamarin.Firebase.Analytics.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Analytics.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Messaging">
<HintPath>..\..\packages\Xamarin.Firebase.Messaging.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Messaging.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@ -96,7 +129,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ModulePages\AnalyticsFragment.cs" />
<Compile Include="ModulePages\CrashesFragment.cs" />
<Compile Include="ModulePages\DistributeFragment.cs" />
<Compile Include="ModulePages\OthersFragment.cs" />
<Compile Include="ModulePages\AppCenterFragment.cs" />
<Compile Include="PagerAdapter.cs" />
<Compile Include="Constants.cs" />
@ -105,6 +138,7 @@
<Compile Include="FakeService.cs" />
<Compile Include="ModulePages\PageFragment.cs" />
<Compile Include="CrashActivity.cs" />
<Compile Include="Preferences.cs" />
</ItemGroup>
<ItemGroup>
<None Include="GettingStarted.Xamarin" />
@ -119,7 +153,7 @@
<AndroidResource Include="Resources\layout\AppCenter.axml" />
<AndroidResource Include="Resources\layout\Analytics.axml" />
<AndroidResource Include="Resources\layout\Crashes.axml" />
<AndroidResource Include="Resources\layout\Distribute.axml" />
<AndroidResource Include="Resources\layout\Others.axml" />
<AndroidResource Include="Resources\values\styles.xml" />
<AndroidResource Include="Resources\drawable-hdpi\icon.png" />
<AndroidResource Include="Resources\drawable-xhdpi\icon.png" />
@ -167,6 +201,14 @@
<Project>{11D31A79-0F09-4708-8097-3D1C5D886547}</Project>
<Name>Microsoft.AppCenter.Distribute.Android.Bindings</Name>
</ProjectReference>
<ProjectReference Include="..\..\SDK\AppCenterPush\Microsoft.AppCenter.Push.Android\Microsoft.AppCenter.Push.Android.csproj">
<Project>{DF7C7C03-E335-4C23-83BA-8E490AC5B61D}</Project>
<Name>Microsoft.AppCenter.Push.Android</Name>
</ProjectReference>
<ProjectReference Include="..\..\SDK\AppCenterPush\Microsoft.AppCenter.Push.Android.Bindings\Microsoft.AppCenter.Push.Android.Bindings.csproj">
<Project>{80B9A47A-7A97-4E5A-9706-43ACB25A7240}</Project>
<Name>Microsoft.AppCenter.Push.Android.Bindings</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="ModulePages\" />
@ -175,6 +217,12 @@
<Folder Include="Resources\drawable-xhdpi\" />
<Folder Include="Resources\drawable-xxhdpi\" />
</ItemGroup>
<ItemGroup>
<GoogleServicesJson Include="google-services.json" />
</ItemGroup>
<ItemGroup>
<ProguardConfiguration Include="proguard.cfg" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
@ -183,17 +231,28 @@
<Target Name="AfterBuild">
</Target>
-->
<Import Project="..\..\packages\Xamarin.Android.Support.Annotations.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Annotations.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Annotations.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Compat.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Core.UI.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.UI.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.UI.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Core.Utils.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.Utils.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Core.Utils.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Media.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Media.Compat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Media.Compat.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Fragment.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Fragment.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Fragment.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Transition.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Transition.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Transition.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Transition.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Design.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Design.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Design.25.3.1\build\MonoAndroid70\Xamarin.Android.Support.Design.targets')" />
<Import Project="..\..\packages\Xamarin.Build.Download.0.4.4\build\Xamarin.Build.Download.targets" Condition="Exists('..\..\packages\Xamarin.Build.Download.0.4.4\build\Xamarin.Build.Download.targets')" />
<Import Project="..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.targets" Condition="Exists('..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets" Condition="Exists('..\..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets" Condition="Exists('..\..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets" Condition="Exists('..\..\packages\Xamarin.Android.Arch.Lifecycle.Runtime.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Runtime.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Compat.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.UI.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.UI.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Core.Utils.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Core.Utils.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Fragment.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Fragment.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Media.Compat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Media.Compat.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Transition.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Transition.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Transition.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Transition.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.v4.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v4.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.v4.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v4.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.v7.RecyclerView.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.RecyclerView.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.v7.RecyclerView.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.RecyclerView.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Vector.Drawable.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Vector.Drawable.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Vector.Drawable.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Animated.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Animated.Vector.Drawable.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets')" />
<Import Project="..\..\packages\Xamarin.GooglePlayServices.Basement.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Basement.targets" Condition="Exists('..\..\packages\Xamarin.GooglePlayServices.Basement.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Basement.targets')" />
<Import Project="..\..\packages\Xamarin.GooglePlayServices.Tasks.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Tasks.targets" Condition="Exists('..\..\packages\Xamarin.GooglePlayServices.Tasks.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Tasks.targets')" />
<Import Project="..\..\packages\Xamarin.Firebase.Common.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Common.targets" Condition="Exists('..\..\packages\Xamarin.Firebase.Common.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Common.targets')" />
<Import Project="..\..\packages\Xamarin.Firebase.Iid.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Iid.targets" Condition="Exists('..\..\packages\Xamarin.Firebase.Iid.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Iid.targets')" />
<Import Project="..\..\packages\Xamarin.Firebase.Analytics.Impl.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.Impl.targets" Condition="Exists('..\..\packages\Xamarin.Firebase.Analytics.Impl.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.Impl.targets')" />
<Import Project="..\..\packages\Xamarin.Firebase.Analytics.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.targets" Condition="Exists('..\..\packages\Xamarin.Firebase.Analytics.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.targets')" />
<Import Project="..\..\packages\Xamarin.Firebase.Messaging.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Messaging.targets" Condition="Exists('..\..\packages\Xamarin.Firebase.Messaging.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Messaging.targets')" />
</Project>

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

@ -1,4 +1,5 @@
using Android.App;
using System.Linq;
using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Support.Design.Widget;
@ -8,6 +9,7 @@ using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
using Microsoft.AppCenter.Crashes;
using Microsoft.AppCenter.Distribute;
using Microsoft.AppCenter.Push;
namespace Contoso.Android.Puppet
{
@ -18,6 +20,12 @@ namespace Contoso.Android.Puppet
{
const string LogTag = "AppCenterXamarinPuppet";
protected override void OnDestroy()
{
base.OnDestroy();
Push.PushNotificationReceived -= PrintNotification;
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
@ -49,12 +57,22 @@ namespace Contoso.Android.Puppet
Crashes.ShouldAwaitUserConfirmation = ConfirmationHandler;
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenterLog.Assert(LogTag, "AppCenter.Configured=" + AppCenter.Configured);
AppCenter.SetLogUrl("https://in-integration.dev.avalanch.es");
Distribute.SetInstallUrl("http://install.asgard-int.trafficmanager.net");
Distribute.SetApiUrl("https://asgard-int.trafficmanager.net/api/v0.1");
AppCenter.Start("bff0949b-7970-439d-9745-92cdc59b10fe", typeof(Analytics), typeof(Crashes), typeof(Distribute));
// Enable Firebase Analytics if set
var enableAnalytics = Preferences.SharedPreferences.GetBoolean(Constants.FirebaseAnalyticsEnabledKey, false);
if (enableAnalytics)
{
Push.EnableFirebaseAnalytics();
}
Push.PushNotificationReceived += PrintNotification;
AppCenter.Start("bff0949b-7970-439d-9745-92cdc59b10fe", typeof(Analytics), typeof(Crashes),
typeof(Push), typeof(Distribute));
AppCenter.IsEnabledAsync().ContinueWith(enabled =>
{
@ -75,6 +93,19 @@ namespace Contoso.Android.Puppet
});
}
void PrintNotification(object sender, PushNotificationReceivedEventArgs e)
{
var alertDialog = new AlertDialog.Builder(this, Resource.Style.AppCompatDialogStyle);
alertDialog.SetTitle(e.Title);
var message = e.Message;
if (e.CustomData != null && e.CustomData.Count > 0)
{
message += "\nCustom data = {" + string.Join(",", e.CustomData.Select(kv => kv.Key + "=" + kv.Value)) + "}";
}
alertDialog.SetMessage(message);
alertDialog.Show();
}
void SendingErrorReportHandler(object sender, SendingErrorReportEventArgs e)
{
AppCenterLog.Info(LogTag, "Sending error report");

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

@ -6,6 +6,7 @@ using Android.Views;
using Android.Widget;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Crashes;
using Uri = Android.Net.Uri;
namespace Contoso.Android.Puppet
{
@ -19,6 +20,7 @@ namespace Contoso.Android.Puppet
private Button CatchNullReferenceExceptionButton;
private Button CrashAsyncButton;
private Button CrashSuperNotCalledButton;
private Button CrashJavaFromDotNetButton;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
@ -38,6 +40,7 @@ namespace Contoso.Android.Puppet
CatchNullReferenceExceptionButton = view.FindViewById(Resource.Id.catch_null_reference_exception) as Button;
CrashAsyncButton = view.FindViewById(Resource.Id.crash_async) as Button;
CrashSuperNotCalledButton = view.FindViewById(Resource.Id.crash_super_not_called) as Button;
CrashJavaFromDotNetButton = view.FindViewById(Resource.Id.crash_java_from_dotnet) as Button;
// Subscribe to events.
CrashesEnabledSwitch.CheckedChange += UpdateEnabled;
@ -48,6 +51,7 @@ namespace Contoso.Android.Puppet
CatchNullReferenceExceptionButton.Click += CatchNullReferenceException;
CrashAsyncButton.Click += CrashAsync;
CrashSuperNotCalledButton.Click += CrashSuperNotCalled;
CrashJavaFromDotNetButton.Click += CrashJavaFromDotNet;
UpdateState();
}
@ -124,6 +128,11 @@ namespace Contoso.Android.Puppet
StartActivity(new Intent(Activity, typeof(CrashActivity)));
}
private void CrashJavaFromDotNet(object sender, EventArgs e)
{
Uri.Parse(null);
}
static Exception PrepareException()
{
try

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

@ -1,46 +0,0 @@
using Android.OS;
using Android.Views;
using Android.Widget;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Distribute;
namespace Contoso.Android.Puppet
{
public class DistributeFragment : PageFragment
{
private Switch DistributeEnabledSwitch;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.Inflate(Resource.Layout.Distribute, container, false);
}
public override void OnViewCreated(View view, Bundle savedInstanceState)
{
base.OnViewCreated(view, savedInstanceState);
// Find views.
DistributeEnabledSwitch = view.FindViewById(Resource.Id.enabled_distribute) as Switch;
// Subscribe to events.
DistributeEnabledSwitch.CheckedChange += UpdateEnabled;
UpdateState();
}
protected override async void UpdateState()
{
DistributeEnabledSwitch.CheckedChange -= UpdateEnabled;
DistributeEnabledSwitch.Enabled = true;
DistributeEnabledSwitch.Checked = await Distribute.IsEnabledAsync();
DistributeEnabledSwitch.Enabled = await AppCenter.IsEnabledAsync();
DistributeEnabledSwitch.CheckedChange += UpdateEnabled;
}
private async void UpdateEnabled(object sender, CompoundButton.CheckedChangeEventArgs e)
{
await Distribute.SetEnabledAsync(e.IsChecked);
DistributeEnabledSwitch.Checked = await Distribute.IsEnabledAsync();
}
}
}

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

@ -0,0 +1,78 @@
using Android.OS;
using Android.Views;
using Android.Widget;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Distribute;
using Microsoft.AppCenter.Push;
namespace Contoso.Android.Puppet
{
public class OthersFragment : PageFragment
{
private Switch DistributeEnabledSwitch;
private Switch PushEnabledSwitch;
private Switch FirebaseAnalyticsEnabledSwitch;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.Inflate(Resource.Layout.Others, container, false);
}
public override void OnViewCreated(View view, Bundle savedInstanceState)
{
base.OnViewCreated(view, savedInstanceState);
// Find views.
DistributeEnabledSwitch = view.FindViewById(Resource.Id.enabled_distribute) as Switch;
PushEnabledSwitch = view.FindViewById(Resource.Id.enabled_push) as Switch;
FirebaseAnalyticsEnabledSwitch = view.FindViewById(Resource.Id.enabled_firebase_analytics) as Switch;
// Subscribe to events.
DistributeEnabledSwitch.CheckedChange += UpdateDistributeEnabled;
PushEnabledSwitch.CheckedChange += UpdatePushEnabled;
FirebaseAnalyticsEnabledSwitch.CheckedChange += UpdateFirebaseAnalyticsEnabled;
UpdateState();
}
protected override async void UpdateState()
{
DistributeEnabledSwitch.CheckedChange -= UpdateDistributeEnabled;
DistributeEnabledSwitch.Enabled = true;
DistributeEnabledSwitch.Checked = await Distribute.IsEnabledAsync();
DistributeEnabledSwitch.Enabled = await AppCenter.IsEnabledAsync();
DistributeEnabledSwitch.CheckedChange += UpdateDistributeEnabled;
PushEnabledSwitch.CheckedChange -= UpdatePushEnabled;
PushEnabledSwitch.Enabled = true;
PushEnabledSwitch.Checked = await Push.IsEnabledAsync();
PushEnabledSwitch.Enabled = await AppCenter.IsEnabledAsync();
PushEnabledSwitch.CheckedChange += UpdatePushEnabled;
FirebaseAnalyticsEnabledSwitch.CheckedChange -= UpdateFirebaseAnalyticsEnabled;
var enableAnalytics = Preferences.SharedPreferences.GetBoolean(Constants.FirebaseAnalyticsEnabledKey, false);
FirebaseAnalyticsEnabledSwitch.Checked = enableAnalytics;
FirebaseAnalyticsEnabledSwitch.CheckedChange += UpdateFirebaseAnalyticsEnabled;
}
private async void UpdateDistributeEnabled(object sender, CompoundButton.CheckedChangeEventArgs e)
{
await Distribute.SetEnabledAsync(e.IsChecked);
DistributeEnabledSwitch.Checked = await Distribute.IsEnabledAsync();
}
private async void UpdatePushEnabled(object sender, CompoundButton.CheckedChangeEventArgs e)
{
await Push.SetEnabledAsync(e.IsChecked);
PushEnabledSwitch.Checked = await Distribute.IsEnabledAsync();
}
private void UpdateFirebaseAnalyticsEnabled(object sender, CompoundButton.CheckedChangeEventArgs e)
{
var editor = Preferences.SharedPreferences.Edit();
editor.PutBoolean(Constants.FirebaseAnalyticsEnabledKey, e.IsChecked);
FirebaseAnalyticsEnabledSwitch.Checked = e.IsChecked;
editor.Apply();
}
}
}

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

@ -25,7 +25,7 @@ namespace Contoso.Android.Puppet
case 0: return new AppCenterFragment();
case 1: return new AnalyticsFragment();
case 2: return new CrashesFragment();
case 3: return new DistributeFragment();
case 3: return new OthersFragment();
default: return null;
}
}
@ -37,7 +37,7 @@ namespace Contoso.Android.Puppet
case 0: return new String(mContext.GetString(Resource.String.AppCenterTitle));
case 1: return new String(mContext.GetString(Resource.String.AnalyticsTitle));
case 2: return new String(mContext.GetString(Resource.String.CrashesTitle));
case 3: return new String(mContext.GetString(Resource.String.DistributeTitle));
case 3: return new String(mContext.GetString(Resource.String.OthersTitle));
default: return null;
}
}

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

@ -0,0 +1,14 @@
using System;
using Android.App;
using Android.Content;
namespace Contoso.Android.Puppet
{
public static class Preferences
{
private const string SharedPreferencesName = "ContosoAppPrefs";
public static ISharedPreferences SharedPreferences =>
Application.Context.GetSharedPreferences(SharedPreferencesName, FileCreationMode.Private);
}
}

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

@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.microsoft.appcenter.xamarin.puppet" android:versionCode="41" android:versionName="1.0.1-SNAPSHOT" android:installLocation="auto">
<uses-sdk android:minSdkVersion="16" />
<application android:label="SXPuppet" android:icon="@drawable/Icon" android:theme="@style/PuppetTheme" />
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.microsoft.appcenter.xamarin.puppet" android:versionCode="43" android:versionName="1.1.0-SNAPSHOT" android:installLocation="auto">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26" />
<application android:label="SXPuppet" android:icon="@drawable/Icon" android:theme="@style/PuppetTheme">
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
</application>
</manifest>

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

@ -25,5 +25,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1-SNAPSHOT")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0-SNAPSHOT")]

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

@ -65,6 +65,11 @@
android:text="@string/CrashSuperNotCalled"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/crash_java_from_dotnet"
android:text="@string/CrashJavaFromDotNet"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
</LinearLayout>

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

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="@string/DistributeEnabled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp" />
<Switch
android:id="@+id/enabled_distribute"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>

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

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minWidth="25px"
android:minHeight="25px">
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp"
android:id="@+id/linearLayout3">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1">
<TextView
android:text="@string/DistributeEnabled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:id="@+id/textView1" />
<Switch
android:id="@+id/enabled_distribute"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:padding="8dp"
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1">
<TextView
android:text="@string/PushEnabled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:id="@+id/textView1" />
<Switch
android:id="@+id/enabled_push"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:padding="8dp"
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1">
<TextView
android:text="@string/FirebaseAnalyticsEnabled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:id="@+id/textView1" />
<Switch
android:id="@+id/enabled_firebase_analytics"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>

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

@ -4,7 +4,7 @@
<string name="AppCenterTitle">App Center</string>
<string name="AnalyticsTitle">Analytics</string>
<string name="CrashesTitle">Crashes</string>
<string name="DistributeTitle">Distribute</string>
<string name="OthersTitle">Others</string>
<string name="AppCenterEnabled">App Center Enabled</string>
<string name="AppCenterLogLevel">Log Level</string>
<string name="AppCenterLogMessage">Log Message</string>
@ -17,12 +17,15 @@
<string name="AnalyticsTrackEvent">Track Event</string>
<string name="CrashesEnabled">Crashes Enabled</string>
<string name="TestCrash">Generate Test Crash</string>
<string name="PushEnabled">Push Enabled</string>
<string name="FirebaseAnalyticsEnabled">Firebase Analytics Enabled</string>
<string name="DivideByZero">Divide 42 by 0</string>
<string name="CrashWithAggregateException">Crash With Aggregate Exception</string>
<string name="CrashWithNullReferenceException">Crash With NullReferenceException</string>
<string name="CatchNullReferenceException">Test Catching NullReferenceException</string>
<string name="CrashAsync">Crash Inside Async Task</string>
<string name="CrashSuperNotCalled">Crash Java: SuperNotCalledException</string>
<string name="CrashSuperNotCalled">Crash Pure Java: SuperNotCalledException</string>
<string name="CrashJavaFromDotNet">Crash Java from .NET</string>
<string name="DistributeEnabled">Distribute Enabled</string>
<string name="crash_confirmation_dialog_title">Unexpected crash found</string>
<string name="crash_confirmation_dialog_message">Would you like to send an anonymous report so we can fix the problem?</string>

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

@ -1,16 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Annotations" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Compat" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Core.UI" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Core.Utils" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Design" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Fragment" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Media.Compat" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Transition" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v7.AppCompat" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.v7.RecyclerView" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Support.Vector.Drawable" version="25.3.1" targetFramework="monoandroid71" />
<package id="Xamarin.Build.Download" version="0.4.4" targetFramework="monoandroid71" />
<package id="Xamarin.Android.Arch.Core.Common" version="1.0.0" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Arch.Lifecycle.Common" version="1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Arch.Lifecycle.Runtime" version="1.0.0" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Annotations" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Compat" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Core.UI" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Core.Utils" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Design" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Fragment" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Media.Compat" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Transition" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.v4" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.v7.AppCompat" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.v7.RecyclerView" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Vector.Drawable" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Build.Download" version="0.4.7" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Analytics" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Analytics.Impl" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Common" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Core" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Iid" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Messaging" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.GooglePlayServices.Basement" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.GooglePlayServices.Tasks" version="60.1142.0-beta2" targetFramework="monoandroid80" />
</packages>

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

@ -0,0 +1,4 @@
-dontwarn com.google.android.gms.**
-keep class com.google.firebase.provider.FirebaseInitProvider
-keep class com.google.firebase.iid.FirebaseInstanceIdReceiver
-keep class com.google.firebase.messaging.FirebaseMessagingService

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

@ -55,6 +55,7 @@
<Compile Include="MainActivity.cs" />
<Compile Include="Resources\Resource.designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="FilePicker.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\AboutResources.txt" />
@ -80,8 +81,5 @@
<ItemGroup>
<ProguardConfiguration Include="proguard.cfg" />
</ItemGroup>
<ItemGroup>
<GoogleServicesJson Include="google-services.json" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
</Project>

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

@ -0,0 +1,130 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Android.Content;
using Android.OS;
using Android.Provider;
using Android.Text.Format;
using Android.Webkit;
using Contoso.Forms.Demo.Droid;
using Xamarin.Forms;
// Make this class visible to the DependencyService manager.
[assembly: Dependency(typeof(FilePicker))]
namespace Contoso.Forms.Demo.Droid
{
public class FilePicker : IFilePicker
{
public Task<string> PickFile()
{
Intent intent;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
{
intent = new Intent(Intent.ActionOpenDocument);
intent.AddCategory(Intent.CategoryOpenable);
}
else
{
intent = new Intent(Intent.ActionGetContent);
}
intent.SetType("*/*");
var activity = Xamarin.Forms.Forms.Context as MainActivity;
activity.StartActivityForResult(Intent.CreateChooser(intent, "Select attachment file"), MainActivity.FileAttachmentId);
activity.FileAttachmentTaskCompletionSource = new TaskCompletionSource<string>();
return activity.FileAttachmentTaskCompletionSource.Task;
}
public Tuple<byte[], string, string> ReadFile(string file)
{
var uri = Android.Net.Uri.Parse(file);
var activity = Xamarin.Forms.Forms.Context as MainActivity;
// Data
byte[] data = null;
using (var inputStream = activity.ContentResolver.OpenInputStream(uri))
using (var memoryStream = new MemoryStream())
{
inputStream.CopyTo(memoryStream);
data = memoryStream.ToArray();
}
// Name
string name = "";
var cursor = activity.ContentResolver.Query(uri, null, null, null, null);
try
{
if (cursor != null && cursor.MoveToFirst())
{
var nameIndex = cursor.GetColumnIndex(OpenableColumns.DisplayName);
if (!cursor.IsNull(nameIndex))
{
name = cursor.GetString(nameIndex);
}
}
}
finally
{
cursor?.Close();
}
// Mime
string mime = null;
if (uri.Scheme == ContentResolver.SchemeContent)
{
mime = activity.ContentResolver.GetType(uri);
}
else
{
var extension = MimeTypeMap.GetFileExtensionFromUrl(file);
mime = MimeTypeMap.Singleton.GetMimeTypeFromExtension(extension.ToLower());
}
return new Tuple<byte[], string, string>(data, name, mime);
}
public string GetFileDescription(string file)
{
if (string.IsNullOrEmpty(file))
{
return null;
}
var uri = Android.Net.Uri.Parse(file);
var activity = Xamarin.Forms.Forms.Context as MainActivity;
string name = null;
string size = null;
var cursor = activity.ContentResolver.Query(uri, null, null, null, null);
try
{
if (cursor != null && cursor.MoveToFirst())
{
var nameIndex = cursor.GetColumnIndex(OpenableColumns.DisplayName);
var sizeIndex = cursor.GetColumnIndex(OpenableColumns.Size);
if (!cursor.IsNull(nameIndex))
{
name = cursor.GetString(nameIndex);
}
if (!cursor.IsNull(sizeIndex))
{
size = Formatter.FormatFileSize(activity, cursor.GetLong(sizeIndex));
}
}
}
finally
{
cursor?.Close();
}
string result = "";
if (name != null)
{
result += "File: " + name;
}
if (size != null)
{
result += " Size: " + size;
}
return result;
}
}
}

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

@ -1,4 +1,5 @@
using Android.App;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
@ -9,6 +10,10 @@ namespace Contoso.Forms.Demo.Droid
[Activity(Label = "ACFDemo", Icon = "@drawable/icon", Theme = "@style/MyTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static readonly int FileAttachmentId = 1;
public TaskCompletionSource<string> FileAttachmentTaskCompletionSource { set; get; }
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
@ -26,5 +31,19 @@ namespace Contoso.Forms.Demo.Droid
base.OnNewIntent(intent);
Push.CheckLaunchedFromNotification(this, intent);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == FileAttachmentId)
{
var uri = resultCode == Result.Ok && data != null ? data.Data : null;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat && uri != null)
{
ContentResolver.TakePersistableUriPermission(uri, data.Flags & ActivityFlags.GrantReadUriPermission);
}
FileAttachmentTaskCompletionSource.SetResult(uri?.ToString());
}
}
}
}

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

@ -5,7 +5,7 @@
"Microsoft.AppCenter.Distribute": "1.0.1",
"Microsoft.AppCenter.Push": "1.0.1",
"Xamarin.Build.Download": "0.4.7",
"Xamarin.Forms": "2.4.0.38779"
"Xamarin.Forms": "2.5.0.91635"
},
"frameworks": {
"MonoAndroid,Version=v8.0": {}

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

@ -5,4 +5,11 @@
xmlns:local="using:Contoso.Forms.Demo.UWP"
RequestedTheme="Light">
<!-- Remove force converting to lowercase titles of table section. -->
<Application.Resources>
<DataTemplate x:Key="TableSection">
<TextBlock Margin="0,20,0,0" Text="{Binding Title}" Style="{ThemeResource SubtitleTextBlockStyle}" Visibility="{Binding Text,RelativeSource={RelativeSource Mode=Self},Converter={StaticResource CollapseWhenEmpty}}" />
</DataTemplate>
</Application.Resources>
</Application>

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

До

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

После

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

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

До

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

После

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

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

До

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

После

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

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

До

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

После

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

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

До

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

После

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

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

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp">
<Identity Name="10805zumoTestUser.AppCenter-Contoso.Forms.Demo.UWP" Publisher="CN=B2D1C358-6AF8-4416-BF73-129CC1F3C152" Version="1.0.1.0" />
<mp:PhoneIdentity PhoneProductId="fbe02dcf-2c7d-4740-9c2b-0df5e15916e5" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
@ -15,10 +15,10 @@
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="Contoso.Forms.Demo.UWP.App">
<uap:VisualElements DisplayName="AppCenter-Contoso.Forms.Demo.UWP" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="Contoso.Forms.Demo.UWP" BackgroundColor="transparent">
<uap:VisualElements DisplayName="AppCenter Demo UWP" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="Contoso.Forms.Demo.UWP" BackgroundColor="transparent">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
</uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
<uap:SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="white" />
</uap:VisualElements>
</Application>
</Applications>

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

@ -5,7 +5,7 @@
"Microsoft.AppCenter.Distribute": "1.0.1",
"Microsoft.AppCenter.Push": "1.0.1",
"Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2",
"Xamarin.Forms": "2.4.0.38779"
"Xamarin.Forms": "2.5.0.91635"
},
"frameworks": {
"uap10.0.10586": {}

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

@ -117,6 +117,7 @@
<ItemGroup>
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
<Compile Include="FilePicker.cs" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\bolt%402x.png" />

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

@ -0,0 +1,78 @@
using System;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Contoso.Forms.Demo.iOS;
using Foundation;
using MobileCoreServices;
using Photos;
using UIKit;
using Xamarin.Forms;
// Make this class visible to the DependencyService manager.
[assembly: Dependency(typeof(FilePicker))]
namespace Contoso.Forms.Demo.iOS
{
public class FilePicker : IFilePicker
{
public async Task<string> PickFile()
{
var status = await PHPhotoLibrary.RequestAuthorizationAsync();
if (status != PHAuthorizationStatus.Authorized)
{
return null;
}
var taskCompletionSource = new TaskCompletionSource<string>();
var imagePicker = new UIImagePickerController();
imagePicker.FinishedPickingMedia += (sender, args) => {
taskCompletionSource.SetResult(args.ReferenceUrl?.AbsoluteString);
imagePicker.DismissModalViewController(true);
};
imagePicker.Canceled += (sender, args) => {
taskCompletionSource.SetResult(null);
imagePicker.DismissModalViewController(true);
};
UIWindow window = UIApplication.SharedApplication.KeyWindow;
var viewController = window.RootViewController;
viewController.PresentModalViewController(imagePicker, true);
return await taskCompletionSource.Task;
}
public Tuple<byte[], string, string> ReadFile(string file)
{
Tuple<byte[], string, string> result = null;
var asset = PHAsset.FetchAssets(new[] { new NSUrl(file) }, null).LastObject as PHAsset;
if (asset != null)
{
var options = new PHImageRequestOptions { Synchronous = true };
PHImageManager.DefaultManager.RequestImageData(asset, options,(data, dataUti, orientation, info) => {
var extension = new NSUrl(dataUti).PathExtension;
var uti = UTType.CreatePreferredIdentifier(UTType.TagClassFilenameExtension, extension, null);
var mime = UTType.GetPreferredTag(uti, UTType.TagClassMIMEType);
var dataBytes = new byte[data.Length];
Marshal.Copy(data.Bytes, dataBytes, 0, Convert.ToInt32(data.Length));
result = new Tuple<byte[], string, string>(dataBytes, dataUti, mime);
});
}
return result;
}
public string GetFileDescription(string file)
{
if (string.IsNullOrEmpty(file))
{
return null;
}
long fileSize = 0;
var asset = PHAsset.FetchAssets(new[] { new NSUrl(file) }, null).LastObject as PHAsset;
if (asset != null)
{
var options = new PHImageRequestOptions { Synchronous = true };
PHImageManager.DefaultManager.RequestImageData(asset, options, (data, dataUti, orientation, info) => {
fileSize = Convert.ToInt64(data.Length);
});
}
return NSByteCountFormatter.Format(fileSize, NSByteCountFormatterCountStyle.Binary);
}
}
}

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

@ -76,5 +76,7 @@
<array>
<string>remote-notification</string>
</array>
<key>NSPhotoLibraryUsageDescription</key>
<string>Select photo for attachment</string>
</dict>
</plist>

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

@ -4,7 +4,7 @@
"Microsoft.AppCenter.Crashes": "1.0.1",
"Microsoft.AppCenter.Distribute": "1.0.1",
"Microsoft.AppCenter.Push": "1.0.1",
"Xamarin.Forms": "2.4.0.38779"
"Xamarin.Forms": "2.5.0.91635"
},
"frameworks": {
"Xamarin.iOS,Version=v1.0": {}

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

@ -1,15 +1,17 @@
<?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="Contoso.Forms.Demo.AddPropertyContentPage">
<StackLayout Padding="20">
<StackLayout Orientation="Horizontal">
<Label Text="Property Name" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="NameEntry" />
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.AddPropertyContentPage">
<StackLayout Padding="20">
<StackLayout Orientation="Horizontal">
<Label Text="Property Name" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="NameEntry" />
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Property Value" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="ValueEntry" />
</StackLayout>
<Button Text="Add Property" Clicked="AddProperty" FontAttributes="Bold" Margin="0,20,0,0" />
<Button Text="Cancel" TextColor="Red" Clicked="Cancel" />
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Property Value" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="ValueEntry" />
</StackLayout>
<Button Text="Add Property" Clicked="AddProperty" />
<Button Text="Cancel" TextColor="Red" Clicked="Cancel" />
</StackLayout>
</ContentPage>

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

@ -12,16 +12,16 @@ namespace Contoso.Forms.Demo
InitializeComponent();
}
void AddProperty(object sender, EventArgs e)
async void AddProperty(object sender, EventArgs e)
{
Property addedProperty = new Property(NameEntry.Text, ValueEntry.Text);
PropertyAdded.Invoke(addedProperty);
Navigation.PopModalAsync();
await Navigation.PopModalAsync();
}
void Cancel(object sender, EventArgs e)
async void Cancel(object sender, EventArgs e)
{
Navigation.PopModalAsync();
await Navigation.PopModalAsync();
}
}
}

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

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Demo.App">
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.App">
<Application.Resources>
<!-- Application resource dictionary -->
</Application.Resources>

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

@ -1,6 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
@ -180,11 +180,36 @@ namespace Contoso.Forms.Demo
IEnumerable<ErrorAttachmentLog> GetErrorAttachments(ErrorReport report)
{
return new ErrorAttachmentLog[]
var attachments = new List<ErrorAttachmentLog>();
if (Current.Properties.TryGetValue(CrashesContentPage.TextAttachmentKey, out var textAttachment) &&
textAttachment is string text)
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
var attachment = ErrorAttachmentLog.AttachmentWithText(text, "hello.txt");
attachments.Add(attachment);
}
if (Current.Properties.TryGetValue(CrashesContentPage.FileAttachmentKey, out var fileAttachment) &&
fileAttachment is string file)
{
var filePicker = DependencyService.Get<IFilePicker>();
if (filePicker != null)
{
try
{
var result = filePicker.ReadFile(file);
if (result != null)
{
var attachment = ErrorAttachmentLog.AttachmentWithBinary(result.Item1, result.Item2, result.Item3);
attachments.Add(attachment);
}
}
catch (Exception e)
{
AppCenterLog.Warn(LogTag, "Couldn't read file attachment", e);
Current.Properties.Remove(CrashesContentPage.FileAttachmentKey);
}
}
}
return attachments;
}
bool OnReleaseAvailable(ReleaseDetails releaseDetails)

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

@ -62,6 +62,10 @@
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Views\TextAttachmentView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
@ -97,6 +101,10 @@
<Compile Include="ModulePages\CustomPropertiesContentPage.xaml.cs">
<DependentUpon>CustomPropertiesContentPage.xaml</DependentUpon>
</Compile>
<Compile Include="IFilePicker.cs" />
<Compile Include="Views\TextAttachmentView.xaml.cs">
<DependentUpon>TextAttachmentView.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="project.json" />

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

@ -5,9 +5,9 @@ namespace Contoso.Forms.Demo
{
static class FakeService
{
internal async static Task DoStuffInBackground()
internal static async Task DoStuffInBackground()
{
await Task.Run(() => { throw new IOException("Server did not respond"); });
await Task.Run(() => throw new IOException("Server did not respond"));
}
}
}

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

@ -0,0 +1,12 @@
using System;
using System.Threading.Tasks;
namespace Contoso.Forms.Demo
{
public interface IFilePicker
{
Task<string> PickFile();
Tuple<byte[], string, string> ReadFile(string file);
string GetFileDescription(string file);
}
}

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

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<TabbedPage Title="App Center Demo App" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Contoso.Forms.Demo;assembly=Contoso.Forms.Demo" x:Class="Contoso.Forms.Demo.MainDemoPage">
<TabbedPage Title="AppCenter Demo Application"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Contoso.Forms.Demo;assembly=Contoso.Forms.Demo"
x:Class="Contoso.Forms.Demo.MainDemoPage">
<local:AppCenterContentPage />
<local:AnalyticsContentPage />
<local:CrashesContentPage />

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

@ -1,23 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Analytics" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Demo.AnalyticsContentPage">
<TableView Intent="Form">
<TableSection>
<SwitchCell Text="Analytics Enabled" On="true" x:Name="EnabledSwitchCell" OnChanged="UpdateEnabled"/>
</TableSection>
<TableSection>
<EntryCell Label="Event Name" HorizontalTextAlignment="Start" x:Name="EventNameCell"/>
<ViewCell Tapped="PropertiesCellTapped">
<StackLayout Orientation="Horizontal" Margin="15,0,15,0">
<Label Text="Properties" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="0" HorizontalOptions="EndAndExpand" VerticalOptions="Center" x:Name="NumPropertiesLabel" />
</StackLayout>
</ViewCell>
<ViewCell Tapped="AddProperty">
<Button Text="Add Property" Clicked="AddProperty" InputTransparent="true"/>
</ViewCell>
<ViewCell Tapped="TrackEvent">
<Button Text="Track Event" InputTransparent="true" Clicked="TrackEvent"/>
</ViewCell>
</TableSection>
</TableView>
<ContentPage Title="Analytics"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.AnalyticsContentPage">
<TableView Intent="Form">
<TableSection Title="Analytics Settings">
<SwitchCell Text="Analytics Enabled" On="true" x:Name="EnabledSwitchCell" OnChanged="UpdateEnabled" />
</TableSection>
<TableSection Title="Tracking Events">
<EntryCell Label="Event Name" HorizontalTextAlignment="Start" x:Name="EventNameCell" />
<ViewCell Tapped="PropertiesCellTapped">
<StackLayout Orientation="Horizontal" Margin="15,0,15,0">
<Label Text="Properties" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="0" HorizontalOptions="EndAndExpand" VerticalOptions="Center" TextColor="Gray" x:Name="NumPropertiesLabel" />
</StackLayout>
</ViewCell>
<ViewCell Tapped="AddProperty">
<Button Text="Add Property" Clicked="AddProperty" InputTransparent="true" />
</ViewCell>
<ViewCell Tapped="TrackEvent">
<Button Text="Track Event" InputTransparent="true" Clicked="TrackEvent" FontAttributes="Bold" />
</ViewCell>
</TableSection>
</TableView>
</ContentPage>

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

@ -8,13 +8,14 @@ namespace Contoso.Forms.Demo
{
public class Property
{
public string Name { get; private set; }
public string Value { get; private set; }
public Property(string propertyName, string propertyValue)
{
Name = propertyName;
Value = propertyValue;
}
public string Name;
public string Value;
}
[Android.Runtime.Preserve(AllMembers = true)]

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

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="App Center" xmlns:local="clr-namespace:Contoso.Forms.Demo"
xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Demo.AppCenterContentPage">
<TableView Intent="Form">
<TableSection>
<SwitchCell Text="AppCenter Enabled" On="true" x:Name="AppCenterEnabledSwitchCell" OnChanged="UpdateEnabled"/>
</TableSection>
</TableView>
</ContentPage>
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.AppCenterContentPage">
<TableView Intent="Form">
<TableSection Title="AppCenter Settings">
<SwitchCell Text="AppCenter Enabled" On="true" x:Name="AppCenterEnabledSwitchCell" OnChanged="UpdateEnabled"/>
</TableSection>
</TableView>
</ContentPage>

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

@ -1,28 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Crashes"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.CrashesContentPage">
<TableView Intent="Form">
<TableSection>
<SwitchCell Text="Crashes Enabled" On="true" x:Name="CrashesEnabledSwitchCell" OnChanged="UpdateEnabled"/>
</TableSection>
<TableSection>
<ViewCell Tapped="TestCrash">
<Button Text="Generate Test Crash" InputTransparent="true" Clicked="TestCrash"/>
</ViewCell>
<ViewCell Tapped="DivideByZero">
<Button Text="Divide 42 by 0" InputTransparent="true" Clicked="DivideByZero"/>
</ViewCell>
<ViewCell Tapped="CrashWithAggregateException">
<Button Text="Crash With Aggregate Exception" InputTransparent="true" Clicked="CrashWithAggregateException"/>
</ViewCell>
<ViewCell Tapped="CrashWithNullReferenceException">
<Button Text="Crash With NullReferenceException" InputTransparent="true" Clicked="CrashWithNullReferenceException"/>
</ViewCell>
<ViewCell Tapped="CrashAsync">
<Button Text="Crash Inside Async Task" InputTransparent="true" Clicked="CrashAsync"/>
</ViewCell>
</TableSection>
</TableView>
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.CrashesContentPage">
<TableView Intent="Form">
<TableSection Title="Crashes Settings">
<SwitchCell Text="Crashes Enabled" On="true" x:Name="CrashesEnabledSwitchCell" OnChanged="UpdateEnabled"/>
<SwitchCell Text="Handle Exceptions" On="false" x:Name="HandleExceptionsSwitchCell"/>
</TableSection>
<TableSection Title="Attachments">
<TextCell Text="Text Attachment" x:Name="TextAttachmentCell" Tapped="TextAttachment"/>
<TextCell Text="Binary Attachment" x:Name="FileAttachmentCell" Tapped="FileAttachment"/>
</TableSection>
<TableSection Title="Test Crashes">
<ViewCell Tapped="TestCrash">
<Button Text="Generate Test Crash" InputTransparent="true" Clicked="TestCrash"/>
</ViewCell>
<ViewCell Tapped="DivideByZero">
<Button Text="Divide 42 by 0" InputTransparent="true" Clicked="DivideByZero"/>
</ViewCell>
<ViewCell Tapped="CrashWithAggregateException">
<Button Text="Crash With Aggregate Exception" InputTransparent="true" Clicked="CrashWithAggregateException"/>
</ViewCell>
<ViewCell Tapped="CrashWithNullReferenceException">
<Button Text="Crash With NullReferenceException" InputTransparent="true" Clicked="CrashWithNullReferenceException"/>
</ViewCell>
<ViewCell Tapped="CrashAsync">
<Button Text="Crash Inside Async Task" InputTransparent="true" Clicked="CrashAsync"/>
</ViewCell>
</TableSection>
</TableView>
</ContentPage>

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

@ -1,20 +1,27 @@
#define DEBUG
using System;
using System.Diagnostics;
using System.IO;
using Contoso.Forms.Demo.Views;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Crashes;
using Xamarin.Forms;
namespace Contoso.Forms.Demo
{
using XamarinDevice = Xamarin.Forms.Device;
[Android.Runtime.Preserve(AllMembers = true)]
public partial class CrashesContentPage
{
public const string TextAttachmentKey = "TEXT_ATTACHMENT";
public const string FileAttachmentKey = "FILE_ATTACHMENT";
public CrashesContentPage()
{
InitializeComponent();
if (Xamarin.Forms.Device.RuntimePlatform == Xamarin.Forms.Device.iOS)
if (XamarinDevice.RuntimePlatform == XamarinDevice.iOS)
{
Icon = "socket.png";
}
@ -25,6 +32,59 @@ namespace Contoso.Forms.Demo
base.OnAppearing();
CrashesEnabledSwitchCell.On = await Crashes.IsEnabledAsync();
CrashesEnabledSwitchCell.IsEnabled = await AppCenter.IsEnabledAsync();
// Attachments
if (Application.Current.Properties.TryGetValue(TextAttachmentKey, out var textAttachment) &&
textAttachment is string text)
{
TextAttachmentCell.Detail = text;
}
if (Application.Current.Properties.TryGetValue(FileAttachmentKey, out var fileAttachment) &&
fileAttachment is string file)
{
var filePicker = DependencyService.Get<IFilePicker>();
try
{
FileAttachmentCell.Detail = filePicker?.GetFileDescription(file);
}
catch (Exception e)
{
Debug.WriteLine("Couldn't read file attachment: {0}", e.Message);
Application.Current.Properties.Remove(FileAttachmentKey);
}
}
if (XamarinDevice.RuntimePlatform == XamarinDevice.UWP)
{
TextAttachmentCell.IsEnabled = false;
FileAttachmentCell.IsEnabled = false;
}
}
async void UpdateEnabled(object sender, ToggledEventArgs e)
{
await Crashes.SetEnabledAsync(e.Value);
}
async void TextAttachment(object sender, EventArgs e)
{
var text = await TextAttachmentView.Show(Navigation);
((TextCell)sender).Detail = text;
Application.Current.Properties[TextAttachmentKey] = text;
await Application.Current.SavePropertiesAsync();
}
async void FileAttachment(object sender, EventArgs e)
{
var filePicker = DependencyService.Get<IFilePicker>();
if (filePicker == null)
{
Debug.WriteLine("File attachment isn't implemented");
return;
}
var file = await filePicker.PickFile();
((TextCell)sender).Detail = filePicker.GetFileDescription(file);
Application.Current.Properties[FileAttachmentKey] = file;
await Application.Current.SavePropertiesAsync();
}
void TestCrash(object sender, EventArgs e)
@ -40,11 +100,6 @@ namespace Contoso.Forms.Demo
#pragma warning restore CS0219
}
async void UpdateEnabled(object sender, ToggledEventArgs e)
{
await Crashes.SetEnabledAsync(e.Value);
}
private void CrashWithNullReferenceException(object sender, EventArgs e)
{
TriggerNullReferenceException();
@ -54,9 +109,9 @@ namespace Contoso.Forms.Demo
{
string[] values = { "one", null, "two" };
for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
System.Diagnostics.Debug.WriteLine("{0}{1}", values[ctr].Trim(),
Debug.WriteLine("{0}{1}", values[ctr].Trim(),
ctr == values.GetUpperBound(0) ? "" : ", ");
System.Diagnostics.Debug.WriteLine("");
Debug.WriteLine("");
}
private void CrashWithAggregateException(object sender, EventArgs e)

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

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Custom Properties"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.CustomPropertiesContentPage">
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.CustomPropertiesContentPage">
<StackLayout Orientation="Vertical">
<ScrollView Orientation="Vertical">
<StackLayout Orientation="Vertical" x:Name="PropertiesContainer">
<StackLayout Orientation="Vertical" x:Name="PropertiesContainer" Padding="10">
</StackLayout>
</ScrollView>
<Button Text="Add property" Clicked="AddProperty_Clicked" x:Name="AddProperty"/>
<Button Text="Send" Clicked="Send_Clicked" x:Name="Send"/>
<Button Text="Add property" Clicked="AddProperty_Clicked" x:Name="AddProperty" Margin="0,20,0,0" />
<Button Text="Send" Clicked="Send_Clicked" x:Name="Send" FontAttributes="Bold" />
</StackLayout>
</ContentPage>

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

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Others"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.OthersContentPage">
<TableView Intent="Form">
<TableSection Title="Distribute">
<SwitchCell Text="Distribute Enabled" On="true" x:Name="DistributeEnabledSwitchCell" OnChanged="UpdateDistributeEnabled"/>
</TableSection>
<TableSection Title="Push">
<SwitchCell Text="Push Enabled" On="true" x:Name="PushEnabledSwitchCell" OnChanged="UpdatePushEnabled"/>
</TableSection>
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.OthersContentPage">
<TableView Intent="Form">
<TableSection Title="Distribute">
<SwitchCell Text="Distribute Enabled" On="true" x:Name="DistributeEnabledSwitchCell" OnChanged="UpdateDistributeEnabled"/>
</TableSection>
<TableSection Title="Push">
<SwitchCell Text="Push Enabled" On="true" x:Name="PushEnabledSwitchCell" OnChanged="UpdatePushEnabled"/>
</TableSection>
</TableView>
</ContentPage>

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

@ -22,11 +22,11 @@ namespace Contoso.Forms.Demo
protected override async void OnAppearing()
{
base.OnAppearing();
var mcEnabled = await AppCenter.IsEnabledAsync();
var acEnabled = await AppCenter.IsEnabledAsync();
DistributeEnabledSwitchCell.On = await Distribute.IsEnabledAsync();
DistributeEnabledSwitchCell.IsEnabled = mcEnabled;
DistributeEnabledSwitchCell.IsEnabled = acEnabled;
PushEnabledSwitchCell.On = await Push.IsEnabledAsync();
PushEnabledSwitchCell.IsEnabled = mcEnabled;
PushEnabledSwitchCell.IsEnabled = acEnabled;
}
async void UpdateDistributeEnabled(object sender, ToggledEventArgs e)

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

@ -1,6 +1,18 @@
<?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="Contoso.Forms.Demo.PropertiesContentPage">
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.PropertiesContentPage"
Title="Event Properties">
<ListView x:Name="PropertyList">
</ListView>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" Padding="10">
<Label Text="{Binding Name}" />
<Label Text="{Binding Value}" TextColor="Gray" HorizontalOptions="EndAndExpand" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>

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

@ -1,5 +1,4 @@
using System.Collections.Generic;
using Xamarin.Forms;
namespace Contoso.Forms.Demo
@ -9,17 +8,7 @@ namespace Contoso.Forms.Demo
public PropertiesContentPage(List<Property> EventProperties)
{
InitializeComponent();
Title = "Event Properties";
List<string> properties = new List<string>();
foreach (Property property in EventProperties)
{
string propertyString = property.Name + ": " + property.Value;
properties.Add(propertyString);
}
PropertyList.ItemsSource = properties;
PropertyList.ItemsSource = EventProperties;
}
}
}

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

@ -2,13 +2,20 @@
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Demo.CustomPropertyView">
<ContentView.Content>
<Frame OutlineColor="DarkGray">
<StackLayout Orientation="Vertical">
<Entry x:Name="PropertyKey"></Entry>
<Picker x:Name="PropertyType" SelectedIndexChanged="PropertyType_SelectedIndexChanged"></Picker>
<StackLayout x:Name="PropertyValueHolder"/>
<Frame OutlineColor="DarkGray">
<StackLayout Orientation="Vertical">
<StackLayout Orientation="Horizontal">
<Label Text="Key" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="60" />
<Entry HorizontalOptions="FillAndExpand" x:Name="PropertyKey" />
</StackLayout>
</Frame>
</ContentView.Content>
<StackLayout Orientation="Horizontal">
<Label Text="Type" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="60" />
<Picker HorizontalOptions="FillAndExpand" x:Name="PropertyType" SelectedIndexChanged="PropertyType_SelectedIndexChanged" />
</StackLayout>
<StackLayout Orientation="Horizontal" IsVisible="false" x:Name="PropertyValue">
<Label Text="Value" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="60" />
<StackLayout HorizontalOptions="FillAndExpand" x:Name="PropertyValueHolder" />
</StackLayout>
</StackLayout>
</Frame>
</ContentView>

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

@ -24,7 +24,8 @@ namespace Contoso.Forms.Demo
{
properties.Clear(PropertyKey.Text);
}
else {
else
{
View view = PropertyValueHolder.Children[0];
switch ((PropertyTypes)PropertyType.SelectedIndex)
{
@ -38,7 +39,8 @@ namespace Contoso.Forms.Demo
}
break;
case PropertyTypes.DateTime:
DateTime date = new DateTime(DatePicker.Date.Year, DatePicker.Date.Month, DatePicker.Date.Day, TimePicker.Time.Hours, TimePicker.Time.Minutes, TimePicker.Time.Seconds);
DateTime date = new DateTime(DatePicker.Date.Year, DatePicker.Date.Month, DatePicker.Date.Day,
TimePicker.Time.Hours, TimePicker.Time.Minutes, TimePicker.Time.Seconds);
properties.Set(PropertyKey.Text, date);
break;
case PropertyTypes.String:
@ -60,26 +62,31 @@ namespace Contoso.Forms.Demo
private void PropertyType_SelectedIndexChanged(object sender, EventArgs e)
{
PropertyValueHolder.Children.Clear();
switch ((PropertyTypes) PropertyType.SelectedIndex)
PropertyValue.IsVisible = false;
switch ((PropertyTypes)PropertyType.SelectedIndex)
{
case PropertyTypes.Boolean:
PropertyValueHolder.Children.Add(new Switch());
PropertyValue.IsVisible = true;
break;
case PropertyTypes.Number:
Editor NumberEditor = new Editor() { Keyboard = Keyboard.Numeric};
Editor NumberEditor = new Editor() { Keyboard = Keyboard.Numeric };
NumberEditor.TextChanged += NumberEditor_TextChanged;
PropertyValueHolder.Children.Add(NumberEditor);
PropertyValue.IsVisible = true;
break;
case PropertyTypes.DateTime:
StackLayout DateTimeLayout = new StackLayout() { Orientation = StackOrientation.Vertical};
StackLayout DateTimeLayout = new StackLayout() { Orientation = StackOrientation.Vertical };
DatePicker = new DatePicker() { Date = DateTime.Now };
DateTimeLayout.Children.Add(DatePicker);
TimePicker = new TimePicker() { Time = DateTime.Now.TimeOfDay };
DateTimeLayout.Children.Add(TimePicker);
PropertyValueHolder.Children.Add(DateTimeLayout);
PropertyValue.IsVisible = true;
break;
case PropertyTypes.String:
PropertyValueHolder.Children.Add(new Editor());
PropertyValue.IsVisible = true;
break;
}
}

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

@ -0,0 +1,15 @@
<?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="Contoso.Forms.Demo.Views.TextAttachmentView">
<StackLayout Orientation="Vertical" VerticalOptions="StartAndExpand" Padding="20">
<Label Text="Text Attachment" HorizontalOptions="Center" FontAttributes="Bold" Margin="10" />
<Frame Padding="5">
<Editor x:Name="Text" HeightRequest="100" />
</Frame>
<StackLayout Orientation="Horizontal" HorizontalOptions="Center" >
<Button WidthRequest="100" Text="OK" Clicked="OK" FontAttributes="Bold" />
<Button WidthRequest="100" Text="Cancel" Clicked="Cancel" />
</StackLayout>
</StackLayout>
</ContentPage>

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

@ -0,0 +1,44 @@
using System;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace Contoso.Forms.Demo.Views
{
public partial class TextAttachmentView : ContentPage
{
private readonly TaskCompletionSource<string> _taskCompletionSource = new TaskCompletionSource<string>();
private INavigation _navigation;
public TextAttachmentView()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
Text.Focus();
}
public static Task<string> Show(INavigation navegation)
{
var view = new TextAttachmentView();
view._navigation = navegation;
navegation.PushModalAsync(view);
return view._taskCompletionSource.Task;
}
async void OK(object sender, EventArgs args)
{
var result = Text.Text;
await _navigation.PopModalAsync();
_taskCompletionSource.SetResult(result);
}
async void Cancel(object sender, EventArgs args)
{
await _navigation.PopModalAsync();
_taskCompletionSource.SetResult(null);
}
}
}

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

@ -5,7 +5,7 @@
"Microsoft.AppCenter.Distribute": "1.0.1",
"Microsoft.AppCenter.Push": "1.0.1",
"NETStandard.Library": "1.6.1",
"Xamarin.Forms": "2.4.0.38779"
"Xamarin.Forms": "2.5.0.91635"
},
"frameworks": {
"netstandard1.0": {}

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

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.props" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.props')" />
<Import Project="..\..\..\packages\Xamarin.Forms.2.5.0.121934\build\netstandard1.0\Xamarin.Forms.props" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.5.0.121934\build\netstandard1.0\Xamarin.Forms.props')" />
<Import Project="..\..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.props" Condition="Exists('..\..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -45,7 +45,7 @@
<WarningLevel>4</WarningLevel>
<AndroidManagedSymbols>true</AndroidManagedSymbols>
<AndroidLinkMode>Full</AndroidLinkMode>
<AndroidLinkSkip>Xamarin.Android.Support.v7.AppCompat;Xamarin.Android.Support.Core.UI</AndroidLinkSkip>
<AndroidLinkSkip>Xamarin.Android.Support.v7.AppCompat;Xamarin.Android.Support.Core.UI;Microsoft.AppCenter.Crashes</AndroidLinkSkip>
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
<AndroidSupportedAbis>armeabi-v7a;armeabi;x86;arm64-v8a;x86_64</AndroidSupportedAbis>
<EnableProguard>true</EnableProguard>
@ -63,27 +63,6 @@
<Reference Include="HockeySDK">
<HintPath>..\..\..\packages\HockeySDK.Xamarin.5.0.0\lib\MonoAndroid403\HockeySDK.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Basement">
<HintPath>..\..\..\packages\Xamarin.GooglePlayServices.Basement.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.GooglePlayServices.Basement.dll</HintPath>
</Reference>
<Reference Include="Xamarin.GooglePlayServices.Tasks">
<HintPath>..\..\..\packages\Xamarin.GooglePlayServices.Tasks.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.GooglePlayServices.Tasks.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Common">
<HintPath>..\..\..\packages\Xamarin.Firebase.Common.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Common.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Iid">
<HintPath>..\..\..\packages\Xamarin.Firebase.Iid.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Iid.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Analytics.Impl">
<HintPath>..\..\..\packages\Xamarin.Firebase.Analytics.Impl.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Analytics.Impl.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Analytics">
<HintPath>..\..\..\packages\Xamarin.Firebase.Analytics.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Analytics.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Firebase.Messaging">
<HintPath>..\..\..\packages\Xamarin.Firebase.Messaging.60.1142.0-beta2\lib\MonoAndroid80\Xamarin.Firebase.Messaging.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Annotations">
<HintPath>..\..\..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.Annotations.dll</HintPath>
</Reference>
@ -142,25 +121,26 @@
<HintPath>..\..\..\packages\Xamarin.Android.Support.v7.MediaRouter.26.1.0.1\lib\MonoAndroid80\Xamarin.Android.Support.v7.MediaRouter.dll</HintPath>
</Reference>
<Reference Include="FormsViewGroup">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\MonoAndroid10\FormsViewGroup.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.121934\lib\MonoAndroid10\FormsViewGroup.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Core">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.121934\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform.Android">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.121934\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.121934\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.121934\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="MainActivity.cs" />
<Compile Include="Resources\Resource.designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="FilePicker.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Properties\AndroidManifest.xml" />
@ -236,22 +216,8 @@
<ItemGroup>
<AndroidEnvironment Include="AndroidEnvironment.cfg" />
</ItemGroup>
<ItemGroup>
<GoogleServicesJson Include="google-services.json" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<Import Project="..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\build\Xamarin.Android.Support.Vector.Drawable.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\build\Xamarin.Android.Support.Vector.Drawable.targets')" />
<Import Project="..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets')" />
<Import Project="..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\build\Xamarin.Android.Support.Vector.Drawable.targets" Condition="Exists('..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\build\Xamarin.Android.Support.Vector.Drawable.targets')" />
<Import Project="..\..\packages\Xamarin.Forms.2.3.3.163-pre3\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.3.163-pre3\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
<Import Project="..\..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.targets" Condition="Exists('..\..\..\packages\Xamarin.Build.Download.0.4.7\build\Xamarin.Build.Download.targets')" />
<Import Project="..\..\..\packages\Xamarin.GooglePlayServices.Basement.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Basement.targets" Condition="Exists('..\..\..\packages\Xamarin.GooglePlayServices.Basement.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Basement.targets')" />
<Import Project="..\..\..\packages\Xamarin.GooglePlayServices.Tasks.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Tasks.targets" Condition="Exists('..\..\..\packages\Xamarin.GooglePlayServices.Tasks.60.1142.0-beta2\build\MonoAndroid80\Xamarin.GooglePlayServices.Tasks.targets')" />
<Import Project="..\..\..\packages\Xamarin.Firebase.Common.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Common.targets" Condition="Exists('..\..\..\packages\Xamarin.Firebase.Common.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Common.targets')" />
<Import Project="..\..\..\packages\Xamarin.Firebase.Iid.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Iid.targets" Condition="Exists('..\..\..\packages\Xamarin.Firebase.Iid.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Iid.targets')" />
<Import Project="..\..\..\packages\Xamarin.Firebase.Analytics.Impl.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.Impl.targets" Condition="Exists('..\..\..\packages\Xamarin.Firebase.Analytics.Impl.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.Impl.targets')" />
<Import Project="..\..\..\packages\Xamarin.Firebase.Analytics.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.targets" Condition="Exists('..\..\..\packages\Xamarin.Firebase.Analytics.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Analytics.targets')" />
<Import Project="..\..\..\packages\Xamarin.Firebase.Messaging.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Messaging.targets" Condition="Exists('..\..\..\packages\Xamarin.Firebase.Messaging.60.1142.0-beta2\build\MonoAndroid80\Xamarin.Firebase.Messaging.targets')" />
<Import Project="..\..\..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets" Condition="Exists('..\..\..\packages\Xamarin.Android.Support.Annotations.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Annotations.targets')" />
<Import Project="..\..\..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets" Condition="Exists('..\..\..\packages\Xamarin.Android.Arch.Core.Common.1.0.0\build\MonoAndroid80\Xamarin.Android.Arch.Core.Common.targets')" />
<Import Project="..\..\..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets" Condition="Exists('..\..\..\packages\Xamarin.Android.Arch.Lifecycle.Common.1.0.1\build\MonoAndroid80\Xamarin.Android.Arch.Lifecycle.Common.targets')" />
@ -271,5 +237,5 @@
<Import Project="..\..\..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets" Condition="Exists('..\..\..\packages\Xamarin.Android.Support.v7.AppCompat.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.AppCompat.targets')" />
<Import Project="..\..\..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets" Condition="Exists('..\..\..\packages\Xamarin.Android.Support.Design.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.Design.targets')" />
<Import Project="..\..\..\packages\Xamarin.Android.Support.v7.MediaRouter.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.MediaRouter.targets" Condition="Exists('..\..\..\packages\Xamarin.Android.Support.v7.MediaRouter.26.1.0.1\build\MonoAndroid80\Xamarin.Android.Support.v7.MediaRouter.targets')" />
<Import Project="..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.targets" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.targets')" />
<Import Project="..\..\..\packages\Xamarin.Forms.2.5.0.121934\build\netstandard1.0\Xamarin.Forms.targets" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.5.0.121934\build\netstandard1.0\Xamarin.Forms.targets')" />
</Project>

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

@ -0,0 +1,130 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Android.Content;
using Android.OS;
using Android.Provider;
using Android.Text.Format;
using Android.Webkit;
using Contoso.Forms.Puppet.Droid;
using Xamarin.Forms;
// Make this class visible to the DependencyService manager.
[assembly: Dependency(typeof(FilePicker))]
namespace Contoso.Forms.Puppet.Droid
{
public class FilePicker : IFilePicker
{
public Task<string> PickFile()
{
Intent intent;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
{
intent = new Intent(Intent.ActionOpenDocument);
intent.AddCategory(Intent.CategoryOpenable);
}
else
{
intent = new Intent(Intent.ActionGetContent);
}
intent.SetType("*/*");
var activity = Xamarin.Forms.Forms.Context as MainActivity;
activity.StartActivityForResult(Intent.CreateChooser(intent, "Select attachment file"), MainActivity.FileAttachmentId);
activity.FileAttachmentTaskCompletionSource = new TaskCompletionSource<string>();
return activity.FileAttachmentTaskCompletionSource.Task;
}
public Tuple<byte[], string, string> ReadFile(string file)
{
var uri = Android.Net.Uri.Parse(file);
var activity = Xamarin.Forms.Forms.Context as MainActivity;
// Data
byte[] data = null;
using (var inputStream = activity.ContentResolver.OpenInputStream(uri))
using (var memoryStream = new MemoryStream())
{
inputStream.CopyTo(memoryStream);
data = memoryStream.ToArray();
}
// Name
string name = "";
var cursor = activity.ContentResolver.Query(uri, null, null, null, null);
try
{
if (cursor != null && cursor.MoveToFirst())
{
var nameIndex = cursor.GetColumnIndex(OpenableColumns.DisplayName);
if (!cursor.IsNull(nameIndex))
{
name = cursor.GetString(nameIndex);
}
}
}
finally
{
cursor?.Close();
}
// Mime
string mime = null;
if (uri.Scheme == ContentResolver.SchemeContent)
{
mime = activity.ContentResolver.GetType(uri);
}
else
{
var extension = MimeTypeMap.GetFileExtensionFromUrl(file);
mime = MimeTypeMap.Singleton.GetMimeTypeFromExtension(extension.ToLower());
}
return new Tuple<byte[], string, string>(data, name, mime);
}
public string GetFileDescription(string file)
{
if (string.IsNullOrEmpty(file))
{
return null;
}
var uri = Android.Net.Uri.Parse(file);
var activity = Xamarin.Forms.Forms.Context as MainActivity;
string name = null;
string size = null;
var cursor = activity.ContentResolver.Query(uri, null, null, null, null);
try
{
if (cursor != null && cursor.MoveToFirst())
{
var nameIndex = cursor.GetColumnIndex(OpenableColumns.DisplayName);
var sizeIndex = cursor.GetColumnIndex(OpenableColumns.Size);
if (!cursor.IsNull(nameIndex))
{
name = cursor.GetString(nameIndex);
}
if (!cursor.IsNull(sizeIndex))
{
size = Formatter.FormatFileSize(activity, cursor.GetLong(sizeIndex));
}
}
}
finally
{
cursor?.Close();
}
string result = "";
if (name != null)
{
result += "File: " + name;
}
if (size != null)
{
result += " Size: " + size;
}
return result;
}
}
}

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

@ -1,4 +1,6 @@
using Android.App;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Com.Microsoft.Appcenter.Analytics;
@ -14,6 +16,10 @@ namespace Contoso.Forms.Puppet.Droid
[Activity(Label = "ACFPuppet", Icon = "@drawable/icon", Theme = "@style/PuppetTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, LaunchMode = LaunchMode.SingleTop)]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static readonly int FileAttachmentId = 1;
public TaskCompletionSource<string> FileAttachmentTaskCompletionSource { set; get; }
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
@ -24,7 +30,7 @@ namespace Contoso.Forms.Puppet.Droid
Xamarin.Forms.Forms.Init(this, savedInstanceState);
AndroidAnalytics.SetListener(new AndroidAnalyticsListener());
Push.SetSenderId("177539951155");
LoadApplication(new App());
}
@ -35,11 +41,25 @@ namespace Contoso.Forms.Puppet.Droid
CrashManager.Register(this, "2c7e569100194bafa2a30f5c648d44fe");
}
protected override void OnNewIntent(Android.Content.Intent intent)
protected override void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
Push.CheckLaunchedFromNotification(this, intent);
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == FileAttachmentId)
{
var uri = resultCode == Result.Ok && data != null ? data.Data : null;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat && uri != null)
{
ContentResolver.TakePersistableUriPermission(uri, data.Flags & ActivityFlags.GrantReadUriPermission);
}
FileAttachmentTaskCompletionSource.SetResult(uri?.ToString());
}
}
}
public class AndroidAnalyticsListener : Java.Lang.Object, IAnalyticsListener
@ -60,3 +80,4 @@ namespace Contoso.Forms.Puppet.Droid
}
}
}

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

@ -1,14 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="42" android:versionName="1.0.1-SNAPSHOT" package="com.microsoft.appcenter.xamarin.forms.puppet">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="44" android:versionName="1.1.0-SNAPSHOT" package="com.microsoft.appcenter.xamarin.forms.puppet">
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />
<application android:label="ACFPuppet">
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<permission android:name="${applicationId}.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<application android:label="ACFPuppet" />
</manifest>

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

@ -19,8 +19,8 @@ using Android.App;
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1-SNAPSHOT")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0-SNAPSHOT")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.

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

@ -1,5 +1,6 @@
#!/usr/bin/env bash
echo "Executing post clone script in `pwd`"
pushd $APPCENTER_SOURCE_DIRECTORY
sed -i '' "s/NUGET_PASSWORD/$NUGET_PASSWORD/g" NuGet.config
echo $GOOGLE_SERVICES_JSON | base64 -D > Apps/Contoso.Forms.Puppet/Contoso.Forms.Puppet.Droid/google-services.json
./build.sh -t=externals-android
popd

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

@ -21,13 +21,5 @@
<package id="Xamarin.Android.Support.v7.RecyclerView" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Android.Support.Vector.Drawable" version="26.1.0.1" targetFramework="monoandroid80" />
<package id="Xamarin.Build.Download" version="0.4.7" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Analytics" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Analytics.Impl" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Common" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Core" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Iid" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Firebase.Messaging" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Forms" version="2.4.0.38779" targetFramework="monoandroid80" />
<package id="Xamarin.GooglePlayServices.Basement" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.GooglePlayServices.Tasks" version="60.1142.0-beta2" targetFramework="monoandroid80" />
<package id="Xamarin.Forms" version="2.5.0.121934" targetFramework="monoandroid80" />
</packages>

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

@ -1,9 +1 @@
-dontwarn com.google.android.gms.**
-dontwarn android.app.NotificationManager
-dontwarn android.app.NotificationChannel
-dontwarn android.app.Notification$Builder
-dontwarn android.content.pm.PackageManager
-keep class com.google.firebase.provider.FirebaseInitProvider
-keep class com.google.firebase.iid.FirebaseInstanceIdReceiver
-keep class com.microsoft.appcenter.push.TokenService
-keep class com.microsoft.appcenter.push.PushMessagingService
-dontwarn com.microsoft.appcenter.push.**

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

@ -5,4 +5,11 @@
xmlns:local="using:Contoso.Forms.Puppet.UWP"
RequestedTheme="Light">
<!-- Remove force converting to lowercase titles of table section. -->
<Application.Resources>
<DataTemplate x:Key="TableSection">
<TextBlock Margin="0,20,0,0" Text="{Binding Title}" Style="{ThemeResource SubtitleTextBlockStyle}" Visibility="{Binding Text,RelativeSource={RelativeSource Mode=Self},Converter={StaticResource CollapseWhenEmpty}}" />
</DataTemplate>
</Application.Resources>
</Application>

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

До

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

После

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

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

До

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

После

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

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

До

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

После

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

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

До

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

После

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

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

До

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

После

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

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

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp">
<Identity Name="10805zumoTestUser.AppCenter-Contoso.Forms.Puppet.U" Publisher="CN=B2D1C358-6AF8-4416-BF73-129CC1F3C152" Version="1.0.1.0" />
<Identity Name="10805zumoTestUser.AppCenter-Contoso.Forms.Puppet.U" Publisher="CN=B2D1C358-6AF8-4416-BF73-129CC1F3C152" Version="1.1.0.0" />
<mp:PhoneIdentity PhoneProductId="55497ed8-b2ac-4485-ba79-e2b65bb720ed" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties>
<DisplayName>AppCenter-Contoso.Forms.Puppet.UWP</DisplayName>
@ -15,10 +15,10 @@
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="Contoso.Forms.Puppet.UWP.App">
<uap:VisualElements DisplayName="AppCenter-Contoso.Forms.Puppet.UWP" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="Contoso.Forms.Puppet.UWP" BackgroundColor="transparent">
<uap:VisualElements DisplayName="AppCenter Puppet UWP" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="Contoso.Forms.Puppet.UWP" BackgroundColor="white">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
</uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
<uap:SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="white" />
</uap:VisualElements>
</Application>
</Applications>

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

@ -24,5 +24,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: ComVisible(false)]

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

@ -1,7 +1,7 @@
{
"dependencies": {
"Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2",
"Xamarin.Forms": "2.4.0.38779"
"Xamarin.Forms": "2.5.0.91635"
},
"frameworks": {
"uap10.0": {}

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

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.props" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.props')" />
<Import Project="..\..\..\packages\Xamarin.Forms.2.5.0.91635\build\netstandard1.0\Xamarin.Forms.props" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.5.0.91635\build\netstandard1.0\Xamarin.Forms.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform>
@ -58,6 +58,7 @@
<MtouchArch>i386, x86_64</MtouchArch>
<MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
<MtouchTlsProvider>Default</MtouchTlsProvider>
<MtouchExtraArgs>--linkskip=Microsoft.AppCenter.Crashes</MtouchExtraArgs>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
<DebugSymbols>true</DebugSymbols>
@ -85,16 +86,16 @@
<Reference Include="System.Core" />
<Reference Include="Xamarin.iOS" />
<Reference Include="Xamarin.Forms.Core">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform.iOS">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Xaml">
<HintPath>..\..\..\packages\Xamarin.Forms.2.4.0.38779\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll</HintPath>
<HintPath>..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
@ -118,6 +119,7 @@
<ItemGroup>
<Compile Include="Main.cs" />
<Compile Include="AppDelegate.cs" />
<Compile Include="FilePicker.cs" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\bolt%402x.png" />
@ -175,5 +177,5 @@
<Import Project="..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets" Condition="Exists('..\packages\Xamarin.Forms.2.3.2.127\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\Xamarin.Forms.targets')" />
<Import Project="..\..\packages\Xamarin.Forms.2.3.3.163-pre3\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\..\packages\Xamarin.Forms.2.3.3.163-pre3\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
<Import Project="..\..\..\packages\Xamarin.Forms.2.3.3.168\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.3.3.168\build\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+Xamarin.iOS10+xamarinmac20\Xamarin.Forms.targets')" />
<Import Project="..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.targets" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.4.0.38779\build\netstandard1.0\Xamarin.Forms.targets')" />
<Import Project="..\..\..\packages\Xamarin.Forms.2.5.0.91635\build\netstandard1.0\Xamarin.Forms.targets" Condition="Exists('..\..\..\packages\Xamarin.Forms.2.5.0.91635\build\netstandard1.0\Xamarin.Forms.targets')" />
</Project>

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

@ -0,0 +1,78 @@
using System;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Contoso.Forms.Puppet.iOS;
using Foundation;
using MobileCoreServices;
using Photos;
using UIKit;
using Xamarin.Forms;
// Make this class visible to the DependencyService manager.
[assembly: Dependency(typeof(FilePicker))]
namespace Contoso.Forms.Puppet.iOS
{
public class FilePicker : IFilePicker
{
public async Task<string> PickFile()
{
var status = await PHPhotoLibrary.RequestAuthorizationAsync();
if (status != PHAuthorizationStatus.Authorized)
{
return null;
}
var taskCompletionSource = new TaskCompletionSource<string>();
var imagePicker = new UIImagePickerController();
imagePicker.FinishedPickingMedia += (sender, args) => {
taskCompletionSource.SetResult(args.ReferenceUrl?.AbsoluteString);
imagePicker.DismissModalViewController(true);
};
imagePicker.Canceled += (sender, args) => {
taskCompletionSource.SetResult(null);
imagePicker.DismissModalViewController(true);
};
UIWindow window = UIApplication.SharedApplication.KeyWindow;
var viewController = window.RootViewController;
viewController.PresentModalViewController(imagePicker, true);
return await taskCompletionSource.Task;
}
public Tuple<byte[], string, string> ReadFile(string file)
{
Tuple<byte[], string, string> result = null;
var asset = PHAsset.FetchAssets(new[] { new NSUrl(file) }, null).LastObject as PHAsset;
if (asset != null)
{
var options = new PHImageRequestOptions { Synchronous = true };
PHImageManager.DefaultManager.RequestImageData(asset, options,(data, dataUti, orientation, info) => {
var extension = new NSUrl(dataUti).PathExtension;
var uti = UTType.CreatePreferredIdentifier(UTType.TagClassFilenameExtension, extension, null);
var mime = UTType.GetPreferredTag(uti, UTType.TagClassMIMEType);
var dataBytes = new byte[data.Length];
Marshal.Copy(data.Bytes, dataBytes, 0, Convert.ToInt32(data.Length));
result = new Tuple<byte[], string, string>(dataBytes, dataUti, mime);
});
}
return result;
}
public string GetFileDescription(string file)
{
if (string.IsNullOrEmpty(file))
{
return null;
}
long fileSize = 0;
var asset = PHAsset.FetchAssets(new[] { new NSUrl(file) }, null).LastObject as PHAsset;
if (asset != null)
{
var options = new PHImageRequestOptions { Synchronous = true };
PHImageManager.DefaultManager.RequestImageData(asset, options, (data, dataUti, orientation, info) => {
fileSize = Convert.ToInt64(data.Length);
});
}
return NSByteCountFormatter.Format(fileSize, NSByteCountFormatterCountStyle.Binary);
}
}
}

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

@ -5,9 +5,9 @@
<key>CFBundleIdentifier</key>
<string>com.microsoft.appcenter.xamarin.forms.puppet</string>
<key>CFBundleShortVersionString</key>
<string>1.0.1</string>
<string>1.1.0</string>
<key>CFBundleVersion</key>
<string>1.0.1</string>
<string>1.1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>MinimumOSVersion</key>
@ -76,5 +76,7 @@
<array>
<string>remote-notification</string>
</array>
<key>NSPhotoLibraryUsageDescription</key>
<string>Select photo for attachment</string>
</dict>
</plist>

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

@ -1,4 +1,6 @@
#!/usr/bin/env bash
echo "Executing post clone script in `pwd`"
pushd $APPCENTER_SOURCE_DIRECTORY
sed -i '' "s/NUGET_PASSWORD/$NUGET_PASSWORD/g" NuGet.config
./build.sh -t=externals-ios
popd

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

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Xamarin.Forms" version="2.4.0.38779" targetFramework="xamarinios10" />
<package id="Xamarin.Forms" version="2.5.0.91635" targetFramework="xamarinios10" />
</packages>

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

@ -1,15 +1,17 @@
<?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="Contoso.Forms.Puppet.AddPropertyContentPage">
<StackLayout Padding="20">
<StackLayout Orientation="Horizontal">
<Label Text="Property Name" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="NameEntry" />
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.AddPropertyContentPage">
<StackLayout Padding="20">
<StackLayout Orientation="Horizontal">
<Label Text="Property Name" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="NameEntry" />
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Property Value" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="ValueEntry" />
</StackLayout>
<Button Text="Add Property" Clicked="AddProperty" FontAttributes="Bold" Margin="0,20,0,0" />
<Button Text="Cancel" TextColor="Red" Clicked="Cancel" />
</StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Property Value" HorizontalOptions="Start" VerticalOptions="Center" WidthRequest="120" />
<Entry HorizontalOptions="FillAndExpand" x:Name="ValueEntry" />
</StackLayout>
<Button Text="Add Property" Clicked="AddProperty" />
<Button Text="Cancel" TextColor="Red" Clicked="Cancel" />
</StackLayout>
</ContentPage>

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

@ -1,12 +1,12 @@
using System;
using Xamarin.Forms;
namespace Contoso.Forms.Puppet
{
[Android.Runtime.Preserve(AllMembers = true)]
public partial class AddPropertyContentPage : ContentPage
public partial class AddPropertyContentPage
{
public event Action<Property> PropertyAdded;
public AddPropertyContentPage()
{
InitializeComponent();

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

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Puppet.App">
<Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.App">
<Application.Resources>
<!-- Application resource dictionary -->
</Application.Resources>

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

@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
@ -23,17 +22,29 @@ namespace Contoso.Forms.Puppet
private const string AndroidKey = "bff0949b-7970-439d-9745-92cdc59b10fe";
private const string IosKey = "b889c4f2-9ac2-4e2e-ae16-dae54f2c5899";
static App()
{
// Set event handlers in static constructor to avoid duplication
Crashes.SendingErrorReport += SendingErrorReportHandler;
Crashes.SentErrorReport += SentErrorReportHandler;
Crashes.FailedToSendErrorReport += FailedToSendErrorReportHandler;
Push.PushNotificationReceived += PrintNotification;
}
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new MainPuppetPage());
}
protected override void OnStart()
{
AppCenterLog.Assert(LogTag, "AppCenter.LogLevel=" + AppCenter.LogLevel);
AppCenter.LogLevel = LogLevel.Verbose;
AppCenterLog.Info(LogTag, "AppCenter.LogLevel=" + AppCenter.LogLevel);
AppCenterLog.Info(LogTag, "AppCenter.Configured=" + AppCenter.Configured);
// set callbacks
// Set callbacks
Crashes.ShouldProcessErrorReport = ShouldProcess;
Crashes.ShouldAwaitUserConfirmation = ConfirmationHandler;
Crashes.GetErrorAttachments = GetErrorAttachments;
@ -41,27 +52,11 @@ namespace Contoso.Forms.Puppet
AppCenterLog.Assert(LogTag, "AppCenter.Configured=" + AppCenter.Configured);
AppCenter.SetLogUrl("https://in-integration.dev.avalanch.es");
Distribute.SetInstallUrl("http://install.asgard-int.trafficmanager.net");
Distribute.SetApiUrl("https://asgard-int.trafficmanager.net/api/v0.1");
Distribute.SetInstallUrl("http://install.appcenter-int.trafficmanager.net");
Distribute.SetApiUrl("https://appcenter-int.trafficmanager.net/api/v0.1");
RealUserMeasurements.SetRumKey("b1919553367d44d8b0ae72594c74e0ff");
AppCenter.Start($"uwp={UwpKey};android={AndroidKey};ios={IosKey}",
typeof(Analytics), typeof(Crashes), typeof(Distribute), typeof(Push), typeof(RealUserMeasurements));
// Need to use reflection because moving this to the Android specific
// code causes crash. (Unable to access properties before init is called).
if (Xamarin.Forms.Device.RuntimePlatform == Xamarin.Forms.Device.Android)
{
if (!Properties.ContainsKey(OthersContentPage.FirebaseEnabledKey))
{
Properties[OthersContentPage.FirebaseEnabledKey] = false;
}
if ((bool)Properties[OthersContentPage.FirebaseEnabledKey])
{
typeof(Push).GetRuntimeMethod("EnableFirebaseAnalytics", new Type[0]).Invoke(null, null);
}
}
AppCenter.IsEnabledAsync().ContinueWith(enabled =>
{
AppCenterLog.Info(LogTag, "AppCenter.Enabled=" + enabled.Result);
@ -81,15 +76,6 @@ namespace Contoso.Forms.Puppet
});
}
static App()
{
// set event handlers in static constructor to avoid duplication
Crashes.SendingErrorReport += SendingErrorReportHandler;
Crashes.SentErrorReport += SentErrorReportHandler;
Crashes.FailedToSendErrorReport += FailedToSendErrorReportHandler;
Push.PushNotificationReceived += PrintNotification;
}
static void PrintNotification(object sender, PushNotificationReceivedEventArgs e)
{
Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
@ -109,7 +95,7 @@ namespace Contoso.Forms.Puppet
var report = e.Report;
//test some values
// Test some values
if (report.Exception != null)
{
AppCenterLog.Info(LogTag, report.Exception.ToString());
@ -126,7 +112,7 @@ namespace Contoso.Forms.Puppet
var report = e.Report;
//test some values
// Test some values
if (report.Exception != null)
{
AppCenterLog.Info(LogTag, report.Exception.ToString());
@ -148,7 +134,7 @@ namespace Contoso.Forms.Puppet
var report = e.Report;
//test some values
// Test some values
if (report.Exception != null)
{
AppCenterLog.Info(LogTag, report.Exception.ToString());
@ -200,12 +186,36 @@ namespace Contoso.Forms.Puppet
static IEnumerable<ErrorAttachmentLog> GetErrorAttachments(ErrorReport report)
{
return new[]
var attachments = new List<ErrorAttachmentLog>();
if (Current.Properties.TryGetValue(CrashesContentPage.TextAttachmentKey, out var textAttachment) &&
textAttachment is string text)
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
null,
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
var attachment = ErrorAttachmentLog.AttachmentWithText(text, "hello.txt");
attachments.Add(attachment);
}
if (Current.Properties.TryGetValue(CrashesContentPage.FileAttachmentKey, out var fileAttachment) &&
fileAttachment is string file)
{
var filePicker = DependencyService.Get<IFilePicker>();
if (filePicker != null)
{
try
{
var result = filePicker.ReadFile(file);
if (result != null)
{
var attachment = ErrorAttachmentLog.AttachmentWithBinary(result.Item1, result.Item2, result.Item3);
attachments.Add(attachment);
}
}
catch (Exception e)
{
AppCenterLog.Warn(LogTag, "Couldn't read file attachment", e);
Current.Properties.Remove(CrashesContentPage.FileAttachmentKey);
}
}
}
return attachments;
}
bool OnReleaseAvailable(ReleaseDetails releaseDetails)

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

@ -60,11 +60,16 @@
<EmbeddedResource Include="ModulePages\OthersContentPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
<EmbeddedResource Include="Views\TextAttachmentView.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="IFilePicker.cs" />
<Compile Include="MainPuppetPage.cs">
<DependentUpon>MainPuppetPage.xaml</DependentUpon>
</Compile>
@ -99,6 +104,9 @@
</Compile>
<Compile Include="FakeService.cs" />
<Compile Include="PreserveAttribute.cs" />
<Compile Include="Views\TextAttachmentView.xaml.cs">
<DependentUpon>TextAttachmentView.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="project.json" />

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

@ -5,9 +5,9 @@ namespace Contoso.Forms.Puppet
{
static class FakeService
{
internal async static Task DoStuffInBackground()
internal static async Task DoStuffInBackground()
{
await Task.Run(() => { throw new IOException("Server did not respond"); });
await Task.Run(() => throw new IOException("Server did not respond"));
}
}
}

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

@ -0,0 +1,12 @@
using System;
using System.Threading.Tasks;
namespace Contoso.Forms.Puppet
{
public interface IFilePicker
{
Task<string> PickFile();
Tuple<byte[], string, string> ReadFile(string file);
string GetFileDescription(string file);
}
}

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

@ -1,11 +1,11 @@
using Microsoft.AppCenter;
using System;
using System;
using System.Collections.Generic;
using Microsoft.AppCenter;
using Xamarin.Forms;
namespace Contoso.Forms.Puppet
{
public partial class LogLevelPage : ContentPage
public partial class LogLevelPage
{
private Dictionary<string, LogLevel> LogLevels;
public event Action<LogLevel> LevelSelected;
@ -23,11 +23,11 @@ namespace Contoso.Forms.Puppet
LogLevels.Add(Constants.Error, LogLevel.Error);
}
void UpdateLogLevel(object sender, System.EventArgs e)
void UpdateLogLevel(object sender, EventArgs e)
{
string level = ((TextCell)sender).Text;
LevelSelected.Invoke(LogLevels[level]);
((NavigationPage)App.Current.MainPage).PopAsync();
string level = ((Button)sender).Text;
LevelSelected?.Invoke(LogLevels[level]);
((NavigationPage)Application.Current.MainPage).PopAsync();
}
}
}

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

@ -1,14 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Contoso.Forms.Puppet" x:Class="Contoso.Forms.Puppet.LogLevelPage">
<ContentPage.Content>
<TableView Intent="Form">
<TableSection>
<TextCell Tapped="UpdateLogLevel" Text="{x:Static local:Constants.Verbose}" />
<TextCell Tapped="UpdateLogLevel" Text="{x:Static local:Constants.Debug}" />
<TextCell Tapped="UpdateLogLevel" Text="{x:Static local:Constants.Info}" />
<TextCell Tapped="UpdateLogLevel" Text="{x:Static local:Constants.Warning}" />
<TextCell Tapped="UpdateLogLevel" Text="{x:Static local:Constants.Error}" />
</TableSection>
</TableView>
</ContentPage.Content>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Contoso.Forms.Puppet"
x:Class="Contoso.Forms.Puppet.LogLevelPage">
<StackLayout Padding="20">
<Button Clicked="UpdateLogLevel" Text="{x:Static local:Constants.Verbose}" />
<Button Clicked="UpdateLogLevel" Text="{x:Static local:Constants.Debug}" />
<Button Clicked="UpdateLogLevel" Text="{x:Static local:Constants.Info}" />
<Button Clicked="UpdateLogLevel" Text="{x:Static local:Constants.Warning}" />
<Button Clicked="UpdateLogLevel" Text="{x:Static local:Constants.Error}" />
</StackLayout>
</ContentPage>

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

@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TabbedPage Title="App Center Puppet App" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Contoso.Forms.Puppet;assembly=Contoso.Forms.Puppet" x:Class="Contoso.Forms.Puppet.MainPuppetPage">
<TabbedPage Title="AppCenter Puppet Application"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Contoso.Forms.Puppet;assembly=Contoso.Forms.Puppet"
x:Class="Contoso.Forms.Puppet.MainPuppetPage">
<local:AppCenterContentPage/>
<local:AnalyticsContentPage/>
<local:CrashesContentPage/>
<local:AnalyticsContentPage/>
<local:CrashesContentPage/>
<local:CustomPropertiesContentPage/>
<local:OthersContentPage/>
<local:OthersContentPage/>
</TabbedPage>

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

@ -1,23 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Analytics" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Puppet.AnalyticsContentPage">
<TableView Intent="Form">
<TableSection>
<SwitchCell Text="Analytics Enabled" On="true" x:Name="EnabledSwitchCell" OnChanged="UpdateEnabled"/>
</TableSection>
<TableSection>
<EntryCell Label="Event Name" HorizontalTextAlignment="Start" x:Name="EventNameCell"/>
<ViewCell Tapped="PropertiesCellTapped">
<StackLayout Orientation="Horizontal" Margin="15,0,15,0">
<Label Text="Properties" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="0" HorizontalOptions="EndAndExpand" VerticalOptions="Center" x:Name="NumPropertiesLabel" />
</StackLayout>
</ViewCell>
<ViewCell Tapped="AddProperty">
<Button Text="Add Property" Clicked="AddProperty" InputTransparent="true"/>
</ViewCell>
<ViewCell Tapped="TrackEvent">
<Button Text="Track Event" InputTransparent="true" Clicked="TrackEvent"/>
</ViewCell>
</TableSection>
</TableView>
<ContentPage Title="Analytics"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.AnalyticsContentPage">
<TableView Intent="Form">
<TableSection Title="Analytics Settings">
<SwitchCell Text="Analytics Enabled" On="true" x:Name="EnabledSwitchCell" OnChanged="UpdateEnabled" />
</TableSection>
<TableSection Title="Tracking Events">
<EntryCell Label="Event Name" HorizontalTextAlignment="Start" x:Name="EventNameCell" />
<ViewCell Tapped="PropertiesCellTapped">
<StackLayout Orientation="Horizontal" Margin="15,0,15,0">
<Label Text="Properties" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="0" HorizontalOptions="EndAndExpand" VerticalOptions="Center" TextColor="Gray" x:Name="NumPropertiesLabel" />
</StackLayout>
</ViewCell>
<ViewCell Tapped="AddProperty">
<Button Text="Add Property" Clicked="AddProperty" InputTransparent="true" />
</ViewCell>
<ViewCell Tapped="TrackEvent">
<Button Text="Track Event" InputTransparent="true" Clicked="TrackEvent" FontAttributes="Bold" />
</ViewCell>
</TableSection>
</TableView>
</ContentPage>

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

@ -8,13 +8,14 @@ namespace Contoso.Forms.Puppet
{
public class Property
{
public string Name { get; private set; }
public string Value { get; private set; }
public Property(string propertyName, string propertyValue)
{
Name = propertyName;
Value = propertyValue;
}
public string Name;
public string Value;
}
[Android.Runtime.Preserve(AllMembers = true)]

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

@ -1,27 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="App Center" xmlns:local="clr-namespace:Contoso.Forms.Puppet"
xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Puppet.AppCenterContentPage">
<ContentPage Title="App Center"
xmlns:local="clr-namespace:Contoso.Forms.Puppet"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Puppet.AppCenterContentPage">
<TableView Intent="Form">
<TableSection>
<TableSection Title="AppCenter Settings">
<SwitchCell Text="App Center Enabled" On="true" x:Name="AppCenterEnabledSwitchCell" OnChanged="UpdateEnabled"/>
</TableSection>
<TableSection>
<ViewCell Tapped="LogLevelCellTapped">
<StackLayout Orientation="Horizontal" Margin="15,0,15,0">
<Label Text="Log level" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="Log Level" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="Verbose" HorizontalOptions="EndAndExpand" VerticalOptions="Center" TextColor="Gray" x:Name="LogLevelLabel" />
</StackLayout>
</ViewCell>
</TableSection>
<TableSection>
<TableSection Title="Logging">
<EntryCell Label="Log Message" x:Name="LogMessageEntryCell"/>
<EntryCell Label="Log Tag" x:Name="LogTagEntryCell"/>
<ViewCell Tapped="LogWriteLevelCellTapped">
<StackLayout Orientation="Horizontal" Margin="15,0,15,0">
<Label Text="Log Level" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="{x:Static local:Constants.Verbose}" HorizontalOptions="EndAndExpand" VerticalOptions="Center" TextColor="Gray" x:Name="LogWriteLevelLabel" />
</StackLayout>
</ViewCell>
<ViewCell Tapped="LogWriteLevelCellTapped">
<StackLayout Orientation="Horizontal" Margin="15,0,15,0">
<Label Text="Log Level" HorizontalOptions="StartAndExpand" VerticalOptions="Center" />
<Label Text="{x:Static local:Constants.Verbose}" HorizontalOptions="EndAndExpand" VerticalOptions="Center" TextColor="Gray" x:Name="LogWriteLevelLabel" />
</StackLayout>
</ViewCell>
<ViewCell Tapped="WriteLog">
<Button Text="Write Log" InputTransparent="true" Clicked="WriteLog"/>
</ViewCell>

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

@ -1,6 +1,6 @@
using Microsoft.AppCenter;
using System;
using System;
using System.Collections.Generic;
using Microsoft.AppCenter;
using Xamarin.Forms;
namespace Contoso.Forms.Puppet
@ -70,7 +70,7 @@ namespace Contoso.Forms.Puppet
((NavigationPage)Application.Current.MainPage).PushAsync(page);
}
void WriteLog(object sender, System.EventArgs e)
void WriteLog(object sender, EventArgs e)
{
string message = LogMessageEntryCell.Text;
string tag = LogTagEntryCell.Text;

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

@ -1,32 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Crashes"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.CrashesContentPage">
<TableView Intent="Form">
<TableSection>
<SwitchCell Text="Crashes Enabled" On="true" x:Name="CrashesEnabledSwitchCell" OnChanged="UpdateEnabled"/>
<SwitchCell Text="Handle Exceptions" On="false" x:Name="HandleExceptionsSwitchCell"/>
</TableSection>
<TableSection>
<ViewCell Tapped="TestException">
<Button Text="Generate Test Exception" InputTransparent="true" Clicked="TestException"/>
</ViewCell>
<ViewCell Tapped="DivideByZero">
<Button Text="Divide 42 by 0" InputTransparent="true" Clicked="DivideByZero"/>
</ViewCell>
<ViewCell Tapped="AggregateException">
<Button Text="Aggregate Exception" InputTransparent="true" Clicked="AggregateException"/>
</ViewCell>
<ViewCell Tapped="NullReferenceException">
<Button Text="NullReferenceException" InputTransparent="true" Clicked="NullReferenceException"/>
</ViewCell>
<ViewCell Tapped="CatchNullReferenceException">
<Button Text="Test Catching NullReferenceException" InputTransparent="true" Clicked="CatchNullReferenceException"/>
</ViewCell>
<ViewCell Tapped="AsyncException">
<Button Text="Exception Inside Async Task" InputTransparent="true" Clicked="AsyncException"/>
</ViewCell>
</TableSection>
</TableView>
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.CrashesContentPage">
<TableView Intent="Form">
<TableSection Title="Crashes Settings">
<SwitchCell Text="Crashes Enabled" On="true" x:Name="CrashesEnabledSwitchCell" OnChanged="UpdateEnabled"/>
<SwitchCell Text="Handle Exceptions" On="false" x:Name="HandleExceptionsSwitchCell"/>
</TableSection>
<TableSection Title="Attachments">
<TextCell Text="Text Attachment" x:Name="TextAttachmentCell" Tapped="TextAttachment"/>
<TextCell Text="Binary Attachment" x:Name="FileAttachmentCell" Tapped="FileAttachment"/>
</TableSection>
<TableSection Title="Test Crashes">
<ViewCell Tapped="TestException">
<Button Text="Generate Test Exception" InputTransparent="true" Clicked="TestException"/>
</ViewCell>
<ViewCell Tapped="DivideByZero">
<Button Text="Divide 42 by 0" InputTransparent="true" Clicked="DivideByZero"/>
</ViewCell>
<ViewCell Tapped="AggregateException">
<Button Text="Aggregate Exception" InputTransparent="true" Clicked="AggregateException"/>
</ViewCell>
<ViewCell Tapped="NullReferenceException">
<Button Text="NullReferenceException" InputTransparent="true" Clicked="NullReferenceException"/>
</ViewCell>
<ViewCell Tapped="CatchNullReferenceException">
<Button Text="Test Catching NullReferenceException" InputTransparent="true" Clicked="CatchNullReferenceException"/>
</ViewCell>
<ViewCell Tapped="AsyncException">
<Button Text="Exception Inside Async Task" InputTransparent="true" Clicked="AsyncException"/>
</ViewCell>
</TableSection>
</TableView>
</ContentPage>

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

@ -1,19 +1,26 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using Contoso.Forms.Puppet.Views;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Crashes;
using Xamarin.Forms;
namespace Contoso.Forms.Puppet
{
using XamarinDevice = Xamarin.Forms.Device;
[Android.Runtime.Preserve(AllMembers = true)]
public partial class CrashesContentPage
{
public const string TextAttachmentKey = "TEXT_ATTACHMENT";
public const string FileAttachmentKey = "FILE_ATTACHMENT";
public CrashesContentPage()
{
InitializeComponent();
if (Xamarin.Forms.Device.RuntimePlatform == Xamarin.Forms.Device.iOS)
if (XamarinDevice.RuntimePlatform == XamarinDevice.iOS)
{
Icon = "socket.png";
}
@ -24,6 +31,32 @@ namespace Contoso.Forms.Puppet
base.OnAppearing();
CrashesEnabledSwitchCell.On = await Crashes.IsEnabledAsync();
CrashesEnabledSwitchCell.IsEnabled = await AppCenter.IsEnabledAsync();
// Attachments
if (Application.Current.Properties.TryGetValue(TextAttachmentKey, out var textAttachment) &&
textAttachment is string text)
{
TextAttachmentCell.Detail = text;
}
if (Application.Current.Properties.TryGetValue(FileAttachmentKey, out var fileAttachment) &&
fileAttachment is string file)
{
var filePicker = DependencyService.Get<IFilePicker>();
try
{
FileAttachmentCell.Detail = filePicker?.GetFileDescription(file);
}
catch (Exception e)
{
Debug.WriteLine("Couldn't read file attachment: {0}", e.Message);
Application.Current.Properties.Remove(FileAttachmentKey);
}
}
if (XamarinDevice.RuntimePlatform == XamarinDevice.UWP)
{
TextAttachmentCell.IsEnabled = false;
FileAttachmentCell.IsEnabled = false;
}
}
async void UpdateEnabled(object sender, ToggledEventArgs e)
@ -31,6 +64,28 @@ namespace Contoso.Forms.Puppet
await Crashes.SetEnabledAsync(e.Value);
}
async void TextAttachment(object sender, EventArgs e)
{
var text = await TextAttachmentView.Show(Navigation);
((TextCell)sender).Detail = text;
Application.Current.Properties[TextAttachmentKey] = text;
await Application.Current.SavePropertiesAsync();
}
async void FileAttachment(object sender, EventArgs e)
{
var filePicker = DependencyService.Get<IFilePicker>();
if (filePicker == null)
{
Debug.WriteLine("File attachment isn't implemented");
return;
}
var file = await filePicker.PickFile();
((TextCell)sender).Detail = filePicker.GetFileDescription(file);
Application.Current.Properties[FileAttachmentKey] = file;
await Application.Current.SavePropertiesAsync();
}
void HandleOrThrow(Action action)
{
try
@ -64,7 +119,7 @@ namespace Contoso.Forms.Puppet
}
catch (NullReferenceException)
{
System.Diagnostics.Debug.WriteLine("null reference exception");
Debug.WriteLine("null reference exception");
}
}
@ -80,9 +135,9 @@ namespace Contoso.Forms.Puppet
{
var val = values[ctr].Trim();
var separator = ctr == values.GetUpperBound(0) ? "" : ", ";
System.Diagnostics.Debug.WriteLine("{0}{1}", val, separator);
Debug.WriteLine("{0}{1}", val, separator);
}
System.Diagnostics.Debug.WriteLine("");
Debug.WriteLine("");
}
void AggregateException(object sender, EventArgs e)

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

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Custom Properties"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.CustomPropertiesContentPage">
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.CustomPropertiesContentPage">
<StackLayout Orientation="Vertical">
<ScrollView Orientation="Vertical">
<StackLayout Orientation="Vertical" x:Name="PropertiesContainer">
<StackLayout Orientation="Vertical" x:Name="PropertiesContainer" Padding="10">
</StackLayout>
</ScrollView>
<Button Text="Add property" Clicked="AddProperty_Clicked" x:Name="AddProperty"/>
<Button Text="Send" Clicked="Send_Clicked" x:Name="Send"/>
<Button Text="Add property" Clicked="AddProperty_Clicked" x:Name="AddProperty" Margin="0,20,0,0" />
<Button Text="Send" Clicked="Send_Clicked" x:Name="Send" FontAttributes="Bold" />
</StackLayout>
</ContentPage>

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

@ -1,18 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage Title="Others"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.OthersContentPage">
<TableView Intent="Form">
<TableSection Title="Distribute">
<SwitchCell Text="Distribute Enabled" On="true" x:Name="DistributeEnabledSwitchCell" OnChanged="UpdateDistributeEnabled"/>
</TableSection>
<TableSection Title="Push">
<SwitchCell Text="Push Enabled" On="true" x:Name="PushEnabledSwitchCell" OnChanged="UpdatePushEnabled"/>
<SwitchCell Text="Firebase Analytics Enabled" On="true" x:Name="FirebaseAnalyticsEnabledSwitchCell" OnChanged="UpdateFirebaseAnalyticsEnabled"/>
</TableSection>
<TableSection Title="Rum">
<SwitchCell Text="Rum Enabled" On="true" x:Name="RumEnabledSwitchCell" OnChanged="UpdateRumEnabled"/>
</TableSection>
</TableView>
<ContentPage Title="Others" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Contoso.Forms.Puppet.OthersContentPage">
<TableView Intent="Form">
<TableSection Title="Distribute">
<SwitchCell Text="Distribute Enabled" On="true" x:Name="DistributeEnabledSwitchCell" OnChanged="UpdateDistributeEnabled" />
</TableSection>
<TableSection Title="Push">
<SwitchCell Text="Push Enabled" On="true" x:Name="PushEnabledSwitchCell" OnChanged="UpdatePushEnabled" />
</TableSection>
<TableSection Title="Rum">
<SwitchCell Text="Rum Enabled" On="true" x:Name="RumEnabledSwitchCell" OnChanged="UpdateRumEnabled" />
</TableSection>
</TableView>
</ContentPage>

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

@ -11,9 +11,6 @@ namespace Contoso.Forms.Puppet
[Android.Runtime.Preserve(AllMembers = true)]
public partial class OthersContentPage
{
public const string FirebaseEnabledKey = "FIREBASE_ENABLED";
public OthersContentPage()
{
InitializeComponent();
@ -21,11 +18,6 @@ namespace Contoso.Forms.Puppet
{
Icon = "handbag.png";
}
if (XamarinDevice.RuntimePlatform != XamarinDevice.Android)
{
FirebaseAnalyticsEnabledSwitchCell.On = false;
FirebaseAnalyticsEnabledSwitchCell.IsEnabled = false;
}
}
protected override async void OnAppearing()
@ -36,14 +28,6 @@ namespace Contoso.Forms.Puppet
DistributeEnabledSwitchCell.IsEnabled = acEnabled;
PushEnabledSwitchCell.On = await Push.IsEnabledAsync();
PushEnabledSwitchCell.IsEnabled = acEnabled;
if (XamarinDevice.RuntimePlatform == XamarinDevice.Android)
{
if (!Application.Current.Properties.ContainsKey(FirebaseEnabledKey))
{
Application.Current.Properties[FirebaseEnabledKey] = false;
}
FirebaseAnalyticsEnabledSwitchCell.On = (bool)Application.Current.Properties[FirebaseEnabledKey];
}
RumEnabledSwitchCell.On = await RealUserMeasurements.IsEnabledAsync();
RumEnabledSwitchCell.IsEnabled = acEnabled;
}
@ -58,11 +42,6 @@ namespace Contoso.Forms.Puppet
await Push.SetEnabledAsync(e.Value);
}
void UpdateFirebaseAnalyticsEnabled(object sender, ToggledEventArgs e)
{
Application.Current.Properties[FirebaseEnabledKey] = e.Value;
}
async void UpdateRumEnabled(object sender, ToggledEventArgs e)
{
await RealUserMeasurements.SetEnabledAsync(e.Value);

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

@ -17,8 +17,8 @@ using System.Reflection;
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1-SNAPSHOT")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0-SNAPSHOT")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.

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

@ -1,6 +1,18 @@
<?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="Contoso.Forms.Puppet.PropertiesContentPage">
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Contoso.Forms.Puppet.PropertiesContentPage"
Title="Event Properties">
<ListView x:Name="PropertyList">
</ListView>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Horizontal" Padding="10">
<Label Text="{Binding Name}" />
<Label Text="{Binding Value}" TextColor="Gray" HorizontalOptions="EndAndExpand" />
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>

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

@ -1,5 +1,4 @@
using System.Collections.Generic;
using Xamarin.Forms;
namespace Contoso.Forms.Puppet
@ -9,17 +8,7 @@ namespace Contoso.Forms.Puppet
public PropertiesContentPage(List<Property> EventProperties)
{
InitializeComponent();
Title = "Event Properties";
List<string> properties = new List<string>();
foreach (Property property in EventProperties)
{
string propertyString = property.Name + ": " + property.Value;
properties.Add(propertyString);
}
PropertyList.ItemsSource = properties;
PropertyList.ItemsSource = EventProperties;
}
}
}

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