From c116dc7f988da69cf5e7bae55f466da7e52b8820 Mon Sep 17 00:00:00 2001 From: Yauheni Pakala Date: Tue, 24 Oct 2023 20:53:43 +0200 Subject: [PATCH] Refactor permissions library --- .../PermissionsManager.cs | 76 +++++++++---------- .../Permissions/Bluetooth.cs | 16 ++-- .../Permissions/Notifications.cs | 10 ++- .../PermissionsManager.cs | 26 +++---- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/Softeq.XToolkit.Permissions.Droid/PermissionsManager.cs b/Softeq.XToolkit.Permissions.Droid/PermissionsManager.cs index 6282ff85..de5eb2f9 100644 --- a/Softeq.XToolkit.Permissions.Droid/PermissionsManager.cs +++ b/Softeq.XToolkit.Permissions.Droid/PermissionsManager.cs @@ -2,12 +2,12 @@ // http://www.softeq.com using System; -using System.Diagnostics; +using System.Diagnostics; using System.Threading.Tasks; using Microsoft.Maui.Storage; using BasePermission = Microsoft.Maui.ApplicationModel.Permissions.BasePermission; -using XToolkitPermissions = Softeq.XToolkit.Permissions.Permissions; -using XToolkitPermissionsDroid = Softeq.XToolkit.Permissions.Droid.Permissions; +using CustomPermissions = Softeq.XToolkit.Permissions.Permissions; +using PlatformCustomPermissions = Softeq.XToolkit.Permissions.Droid.Permissions; namespace Softeq.XToolkit.Permissions.Droid { @@ -31,15 +31,15 @@ public virtual Task CheckAsync() where T : BasePermission, new() { var permissionType = typeof(T); - if (permissionType == typeof(XToolkitPermissions.Notifications)) + if (permissionType == typeof(CustomPermissions.Notifications)) { - return _permissionsService.CheckPermissionsAsync(); + return _permissionsService.CheckPermissionsAsync(); } - else if (permissionType == typeof(XToolkitPermissions.Bluetooth)) + else if (permissionType == typeof(CustomPermissions.Bluetooth)) { - return _permissionsService.CheckPermissionsAsync(); + return _permissionsService.CheckPermissionsAsync(); } - else + else { return _permissionsService.CheckPermissionsAsync(); } @@ -50,15 +50,15 @@ public Task CheckWithRequestAsync() where T : BasePermission, new() { var permissionType = typeof(T); - if (permissionType == typeof(XToolkitPermissions.Notifications)) + if (permissionType == typeof(CustomPermissions.Notifications)) { - return CommonCheckWithRequestAsync(); + return CommonCheckWithRequestAsync(); } - else if (permissionType == typeof(XToolkitPermissions.Bluetooth)) + else if (permissionType == typeof(CustomPermissions.Bluetooth)) { - return CommonCheckWithRequestAsync(); + return CommonCheckWithRequestAsync(); } - else + else { return CommonCheckWithRequestAsync(); } @@ -76,31 +76,31 @@ private void OpenSettings() _permissionsService.OpenSettings(); } - private void RemoveOldKeys() - where T : BasePermission, new() - { - var requestedKey = GetPermissionRequestedKey(); + private void RemoveOldKeys() + where T : BasePermission, new() + { + var requestedKey = GetPermissionRequestedKey(); if (Preferences.ContainsKey(requestedKey)) - { - Preferences.Remove(requestedKey); - } - - var deniedEverKey = GetPermissionDeniedEverKey(); + { + Preferences.Remove(requestedKey); + } + + var deniedEverKey = GetPermissionDeniedEverKey(); if (Preferences.ContainsKey(deniedEverKey)) - { - Preferences.Remove(deniedEverKey); - } - - string GetPermissionRequestedKey() - where TPermission : BasePermission - { - return $"{nameof(PermissionsManager)}_IsPermissionRequested_{typeof(T).Name}"; - } - + { + Preferences.Remove(deniedEverKey); + } + + string GetPermissionRequestedKey() + where TPermission : BasePermission + { + return $"{nameof(PermissionsManager)}_IsPermissionRequested_{typeof(T).Name}"; + } + string GetPermissionDeniedEverKey() - where T : BasePermission - { - return $"{nameof(PermissionsManager)}_IsPermissionDeniedEver_{typeof(T).Name}"; + where T : BasePermission + { + return $"{nameof(PermissionsManager)}_IsPermissionDeniedEver_{typeof(T).Name}"; } } @@ -115,7 +115,7 @@ private async Task CommonCheckWithRequestAsync() RemoveOldKeys(); - // Timer are used for confirm a fact of showing a request of permission access popup + // Timer are used for confirm a fact of showing a request of permission access popup // in another case user should see screen with settings for changing permission state var timer = new Stopwatch(); timer.Start(); @@ -126,7 +126,7 @@ private async Task CommonCheckWithRequestAsync() permissionStatus = await _permissionsService.RequestPermissionsAsync().ConfigureAwait(false); } - if (permissionStatus == PermissionStatus.Denied + if (permissionStatus == PermissionStatus.Denied && timer.Elapsed < _showPermissionDialogThreshold) { await OpenSettingsWithConfirmationAsync().ConfigureAwait(false); @@ -147,4 +147,4 @@ private async Task OpenSettingsWithConfirmationAsync() } } } -} \ No newline at end of file +} diff --git a/Softeq.XToolkit.Permissions.iOS/Permissions/Bluetooth.cs b/Softeq.XToolkit.Permissions.iOS/Permissions/Bluetooth.cs index dd808042..1a2d6687 100644 --- a/Softeq.XToolkit.Permissions.iOS/Permissions/Bluetooth.cs +++ b/Softeq.XToolkit.Permissions.iOS/Permissions/Bluetooth.cs @@ -3,9 +3,6 @@ using System; using System.Collections.Generic; -using System.Reactive.Linq; -using System.Reactive.Subjects; -using System.Reactive.Threading.Tasks; using System.Threading.Tasks; using CoreBluetooth; using BasePlatformPermission = Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission; @@ -15,9 +12,11 @@ namespace Softeq.XToolkit.Permissions.iOS.Permissions { public class Bluetooth : BasePlatformPermission { + /// protected override Func> RequiredInfoPlistKeys => () => new string[] { "NSBluetoothAlwaysUsageDescription" }; + /// public override Task CheckStatusAsync() { EnsureDeclared(); @@ -25,11 +24,12 @@ public override Task CheckStatusAsync() return Task.FromResult(ParseAuthorization(CBManager.Authorization)); } + /// public override async Task RequestAsync() { EnsureDeclared(); - var status = await CheckStatusAsync(); + var status = await CheckStatusAsync().ConfigureAwait(false); if (status == EssentialsPermissionStatus.Granted) { @@ -39,7 +39,7 @@ public override async Task RequestAsync() if (CBManager.Authorization == CBManagerAuthorization.NotDetermined) { var centralManagerDelegate = new CentralManagerDelegate(); - await centralManagerDelegate.RequestAccessAsync(); + await centralManagerDelegate.RequestAccessAsync().ConfigureAwait(false); } return ParseAuthorization(CBManager.Authorization); @@ -61,7 +61,7 @@ private class CentralManagerDelegate : CBCentralManagerDelegate { private readonly CBCentralManager _centralManager; - private TaskCompletionSource _statusRequest = + private readonly TaskCompletionSource _statusRequest = new TaskCompletionSource(); public CentralManagerDelegate() @@ -71,7 +71,7 @@ public CentralManagerDelegate() public async Task RequestAccessAsync() { - var state = await _statusRequest.Task; + var state = await _statusRequest.Task.ConfigureAwait(false); return state; } @@ -84,4 +84,4 @@ public override void UpdatedState(CBCentralManager centralManager) } } } -} \ No newline at end of file +} diff --git a/Softeq.XToolkit.Permissions.iOS/Permissions/Notifications.cs b/Softeq.XToolkit.Permissions.iOS/Permissions/Notifications.cs index 98da0855..99af8986 100644 --- a/Softeq.XToolkit.Permissions.iOS/Permissions/Notifications.cs +++ b/Softeq.XToolkit.Permissions.iOS/Permissions/Notifications.cs @@ -2,9 +2,7 @@ // http://www.softeq.com using System; -using System.Collections.Generic; using System.Threading.Tasks; -using CoreBluetooth; using UserNotifications; using BasePlatformPermission = Microsoft.Maui.ApplicationModel.Permissions.BasePlatformPermission; using EssentialsPermissionStatus = Microsoft.Maui.ApplicationModel.PermissionStatus; @@ -16,6 +14,7 @@ public class Notifications : BasePlatformPermission public static UNAuthorizationOptions AuthorizationOptions = UNAuthorizationOptions.Alert | UNAuthorizationOptions.Sound; + /// public override async Task CheckStatusAsync() { var notificationSettings = await UNUserNotificationCenter.Current @@ -24,10 +23,13 @@ public override async Task CheckStatusAsync() return ParseAuthorization(notificationSettings.AuthorizationStatus); } + /// public override async Task RequestAsync() { var notificationCenter = UNUserNotificationCenter.Current; - var (isGranted, _) = await notificationCenter.RequestAuthorizationAsync(AuthorizationOptions); + var (isGranted, _) = await notificationCenter + .RequestAuthorizationAsync(AuthorizationOptions) + .ConfigureAwait(false); return isGranted ? EssentialsPermissionStatus.Granted : EssentialsPermissionStatus.Denied; @@ -45,4 +47,4 @@ private static EssentialsPermissionStatus ParseAuthorization(UNAuthorizationStat }; } } -} \ No newline at end of file +} diff --git a/Softeq.XToolkit.Permissions.iOS/PermissionsManager.cs b/Softeq.XToolkit.Permissions.iOS/PermissionsManager.cs index fa4e197f..dea76e88 100644 --- a/Softeq.XToolkit.Permissions.iOS/PermissionsManager.cs +++ b/Softeq.XToolkit.Permissions.iOS/PermissionsManager.cs @@ -5,8 +5,8 @@ using System.Threading.Tasks; using Microsoft.Maui.Storage; using BasePermission = Microsoft.Maui.ApplicationModel.Permissions.BasePermission; -using XToolkitPermissions = Softeq.XToolkit.Permissions.Permissions; -using XToolkitPermissionsIos = Softeq.XToolkit.Permissions.iOS.Permissions; +using CustomPermissions = Softeq.XToolkit.Permissions.Permissions; +using PlatformCustomPermissions = Softeq.XToolkit.Permissions.iOS.Permissions; namespace Softeq.XToolkit.Permissions.iOS { @@ -39,15 +39,15 @@ public virtual Task CheckWithRequestAsync() { var permissionType = typeof(T); - if (permissionType == typeof(XToolkitPermissions.Notifications)) + if (permissionType == typeof(CustomPermissions.Notifications)) { - return CommonCheckWithRequestAsync(); + return CommonCheckWithRequestAsync(); } - else if (permissionType == typeof(XToolkitPermissions.Bluetooth)) + else if (permissionType == typeof(CustomPermissions.Bluetooth)) { - return CommonCheckWithRequestAsync(); + return CommonCheckWithRequestAsync(); } - else + else { return CommonCheckWithRequestAsync(); } @@ -59,15 +59,15 @@ public Task CheckAsync() { var permissionType = typeof(T); - if (permissionType == typeof(XToolkitPermissions.Notifications)) + if (permissionType == typeof(CustomPermissions.Notifications)) { - return _permissionsService.CheckPermissionsAsync(); + return _permissionsService.CheckPermissionsAsync(); } - else if (permissionType == typeof(XToolkitPermissions.Bluetooth)) + else if (permissionType == typeof(CustomPermissions.Bluetooth)) { - return _permissionsService.CheckPermissionsAsync(); + return _permissionsService.CheckPermissionsAsync(); } - else + else { return _permissionsService.CheckPermissionsAsync(); } @@ -124,4 +124,4 @@ private async Task OpenSettingsWithConfirmationAsync() return PermissionStatus.Unknown; } } -} \ No newline at end of file +}