Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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;
                        }
                    }
                }
            }
        }