add lots of misc thigns to appdelegate

This commit is contained in:
Kyle Spearrin 2019-06-11 23:04:41 -04:00
parent 5aac96edb5
commit 5dbe9e5ca2
5 changed files with 260 additions and 7 deletions

View File

@ -103,7 +103,7 @@ namespace Bit.App
{
return;
}
await LogOutAsync(false);
Device.BeginInvokeOnMainThread(async () => await LogOutAsync(false));
}
else if(message.Command == "loggedOut")
{

32
src/iOS.Core/Constants.cs Normal file
View File

@ -0,0 +1,32 @@
namespace Bit.iOS.Core
{
public static class Constants
{
public const string AppExtensionVersionNumberKey = "version_number";
public const string AppExtensionUrlStringKey = "url_string";
public const string AppExtensionUsernameKey = "username";
public const string AppExtensionPasswordKey = "password";
public const string AppExtensionTotpKey = "totp";
public const string AppExtensionTitleKey = "login_title";
public const string AppExtensionNotesKey = "notes";
public const string AppExtensionSectionTitleKey = "section_title";
public const string AppExtensionFieldsKey = "fields";
public const string AppExtensionReturnedFieldsKey = "returned_fields";
public const string AppExtensionOldPasswordKey = "old_password";
public const string AppExtensionPasswordGeneratorOptionsKey = "password_generator_options";
public const string AppExtensionGeneratedPasswordMinLengthKey = "password_min_length";
public const string AppExtensionGeneratedPasswordMaxLengthKey = "password_max_length";
public const string AppExtensionGeneratedPasswordRequireDigitsKey = "password_require_digits";
public const string AppExtensionGeneratedPasswordRequireSymbolsKey = "password_require_symbols";
public const string AppExtensionGeneratedPasswordForbiddenCharactersKey = "password_forbidden_characters";
public const string AppExtensionWebViewPageFillScript = "fillScript";
public const string AppExtensionWebViewPageDetails = "pageDetails";
public const string UTTypeAppExtensionFindLoginAction = "org.appextension.find-login-action";
public const string UTTypeAppExtensionSaveLoginAction = "org.appextension.save-login-action";
public const string UTTypeAppExtensionChangePasswordAction = "org.appextension.change-password-action";
public const string UTTypeAppExtensionFillWebViewAction = "org.appextension.fill-webview-action";
public const string UTTypeAppExtensionFillBrowserAction = "org.appextension.fill-browser-action";
public const string UTTypeAppExtensionSetup = "com.8bit.bitwarden.extension-setup";
}
}

View File

@ -0,0 +1,40 @@
using Bit.Core.Abstractions;
using HockeyApp.iOS;
using Newtonsoft.Json;
using System.Threading.Tasks;
namespace Bit.iOS.Core.Utilities
{
public class HockeyAppCrashManagerDelegate : BITCrashManagerDelegate
{
private readonly IAppIdService _appIdService;
private readonly IUserService _userService;
private string _userId;
private string _appId;
public HockeyAppCrashManagerDelegate(
IAppIdService appIdService,
IUserService userService)
{
_appIdService = appIdService;
_userService = userService;
}
public async Task InitAsync(BITHockeyManager manager)
{
_userId = await _userService.GetUserIdAsync();
_appId = await _appIdService.GetAppIdAsync();
manager.UserId = _userId;
}
public override string ApplicationLogForCrashManager(BITCrashManager crashManager)
{
return JsonConvert.SerializeObject(new
{
AppId = _appId,
UserId = _userId
}, Formatting.Indented);
}
}
}

View File

@ -53,6 +53,8 @@
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<Compile Include="Constants.cs" />
<Compile Include="Utilities\HockeyAppCrashManagerDelegate.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\CryptoPrimitiveService.cs" />
<Compile Include="Services\KeyChainStorageService.cs" />

View File

@ -1,16 +1,20 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Bit.App.Abstractions;
using Bit.App.Resources;
using Bit.App.Services;
using Bit.Core;
using Bit.Core.Abstractions;
using Bit.Core.Services;
using Bit.Core.Utilities;
using Bit.iOS.Core.Services;
using Bit.iOS.Core.Utilities;
using Bit.iOS.Services;
using CoreNFC;
using Foundation;
using HockeyApp.iOS;
using UIKit;
namespace Bit.iOS
@ -26,18 +30,131 @@ namespace Bit.iOS
private iOSPushNotificationHandler _pushHandler = null;
private NFCReaderDelegate _nfcDelegate = null;
private IDeviceActionService _deviceActionService;
private IMessagingService _messagingService;
private IBroadcasterService _broadcasterService;
private IStorageService _storageService;
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Xamarin.Forms.Forms.Init();
InitApp();
Bootstrap();
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>("deviceActionService");
_messagingService = ServiceContainer.Resolve<IMessagingService>("messagingService");
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
_storageService = ServiceContainer.Resolve<IStorageService>("storageService");
LoadApplication(new App.App(null));
AppearanceAdjustments();
ZXing.Net.Mobile.Forms.iOS.Platform.Init();
_broadcasterService.Subscribe(nameof(AppDelegate), (message) =>
{
if(message.Command == "scheduleLockTimer")
{
var lockOptionMinutes = (int)message.Data;
}
else if(message.Command == "cancelLockTimer")
{
}
else if(message.Command == "updatedTheme")
{
}
else if(message.Command == "copiedToClipboard")
{
}
else if(message.Command == "listenYubiKeyOTP")
{
ListenYubiKey((bool)message.Data);
}
else if(message.Command == "showAppExtension")
{
}
else if(message.Command == "showStatusBar")
{
UIApplication.SharedApplication.SetStatusBarHidden(!(bool)message.Data, false);
}
else if(message.Command == "syncCompleted")
{
if(message.Data is Dictionary<string, object> data && data.ContainsKey("successfully"))
{
var success = data["successfully"] as bool?;
if(success.GetValueOrDefault())
{
}
}
}
else if(message.Command == "addedCipher" || message.Command == "editedCipher")
{
}
else if(message.Command == "deletedCipher")
{
}
else if(message.Command == "loggedOut")
{
}
});
return base.FinishedLaunching(app, options);
}
public override void DidEnterBackground(UIApplication uiApplication)
{
var view = new UIView(UIApplication.SharedApplication.KeyWindow.Frame)
{
Tag = 4321
};
var backgroundView = new UIView(UIApplication.SharedApplication.KeyWindow.Frame)
{
BackgroundColor = new UIColor(red: 0.93f, green: 0.94f, blue: 0.96f, alpha: 1.0f)
};
var imageView = new UIImageView(new UIImage("logo.png"))
{
Center = new CoreGraphics.CGPoint(view.Center.X, view.Center.Y - 30)
};
view.AddSubview(backgroundView);
view.AddSubview(imageView);
UIApplication.SharedApplication.KeyWindow.AddSubview(view);
UIApplication.SharedApplication.KeyWindow.BringSubviewToFront(view);
UIApplication.SharedApplication.KeyWindow.EndEditing(true);
UIApplication.SharedApplication.SetStatusBarHidden(true, false);
_storageService.SaveAsync(Bit.Core.Constants.LastActiveKey, DateTime.UtcNow);
base.DidEnterBackground(uiApplication);
}
public override void OnActivated(UIApplication uiApplication)
{
base.OnActivated(uiApplication);
UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;
var view = UIApplication.SharedApplication.KeyWindow.ViewWithTag(4321);
if(view != null)
{
view.RemoveFromSuperview();
UIApplication.SharedApplication.SetStatusBarHidden(false, false);
}
}
public override void WillEnterForeground(UIApplication uiApplication)
{
_messagingService.Send("Resumed");
base.WillEnterForeground(uiApplication);
}
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication,
NSObject annotation)
{
return true;
}
public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
{
_pushHandler?.OnErrorReceived(error);
@ -75,8 +192,19 @@ namespace Bit.iOS
ServiceContainer.Init();
_pushHandler = new iOSPushNotificationHandler(
ServiceContainer.Resolve<IPushNotificationListenerService>("pushNotificationListenerService"));
_nfcDelegate = new NFCReaderDelegate((success, message) => { }); // TODO: process YubiKey
// TODO: HockeyApp Init
_nfcDelegate = new NFCReaderDelegate((success, message) =>
_messagingService.Send("GotYubiKeyOTP", message));
var crashManagerDelegate = new HockeyAppCrashManagerDelegate(
ServiceContainer.Resolve<IAppIdService>("appIdService"),
ServiceContainer.Resolve<IUserService>("userService"));
var manager = BITHockeyManager.SharedHockeyManager;
manager.Configure("51f96ae568ba45f699a18ad9f63046c3", crashManagerDelegate);
manager.CrashManager.CrashManagerStatus = BITCrashManagerStatus.AutoSend;
manager.StartManager();
manager.Authenticator.AuthenticateInstallation();
manager.DisableMetricsManager = manager.DisableFeedbackManager = manager.DisableUpdateManager = true;
var task = crashManagerDelegate.InitAsync(manager);
}
private void RegisterLocalServices()
@ -146,16 +274,67 @@ namespace Bit.iOS
private async Task BootstrapAsync()
{
var disableFavicon = await ServiceContainer.Resolve<IStorageService>("storageService").GetAsync<bool?>(
Constants.DisableFaviconKey);
await ServiceContainer.Resolve<IStateService>("stateService").SaveAsync(Constants.DisableFaviconKey,
disableFavicon);
Bit.Core.Constants.DisableFaviconKey);
await ServiceContainer.Resolve<IStateService>("stateService").SaveAsync(
Bit.Core.Constants.DisableFaviconKey, disableFavicon);
await ServiceContainer.Resolve<IEnvironmentService>("environmentService").SetUrlsFromStorageAsync();
}
private void AppearanceAdjustments()
{
var primaryColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f);
var grayLight = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f);
UINavigationBar.Appearance.ShadowImage = new UIImage();
UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
UIBarButtonItem.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).TintColor = primaryColor;
UIButton.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).SetTitleColor(primaryColor,
UIControlState.Normal);
UIButton.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).TintColor = primaryColor;
UIStepper.Appearance.TintColor = grayLight;
UISlider.Appearance.TintColor = primaryColor;
UIApplication.SharedApplication.StatusBarHidden = false;
UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.LightContent;
}
private void ListenYubiKey(bool listen)
{
if(_deviceActionService.SupportsNfc())
{
_nfcSession?.InvalidateSession();
_nfcSession?.Dispose();
_nfcSession = null;
if(listen)
{
_nfcSession = new NFCNdefReaderSession(_nfcDelegate, null, true)
{
AlertMessage = AppResources.HoldYubikeyNearTop
};
_nfcSession.BeginSession();
}
}
}
private void ShowAppExtension()
{
var itemProvider = new NSItemProvider(new NSDictionary(), Core.Constants.UTTypeAppExtensionSetup);
var extensionItem = new NSExtensionItem();
extensionItem.Attachments = new NSItemProvider[] { itemProvider };
var activityViewController = new UIActivityViewController(new NSExtensionItem[] { extensionItem }, null);
activityViewController.CompletionHandler = (activityType, completed) =>
{
// TODO
//page.EnabledExtension(completed && activityType == "com.8bit.bitwarden.find-login-action-extension");
};
var modal = UIApplication.SharedApplication.KeyWindow.RootViewController.ModalViewController;
if(activityViewController.PopoverPresentationController != null)
{
activityViewController.PopoverPresentationController.SourceView = modal.View;
var frame = UIScreen.MainScreen.Bounds;
frame.Height /= 2;
activityViewController.PopoverPresentationController.SourceRect = frame;
}
modal.PresentViewController(activityViewController, true, null);
}
}
}