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}"); } } } }
public static void Postfix(ResourceCounter __instance) { if (TickUtility.NoOverlapTickMod(204)) { __instance.UpdateResourceCounts(); } }
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; } }
public static void Postfix(Pawn_MindState __instance) { if (__instance.pawn.NoOverlapAdjustedIsHashIntervalTick(100)) { if (__instance.pawn.Spawned) { int regionsToScan = __instance.anyCloseHostilesRecently ? 24 : 18; __instance.anyCloseHostilesRecently = PawnUtility.EnemiesAreNearby(__instance.pawn, regionsToScan, true); } else { __instance.anyCloseHostilesRecently = false; } } if (TickUtility.NoOverlapTickMod(123) && __instance.pawn.Spawned && __instance.pawn.RaceProps.IsFlesh && __instance.pawn.needs.mood != null) { TerrainDef terrain = __instance.pawn.Position.GetTerrain(__instance.pawn.Map); if (terrain.traversedThought != null) { __instance.pawn.needs.mood.thoughts.memories.TryGainMemoryFast(terrain.traversedThought); } WeatherDef curWeatherLerped = __instance.pawn.Map.weatherManager.CurWeatherLerped; if (curWeatherLerped.exposedThought != null && !__instance.pawn.Position.Roofed(__instance.pawn.Map)) { __instance.pawn.needs.mood.thoughts.memories.TryGainMemoryFast(curWeatherLerped.exposedThought); } } }
void ScheduleNotifications() { var schedule = _data.GetExerciseSchedule(); var now = DateTime.Now; var tomorrow = now.AddDays(1); var random = new Random(); for (var testDate = TickUtility.GetNextRunTime(schedule); testDate < tomorrow; testDate = TickUtility.GetNextRunTime(schedule, testDate)) { //TODO: figure out how to make this more random. Right now it makes a random schedule, but it's the same every day var exercise = _data.GetNextEnabledExercise(random); LocalNotifications.CreateNotification(testDate, exercise, true); } }
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 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); }
public static bool Prefix(Pawn_JobTracker __instance) { FieldInfo p = AccessTools.Field(typeof(Pawn_JobTracker), "pawn"); Pawn pawn = p.GetValue(__instance) as Pawn; if (TickUtility.NoOverlapAdjustedIsHashIntervalTick(pawn, 30)) { ThinkResult thinkResult = (ThinkResult)JobTrackerUtility.DetermineNextConstantThinkTreeJob.Invoke(__instance, null); if (thinkResult.IsValid) { bool start = (bool)JobTrackerUtility.ShouldStartJobFromThinkTree.Invoke(__instance, new object[] { thinkResult }); if (start) { JobTrackerUtility.CheckLeaveJoinableLordBecauseJobIssued.Invoke(__instance, new object[] { thinkResult }); __instance.StartJob(thinkResult.Job, JobCondition.InterruptForced, thinkResult.SourceNode, false, false, pawn.thinker.ConstantThinkTree, thinkResult.Tag, false, false); } else if (thinkResult.Job != __instance.curJob && !__instance.jobQueue.Contains(thinkResult.Job)) { JobMaker.ReturnToPool(thinkResult.Job); } } } return(true); }