diff --git a/MvvmCross.Plugins.sln b/MvvmCross.Plugins.sln index 4c2f3332..8f718ba2 100644 --- a/MvvmCross.Plugins.sln +++ b/MvvmCross.Plugins.sln @@ -305,6 +305,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmCross.Plugins.Email.Win EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmCross.Plugins.Email.WindowsUWP", "Email\MvvmCross.Plugins.Email.WindowsUWP\MvvmCross.Plugins.Email.WindowsUWP.csproj", "{645DE858-1C4C-4F7B-98A5-070EE1D331E6}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Permissions", "Permissions", "{8209CF8F-801C-4982-A398-A3EAF99D4BCC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MvvmCross.Plugins.Permissions", "Permissions\Core\MvvmCross.Plugins.Permissions.csproj", "{B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -2333,6 +2337,22 @@ Global {645DE858-1C4C-4F7B-98A5-070EE1D331E6}.Release|x64.Build.0 = Release|x64 {645DE858-1C4C-4F7B-98A5-070EE1D331E6}.Release|x86.ActiveCfg = Release|x86 {645DE858-1C4C-4F7B-98A5-070EE1D331E6}.Release|x86.Build.0 = Release|x86 + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|ARM.Build.0 = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|x64.ActiveCfg = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|x64.Build.0 = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|x86.ActiveCfg = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Debug|x86.Build.0 = Debug|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|Any CPU.Build.0 = Release|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|ARM.ActiveCfg = Release|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|ARM.Build.0 = Release|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|x64.ActiveCfg = Release|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|x64.Build.0 = Release|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|x86.ActiveCfg = Release|Any CPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2464,5 +2484,6 @@ Global {0B08507A-DA49-4069-B8CF-0FB0B7895B21} = {EB7A7EA9-995D-44EC-A4C9-7936BD6DF759} {D381A63C-994E-48FB-A32E-B3667BFEFC84} = {83DC5338-32A2-47D1-974E-1F3ACC600A03} {645DE858-1C4C-4F7B-98A5-070EE1D331E6} = {83DC5338-32A2-47D1-974E-1F3ACC600A03} + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841} = {8209CF8F-801C-4982-A398-A3EAF99D4BCC} EndGlobalSection EndGlobal diff --git a/Permissions/Core/IMvxPermissions.cs b/Permissions/Core/IMvxPermissions.cs new file mode 100644 index 00000000..804fbecd --- /dev/null +++ b/Permissions/Core/IMvxPermissions.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MvvmCross.Plugins.Permissions +{ + public interface IMvxPermissions + { + Task ShouldShowRequestPermissionRationaleAsync(MvxPermission permission); + Task CheckPermissionStatusAsync(MvxPermission permission); + Task> RequestPermissionsAsync(params MvxPermission[] permissions); + } +} diff --git a/Permissions/Core/MvvmCross.Plugins.Permissions.csproj b/Permissions/Core/MvvmCross.Plugins.Permissions.csproj new file mode 100644 index 00000000..edb7c5cc --- /dev/null +++ b/Permissions/Core/MvvmCross.Plugins.Permissions.csproj @@ -0,0 +1,74 @@ + + + + + 10.0 + Debug + AnyCPU + {B3B46E7E-CDA2-4297-8700-6E8EBBE3A841} + Library + Properties + MvvmCross.Plugins.Permissions + MvvmCross.Plugins.Permissions + en-US + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Profile111 + v4.5 + + + true + full + false + ..\..\bin\Debug\Mvx\Portable\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\bin\Release\Mvx\Portable\ + TRACE + prompt + 4 + + + + + + + + + + + + + ..\..\packages\MvvmCross.Core.4.1.0\lib\portable-net45+win+wpa81+wp80\MvvmCross.Core.dll + True + + + ..\..\packages\MvvmCross.Platform.4.1.0\lib\portable-net45+win+wpa81+wp80\MvvmCross.Platform.dll + True + + + ..\..\packages\Plugin.Permissions.1.1.7\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.Permissions.dll + True + + + ..\..\packages\Plugin.Permissions.1.1.7\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10\Plugin.Permissions.Abstractions.dll + True + + + + + + + + \ No newline at end of file diff --git a/Permissions/Core/MvxPermission.cs b/Permissions/Core/MvxPermission.cs new file mode 100644 index 00000000..f10330dc --- /dev/null +++ b/Permissions/Core/MvxPermission.cs @@ -0,0 +1,18 @@ +namespace MvvmCross.Plugins.Permissions +{ + public enum MvxPermission + { + Unknown, + Calendar, + Camera, + Contacts, + Location, + Microphone, + Phone, + Photos, + Reminders, + Sensors, + Sms, + Storage + } +} \ No newline at end of file diff --git a/Permissions/Core/MvxPermissionExtensions.cs b/Permissions/Core/MvxPermissionExtensions.cs new file mode 100644 index 00000000..9f525c9f --- /dev/null +++ b/Permissions/Core/MvxPermissionExtensions.cs @@ -0,0 +1,103 @@ +using Plugin.Permissions.Abstractions; + +namespace MvvmCross.Plugins.Permissions +{ + public static class MvxPermissionExtensions + { + public static Permission ToPermission(this MvxPermission permission) + { + switch (permission) + { + case MvxPermission.Calendar: + return Permission.Calendar; + case MvxPermission.Camera: + return Permission.Camera; + case MvxPermission.Contacts: + return Permission.Contacts; + case MvxPermission.Location: + return Permission.Location; + case MvxPermission.Microphone: + return Permission.Microphone; + case MvxPermission.Phone: + return Permission.Phone; + case MvxPermission.Photos: + return Permission.Photos; + case MvxPermission.Reminders: + return Permission.Reminders; + case MvxPermission.Sensors: + return Permission.Sensors; + case MvxPermission.Sms: + return Permission.Sms; + case MvxPermission.Storage: + return Permission.Storage; + default: + return Permission.Unknown; + } + } + + public static PermissionStatus ToPermissionStatus(this MvxPermissionStatus permissionStatus) + { + switch (permissionStatus) + { + case MvxPermissionStatus.Denied: + return PermissionStatus.Denied; + case MvxPermissionStatus.Disabled: + return PermissionStatus.Disabled; + case MvxPermissionStatus.Granted: + return PermissionStatus.Granted; + case MvxPermissionStatus.Restricted: + return PermissionStatus.Restricted; + default: + return PermissionStatus.Unknown; + } + } + + public static MvxPermission ToMvxPermission(this Permission permission) + { + switch (permission) + { + case Permission.Calendar: + return MvxPermission.Calendar; + case Permission.Camera: + return MvxPermission.Camera; + case Permission.Contacts: + return MvxPermission.Contacts; + case Permission.Location: + return MvxPermission.Location; + case Permission.Microphone: + return MvxPermission.Microphone; + case Permission.Phone: + return MvxPermission.Phone; + case Permission.Photos: + return MvxPermission.Photos; + case Permission.Reminders: + return MvxPermission.Reminders; + case Permission.Sensors: + return MvxPermission.Sensors; + case Permission.Sms: + return MvxPermission.Sms; + case Permission.Storage: + return MvxPermission.Storage; + default: + return MvxPermission.Unknown; + } + } + + public static MvxPermissionStatus ToMvxPermissionStatus(this PermissionStatus permissionStatus) + { + switch (permissionStatus) + { + case PermissionStatus.Denied: + return MvxPermissionStatus.Denied; + case PermissionStatus.Disabled: + return MvxPermissionStatus.Disabled; + case PermissionStatus.Granted: + return MvxPermissionStatus.Granted; + case PermissionStatus.Restricted: + return MvxPermissionStatus.Restricted; + default: + return MvxPermissionStatus.Unknown; + } + } + } +} \ No newline at end of file diff --git a/Permissions/Core/MvxPermissionStatus.cs b/Permissions/Core/MvxPermissionStatus.cs new file mode 100644 index 00000000..4f393b00 --- /dev/null +++ b/Permissions/Core/MvxPermissionStatus.cs @@ -0,0 +1,11 @@ +namespace MvvmCross.Plugins.Permissions +{ + public enum MvxPermissionStatus + { + Denied, + Disabled, + Granted, + Restricted, + Unknown + } +} \ No newline at end of file diff --git a/Permissions/Core/MvxPermissions.cs b/Permissions/Core/MvxPermissions.cs new file mode 100644 index 00000000..8e6db403 --- /dev/null +++ b/Permissions/Core/MvxPermissions.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Plugin.Permissions; + +namespace MvvmCross.Plugins.Permissions +{ + public class MvxPermissions : IMvxPermissions + { + public Task ShouldShowRequestPermissionRationaleAsync(MvxPermission permission) + { + return CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(permission.ToPermission()); + } + + public async Task CheckPermissionStatusAsync(MvxPermission permission) + { + var status = await CrossPermissions.Current.CheckPermissionStatusAsync(permission.ToPermission()).ConfigureAwait(false); + return status.ToMvxPermissionStatus(); + } + + public async Task> RequestPermissionsAsync(params MvxPermission[] permissions) + { + var nativePermissions = permissions.Select(p => p.ToPermission()).ToArray(); + + var status = await CrossPermissions.Current.RequestPermissionsAsync(nativePermissions).ConfigureAwait(false); + return status.ToDictionary(k => k.Key.ToMvxPermission(), v => v.Value.ToMvxPermissionStatus()); + } + } +} \ No newline at end of file diff --git a/Permissions/Core/PluginLoader.cs b/Permissions/Core/PluginLoader.cs new file mode 100644 index 00000000..c037b50c --- /dev/null +++ b/Permissions/Core/PluginLoader.cs @@ -0,0 +1,29 @@ +// PluginLoader.cs +// (c) Copyright Cirrious Ltd. http://www.cirrious.com +// MvvmCross is licensed using Microsoft Public License (Ms-PL) +// Contributions and inspirations noted in readme.md and license.txt + +using MvvmCross.Platform; +using MvvmCross.Platform.Plugins; + +namespace MvvmCross.Plugins.Permissions +{ + public class PluginLoader + : IMvxPluginLoader + { + public static readonly PluginLoader Instance = new PluginLoader(); + + private bool _loaded; + + public void EnsureLoaded() + { + if (_loaded) + { + return; + } + + Mvx.RegisterSingleton(new MvxPermissions()); + _loaded = true; + } + } +} \ No newline at end of file diff --git a/Permissions/Core/Properties/AssemblyInfo.cs b/Permissions/Core/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a3b8df28 --- /dev/null +++ b/Permissions/Core/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +using System.Resources; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Core")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Core")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Permissions/Core/packages.config b/Permissions/Core/packages.config new file mode 100644 index 00000000..79db3f9e --- /dev/null +++ b/Permissions/Core/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file