From fb3009fc669c43e40328359e9ae462afb4bf77a3 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Thu, 27 Jun 2019 14:07:25 -0400 Subject: [PATCH] core utils --- src/iOS.Core/Utilities/ASHelpers.cs | 76 +++++++++++++++++++++++++++++ src/iOS.Core/Utilities/Dialogs.cs | 55 +++++++++++++++++++++ src/iOS.Core/iOS.Core.csproj | 2 + 3 files changed, 133 insertions(+) create mode 100644 src/iOS.Core/Utilities/ASHelpers.cs create mode 100644 src/iOS.Core/Utilities/Dialogs.cs diff --git a/src/iOS.Core/Utilities/ASHelpers.cs b/src/iOS.Core/Utilities/ASHelpers.cs new file mode 100644 index 000000000..d6f2b5466 --- /dev/null +++ b/src/iOS.Core/Utilities/ASHelpers.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using AuthenticationServices; +using Bit.Core.Abstractions; +using Bit.Core.Models.View; + +namespace Bit.iOS.Core.Utilities +{ + public static class ASHelpers + { + public static async Task ReplaceAllIdentities(ICipherService cipherService) + { + if(await AutofillEnabled()) + { + var identities = new List(); + var ciphers = await cipherService.GetAllDecryptedAsync(); + foreach(var cipher in ciphers) + { + var identity = ToCredentialIdentity(cipher); + if(identity != null) + { + identities.Add(identity); + } + } + if(identities.Any()) + { + await ASCredentialIdentityStore.SharedStore?.ReplaceCredentialIdentitiesAsync(identities.ToArray()); + } + } + } + + public static async Task IdentitiesCanIncremental() + { + var state = await ASCredentialIdentityStore.SharedStore?.GetCredentialIdentityStoreStateAsync(); + return state != null && state.Enabled && state.SupportsIncrementalUpdates; + } + + public static async Task AutofillEnabled() + { + var state = await ASCredentialIdentityStore.SharedStore?.GetCredentialIdentityStoreStateAsync(); + return state != null && state.Enabled; + } + + public static async Task GetCipherIdentityAsync(string cipherId, ICipherService cipherService) + { + var cipher = await cipherService.GetAsync(cipherId); + if(cipher == null) + { + return null; + } + var cipherView = await cipher.DecryptAsync(); + return ToCredentialIdentity(cipherView); + } + + public static ASPasswordCredentialIdentity ToCredentialIdentity(CipherView cipher) + { + if(!cipher?.Login?.Uris?.Any() ?? true) + { + return null; + } + var uri = cipher.Login.Uris.FirstOrDefault()?.Uri; + if(string.IsNullOrWhiteSpace(uri)) + { + return null; + } + var username = cipher.Login.Username; + if(string.IsNullOrWhiteSpace(username)) + { + return null; + } + var serviceId = new ASCredentialServiceIdentifier(uri, ASCredentialServiceIdentifierType.Url); + return new ASPasswordCredentialIdentity(serviceId, username, cipher.Id); + } + } +} diff --git a/src/iOS.Core/Utilities/Dialogs.cs b/src/iOS.Core/Utilities/Dialogs.cs new file mode 100644 index 000000000..817013632 --- /dev/null +++ b/src/iOS.Core/Utilities/Dialogs.cs @@ -0,0 +1,55 @@ +using System; +using System.Drawing; +using CoreGraphics; +using UIKit; + +namespace Bit.iOS.Core.Utilities +{ + public static class Dialogs + { + public static UIAlertController CreateLoadingAlert(string message) + { + var loadingIndicator = new UIActivityIndicatorView(new CGRect(10, 5, 50, 50)); + loadingIndicator.HidesWhenStopped = true; + loadingIndicator.ActivityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray; + loadingIndicator.StartAnimating(); + + var alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert); + alert.View.TintColor = UIColor.Black; + alert.View.Add(loadingIndicator); + return alert; + } + + public static UIAlertController CreateMessageAlert(string message) + { + var alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert); + alert.View.TintColor = UIColor.Black; + return alert; + } + + public static UIAlertController CreateAlert(string title, string message, string accept, Action acceptHandle = null) + { + var alert = UIAlertController.Create(title, message, UIAlertControllerStyle.Alert); + var oldFrame = alert.View.Frame; + alert.View.Frame = new RectangleF((float)oldFrame.X, (float)oldFrame.Y, (float)oldFrame.Width, (float)oldFrame.Height - 20); + alert.AddAction(UIAlertAction.Create(accept, UIAlertActionStyle.Default, acceptHandle)); + return alert; + } + + public static UIAlertController CreateActionSheet(string title, UIViewController controller) + { + var sheet = UIAlertController.Create(title, null, UIAlertControllerStyle.ActionSheet); + if(UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad) + { + var x = controller.View.Bounds.Width / 2; + var y = controller.View.Bounds.Bottom; + var rect = new CGRect(x, y, 0, 0); + + sheet.PopoverPresentationController.SourceView = controller.View; + sheet.PopoverPresentationController.SourceRect = rect; + sheet.PopoverPresentationController.PermittedArrowDirections = UIPopoverArrowDirection.Unknown; + } + return sheet; + } + } +} diff --git a/src/iOS.Core/iOS.Core.csproj b/src/iOS.Core/iOS.Core.csproj index c24f39388..e0117a229 100644 --- a/src/iOS.Core/iOS.Core.csproj +++ b/src/iOS.Core/iOS.Core.csproj @@ -58,6 +58,8 @@ + +