public AutoSuspendHelper(UIApplicationDelegate appDelegate)
        {
            Reflection.ThrowIfMethodsNotOverloaded("AutoSuspendHelper", appDelegate,
                                                   "FinishedLaunching", "OnActivated", "DidEnterBackground");

            RxApp.SuspensionHost.IsLaunchingNew = Observable.Never <Unit>();
            RxApp.SuspensionHost.IsResuming     = _finishedLaunching.Select(_ => Unit.Default);
            RxApp.SuspensionHost.IsUnpausing    = _activated.Select(_ => Unit.Default);

            var untimelyDeath = new Subject <Unit>();

            AppDomain.CurrentDomain.UnhandledException += (o, e) => untimelyDeath.OnNext(Unit.Default);

            RxApp.SuspensionHost.ShouldInvalidateState = untimelyDeath;

            RxApp.SuspensionHost.ShouldPersistState = _backgrounded.SelectMany(app => {
                var taskId = app.BeginBackgroundTask(new NSAction(() => untimelyDeath.OnNext(Unit.Default)));

                // NB: We're being force-killed, signal invalidate instead
                if (taskId == UIApplication.BackgroundTaskInvalid)
                {
                    untimelyDeath.OnNext(Unit.Default);
                    return(Observable.Empty <IDisposable>());
                }

                return(Observable.Return(Disposable.Create(() => app.EndBackgroundTask(taskId))));
            });
        }
        public AutoSuspendHelper(Application app)
        {
            Reflection.ThrowIfMethodsNotOverloaded("AutoSuspendHelper", app, "OnLaunched");

            var launchNew = new[] { ApplicationExecutionState.ClosedByUser, ApplicationExecutionState.NotRunning, };

            RxApp.SuspensionHost.IsLaunchingNew = _activated
                                                  .Where(x => launchNew.Contains(x.PreviousExecutionState))
                                                  .Select(_ => Unit.Default);

            RxApp.SuspensionHost.IsResuming = _activated
                                              .Where(x => x.PreviousExecutionState == ApplicationExecutionState.Terminated)
                                              .Select(_ => Unit.Default);

            var unpausing = new[] { ApplicationExecutionState.Suspended, ApplicationExecutionState.Running, };

            RxApp.SuspensionHost.IsUnpausing = _activated
                                               .Where(x => unpausing.Contains(x.PreviousExecutionState))
                                               .Select(_ => Unit.Default);

            var shouldPersistState = new Subject <SuspendingEventArgs>();

            app.Suspending += (o, e) => shouldPersistState.OnNext(e);
            RxApp.SuspensionHost.ShouldPersistState =
                shouldPersistState.Select(x => {
                var deferral = x.SuspendingOperation.GetDeferral();
                return(Disposable.Create(deferral.Complete));
            });

            var shouldInvalidateState = new Subject <Unit>();

            app.UnhandledException += (o, e) => shouldInvalidateState.OnNext(Unit.Default);
            RxApp.SuspensionHost.ShouldInvalidateState = shouldInvalidateState;
        }
        public AutoSuspendHelper(NSApplicationDelegate appDelegate)
        {
            Reflection.ThrowIfMethodsNotOverloaded("AutoSuspendHelper", appDelegate,
                                                   "ApplicationShouldTerminate", "DidFinishLaunching", "DidResignActive", "DidBecomeActive", "DidHide");

            RxApp.SuspensionHost.IsLaunchingNew     = Observable <Unit> .Never;
            RxApp.SuspensionHost.IsResuming         = isResuming;
            RxApp.SuspensionHost.IsUnpausing        = isUnpausing;
            RxApp.SuspensionHost.ShouldPersistState = shouldPersistState;

            var untimelyDemise = new Subject <Unit>();

            AppDomain.CurrentDomain.UnhandledException += (o, e) =>
                                                          untimelyDemise.OnNext(Unit.Default);

            RxApp.SuspensionHost.ShouldInvalidateState = untimelyDemise;
        }