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())); }
public async Task UpdateAllDataServices() { Debug.WriteLine($"Updating all data services in mode: {currentUpdateMode}"); try { IWalkingDataService walkingDataService = CrossServiceContainer.WalkingDataService; if (!walkingDataService.GetIsConnectedToOSService()) { walkingDataService.ConnectToOSService(); return; } TodaysWalkingModel todaysWalking = null; if (walkingDataService != null) { await walkingDataService.RequestUpdate(); todaysWalking = walkingDataService.GetTodaysHistory(); } IGoalService goalService = GoalService.Current; if (goalService != null && todaysWalking != null) { if (await goalService.CheckIfGoalCompleted(todaysWalking)) { if (!App.IsForeground && Settings.WillSendNotifications) { var id = (Config.NotificationIdGoal + (int)Settings.CurrentGoal); CrossLocalNotifications.Current.Show(AppText.notification_title, AppText.notification_goal_reached, id); Analytics.TrackEvent(TrackingEvents.BackgroundEvents.NotificationSent); } } } IAchievementService achievementService = AchievementService.Current; if (achievementService != null && todaysWalking != null) { //await achievementService.CheckAllAchievementsCriteria(todaysWalking); await achievementService.CheckTieredAchievementsProgress(todaysWalking); } var lastWalkingDateEventDate = Settings.LastWalkingDataEventDate; if (lastWalkingDateEventDate.AddDays(1) < DateTime.Today) { IStorageService storageService = StorageService.Current; if (storageService != null) { var days = await storageService.GetWalkingDaysSinceInclusive(lastWalkingDateEventDate.AddDays(1)); var today = DateTime.Today; var daysToTrack = days.Where(d => Settings.LastWalkingDataEventDate < d.Day && d.Day < today); foreach (var d in daysToTrack) { Analytics.TrackEvent(TrackingEvents.BriskWalking, new TrackingEvents.WalkingDataArgs(d.Day.DayOfWeek, d.MinutesBriskWalking)); Analytics.TrackEvent(TrackingEvents.RegularWalking, new TrackingEvents.WalkingDataArgs(d.Day.DayOfWeek, d.MinutesRegularWalking)); Analytics.TrackEvent(TrackingEvents.WalkingRaw, new TrackingEvents.WalkingRawDataArgs(d.Day.Date, d.MinutesBriskWalking, d.MinutesRegularWalking, d.MinutesUnknownWalking, Settings.UserHeight)); } //Last date stored is always today - 1 Settings.LastWalkingDataEventDate = today.AddDays(-1); // log history var all = await storageService.GetWalkingDaysSinceInclusive(DateTime.MinValue); Analytics.TrackEvent(TrackingEvents.DailyHistory, new TrackingEvents.WalkingDataArgs(all)); } } UpdateCompleted?.Invoke(); } catch (Exception e) { #if DEBUG Device.BeginInvokeOnMainThread(() => throw e); #else Crashes.TrackError(e); #endif } }