private ScheduleTileDayData CreateDayData(DateTime date) { var answer = new ScheduleTileDayData() { Date = date, IsToday = date == Today }; if (!ScheduleViewItemsGroup.Semester.IsDateDuringThisSemester(date)) { return(answer); } if (HolidayViewItemsGroup != null && HolidayViewItemsGroup.Holidays.Any(h => h.IsOnDay(date))) { answer.Holidays = HolidayViewItemsGroup.Holidays.Where(h => h.IsOnDay(date)).OrderBy(h => h).ToArray(); } else { answer.Schedules = SchedulesOnDay.Get(Account, ScheduleViewItemsGroup.Classes, date, Account.CurrentWeek, trackChanges: false).ToArray(); } return(answer); }
public static ViewItemClass GetFirstClassOnDay(DateTime date, AccountDataItem account, IEnumerable <ViewItemClass> classes) { if (classes == null) { return(null); } var currWeek = account.GetWeekOnDifferentDate(date); var schedules = SchedulesOnDay.Get(classes, date, currWeek, trackChanges: false); return(schedules.FirstOrDefault()?.Class); }
public static ViewItemClass GetClosestClassBasedOnSchedule(DateTime now, AccountDataItem account, IEnumerable <ViewItemClass> classes) { if (classes == null) { return(null); } var currWeek = account.GetWeekOnDifferentDate(now); var schedules = SchedulesOnDay.Get(classes, now, currWeek, trackChanges: false); ViewItemSchedule closestBefore = null; ViewItemSchedule closestAfter = null; //look through all schedules foreach (var s in schedules) { //if the class is currently going on if (now.TimeOfDay >= s.StartTime.TimeOfDay && now.TimeOfDay <= s.EndTime.TimeOfDay) { return(s.Class); } //else if the class is in the future, we instantly select it for the after class since it's sorted from earliest to latest else if (s.StartTime.TimeOfDay >= now.TimeOfDay) { // Make sure it's only 10 mins after if ((s.StartTime.TimeOfDay - now.TimeOfDay) < TimeSpan.FromMinutes(10)) { closestAfter = s; } // Regardless we break break; } else { // Make sure it's only 10 mins before if ((now.TimeOfDay - s.EndTime.TimeOfDay) < TimeSpan.FromMinutes(10)) { closestBefore = s; } } } if (closestAfter == null && closestBefore == null) { return(null); } else if (closestAfter == null) { return(closestBefore.Class); } else if (closestBefore == null) { return(closestAfter.Class); } else if ((now.TimeOfDay - closestBefore.EndTime.TimeOfDay) < (closestAfter.StartTime.TimeOfDay - now.TimeOfDay)) { return(closestBefore.Class); } else { return(closestAfter.Class); } }
protected override void ResetAllReminders(AccountDataItem account, ScheduleViewItemsGroup scheduleViewItemsGroup) { var notifier = ToastNotificationManager.CreateToastNotifier(); var group = ClassRemindersGroupPrefix + "." + UWPRemindersExtension.GetId(account); // Clear current scheduled notifications try { var scheduled = notifier.GetScheduledToastNotifications(); foreach (var s in scheduled) { try { if (s.Group == group) { notifier.RemoveFromSchedule(s); } } catch { } } } catch { } if (scheduleViewItemsGroup == null) { return; } // This will be initialized var beforeTime = account.ClassRemindersTimeSpan.GetValueOrDefault(); // Added in 17134 bool isExpirationTimeSupported = ApiInformation.IsPropertyPresent(typeof(ScheduledToastNotification).FullName, "ExpirationTime"); var today = DateTime.Today; var end = today.AddDays(8); // Schedule out for 8 days Dictionary <ViewItemSchedule, XmlDocument> generatedPayloads = new Dictionary <ViewItemSchedule, XmlDocument>(); for (; today.Date < end.Date; today = today.AddDays(1).Date) { // No need to lock changes, if changes occur an exception might occur, but that's fine, reminders would be reset once again anyways var schedulesOnDay = SchedulesOnDay.Get(account, scheduleViewItemsGroup.Classes, today, account.GetWeekOnDifferentDate(today), trackChanges: false); foreach (var s in schedulesOnDay) { var reminderTime = today.Add(s.StartTime.TimeOfDay).Subtract(beforeTime); if (reminderTime >= DateTime.Now.AddSeconds(5)) { XmlDocument payload; if (!generatedPayloads.TryGetValue(s, out payload)) { payload = GeneratePayload(account, s); generatedPayloads[s] = payload; } var notif = new ScheduledToastNotification(payload, reminderTime) { Group = group, Tag = s.Identifier.ToString() + "." + today.ToString("yy-dd-MM") }; if (isExpirationTimeSupported) { notif.ExpirationTime = today.Add(s.EndTime.TimeOfDay); } try { notifier.AddToSchedule(notif); } catch (Exception ex) { // If OS is in a bad state, we'll just stop TelemetryExtension.Current?.TrackException(new Exception("Adding toast to schedule failed: " + ex.Message, ex)); return; } } } } }