Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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}");
                    }
                }
            }
        }
Esempio n. 4
0
        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();
            }
        }
Esempio n. 5
0
        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();
        }
Esempio n. 6
0
        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();
            }
        }
Esempio n. 7
0
        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);
     }
 }
Esempio n. 9
0
 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));
 }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        /// <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);
        }
Esempio n. 12
0
        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;
        }
Esempio n. 15
0
 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));
 }
Esempio n. 16
0
        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();
        }
Esempio n. 17
0
        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);
        }
Esempio n. 18
0
        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);
        }
Esempio n. 19
0
        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);
        }
Esempio n. 20
0
        // 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();
            }
        }
Esempio n. 22
0
        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);
        }
Esempio n. 23
0
        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);
        }
Esempio n. 24
0
        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);
        }
Esempio n. 28
0
        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);
        }
Esempio n. 30
0
        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
        }