Exemple #1
0
        public override bool OnStartJob(JobParameters jobParams)
        {
            //NOTE: Lazy loading of service for platform specific version
#pragma warning disable CS0436 // Type conflicts with imported type
            IWalkingDataService walkingDataService = CrossWalkingDataService.Current;
            IUpdateService      updateService      = CrossUpdateService.Current;
#pragma warning restore CS0436 // Type conflicts with imported type

            CrossServiceContainer.SetWalkingDataService(walkingDataService);
            CrossServiceContainer.SetUpdateService(updateService);

            //NOTE: As mainactivity might not be run / we need to set this icon
            LocalNotificationsImplementation.NotificationIconId = Resource.Mipmap.notification_icon;
            Task.Run(async() =>
            {
                if (updateService != null)
                {
                    //NOTE: When Service is created - a separate instance of CrossUpdateService may be created where the default mode is foreground, with no lifecycle events
                    //NOTE: Thus we check if the app is running. Note the different packagenames for application and this service
                    if (!AppLifecycleUtil.IsRunning(this, Application.Context.PackageName))
                    {
                        updateService.SetUpdateMode(UpdateMode.Background);
                    }

                    Log.Debug("UpdateJob", "Running update job with updateservice address: " + updateService.ToString());

                    if (updateService.GetUpdateMode() == UpdateMode.Background)
                    {
#if DEBUG
                        Stopwatch timer = Stopwatch.StartNew();
#endif
                        await updateService.UpdateAllDataServices();

                        Analytics.TrackEvent(TrackingEvents.Background,
                                             new TrackingEvents.BackgroundArgs(TrackingEvents.BackgroundEvents.BackgroundFetch));
#if DEBUG
                        Console.WriteLine("Completed background update of walking data and achievements in {0} ms", timer.ElapsedMilliseconds);
#endif
                    }
                    else
                    {
#if DEBUG
                        Console.WriteLine("Skipped background update since we're not in background");
#endif
                    }
                }

                //NOTE: Return whether or not we want to reschedule the job
                //NOTE: We do not, as JobInfo.Builder.setPeriodic() takes care of resheduling for us!
                JobFinished(jobParams, false);
            });

            //Continue this job until Jobfinished is called
            return(true);
        }
Exemple #2
0
        protected override void OnCreate(Bundle bundle)
        {
            AppDomain.CurrentDomain.UnhandledException += PlatformError.CurrentDomainUnhandledException;
            TaskScheduler.UnobservedTaskException      += PlatformError.TaskSchedulerUnobservedTaskException;

            App.ScreenHeight = (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density);
            App.ScreenWidth  = (int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density);
            App.VersionName  = Application.ApplicationContext.PackageManager
                               .GetPackageInfo(Application.ApplicationContext.PackageName, 0)
                               .VersionName;

            AccessibilityManager accessibilityManager = (AccessibilityManager)GetSystemService(AccessibilityService);

            //NOTE: ref: https://stackoverflow.com/a/12362545 we only use touch exploration events for checking if talkback is enabled
            accessibilityManager.AddTouchExplorationStateChangeListener(this);
            Accessibility.AccessibilityEnabled = accessibilityManager.IsTouchExplorationEnabled;

            Xamarin.Forms.Forms.Init(this, bundle);
            UserDialogs.Init(this);
            CarouselViewRenderer.Init();
            CachedImageRenderer.Init(true);
            FlowListView.Init();

            Rg.Plugins.Popup.Popup.Init(this, bundle);

            LocalNotificationsImplementation.NotificationIconId = Resource.Mipmap.notification_icon;
            //NOTE: We know. Lazy loading of service for platform specific version
#pragma warning disable CS0436 // Type conflicts with imported type
            IWalkingDataService walkingDataService = CrossWalkingDataService.Current;
            IUpdateService      updateService      = CrossUpdateService.Current;
            IScreenshotService  screenshotService  = CrossScreenshotService.Current;
            IShareImageService  shareImageService  = CrossImageShareService.Current;
#pragma warning restore CS0436 // Type conflicts with imported type
            ScreenshotService.Activity = this;
            ShareImageService.Context  = this;

            CrossServiceContainer.SetWalkingDataService(walkingDataService);
            CrossServiceContainer.SetUpdateService(updateService);
            CrossServiceContainer.SetScreenshotService(screenshotService);
            CrossServiceContainer.SetShareImageService(shareImageService);

            Log.Debug("MainActivity", "Mainactivity updateservice: " + updateService.ToString());

            base.OnCreate(bundle);

            Instance = this;
            OnActivityCreated?.Invoke(this);

            if (Settings.CanRequestReview())
            {
                RequestReview();
            }
        }
Exemple #3
0
        public void OnFinishedLaunching(NSDictionary options = null)
        {
            AppDomain.CurrentDomain.UnhandledException += PlatformError.CurrentDomainUnhandledException;
            TaskScheduler.UnobservedTaskException      += PlatformError.TaskSchedulerUnobservedTaskException;

            //NOTE: this is in seconds
            //UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval(Config.BackgroundUpdateIntervalMS / 1000);
            UIApplication.SharedApplication.SetMinimumBackgroundFetchInterval(UIApplication.BackgroundFetchIntervalMinimum);

            App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height;
            App.ScreenWidth  = (int)UIScreen.MainScreen.Bounds.Width;
            App.VersionName  = NSBundle.MainBundle.InfoDictionary[new NSString("CFBundleVersion")].ToString();

            Accessibility.AccessibilityEnabled = UIAccessibility.IsVoiceOverRunning;
            NSNotificationCenter.DefaultCenter.AddObserver(UIView.VoiceOverStatusDidChangeNotification, notification => Accessibility.AccessibilityEnabled = UIAccessibility.IsVoiceOverRunning);

            Xamarin.Forms.Forms.Init();

            AnimationViewRenderer.Init();
            CarouselViewRenderer.Init();
            CachedImageRenderer.Init();
            Rg.Plugins.Popup.Popup.Init();

            CarouselViewRenderer.Init();
            CachedImageRenderer.Init();
            ShapeRenderer.Init();

            FlowListView.Init();

            //Setup accessibility callbacks

            Xamarin.Forms.Forms.Init();
            LoadApplication(new App());
            GetNotificationPermissions();

            //NOTE: We know. Lazy loading of service for platform specific version
#pragma warning disable CS0436 // Type conflicts with imported type
            IWalkingDataService walkingDataService = CrossWalkingDataService.Current;
            IUpdateService      updateService      = CrossUpdateService.Current;
            IScreenshotService  screenshotService  = CrossScreenshotService.Current;
            IShareImageService  shareImageService  = CrossImageShareService.Current;
#pragma warning restore CS0436 // Type conflicts with imported type

            CrossServiceContainer.SetWalkingDataService(walkingDataService);
            CrossServiceContainer.SetUpdateService(updateService);
            CrossServiceContainer.SetScreenshotService(screenshotService);
            CrossServiceContainer.SetShareImageService(shareImageService);

            Console.WriteLine("Appdelegate unning updateService: " + updateService.ToString());
        }
Exemple #4
0
        public override async void PerformFetch(UIApplication application, Action <UIBackgroundFetchResult> completionHandler)
        {
            Analytics.TrackEvent(TrackingEvents.BackgroundEvents.BackgroundFetch);

            //NOTE: We know. Lazy loading of service for platform specific version
#pragma warning disable CS0436 // Type conflicts with imported type
            IWalkingDataService walkingDataService = CrossWalkingDataService.Current;
            IUpdateService      updateService      = CrossUpdateService.Current;
#pragma warning restore CS0436 // Type conflicts with imported type

            CrossServiceContainer.SetWalkingDataService(walkingDataService);
            CrossServiceContainer.SetUpdateService(updateService);

            Console.WriteLine("Background Fetch running updateService: " + updateService.ToString());

            var result        = UIBackgroundFetchResult.NoData;
            var minutesBefore = walkingDataService.GetTodaysHistory().minutesBriskWalkToday +
                                walkingDataService.GetTodaysHistory().minutesRegularWalkToday;
            try {
                await updateService.UpdateAllDataServices();

                var minutesAfter = walkingDataService.GetTodaysHistory().minutesBriskWalkToday +
                                   walkingDataService.GetTodaysHistory().minutesRegularWalkToday;;
                if (minutesBefore != minutesAfter)
                {
                    result = UIBackgroundFetchResult.NewData;
                }
            }
            catch
            {
                Crashes.TrackError(new BackgroundException(UIBackgroundFetchResult.Failed.ToString()));
                result = UIBackgroundFetchResult.Failed;
            }

            var output = "Ran background fetch with result: " + Enum.GetName(typeof(UIBackgroundFetchResult), result);
#if DEBUG
            LiveLogService.Current.LogLine(output);
#endif
            completionHandler(result);
            Analytics.TrackEvent(TrackingEvents.Background, new TrackingEvents.BackgroundArgs(result.ToString()));
        }