2016-05-02 08:52:09 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using XLabs.Ioc;
|
|
|
|
|
using XLabs.Ioc.Unity;
|
|
|
|
|
|
|
|
|
|
using Foundation;
|
|
|
|
|
using UIKit;
|
|
|
|
|
using Bit.App.Abstractions;
|
|
|
|
|
using Bit.App.Services;
|
|
|
|
|
using Microsoft.Practices.Unity;
|
|
|
|
|
using Bit.iOS.Services;
|
2016-05-03 08:08:50 +02:00
|
|
|
|
using Plugin.Connectivity;
|
|
|
|
|
using Acr.UserDialogs;
|
2016-05-06 06:17:38 +02:00
|
|
|
|
using Bit.App.Repositories;
|
2016-05-21 18:32:34 +02:00
|
|
|
|
using Plugin.Fingerprint;
|
|
|
|
|
using Plugin.Fingerprint.Abstractions;
|
|
|
|
|
using Plugin.Settings.Abstractions;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using Xamarin.Forms;
|
2016-05-22 04:50:15 +02:00
|
|
|
|
using Bit.App;
|
2016-05-28 22:06:53 +02:00
|
|
|
|
using Bit.iOS.Core.Services;
|
2016-06-18 08:45:46 +02:00
|
|
|
|
using PushNotification.Plugin;
|
2016-06-22 04:29:29 +02:00
|
|
|
|
using Plugin.DeviceInfo;
|
2016-07-02 00:54:00 +02:00
|
|
|
|
using Plugin.Connectivity.Abstractions;
|
2016-07-05 05:11:44 +02:00
|
|
|
|
using Bit.App.Pages;
|
2016-07-20 00:46:39 +02:00
|
|
|
|
using PushNotification.Plugin.Abstractions;
|
2016-07-22 06:04:05 +02:00
|
|
|
|
using HockeyApp.iOS;
|
2016-07-22 23:55:11 +02:00
|
|
|
|
using Bit.iOS.Core;
|
2016-05-02 08:52:09 +02:00
|
|
|
|
|
|
|
|
|
namespace Bit.iOS
|
|
|
|
|
{
|
|
|
|
|
[Register("AppDelegate")]
|
|
|
|
|
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
|
|
|
|
|
{
|
2016-06-25 05:39:13 +02:00
|
|
|
|
public ISettings Settings { get; set; }
|
|
|
|
|
|
2016-05-02 08:52:09 +02:00
|
|
|
|
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
|
|
|
|
|
{
|
|
|
|
|
global::Xamarin.Forms.Forms.Init();
|
|
|
|
|
|
|
|
|
|
if(!Resolver.IsSet)
|
|
|
|
|
{
|
|
|
|
|
SetIoc();
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-22 23:55:11 +02:00
|
|
|
|
var crashManagerDelegate = new HockeyAppCrashManagerDelegate(Resolver.Resolve<IAppIdService>());
|
|
|
|
|
var manager = BITHockeyManager.SharedHockeyManager;
|
|
|
|
|
manager.Configure("51f96ae568ba45f699a18ad9f63046c3", crashManagerDelegate);
|
2016-07-23 04:56:45 +02:00
|
|
|
|
manager.CrashManager.CrashManagerStatus = BITCrashManagerStatus.AutoSend;
|
2016-07-22 23:55:11 +02:00
|
|
|
|
manager.StartManager();
|
|
|
|
|
manager.Authenticator.AuthenticateInstallation();
|
|
|
|
|
|
2016-05-22 05:26:35 +02:00
|
|
|
|
LoadApplication(new App.App(
|
2016-05-21 18:32:34 +02:00
|
|
|
|
Resolver.Resolve<IAuthService>(),
|
2016-07-02 00:54:00 +02:00
|
|
|
|
Resolver.Resolve<IConnectivity>(),
|
|
|
|
|
Resolver.Resolve<IUserDialogs>(),
|
2016-05-21 18:32:34 +02:00
|
|
|
|
Resolver.Resolve<IDatabaseService>(),
|
2016-07-01 02:08:34 +02:00
|
|
|
|
Resolver.Resolve<ISyncService>(),
|
2016-05-21 18:32:34 +02:00
|
|
|
|
Resolver.Resolve<IFingerprint>(),
|
2016-07-20 00:46:39 +02:00
|
|
|
|
Resolver.Resolve<ISettings>(),
|
2016-07-20 05:29:32 +02:00
|
|
|
|
Resolver.Resolve<IPushNotification>(),
|
|
|
|
|
Resolver.Resolve<ILockService>()));
|
2016-05-02 08:52:09 +02:00
|
|
|
|
|
2016-07-12 05:55:16 +02:00
|
|
|
|
// Appearance stuff
|
|
|
|
|
|
|
|
|
|
var primaryColor = new UIColor(red: 0.24f, green: 0.55f, blue: 0.74f, alpha: 1.0f);
|
2016-07-13 00:59:09 +02:00
|
|
|
|
var grayLight = new UIColor(red: 0.47f, green: 0.47f, blue: 0.47f, alpha: 1.0f);
|
2016-07-12 05:55:16 +02:00
|
|
|
|
|
2016-06-14 06:19:18 +02:00
|
|
|
|
UINavigationBar.Appearance.ShadowImage = new UIImage();
|
|
|
|
|
UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
|
2016-07-12 05:55:16 +02:00
|
|
|
|
UIBarButtonItem.AppearanceWhenContainedIn(new Type[] { typeof(UISearchBar) }).TintColor = primaryColor;
|
2016-07-13 00:59:09 +02:00
|
|
|
|
UIStepper.Appearance.TintColor = grayLight;
|
|
|
|
|
UISlider.Appearance.TintColor = primaryColor;
|
2016-06-14 06:19:18 +02:00
|
|
|
|
|
2016-07-05 05:11:44 +02:00
|
|
|
|
MessagingCenter.Subscribe<Xamarin.Forms.Application, ToolsExtensionPage>(Xamarin.Forms.Application.Current, "ShowAppExtension", (sender, page) =>
|
2016-07-02 21:20:06 +02:00
|
|
|
|
{
|
|
|
|
|
var itemProvider = new NSItemProvider(new NSDictionary(), "com.8bit.bitwarden.extension-setup");
|
|
|
|
|
var extensionItem = new NSExtensionItem();
|
|
|
|
|
extensionItem.Attachments = new NSItemProvider[] { itemProvider };
|
|
|
|
|
var activityViewController = new UIActivityViewController(new NSExtensionItem[] { extensionItem }, null);
|
|
|
|
|
activityViewController.CompletionHandler = (activityType, completed) =>
|
|
|
|
|
{
|
2016-07-05 05:11:44 +02:00
|
|
|
|
page.EnabledExtension(completed && activityType == "com.8bit.bitwarden.find-login-action-extension");
|
2016-07-02 21:20:06 +02:00
|
|
|
|
};
|
|
|
|
|
|
2016-07-10 07:15:59 +02:00
|
|
|
|
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);
|
2016-07-02 21:20:06 +02:00
|
|
|
|
});
|
|
|
|
|
|
2016-07-23 21:32:11 +02:00
|
|
|
|
UIApplication.SharedApplication.StatusBarHidden = false;
|
|
|
|
|
UIApplication.SharedApplication.StatusBarStyle = UIStatusBarStyle.LightContent;
|
|
|
|
|
|
|
|
|
|
MessagingCenter.Subscribe<Xamarin.Forms.Application, bool>(Xamarin.Forms.Application.Current, "ShowStatusBar", (sender, show) =>
|
|
|
|
|
{
|
|
|
|
|
UIApplication.SharedApplication.SetStatusBarHidden(!show, false);
|
|
|
|
|
});
|
|
|
|
|
|
2016-05-02 08:52:09 +02:00
|
|
|
|
return base.FinishedLaunching(app, options);
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-21 18:32:34 +02:00
|
|
|
|
public override void DidEnterBackground(UIApplication uiApplication)
|
|
|
|
|
{
|
2016-06-11 08:43:53 +02:00
|
|
|
|
var view = new UIView(UIApplication.SharedApplication.KeyWindow.Frame)
|
2016-05-21 18:32:34 +02:00
|
|
|
|
{
|
|
|
|
|
Tag = 4321
|
|
|
|
|
};
|
2016-06-11 08:43:53 +02:00
|
|
|
|
|
|
|
|
|
var backgroundView = new UIView(UIApplication.SharedApplication.KeyWindow.Frame)
|
|
|
|
|
{
|
2016-06-26 02:54:17 +02:00
|
|
|
|
BackgroundColor = new UIColor(red: 0.93f, green: 0.94f, blue: 0.96f, alpha: 1.0f)
|
2016-06-11 08:43:53 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var imageView = new UIImageView(new UIImage("logo.png"))
|
|
|
|
|
{
|
2016-07-24 05:50:08 +02:00
|
|
|
|
Center = new CoreGraphics.CGPoint(view.Center.X, view.Center.Y - 40)
|
2016-06-11 08:43:53 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
view.AddSubview(backgroundView);
|
|
|
|
|
view.AddSubview(imageView);
|
|
|
|
|
|
|
|
|
|
UIApplication.SharedApplication.KeyWindow.AddSubview(view);
|
|
|
|
|
UIApplication.SharedApplication.KeyWindow.BringSubviewToFront(view);
|
|
|
|
|
UIApplication.SharedApplication.KeyWindow.EndEditing(true);
|
2016-07-24 05:50:08 +02:00
|
|
|
|
UIApplication.SharedApplication.SetStatusBarHidden(true, false);
|
2016-05-22 04:50:15 +02:00
|
|
|
|
|
|
|
|
|
// Log the date/time we last backgrounded
|
2016-06-25 05:39:13 +02:00
|
|
|
|
|
2016-07-22 06:04:05 +02:00
|
|
|
|
Settings.AddOrUpdateValue(Bit.App.Constants.SettingLastBackgroundedDate, DateTime.UtcNow);
|
2016-05-21 18:32:34 +02:00
|
|
|
|
|
|
|
|
|
base.DidEnterBackground(uiApplication);
|
|
|
|
|
Debug.WriteLine("DidEnterBackground");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override void OnResignActivation(UIApplication uiApplication)
|
|
|
|
|
{
|
|
|
|
|
base.OnResignActivation(uiApplication);
|
|
|
|
|
Debug.WriteLine("OnResignActivation");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void WillTerminate(UIApplication uiApplication)
|
|
|
|
|
{
|
|
|
|
|
base.WillTerminate(uiApplication);
|
|
|
|
|
Debug.WriteLine("WillTerminate");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnActivated(UIApplication uiApplication)
|
|
|
|
|
{
|
|
|
|
|
base.OnActivated(uiApplication);
|
|
|
|
|
Debug.WriteLine("OnActivated");
|
|
|
|
|
|
2016-07-23 21:09:00 +02:00
|
|
|
|
UIApplication.SharedApplication.ApplicationIconBadgeNumber = 0;
|
|
|
|
|
|
2016-05-21 18:32:34 +02:00
|
|
|
|
var view = UIApplication.SharedApplication.KeyWindow.ViewWithTag(4321);
|
|
|
|
|
if(view != null)
|
|
|
|
|
{
|
|
|
|
|
view.RemoveFromSuperview();
|
2016-07-24 05:50:08 +02:00
|
|
|
|
UIApplication.SharedApplication.SetStatusBarHidden(false, false);
|
2016-05-21 18:32:34 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void WillEnterForeground(UIApplication uiApplication)
|
|
|
|
|
{
|
2016-07-01 02:08:34 +02:00
|
|
|
|
SendResumedMessage();
|
2016-05-21 18:32:34 +02:00
|
|
|
|
base.WillEnterForeground(uiApplication);
|
|
|
|
|
Debug.WriteLine("WillEnterForeground");
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-30 09:08:12 +02:00
|
|
|
|
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-18 08:45:46 +02:00
|
|
|
|
public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error)
|
|
|
|
|
{
|
|
|
|
|
if(CrossPushNotification.Current is IPushNotificationHandler)
|
|
|
|
|
{
|
|
|
|
|
((IPushNotificationHandler)CrossPushNotification.Current).OnErrorReceived(error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
|
|
|
|
|
{
|
|
|
|
|
if(CrossPushNotification.Current is IPushNotificationHandler)
|
|
|
|
|
{
|
|
|
|
|
((IPushNotificationHandler)CrossPushNotification.Current).OnRegisteredSuccess(deviceToken);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
|
|
|
|
|
{
|
|
|
|
|
application.RegisterForRemoteNotifications();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
|
|
|
|
|
{
|
|
|
|
|
if(CrossPushNotification.Current is IPushNotificationHandler)
|
|
|
|
|
{
|
|
|
|
|
((IPushNotificationHandler)CrossPushNotification.Current).OnMessageReceived(userInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
|
|
|
|
|
{
|
|
|
|
|
if(CrossPushNotification.Current is IPushNotificationHandler)
|
|
|
|
|
{
|
|
|
|
|
((IPushNotificationHandler)CrossPushNotification.Current).OnMessageReceived(userInfo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-01 02:08:34 +02:00
|
|
|
|
private void SendResumedMessage()
|
2016-05-21 18:32:34 +02:00
|
|
|
|
{
|
2016-07-01 02:08:34 +02:00
|
|
|
|
MessagingCenter.Send(Xamarin.Forms.Application.Current, "Resumed", false);
|
2016-05-21 18:32:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
2016-05-02 08:52:09 +02:00
|
|
|
|
private void SetIoc()
|
|
|
|
|
{
|
|
|
|
|
var container = new UnityContainer();
|
|
|
|
|
|
|
|
|
|
container
|
2016-05-06 06:17:38 +02:00
|
|
|
|
// Services
|
2016-05-02 08:52:09 +02:00
|
|
|
|
.RegisterType<IDatabaseService, DatabaseService>(new ContainerControlledLifetimeManager())
|
2016-05-06 06:17:38 +02:00
|
|
|
|
.RegisterType<ISqlService, SqlService>(new ContainerControlledLifetimeManager())
|
2016-05-02 08:52:09 +02:00
|
|
|
|
.RegisterType<ISecureStorageService, KeyChainStorageService>(new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterType<ICryptoService, CryptoService>(new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
2016-05-03 08:08:50 +02:00
|
|
|
|
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
|
2016-05-06 06:17:38 +02:00
|
|
|
|
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
2016-05-07 04:29:03 +02:00
|
|
|
|
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
2016-06-18 08:45:46 +02:00
|
|
|
|
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
2016-06-22 04:29:29 +02:00
|
|
|
|
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
|
2016-07-02 08:01:47 +02:00
|
|
|
|
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
|
2016-07-03 08:57:09 +02:00
|
|
|
|
.RegisterType<IReflectionService, ReflectionService>(new ContainerControlledLifetimeManager())
|
2016-07-20 05:29:32 +02:00
|
|
|
|
.RegisterType<ILockService, LockService>(new ContainerControlledLifetimeManager())
|
2016-07-24 05:50:08 +02:00
|
|
|
|
.RegisterType<IAppInfoService, AppInfoService>(new ContainerControlledLifetimeManager())
|
2016-05-06 06:17:38 +02:00
|
|
|
|
// Repositories
|
|
|
|
|
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
2016-06-18 22:10:09 +02:00
|
|
|
|
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
2016-06-26 02:54:17 +02:00
|
|
|
|
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
2016-06-30 03:59:18 +02:00
|
|
|
|
.RegisterType<ICipherApiRepository, CipherApiRepository>(new ContainerControlledLifetimeManager())
|
2016-05-06 06:17:38 +02:00
|
|
|
|
// Other
|
2016-06-22 04:29:29 +02:00
|
|
|
|
.RegisterInstance(CrossDeviceInfo.Current, new ContainerControlledLifetimeManager())
|
2016-05-03 08:08:50 +02:00
|
|
|
|
.RegisterInstance(CrossConnectivity.Current, new ContainerControlledLifetimeManager())
|
2016-05-21 18:32:34 +02:00
|
|
|
|
.RegisterInstance(UserDialogs.Instance, new ContainerControlledLifetimeManager())
|
|
|
|
|
.RegisterInstance(CrossFingerprint.Current, new ContainerControlledLifetimeManager());
|
2016-05-02 08:52:09 +02:00
|
|
|
|
|
2016-06-25 05:39:13 +02:00
|
|
|
|
Settings = new Settings("group.com.8bit.bitwarden");
|
|
|
|
|
container.RegisterInstance(Settings, new ContainerControlledLifetimeManager());
|
|
|
|
|
|
2016-06-18 08:45:46 +02:00
|
|
|
|
CrossPushNotification.Initialize(container.Resolve<IPushNotificationListener>());
|
|
|
|
|
container.RegisterInstance(CrossPushNotification.Current, new ContainerControlledLifetimeManager());
|
|
|
|
|
|
2016-05-02 08:52:09 +02:00
|
|
|
|
Resolver.SetResolver(new UnityResolver(container));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|