mirror of
https://github.com/bitwarden/android.git
synced 2024-11-01 07:35:52 +03:00
01736ca685
- Move settings to AppSettingsService - Update activity on page disappaearing - Always check if app is currently locked before updating last activity date
240 lines
No EOL
10 KiB
C#
240 lines
No EOL
10 KiB
C#
using System;
|
|
using Acr.UserDialogs;
|
|
using Android.App;
|
|
using Android.Content;
|
|
using Android.OS;
|
|
using Android.Runtime;
|
|
using Bit.Android.Services;
|
|
using Bit.App.Abstractions;
|
|
using Bit.App.Repositories;
|
|
using Bit.App.Services;
|
|
using Microsoft.Practices.Unity;
|
|
using Plugin.Connectivity;
|
|
using Plugin.CurrentActivity;
|
|
using Plugin.Fingerprint;
|
|
using Plugin.Settings;
|
|
using PushNotification.Plugin;
|
|
using PushNotification.Plugin.Abstractions;
|
|
using XLabs.Ioc;
|
|
using XLabs.Ioc.Unity;
|
|
using System.Threading.Tasks;
|
|
using Plugin.Settings.Abstractions;
|
|
using Xamarin.Android.Net;
|
|
using FFImageLoading.Forms.Droid;
|
|
|
|
namespace Bit.Android
|
|
{
|
|
#if DEBUG
|
|
[Application(Debuggable = true)]
|
|
#else
|
|
[Application(Debuggable = false)]
|
|
#endif
|
|
public class MainApplication : Application, Application.IActivityLifecycleCallbacks
|
|
{
|
|
private const string FirstLaunchKey = "firstLaunch";
|
|
private const string LastVersionCodeKey = "lastVersionCode";
|
|
|
|
public static Context AppContext;
|
|
|
|
public MainApplication(IntPtr handle, JniHandleOwnership transer)
|
|
: base(handle, transer)
|
|
{
|
|
if(!Resolver.IsSet)
|
|
{
|
|
SetIoc(this);
|
|
}
|
|
}
|
|
|
|
public override void OnCreate()
|
|
{
|
|
base.OnCreate();
|
|
|
|
// workaround for app compat bug
|
|
// ref https://forums.xamarin.com/discussion/62414/app-resuming-results-in-crash-with-formsappcompatactivity
|
|
Task.Delay(10).Wait();
|
|
|
|
RegisterActivityLifecycleCallbacks(this);
|
|
AppContext = ApplicationContext;
|
|
StartPushService();
|
|
HandlePushReregistration();
|
|
}
|
|
|
|
private void HandlePushReregistration()
|
|
{
|
|
var pushNotification = Resolver.Resolve<IPushNotification>();
|
|
var settings = Resolver.Resolve<ISettings>();
|
|
|
|
// Reregister for push token based on certain conditions
|
|
// ref https://github.com/rdelrosario/xamarin-plugins/issues/65
|
|
|
|
var reregister = false;
|
|
|
|
// 1. First time starting the app after a new install
|
|
if(settings.GetValueOrDefault(FirstLaunchKey, true))
|
|
{
|
|
settings.AddOrUpdateValue(FirstLaunchKey, false);
|
|
reregister = true;
|
|
}
|
|
|
|
// 2. App version changed (installed update)
|
|
var versionCode = Context.ApplicationContext.PackageManager.GetPackageInfo(Context.PackageName, 0).VersionCode;
|
|
if(settings.GetValueOrDefault(LastVersionCodeKey, -1) != versionCode)
|
|
{
|
|
settings.AddOrUpdateValue(LastVersionCodeKey, versionCode);
|
|
reregister = true;
|
|
}
|
|
|
|
// 3. In debug mode
|
|
if(InDebugMode())
|
|
{
|
|
reregister = true;
|
|
}
|
|
|
|
// 4. Doesn't have a push token currently
|
|
if(string.IsNullOrWhiteSpace(pushNotification.Token))
|
|
{
|
|
reregister = true;
|
|
}
|
|
|
|
if(reregister)
|
|
{
|
|
pushNotification.Unregister();
|
|
if(Resolver.Resolve<IAuthService>().IsAuthenticated)
|
|
{
|
|
pushNotification.Register();
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool InDebugMode()
|
|
{
|
|
#if DEBUG
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
public override void OnTerminate()
|
|
{
|
|
base.OnTerminate();
|
|
UnregisterActivityLifecycleCallbacks(this);
|
|
}
|
|
|
|
public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
|
|
{
|
|
CrossCurrentActivity.Current.Activity = activity;
|
|
}
|
|
|
|
public void OnActivityDestroyed(Activity activity)
|
|
{
|
|
}
|
|
|
|
public void OnActivityPaused(Activity activity)
|
|
{
|
|
}
|
|
|
|
public void OnActivityResumed(Activity activity)
|
|
{
|
|
CrossCurrentActivity.Current.Activity = activity;
|
|
}
|
|
|
|
public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
|
|
{
|
|
}
|
|
|
|
public void OnActivityStarted(Activity activity)
|
|
{
|
|
CrossCurrentActivity.Current.Activity = activity;
|
|
}
|
|
|
|
public void OnActivityStopped(Activity activity)
|
|
{
|
|
}
|
|
|
|
public static void StartPushService()
|
|
{
|
|
AppContext.StartService(new Intent(AppContext, typeof(PushNotificationService)));
|
|
if(Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
|
|
{
|
|
PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext,
|
|
typeof(PushNotificationService)), 0);
|
|
AlarmManager alarm = (AlarmManager)AppContext.GetSystemService(AlarmService);
|
|
alarm.Cancel(pintent);
|
|
}
|
|
}
|
|
|
|
public static void StopPushService()
|
|
{
|
|
AppContext.StopService(new Intent(AppContext, typeof(PushNotificationService)));
|
|
if(Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
|
|
{
|
|
PendingIntent pintent = PendingIntent.GetService(AppContext, 0, new Intent(AppContext,
|
|
typeof(PushNotificationService)), 0);
|
|
AlarmManager alarm = (AlarmManager)AppContext.GetSystemService(AlarmService);
|
|
alarm.Cancel(pintent);
|
|
}
|
|
}
|
|
|
|
public static void SetIoc(Application application)
|
|
{
|
|
UserDialogs.Init(application);
|
|
|
|
var container = new UnityContainer();
|
|
|
|
container
|
|
// Android Stuff
|
|
.RegisterInstance(application.ApplicationContext)
|
|
.RegisterInstance<Application>(application)
|
|
// Services
|
|
.RegisterType<IDatabaseService, DatabaseService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ISqlService, SqlService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ISecureStorageService, KeyStoreStorageService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ICryptoService, CryptoService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IKeyDerivationService, BouncyCastleKeyDerivationService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ILoginService, LoginService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IReflectionService, ReflectionService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ILockService, LockService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IAppInfoService, AppInfoService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IGoogleAnalyticsService, GoogleAnalyticsService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IDeviceInfoService, DeviceInfoService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ILocalizeService, LocalizeService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ILogService, LogService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IHttpService, HttpService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ITokenService, TokenService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ISettingsService, SettingsService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IMemoryService, MemoryService>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IAppSettingsService, AppSettingsService>(new ContainerControlledLifetimeManager())
|
|
// Repositories
|
|
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ILoginRepository, LoginRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ILoginApiRepository, LoginApiRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IConnectApiRepository, ConnectApiRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ICipherApiRepository, CipherApiRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ISettingsRepository, SettingsRepository>(new ContainerControlledLifetimeManager())
|
|
.RegisterType<ISettingsApiRepository, SettingsApiRepository>(new ContainerControlledLifetimeManager())
|
|
// Other
|
|
.RegisterInstance(CrossSettings.Current, new ContainerControlledLifetimeManager())
|
|
.RegisterInstance(CrossConnectivity.Current, new ContainerControlledLifetimeManager())
|
|
.RegisterInstance(UserDialogs.Instance, new ContainerControlledLifetimeManager())
|
|
.RegisterInstance(CrossFingerprint.Current, new ContainerControlledLifetimeManager());
|
|
|
|
CrossPushNotification.Initialize(container.Resolve<IPushNotificationListener>(), "962181367620");
|
|
container.RegisterInstance(CrossPushNotification.Current, new ContainerControlledLifetimeManager());
|
|
CachedImageRenderer.Init();
|
|
|
|
Resolver.SetResolver(new UnityResolver(container));
|
|
CrossFingerprint.SetCurrentActivityResolver(() => CrossCurrentActivity.Current.Activity);
|
|
}
|
|
}
|
|
} |