protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); _exerciseSchedule = Data.GetExerciseSchedule(); SetContentView(Resource.Layout.ManageSchedule); _scheduleTypeSpinner = FindViewById <Spinner>(Resource.Id.ScheduleTypeSpinner); _reminderPeriodSpinner = FindViewById <Spinner>(Resource.Id.ReminderSpinner); _saveButton = FindViewById <Button>(Resource.Id.SaveButton); _cancelButton = FindViewById <Button>(Resource.Id.CancelButton); _startTimeContainer = FindViewById(Resource.Id.StartTimeContainer); _startTimeText = FindViewById <TextView>(Resource.Id.StartTimeText); _endTimeContainer = FindViewById(Resource.Id.EndTimeContainer); _endTimeText = FindViewById <TextView>(Resource.Id.EndTimeText); _movementLocationsEnabledCheckbox = FindViewById <CheckBox>(Resource.Id.MovementLocationsEnabledCheckbox); _movementLocationsContainer = FindViewById(Resource.Id.MovementLocationsContainer); _movementLocationRecyclerView = FindViewById <RecyclerView>(Resource.Id.MovementLocationsList); _loadingIndicator = FindViewById(Resource.Id.LoadingIndicator); InitializePickers(); SetData(); _cancelButton.Click += (s, e) => Finish(); _saveButton.Click += (s, e) => SaveData(); _movementLocationsEnabledCheckbox.CheckedChange += MovementLocationsEnabledCheckbox_CheckedChange; }
private void RunBiHourlyTestLoop(ExerciseSchedule schedule) { DateTime?previousRunTime = null; for (var testTime = _startTime; testTime <= _startTime.AddDays(1).AddMinutes(-1); testTime = testTime.AddMinutes(1)) { var nextRunTime = TickUtility.MockNow_GetNextRunTime(schedule, testTime); Assert.IsTrue(nextRunTime.Minute == 0, $"Minutes generated for {testTime} must equal 0. Current value is {nextRunTime.Minute}"); if (testTime.TimeOfDay < schedule.StartTime.TimeOfDay) { Assert.AreEqual(GetTodaysStartTime(schedule), nextRunTime); } else if (testTime.TimeOfDay >= schedule.EndTime.TimeOfDay) { Assert.AreEqual(GetTomorrowsStartTime(schedule), nextRunTime); } else if (previousRunTime.HasValue) { Assert.IsTrue(previousRunTime.Value == nextRunTime || previousRunTime.Value.AddHours(2) == nextRunTime || nextRunTime == GetTomorrowsStartTime(schedule), $"Previous Run Time: {previousRunTime.Value}, Next Run Time {nextRunTime}"); } previousRunTime = nextRunTime; testTime = nextRunTime; } }
private void RunHalfHourlyTestLoop(ExerciseSchedule schedule) { for (var testTime = _startTime; testTime <= _startTime.AddDays(1).AddMinutes(-1); testTime = testTime.AddMinutes(1)) { var nextRunTime = TickUtility.MockNow_GetNextRunTime(schedule, testTime); Assert.IsTrue(nextRunTime.Minute == 0 || nextRunTime.Minute == 30, $"Minutes generated for {testTime} must equal 0 or 30. Current value is {nextRunTime.Minute}"); if (testTime.TimeOfDay < schedule.StartTime.TimeOfDay) { Assert.AreEqual(GetTodaysStartTime(schedule), nextRunTime); } else if (testTime.TimeOfDay >= schedule.EndTime.TimeOfDay) { Assert.AreEqual(GetTomorrowsStartTime(schedule), nextRunTime); } else { if (testTime.Minute < 30) { Assert.IsTrue(nextRunTime.Minute == 30, $"Minutes must be set to 30 for {testTime}. Current value is {nextRunTime.Minute}"); } else { Assert.IsTrue(nextRunTime.Minute == 0, $"Minutes must be set to 0 for {testTime}. Current value is {nextRunTime.Minute}"); } } } }
private List <DayOfWeek> GetScheduleDays(ExerciseSchedule schedule) { switch (schedule.Type) { case ScheduleType.EveryDay: return(Enum.GetValues(typeof(DayOfWeek)).Cast <DayOfWeek>().ToList()); case ScheduleType.WeekendsOnly: return(new List <DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday }); case ScheduleType.WeekdaysOnly: return (Enum.GetValues(typeof(DayOfWeek)) .Cast <DayOfWeek>() .Except(new List <DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday }) .ToList()); case ScheduleType.Custom: return(string.IsNullOrWhiteSpace(schedule.CustomDays) ? new List <DayOfWeek>() : schedule.CustomDays.Split(Constants.DatabaseListSeparator).Select(GetDayOfWeekFromString) .Where(d => d.HasValue).Select(d => d.Value).ToList()); default: throw new ArgumentOutOfRangeException(); } }
private void SaveData() { _exerciseSchedule.Period = (SchedulePeriod)_reminderPeriodSpinner.SelectedItemPosition; _exerciseSchedule.Type = (ScheduleType)_scheduleTypeSpinner.SelectedItemPosition; if (_selectedStartTime >= _selectedEndTime) { _userNotification.ShowValidationErrorPopUp(this, Resource.String.TimeRangeValidation); return; } _exerciseSchedule.StartTime = _selectedStartTime; _exerciseSchedule.EndTime = _selectedEndTime; Data.SaveExerciseSchedule(_exerciseSchedule); _exerciseSchedule = Data.GetExerciseSchedule(); _serviceManager.RestartNotificationServiceIfNeeded(this, _exerciseSchedule); Data.SetMovementLocationsEnabled(_movementLocationsEnabledCheckbox.Checked); Data.InsertAllMovementLocations(_updatedMovementLocations.Except(_initialMovementLocations)); Data.DeleteAllMovementLocations(_initialMovementLocations.Except(_updatedMovementLocations).Select(ml => ml.Id)); Finish(); }
public static DateTime GetNextRunTime(ExerciseSchedule schedule, DateTime fromDate) { if (!schedule.ScheduledDays.Contains(fromDate.DayOfWeek) || fromDate.TimeOfDay > schedule.EndTime.TimeOfDay) { return(GetStartOfNextDay(schedule, fromDate)); } if (fromDate.TimeOfDay < schedule.StartTime.TimeOfDay) { return(GetStartOfToday(schedule, fromDate)); } switch (schedule.Period) { #if DEBUG case SchedulePeriod.EveryFiveMinutes: return(GetNextXMinuteRun(schedule, fromDate, 5)); #endif case SchedulePeriod.HalfHourly: return(GetNextXMinuteRun(schedule, fromDate, 30)); case SchedulePeriod.Hourly: return(GetNextXMinuteRun(schedule, fromDate, 60)); case SchedulePeriod.BiHourly: return(GetNextXMinuteRun(schedule, fromDate, 120)); case SchedulePeriod.EveryFifteenMinutes: return(GetNextXMinuteRun(schedule, fromDate, 15)); default: throw new ArgumentOutOfRangeException(); } }
public ActionResult DeleteConfirmed(int id) { ExerciseSchedule exerciseSchedule = db.ExerciseSchedules.Find(id); db.ExerciseSchedules.Remove(exerciseSchedule); db.SaveChanges(); return(RedirectToAction("Index")); }
public void RestartNotificationServiceIfNeeded(Context context, ExerciseSchedule schedule) { if (NotificationServiceIsRunning(context)) { StopNotificationService(context, schedule, false); StartNotificationService(context, schedule, false); } }
public ActionResult Edit([Bind(Include = "Id,PreparationTime,Name,Description,StartTime,EndTime")] ExerciseSchedule exerciseSchedule) { if (ModelState.IsValid) { db.Entry(exerciseSchedule).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } return(View(exerciseSchedule)); }
private static DateTime GetStartOfNextDay(ExerciseSchedule schedule, DateTime fromDateValue) { var targetDay = GetStartOfToday(schedule, fromDateValue).AddDays(1); while (!schedule.ScheduledDays.Contains(targetDay.DayOfWeek)) { targetDay = targetDay.AddDays(1); } return(targetDay); }
/// <summary> /// Test method. This is used to allow unit tests to mock 'now' /// </summary> /// <param name="schedule"></param> /// <param name="nowValue"></param> /// <returns></returns> public static DateTime MockNow_GetNextRunTime(ExerciseSchedule schedule, DateTime nowValue) { var todaysStartTime = new DateTime(nowValue.Year, nowValue.Month, nowValue.Day, schedule.StartTime.Hour, schedule.StartTime.Minute, 0); while (todaysStartTime <= nowValue) { todaysStartTime = GetNextRunTime(schedule, todaysStartTime); } return(todaysStartTime); }
public ActionResult Create([Bind(Include = "Id,PreparationTime,Name,Description,StartTime,EndTime")] ExerciseSchedule exerciseSchedule) { if (ModelState.IsValid) { db.ExerciseSchedules.Add(exerciseSchedule); db.SaveChanges(); return(RedirectToAction("Index")); } return(View(exerciseSchedule)); }
public void StartNotificationService(Context context, ExerciseSchedule schedule, bool showMessage = true) { SetNextAlarm(context, schedule); SaveServiceStatus(context, true); if (showMessage) { Toast.MakeText(context, Resource.String.ServiceStarted, ToastLength.Long).Show(); } }
public override void ViewWillAppear(bool animated) { base.ViewWillAppear(animated); MenuButton.Clicked += MenuButton_Clicked; _exerciseSchedule = Data.GetExerciseSchedule(); StartTime.Text = _exerciseSchedule.StartTime.ToLongTimeString(); EndTime.Text = _exerciseSchedule.EndTime.ToLongTimeString(); ReminderPeriod.Text = _exerciseSchedule.PeriodDisplayString; StatusSwitch.ValueChanged += StatusSwitch_ValueChanged; _changeScheduleButton.TouchUpInside += ChangeScheduleButton_TouchUpInside; }
private static DateTime GetStartNextDayIfOverTodaysEnd(ExerciseSchedule schedule, DateTime target) { if (target.TimeOfDay <= schedule.EndTime.TimeOfDay && target.TimeOfDay >= schedule.StartTime.TimeOfDay) { return(target); } if (target.TimeOfDay > schedule.EndTime.TimeOfDay) { return(GetStartOfNextDay(schedule, target)); } return(GetStartOfToday(schedule, target)); }
public override void OnResume() { base.OnResume(); _exerciseSchedule = _data.GetExerciseSchedule(); _startTimeText.Text = _exerciseSchedule.StartTime.ToShortTimeString(); _endTimeText.Text = _exerciseSchedule.EndTime.ToShortTimeString(); _scheduleTypeText.Text = _exerciseSchedule.TypeDisplayString; _reminderPeriodText.Text = _exerciseSchedule.PeriodDisplayString; EnableDisableServiceButtons(); }
public void UnknownDate_TestBiHourlySchedule() { var schedule = new ExerciseSchedule { Type = ScheduleType.EveryDay, ScheduledDays = Enum.GetValues(typeof(DayOfWeek)).Cast <DayOfWeek>().ToList(), StartTime = new DateTime(1, 1, 1, 8, 0, 0), EndTime = new DateTime(1, 1, 1, 17, 30, 0), Period = SchedulePeriod.BiHourly }; RunBiHourlyTestLoop(schedule); }
public void SaveExerciseSchedule(ExerciseSchedule exerciseSchedule) { if (exerciseSchedule.Type == ScheduleType.Custom) { exerciseSchedule.CustomDays = string.Join(Constants.DatabaseListSeparator.ToString(), exerciseSchedule.ScheduledDays); } else { exerciseSchedule.CustomDays = string.Empty; } _db.Update(exerciseSchedule); }
public void UnknownDate_TestHalfHourlySchedule_BeginningAndEndOfDay() { var schedule = new ExerciseSchedule { Type = ScheduleType.EveryDay, ScheduledDays = Enum.GetValues(typeof(DayOfWeek)).Cast <DayOfWeek>().ToList(), StartTime = new DateTime(1, 1, 1, 0, 0, 0), EndTime = new DateTime(1, 1, 1, 23, 30, 0), Period = SchedulePeriod.HalfHourly }; RunHalfHourlyTestLoop(schedule); }
// GET: ExerciseSchedules/Delete/5 public ActionResult Delete(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } ExerciseSchedule exerciseSchedule = db.ExerciseSchedules.Find(id); if (exerciseSchedule == null) { return(HttpNotFound()); } return(View(exerciseSchedule)); }
public void StopNotificationService(Context context, ExerciseSchedule schedule, bool showMessage = true) { var reminder = new Intent(context, typeof(ExerciseTickBroadcastReceiver)); var recurringReminders = PendingIntent.GetBroadcast(context, 0, reminder, PendingIntentFlags.CancelCurrent); var alarms = (AlarmManager)context.GetSystemService(Context.AlarmService); alarms.Cancel(recurringReminders); SaveServiceStatus(context, false); if (showMessage) { Toast.MakeText(context, Resource.String.ServiceStopped, ToastLength.Long).Show(); } }
public void UnknownDate_TestWeekdayOnlySchedule_LastOnSunday_AdvanceToSaturday() { var schedule = new ExerciseSchedule { Type = ScheduleType.WeekendsOnly, ScheduledDays = new List <DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday }, StartTime = new DateTime(1, 1, 1, 8, 30, 0), EndTime = new DateTime(1, 1, 1, 22, 30, 0), Period = SchedulePeriod.EveryFifteenMinutes }; var thisRunTime = new DateTime(1, 1, 7, 22, 30, 0); var nextRunTime = TickUtility.MockNow_GetNextRunTime(schedule, thisRunTime); Assert.AreEqual(schedule.StartTime.AddDays(12), nextRunTime); }
public void UnknownDate_TestWeekdayOnlySchedule_LastOnFriday_AdvanceToMonday() { var schedule = new ExerciseSchedule { Type = ScheduleType.WeekdaysOnly, ScheduledDays = Enum.GetValues(typeof(DayOfWeek)).Cast <DayOfWeek>().Except(new List <DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday }).ToList(), StartTime = new DateTime(1, 1, 1, 8, 30, 0), EndTime = new DateTime(1, 1, 1, 22, 30, 0), Period = SchedulePeriod.EveryFifteenMinutes }; var thisRunTime = new DateTime(1, 1, 5, 22, 30, 0); var nextRunTime = TickUtility.MockNow_GetNextRunTime(schedule, thisRunTime); Assert.AreEqual(schedule.StartTime.AddDays(7), nextRunTime); }
public void UnknownDate_TestFifteenMinuteSchedule_AdvanceToStart() { var schedule = new ExerciseSchedule { Type = ScheduleType.EveryDay, ScheduledDays = Enum.GetValues(typeof(DayOfWeek)).Cast <DayOfWeek>().ToList(), StartTime = new DateTime(1, 1, 1, 8, 30, 0), EndTime = new DateTime(1, 1, 1, 22, 30, 0), Period = SchedulePeriod.EveryFifteenMinutes }; var thisRunTime = new DateTime(_startTime.Year, _startTime.Month, _startTime.Day, 7, 30, 0); var nextRunTime = TickUtility.MockNow_GetNextRunTime(schedule, thisRunTime); Assert.AreEqual(8, nextRunTime.Hour); Assert.AreEqual(30, nextRunTime.Minute); }
public void FromDate_TestWeekdayOnlySchedule_RunOnSunday() { var schedule = new ExerciseSchedule { Type = ScheduleType.WeekendsOnly, ScheduledDays = new List <DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday }, StartTime = new DateTime(1, 1, 1, 8, 30, 0), EndTime = new DateTime(1, 1, 1, 22, 30, 0), Period = SchedulePeriod.EveryFifteenMinutes }; var thisRunTime = new DateTime(1, 1, 7, 9, 30, 0); var nextRunTime = TickUtility.GetNextRunTime(schedule, thisRunTime); Assert.AreEqual(thisRunTime.AddMinutes(15), nextRunTime); }
public void FromDate_TestWeekdayOnlySchedule_RunOnMonday() { var schedule = new ExerciseSchedule { Type = ScheduleType.WeekdaysOnly, ScheduledDays = Enum.GetValues(typeof(DayOfWeek)).Cast <DayOfWeek>().Except(new List <DayOfWeek> { DayOfWeek.Saturday, DayOfWeek.Sunday }).ToList(), StartTime = new DateTime(1, 1, 1, 8, 30, 0), EndTime = new DateTime(1, 1, 1, 22, 30, 0), Period = SchedulePeriod.EveryFifteenMinutes }; var thisRunTime = new DateTime(_startTime.Year, _startTime.Month, _startTime.Day, 9, 30, 0); var nextRunTime = TickUtility.GetNextRunTime(schedule, thisRunTime); Assert.AreEqual(thisRunTime.AddMinutes(15), nextRunTime); }
public void FromDate_TestFifteenMinuteSchedule_Start45End0() { var schedule = new ExerciseSchedule { Type = ScheduleType.EveryDay, ScheduledDays = Enum.GetValues(typeof(DayOfWeek)).Cast <DayOfWeek>().ToList(), StartTime = new DateTime(1, 1, 1, 0, 0, 0), EndTime = new DateTime(1, 1, 1, 22, 0, 0), Period = SchedulePeriod.EveryFifteenMinutes }; var thisRunTime = new DateTime(_startTime.Year, _startTime.Month, _startTime.Day, 15, 45, 0); var nextRunTime = TickUtility.GetNextRunTime(schedule, thisRunTime); Assert.AreEqual(16, nextRunTime.Hour); Assert.AreEqual(0, nextRunTime.Minute); }
public override void ViewDidLoad() { base.ViewDidLoad(); _schedule = Data.GetExerciseSchedule(); _schedulePicker = MirroredPicker.Create(new PickerModel(PickerListHelper.GetExercisePeriods()), ReminderPeriod, doneAction: null); _startTimePicker = MirroredPicker.Create(new PickerModel(_availableTimes), StartTime, HandleTimeSet, doneAction: null); _endTimePicker = MirroredPicker.Create(new PickerModel(_availableTimes), EndTime, HandleTimeSet, doneAction: null); AddButtons(); PopulateData(); var pickerTextFields = View.Subviews.OfType <PickerUITextField>().ToArray(); Colors.SetTextPrimaryColor(pickerTextFields); }
public static DateTime SetNextAlarm(Context context, ExerciseSchedule exerciseSchedule) { var reminder = new Intent(context, typeof(ExerciseTickBroadcastReceiver)); var recurringReminders = PendingIntent.GetBroadcast(context, 0, reminder, PendingIntentFlags.CancelCurrent); var alarms = (AlarmManager)context.GetSystemService(Context.AlarmService); var nextRunTime = TickUtility.GetNextRunTime(exerciseSchedule); var dtBasis = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); if (Build.VERSION.SdkInt >= BuildVersionCodes.M) { var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); var filePath = Path.Combine(documentsPath, Constants.NotificationPreferences); var allowWakeFromIdle = JsonConvert.DeserializeObject <bool>(File.ReadAllText(filePath)); if (allowWakeFromIdle) { alarms.SetExactAndAllowWhileIdle(AlarmType.RtcWakeup, (long)nextRunTime.ToUniversalTime().Subtract(dtBasis).TotalMilliseconds, recurringReminders); } else { alarms.SetExact(AlarmType.RtcWakeup, (long)nextRunTime.ToUniversalTime().Subtract(dtBasis).TotalMilliseconds, recurringReminders); } } else { alarms.SetExact(AlarmType.RtcWakeup, (long)nextRunTime.ToUniversalTime().Subtract(dtBasis).TotalMilliseconds, recurringReminders); } return(nextRunTime); }
private void Initalize(SQLiteConnection conn) { _db = conn; _db.CreateTable <SystemStatus>(); if (!SystemStatus.Any()) { _db.Insert(new SystemStatus { IsFirstRun = true }); } _db.CreateTable <ExerciseSchedule>(); var hasExerciseSchedule = ExerciseSchedules.Any(); if (!hasExerciseSchedule) { var defaultSchedule = ExerciseSchedule.CreateDefaultSchedule(); _db.Insert(defaultSchedule); } _db.CreateTable <ExerciseBlock>(); _db.CreateTable <MostRecentExercise>(); if (!hasExerciseSchedule && !ExerciseBlocks.Any()) { var defaultExercises = ExerciseBlock.CreateDefaultExercises(); _db.InsertAll(defaultExercises); } _db.CreateTable <ExerciseHistory>(); _db.CreateTable <MovementLocation>(); #if DEBUG var now = DateTime.Now.Date; if (!ExerciseHistories.Any(eh => eh.RecordedDate < now)) { _db.InsertAll(new List <ExerciseHistory> { new ExerciseHistory { QuantityNotified = 10, ExerciseName = "test", RecordedDate = DateTime.Now.AddDays(-1), QuantityCompleted = 10 }, new ExerciseHistory { QuantityNotified = 10, ExerciseName = "test", RecordedDate = DateTime.Now.AddDays(-2), QuantityCompleted = 10 }, new ExerciseHistory { QuantityNotified = 10, ExerciseName = "test", RecordedDate = DateTime.Now.AddDays(-3), QuantityCompleted = 10 }, }); } #endif }